Переглянути джерело

团客手机号报到功能开发

baiyun 1 рік тому
батько
коміт
1fac3dbe94

+ 1 - 1
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/Constants.java

@@ -65,7 +65,7 @@ public interface Constants {
     /**
      * 验证码有效期(分钟)
      */
-    Integer CAPTCHA_EXPIRATION = 2;
+    Integer CAPTCHA_EXPIRATION = 5;
 
     /**
      * 令牌

+ 61 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/SmsUtils.java

@@ -0,0 +1,61 @@
+package org.dromara.common.core.utils;
+
+import cn.hutool.http.HttpRequest;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+
+/**
+ * @author Hz
+ * @date 2024/11/27
+ * @description 短信平台工具类
+ */
+@Slf4j
+public class SmsUtils {
+
+    public static final String PHONE_CODE_PREFIX = "PhoneCode_";
+
+    @Value("sms.swdx.url")
+    private static String url = "http://172.16.137.85:9023";
+    @Value("sms.swdx.user")
+    private static String user = "jw";
+    @Value("sms.swdx.pwd")
+    private static String pwd = "jw@Swdx20220414";
+
+    public static Boolean send(String phones, String content) {
+        boolean flag = false;
+        String sendUrl = url + "/sms/api/v1/send";
+        String token = getToken();
+
+        if(StringUtils.isNotBlank(token)){
+            String body = "{\"mobile\":\"" + phones + "\",\"message\":\"" + content + "\"}";
+            String res = HttpRequest.post(sendUrl)
+                .header("token", token)
+                .body(body)
+                .execute().body();
+            JSONObject resJson = JSONObject.parseObject(res);
+            flag = resJson.getBoolean("success");
+        }
+        return flag;
+    }
+
+    /** 获取短信平台token*/
+    private static String getToken() {
+        String token = "";
+        try {
+            String loginUrl = url + "/sms/api/v1/login";
+            String res = HttpRequest.post(loginUrl)
+                .body("{\"name\":\"" + user + "\",\"pwd\":\"" + pwd + "\"}")
+                .execute().body();
+            JSONObject body = JSONObject.parseObject(res);
+            if(body.getBoolean("success")){
+                token = body.getString("data");
+            }
+        }catch (Exception e) {
+            log.error("获取token异常!", e);
+        }
+
+        return token;
+    }
+
+}

+ 14 - 2
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/controller/KfOrderController.java

@@ -2,6 +2,7 @@ package org.dromara.hotel.controller;
 
 import java.util.List;
 
+import cn.hutool.core.util.RandomUtil;
 import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
@@ -133,16 +134,27 @@ public class KfOrderController extends BaseController {
     }
 
     /**
-     * 团客报到
+     * 团客身份证报到
      */
     @SaCheckPermission("business:guestOrder:edit")
-    @Log(title = "团客报到", businessType = BusinessType.UPDATE)
+    @Log(title = "身份证报到", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping("teamGuestCheckIn")
     public R<Void> teamGuestCheckIn(@RequestBody KfTeamGuestVo vo) {
         return toAjax(kfOrderService.teamGuestCheckIn(vo));
     }
 
+    /**
+     * 手机号报到
+     */
+    @SaCheckPermission("business:guestOrder:edit")
+    @Log(title = "手机号报到", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping("phoneCodeCheckIn")
+    public R<Void> phoneCodeCheckIn(@RequestBody KfTeamGuestVo vo) {
+        return kfOrderService.phoneCheckIn(vo.getPhone(), vo.getPhoneCode());
+    }
+
     /**
      * 退房|取消预定
      */

+ 1 - 0
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/domain/vo/KfTeamGuestVo.java

@@ -57,6 +57,7 @@ public class KfTeamGuestVo implements Serializable {
      */
     @ExcelProperty(value = "手机号")
     private String phone;
+    private String phoneCode;
 
     private String teamName;
     private Long teamId;

+ 3 - 1
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/IKfOrderService.java

@@ -9,7 +9,6 @@ import org.dromara.hotel.domain.bo.KfGuestBo;
 import org.dromara.hotel.domain.bo.KfOrderBo;
 import org.dromara.hotel.domain.vo.KfOrderVo;
 import org.dromara.hotel.domain.vo.KfTeamGuestVo;
-import org.dromara.hotel.domain.vo.OrderAndGuestVo;
 
 import java.util.Collection;
 import java.util.List;
@@ -75,6 +74,9 @@ public interface IKfOrderService {
 
     Boolean teamGuestCheckIn(KfTeamGuestVo bo);
 
+    /** 手机号码报到*/
+    R<Void> phoneCheckIn(String phone, String phoneCode);
+
     /** 修改订单信息和房间状态*/
     Boolean updateOrderAndRoomStatus(KfOrderBo bo);
     /**

+ 27 - 4
ruoyi-modules/ruoyi-hotel/src/main/java/org/dromara/hotel/service/impl/KfOrderServiceImpl.java

@@ -3,20 +3,20 @@ package org.dromara.hotel.service.impl;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.collection.ListUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.RandomUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
-import org.dromara.common.core.constant.CacheNames;
+import org.dromara.common.core.constant.*;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.dromara.backstage.api.RemotePtRoomService;
-import org.dromara.common.core.constant.DefaultConstants;
-import org.dromara.common.core.constant.HotelBusinessConstants;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.enums.HotelRoomStatusEnum;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.SmsUtils;
 import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
@@ -36,6 +36,7 @@ import org.dromara.hotel.service.IKfTeamService;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.time.Duration;
 import java.util.*;
 import java.util.concurrent.LinkedBlockingQueue;
 
@@ -53,7 +54,6 @@ public class KfOrderServiceImpl implements IKfOrderService {
 
     private final KfOrderMapper baseMapper;
     private final IKfTeamService teamService;
-    private final KfGuestMapper guestMapper;
     private final IKfGuestTeamRService guestTeamService;
 
     /**
@@ -272,6 +272,29 @@ public class KfOrderServiceImpl implements IKfOrderService {
         return flag;
         }
 
+    @Override
+    public R<Void> phoneCheckIn(String phone, String phoneCode) {
+        //1.校验验证码
+        if(RedisUtils.isExistsObject(SmsUtils.PHONE_CODE_PREFIX + phone)){
+            if(RedisUtils.getCacheObject(SmsUtils.PHONE_CODE_PREFIX + phone).equals(phoneCode)){
+                //2.根据手机号查询团客信息
+                KfGuestBo guestBo = new KfGuestBo();
+                guestBo.setPhone(phone);
+                R<KfTeamGuestVo> teamGuestVoR = getTeamGuestCheckInfo(guestBo);
+                //3.报到
+                if(teamGuestCheckIn(teamGuestVoR.getData())){
+                    return R.ok();
+                }else {
+                    return R.fail("报到失败");
+                }
+            } else {
+                return R.fail("验证码错误");
+            }
+        }else {
+            return R.fail("验证码错误");
+        }
+    }
+
     @Override
     public Boolean updateOrderAndRoomStatus(KfOrderBo bo) {
         if(ObjectUtil.isNotEmpty(bo)){

+ 15 - 0
ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysSmsController.java

@@ -8,6 +8,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.constant.Constants;
 import org.dromara.common.core.constant.GlobalConstants;
 import org.dromara.common.core.domain.R;
+import org.dromara.common.core.utils.SmsUtils;
 import org.dromara.common.ratelimiter.annotation.RateLimiter;
 import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.common.web.core.BaseController;
@@ -58,4 +59,18 @@ public class SysSmsController extends BaseController {
         return R.ok();
     }
 
+    /** 调用省委党校短信平台发送短信验证码*/
+    @RateLimiter(key = "#phone", time = 60, count = 1)
+    @GetMapping("/sendPhoneCode")
+    public R<Object> sendPhoneCode(String phone)  {
+        String key = "PhoneCode_" + phone;
+        String code = RandomUtil.randomNumbers(4);
+        RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
+        String content = "您的验证码为:" + code + ",有效性为" + Constants.CAPTCHA_EXPIRATION + "分钟,请尽快填写。";
+        boolean flag = SmsUtils.send(phone, content);
+        if (!flag) {
+            return R.fail("验证码短信发送异常,请稍后重试!");
+        }
+        return R.ok();
+    }
 }

+ 4 - 0
ruoyi-modules/ruoyi-system/pom.xml

@@ -141,6 +141,10 @@
             <artifactId>ruoyi-common-message</artifactId>
             <version>${revision}</version>
         </dependency>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-ratelimiter</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 42 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysSmsController.java

@@ -0,0 +1,42 @@
+package org.dromara.system.controller.system;
+
+import cn.hutool.core.util.RandomUtil;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.constant.Constants;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.utils.SmsUtils;
+import org.dromara.common.ratelimiter.annotation.RateLimiter;
+import org.dromara.common.redis.utils.RedisUtils;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.Duration;
+
+/**
+ * @author Hz
+ * @date 2024/11/27
+ * @description 短信发送
+ */
+
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/sms")
+public class SysSmsController {
+
+    /** 调用省委党校短信平台发送短信验证码*/
+    @RateLimiter(key = "#phone", time = 60, count = 1)
+    @GetMapping("/sendPhoneCode")
+    public R<Object> sendPhoneCode(String phone)  {
+        String key = SmsUtils.PHONE_CODE_PREFIX + phone;
+        String code = RandomUtil.randomNumbers(4);
+        RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
+        String content = "您的验证码为:" + code + ",有效性为" + Constants.CAPTCHA_EXPIRATION + "分钟,请尽快填写。";
+        boolean flag = SmsUtils.send(phone, content);
+        if (!flag) {
+            return R.fail("验证码短信发送异常,请稍后重试!");
+        }
+        return R.ok();
+    }
+}