Browse Source

扫码取车

guoshuai 5 days ago
parent
commit
47c7d6f7bb

+ 34 - 18
src/main/java/com/qmrb/system/controller/CaSignController.java

@@ -3,7 +3,6 @@ package com.qmrb.system.controller;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.RandomUtil;
-import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -11,17 +10,13 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.qmrb.system.adatper.CaSignAdatper;
 import com.qmrb.system.adatper.EmrAdatper;
 import com.qmrb.system.common.constant.DeptNameMapping;
-import com.qmrb.system.common.constant.SecurityConstants;
-import com.qmrb.system.common.constant.SystemConstants;
 import com.qmrb.system.common.proc.CommonJDBCTemplate;
 import com.qmrb.system.common.proc.CommonTemplate;
 import com.qmrb.system.common.result.Result;
 import com.qmrb.system.common.util.AesUtils;
 import com.qmrb.system.framework.security.CaConstants;
 import com.qmrb.system.framework.security.JwtTokenManager;
-import com.qmrb.system.framework.security.userdetails.SysUserDetails;
 import com.qmrb.system.framework.security.util.SecurityUtils;
-import com.qmrb.system.pojo.bo.UserAuthInfo;
 import com.qmrb.system.pojo.dto.CaSignFileDTO;
 import com.qmrb.system.pojo.dto.CallBackResponse;
 import com.qmrb.system.pojo.dto.SoapReturnDTO;
@@ -31,25 +26,19 @@ import com.qmrb.system.pojo.form.TplCategoryForm;
 import com.qmrb.system.pojo.form.TplContentMyForm;
 import com.qmrb.system.pojo.form.TplTemplateConfigForm;
 import com.qmrb.system.pojo.query.*;
-import com.qmrb.system.pojo.vo.TplCategoryVO;
-import com.qmrb.system.pojo.vo.TplTemplateVO;
 import com.qmrb.system.pojo.vo.TplTreeVO;
 import com.qmrb.system.service.*;
-import com.qmrb.system.service.impl.TplTemplateServiceImpl;
 import com.qmrb.system.utils.*;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.security.SecurityRequirement;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
 import okhttp3.OkHttpClient;
 import okhttp3.Request;
 import org.apache.axis.client.Call;
 import org.apache.axis.client.Service;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.SystemUtils;
-import org.springdoc.core.annotations.ParameterObject;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -60,18 +49,13 @@ import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.RequestBody;
 
 import java.io.File;
-import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 import java.nio.charset.Charset;
-import java.sql.Timestamp;
 import java.text.MessageFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -136,6 +120,8 @@ public class CaSignController {
      */
     @Value("${auth.token.overDue}")
     private Long overDue;
+    @Value("${auth.token.fetchVehicleTime}")
+    private Long fetchVehicleTime;
 
     @Autowired
     private  SysUserService userService;
@@ -2439,8 +2425,9 @@ public class CaSignController {
 //        String signUrl = "";
         try {
             UUID uuid = UUID.randomUUID();
-            String key = RandomUtil.randomString(10);
-            String base64 = iUserService.getCouponQRCode(toolWxConfigService.findConf(),key);
+            String key = "contractId";
+            String redisKey = RandomUtil.randomString(10);
+            String base64 = iUserService.getCouponQRCode(toolWxConfigService.findConf(),key, redisKey);
             redisTemplate.opsForValue().set(key,contract.getId(),overDue,TimeUnit.SECONDS);
 
             // String url = contract.getQrcodeLoginUrl() + "?contractId=" + uuid;
@@ -2457,6 +2444,35 @@ public class CaSignController {
         }
         return null;
     }
+    
+    
+    /**
+     * 获取扫码取车的二维码
+     * @return
+     */
+    @GetMapping("fetchVehicleQrcode")
+    public Result<?> fetchVehicleQrcode(){
+        if(SecurityUtils.getUserId() == null){
+            return null;
+        }
+        
+        Map<String,Object> map = new HashMap<>();
+
+        try {
+            String key = "fetchVehicle";
+            String redisKey = "pickUp" + RandomUtil.randomString(10);
+            String base64 = iUserService.getCouponQRCode(toolWxConfigService.findConf(),key,redisKey);
+            //保存当前时间戳
+            redisTemplate.opsForValue().set(redisKey,System.currentTimeMillis(),fetchVehicleTime,TimeUnit.SECONDS);
+            
+            map.put("data",base64);
+            
+            return Result.success(map);
+        }catch (Exception e){
+            log.error(e.getMessage(),e);
+        }
+        return null;
+    }
 
 
     /**

+ 17 - 1
src/main/java/com/qmrb/system/controller/OrderController.java

@@ -46,6 +46,7 @@ import org.apache.rocketmq.remoting.exception.RemotingException;
 import org.springdoc.core.annotations.ParameterObject;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -90,6 +91,9 @@ public class OrderController extends CommonController {
     @Autowired
     private ICarParkChargingRulesService rulesService;
 
+    @Autowired
+    private RedisTemplate redisTemplate;
+
 
     @Value("${pickCarProducer.topic}")
     private String topic;
@@ -313,7 +317,8 @@ public class OrderController extends CommonController {
     public CommonResult<?> pickUp(
             @Parameter(description = "岗亭端停车记录ID") @PathVariable Long id,
             @ParameterObject String openId,
-            @ParameterObject Boolean isMonthlyCardMode
+            @ParameterObject Boolean isMonthlyCardMode,
+            @ParameterObject String fetchVehicle
     ) throws MQBrokerException, RemotingException, UnsupportedEncodingException, InterruptedException, MQClientException {
         // todo 调用计费模块,计算是否有应付费用
         BigDecimal pendingAmount = BigDecimal.ZERO;
@@ -339,9 +344,20 @@ public class OrderController extends CommonController {
                     .setPayStatus(SystemConstant.NUM_ZERO));
             return process(() -> orderService.createOrder(toolWxConfigService.findConf(), toCreateOrderVO));
         } else if (formData != null && pendingAmount.compareTo(BigDecimal.ZERO) <= 0) {
+            if(StringUtils.isBlank(fetchVehicle)){
+                log.info("未扫码取车");
+                return CommonResult.failed("请重新扫码后取车!");
+            }
+            // 取车前校验是否现场扫码
+            Object token = redisTemplate.opsForValue().get(fetchVehicle);
+            if(token == null){
+                log.info("请扫码后取车,{}",(Long) token);
+                return CommonResult.failed("请重新扫码后取车!");
+            }
             HashMap<String, Object> paramsMap = new HashMap<>();
             paramsMap.put("channelId", formData.getBarnId());
             paramsMap.put("carNumber", formData.getCarNumber());
+            log.info("发送取车指令");
             // 发送取车指令
             pickCarProducer.send(topic, tags, JSONUtil.toJsonStr(paramsMap));
         }

+ 1 - 0
src/main/java/com/qmrb/system/framework/security/config/SecurityConfig.java

@@ -102,6 +102,7 @@ public class SecurityConfig {
                         "/api/v1/patientSign/getTokenByTokenId",
                         "/api/ucenter/**",
                         "/api/v1/auth/loginByMerchants",
+                        "/api/v1/patientSign/fetchVehicleQrcode",
                         "/api/order/wechatPayCallback"
 
                 );

+ 1 - 3
src/main/java/com/qmrb/system/service/UserService.java

@@ -8,8 +8,6 @@ import com.qmrb.system.pojo.entity.ToolWxConfig;
 import com.qmrb.system.pojo.vo.UserInfo;
 import com.qmrb.system.pojo.vo.WxLoginVO;
 
-import java.util.UUID;
-
 
 /**
  * <p>
@@ -36,5 +34,5 @@ public interface UserService extends IService<Order> {
 
     public String getUserPhoneNumber(ToolWxConfig wxConfig, String code);
 
-    String getCouponQRCode(ToolWxConfig conf, String key);
+    String getCouponQRCode(ToolWxConfig conf, String key, String redisKey);
 }

+ 2 - 5
src/main/java/com/qmrb/system/service/impl/UserServiceImpl.java

@@ -14,7 +14,6 @@ import com.qmrb.system.pojo.vo.UserInfo;
 import com.qmrb.system.pojo.vo.WxLoginVO;
 import com.qmrb.system.service.ToolWxConfigService;
 import com.qmrb.system.service.UserService;
-import com.qmrb.system.utils.QRCodeUtil;
 import com.qmrb.system.utils.WxPayUtil;
 import com.qmrb.system.wxpayback.Enum.WxApiType;
 import lombok.extern.slf4j.Slf4j;
@@ -22,7 +21,6 @@ import org.apache.commons.codec.binary.Base64;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import javax.imageio.ImageIO;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -32,7 +30,6 @@ import java.net.URLConnection;
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.UUID;
 
 /**
  * <p>
@@ -117,7 +114,7 @@ public class UserServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     }
 
     @Override
-    public String getCouponQRCode(ToolWxConfig conf, String key) {
+    public String getCouponQRCode(ToolWxConfig conf, String key, String redisKey) {
         String token =  getWxAccessToken(conf);
         //获取当前的openid
         // Map hashMap = new HashMap();
@@ -161,7 +158,7 @@ public class UserServiceImpl extends ServiceImpl<OrderMapper, Order> implements
             out = new PrintWriter(conn.getOutputStream());
             // 发送请求参数
             JSONObject jsonObject = new JSONObject();
-            jsonObject.put("scene", "contractId=" + key); //参数自定义
+            jsonObject.put("scene", key + "=" + redisKey); //参数自定义
             jsonObject.put("page","pages/index/index");//要生成小程序码的链接
             jsonObject.put("width",300);
             jsonObject.put("env_version", conf.getEnvVersion());

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

@@ -68,6 +68,8 @@ auth:
     ttl: 86400000
     # 客商领券二维码有效期
     overDue: 900
+    # 取车二维码有效期(秒)
+    fetchVehicleTime: 180
 
 # MinIO 分布式文件系统
 minio:
@@ -176,6 +178,6 @@ pickCarProducer:
   tags: push
   
   
-default_qrcode_login_url: http://mini.qmrb.net:9990/#/receive-coupon
+default_qrcode_login_url: mini.qmrb.net:9990/#/coupon
 # 是否开启抵扣
-deductionSwitch: false
+deductionSwitch: true

+ 3 - 1
src/main/resources/application-prod.yml

@@ -66,6 +66,8 @@ auth:
     ttl: 86400000
     # 客商领券二维码有效期
     overDue: 900
+    # 取车二维码有效期(秒)
+    fetchVehicleTime: 180
 
 # MinIO 分布式文件系统
 minio:
@@ -174,6 +176,6 @@ pickCarProducer:
   tags: push
   
   
-default_qrcode_login_url: http://mini.qmrb.net:9990/#/receive-coupon
+default_qrcode_login_url: mini.qmrb.net:9990/#/coupon
 # 是否开启抵扣
 deductionSwitch: false