Prechádzať zdrojové kódy

20220716 v1.0 可上线

lifuquan 2 rokov pred
rodič
commit
49b078caf3

+ 67 - 0
src/main/java/com/nokia/common/http/R.java

@@ -0,0 +1,67 @@
+package com.nokia.common.http;
+
+import lombok.Data;
+
+/**
+ * 接口返回值的统一封装
+ */
+@Data
+public class R {
+    private Boolean success;
+    private Integer code;
+    private String message;
+
+    private Object data = null;
+
+    /**
+     * 私有化构造方法,不允许在外部实例化
+     */
+    private R() {
+    }
+
+    /**
+     * 成功的静态方法
+     *
+     * @return R实例
+     */
+    public static R ok() {
+        R r = new R();
+        r.setSuccess(true);
+        r.setCode(200);
+        r.setMessage("成功");
+        return r;
+    }
+
+    /**
+     * 失败的静态方法
+     *
+     * @return R实例
+     */
+    public static R error() {
+        R r = new R();
+        r.setSuccess(false);
+        r.setCode(500);
+        r.setMessage("失败");
+        return r;
+    }
+
+    public R success(Boolean success) {
+        this.setSuccess(success);
+        return this;
+    }
+
+    public R code(Integer code) {
+        this.setCode(code);
+        return this;
+    }
+
+    public R data(Object object) {
+        this.setData(object);
+        return this;
+    }
+
+    public R message(String message) {
+        this.setMessage(message);
+        return this;
+    }
+}

+ 84 - 1
src/main/java/com/nokia/sms/controller/SmsController.java

@@ -1,10 +1,93 @@
 package com.nokia.sms.controller;
 
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import com.nokia.common.http.R;
+import com.nokia.sms.pojo.Sms;
+import com.nokia.sms.service.SgipSmsService;
+import com.nokia.sms.service.UserService;
+import com.nokia.sms.vo.MultiNumberSms;
+import com.nokia.sms.vo.SingleNumberSms;
+
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
 @RestController
 @RequestMapping("/api/sms")
 public class SmsController {
-    
+
+    private final SgipSmsService smsService;
+    private final UserService userService;
+
+    public SmsController(SgipSmsService sgipSmsService, UserService userService) {
+        this.smsService = sgipSmsService;
+        this.userService = userService;
+    }
+
+    @PostMapping("sendByPhoneNumber")
+    public R sendByPhoneNumber(@RequestBody SingleNumberSms singleNumberSms) {
+        log.debug("sendByPhoneNumber收到入参: {}", singleNumberSms);
+        if ((null == singleNumberSms.getPhoneNumber()) || ("".equals(singleNumberSms.getPhoneNumber()))) {
+            return R.error().message("phoneNumber不能为空");
+        }
+        Sms sms = new Sms(singleNumberSms);
+        return send(sms);
+    }
+
+    @PostMapping("sendByPhoneNumbers")
+    public R sendByPhoneNumbers(@RequestBody MultiNumberSms multiNumberSms) {
+        log.debug("sendByPhoneNumbers收到入参: {}", multiNumberSms);
+        if ((null == multiNumberSms.getPhoneNumbers()) || (multiNumberSms.getPhoneNumbers().length == 0)) {
+            return R.error().message("phoneNumbers不能为空");
+        }
+        Sms sms = new Sms(multiNumberSms);
+        return send(sms);
+    }
+
+    @PostMapping("sendByLoginName")
+    public R sendByLoginName(@RequestBody SingleNumberSms singleNumberSms) {
+        log.debug("sendByLoginName收到入参: {}", singleNumberSms);
+        if ((null == singleNumberSms.getLoginName()) || ("".equals(singleNumberSms.getLoginName()))) {
+            return R.error().message("loginName不能为空");
+        }
+        String phoneNumber = userService.getPhoneNumberByLoginName(singleNumberSms.getLoginName());
+        if ((null == phoneNumber) || ("".equals(phoneNumber))) {
+            return R.error().message("用户 " + singleNumberSms.getLoginName() + " 未预留手机号码...");
+        }
+        Sms sms = new Sms(singleNumberSms);
+        sms.setPhoneNumbers(new String[] { phoneNumber });
+        return send(sms);
+    }
+
+    @PostMapping("sendByLoginNames")
+    public R sendByLoginNames(@RequestBody MultiNumberSms multiNumberSms) {
+        log.debug("sendByLoginName收到入参: {}", multiNumberSms);
+        if ((null == multiNumberSms.getLoginNames()) || (multiNumberSms.getLoginNames().length == 0)) {
+            return R.error().message("loginName不能为空");
+        }
+        String[] phoneNumbers = new String[multiNumberSms.getLoginNames().length];
+        for (int i = 0; i < phoneNumbers.length; i++) {
+            String phoneNumber = userService.getPhoneNumberByLoginName(multiNumberSms.getLoginNames()[i]);
+            if ((null == phoneNumber) || ("".equals(phoneNumber))) {
+                return R.error().message("用户 " + multiNumberSms.getLoginNames()[i] + " 未预留手机号码...");
+            }
+            phoneNumbers[i] = phoneNumber;
+        }
+        Sms sms = new Sms(multiNumberSms);
+        sms.setPhoneNumbers(phoneNumbers);
+        return send(sms);
+    }
+
+    private R send(Sms sms) {
+        String result = smsService.sendMessage(sms);
+        log.debug("发送结果----{}", result);
+        if ("成功".equals(result)) {
+            return R.ok();
+        } else {
+            return R.error().message(sms.getStatus());
+        }
+    }
 }

+ 11 - 0
src/main/java/com/nokia/sms/dao/UserDao.java

@@ -0,0 +1,11 @@
+package com.nokia.sms.dao;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+@Mapper
+public interface UserDao {
+
+    @Select("select phone from sqmdb_rpt.acl_user where login_name = #{loginName}")
+    String getPhoneNumberByLoginName(String loginName);
+}

+ 27 - 0
src/main/java/com/nokia/sms/pojo/Sms.java

@@ -1,6 +1,10 @@
 package com.nokia.sms.pojo;
 
 import java.util.Date;
+
+import com.nokia.sms.vo.MultiNumberSms;
+import com.nokia.sms.vo.SingleNumberSms;
+
 import lombok.Data;
 
 @Data
@@ -17,4 +21,27 @@ public class Sms {
     private String result;
     private Date sendTime;
     private String status;
+
+    public Sms() {
+    }
+
+    public Sms(MultiNumberSms sms) {
+        this.fromSystem = sms.getFromSystem();
+        this.loginNames = sms.getLoginNames();
+        this.phoneNumbers = sms.getPhoneNumbers();
+        this.content = sms.getContent();
+        this.scheduleTime = sms.getScheduleTime();
+        this.smsType = sms.getSmsType();
+        this.internalId = sms.getInternalId();
+    }
+
+    public Sms(SingleNumberSms sms) {
+        this.fromSystem = sms.getFromSystem();
+        this.loginNames = new String[] { sms.getLoginName() };
+        this.phoneNumbers = new String[] { sms.getPhoneNumber() };
+        this.content = sms.getContent();
+        this.scheduleTime = sms.getScheduleTime();
+        this.smsType = sms.getSmsType();
+        this.internalId = sms.getInternalId();
+    }
 }

+ 5 - 5
src/main/java/com/nokia/sms/service/SgipSmsService.java

@@ -23,8 +23,8 @@ public class SgipSmsService {
         this.smsDao = smsDao;
     }
 
-    public boolean sendMessage(Sms sms) {
-        log.info("准备发送短信: {}", sms);
+    public String sendMessage(Sms sms) {
+        log.debug("准备发送短信: {}", sms);
         sms.setId(UUID.randomUUID().toString());
         sms.setSendTime(new Date());
         try {
@@ -32,17 +32,17 @@ public class SgipSmsService {
             MTClient client = MTClient.getInstance();
             // 发送短信
             SendResult[] results = client.sendMessage(sms.getPhoneNumbers(), sms.getContent(), sms.getScheduleTime());
-            log.info("短信已成功发送, 发送结果: {}", Arrays.toString(results));
+            log.debug("短信已成功发送, 发送结果: {}", Arrays.toString(results));
             // 销毁应用
             client.dispose();
             sms.setResult(Arrays.toString(results));
             sms.setStatus("已发送到短信网关");
-            return true;
+            return "成功";
         } catch (Exception e) {
             log.error("短信发送失败, 短信: {}, 错误信息: {}", sms, e.getMessage());
             sms.setStatus("发送到短信网关失败");
             e.printStackTrace();
-            return false;
+            return sms.getStatus();
         } finally {
             smsDao.insert(sms);
         }

+ 19 - 0
src/main/java/com/nokia/sms/service/UserService.java

@@ -0,0 +1,19 @@
+package com.nokia.sms.service;
+
+import org.springframework.stereotype.Service;
+
+import com.nokia.sms.dao.UserDao;
+
+@Service
+public class UserService {
+
+    private final UserDao userDao;
+
+    public UserService(UserDao userDao) {
+        this.userDao = userDao;
+    }
+
+    public String getPhoneNumberByLoginName(String loginName) {
+        return userDao.getPhoneNumberByLoginName(loginName);
+    }
+}

+ 3 - 1
src/main/java/com/nokia/sms/vo/MultiNumberSms.java

@@ -1,14 +1,16 @@
 package com.nokia.sms.vo;
 
 import java.util.Date;
-
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
 @Data
 public class MultiNumberSms {
     private String fromSystem;
+    private String[] loginNames;
     private String[] phoneNumbers;
     private String content;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date scheduleTime;
     private String smsType;
     private String internalId;

+ 4 - 0
src/main/java/com/nokia/sms/vo/SingleNumberSms.java

@@ -2,13 +2,17 @@ package com.nokia.sms.vo;
 
 import java.util.Date;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
+
 import lombok.Data;
 
 @Data
 public class SingleNumberSms {
     private String fromSystem;
+    private String loginName;
     private String phoneNumber;
     private String content;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date scheduleTime;
     private String smsType;
     private String internalId;

+ 1 - 0
src/main/resources/application.properties

@@ -1,5 +1,6 @@
 server.port=12080
 
+logging.level.com.nokia=debug
 logging.file.name=logs/sms_server.log
 
 # 正式环境数据源GP数据库配置

+ 2 - 4
src/test/com/nokia/sms/service/SmsServiceTest.java

@@ -19,8 +19,7 @@ public class SmsServiceTest {
         Sms sms = new Sms();
         sms.setPhoneNumbers(new String[] { "13231899751", "18631181961", "18031151219", "15633560090", "15996582933" });
         sms.setContent("这是一条测试短信--" + new Date());
-        boolean b = service.sendMessage(sms);
-        System.out.println(b);
+        System.out.println(service.sendMessage(sms));
     }
 
     // 测试定时发送
@@ -32,7 +31,6 @@ public class SmsServiceTest {
         sms.setContent("这是一条测试短信--" + new Date());
         // 5分钟后发送
         sms.setScheduleTime(new Date(System.currentTimeMillis() + 5 * 60 * 1000));
-        boolean b = service.sendMessage(sms);
-        System.out.println(b);
+        System.out.println(service.sendMessage(sms));
     }
 }

+ 106 - 11
短信网关接口说明.md

@@ -2,29 +2,124 @@
 
 入参说明:
 fromSystem  来源系统,按照约定传固定值 如 tousuliucheng
-phone 手机号
-message  短信内容文本
+loginName 登录用户名, loginName和phoneNumber不能全为空
+phoneNumber 手机号
+content  短信内容文本
+scheduleTime 定时发送,传空字符串或者省略表示即时发送
 messageType  各系统自行定义的消息类型,仅用于记录
 internalId  系统内编号,可以考虑群发使用相同编号
 
+群发时如果出现多个号码相同,只会发1次
+
+- sendByPhoneNumber 1
+
+```http
+Post http://127.0.0.1:12080/api/sms/sendByPhoneNumber
+Content-Type: application/json
+
+{
+  "fromSystem": "ceshi",
+  "phoneNumber": "13231899751",
+  "content": "这是一条测试短信,请忽略...",
+  "scheduleTime": "2022-07-16 22:30:00",
+  "smsType": "test",
+  "internalId": "000001"
+}
+```
+
+- sendByPhoneNumber 2
+
+```http
+Post http://127.0.0.1:12080/api/sms/sendByPhoneNumber
+Content-Type: application/json
+
+{
+  "fromSystem": "ceshi",
+  "phoneNumber": "13231899751",
+  "content": "这是一条测试短信,请忽略...",
+  "scheduleTime": "",
+  "smsType": "test",
+  "internalId": "000001"
+}
+```
+
+- sendByPhoneNumber 3
+
 ```http
-http://192.168.70.125:12080/api/sms/send
+Post http://127.0.0.1:12080/api/sms/sendByPhoneNumber
 Content-Type: application/json
 
 {
-  "fromSystem": "tousuliucheng",
-  "phone": "13231899751",
-  "message": "这是一条短信",
-  "messageType": "催单",
-  "internalId": "内部编号"
+  "fromSystem": "ceshi",
+  "phoneNumber": "13231899751",
+  "content": "这是一条测试短信,请忽略...",
+  "smsType": "test",
+  "internalId": "000001"
 }
 ```
 
+- sendByPhoneNumbers
+
+phoneNumbers 表示手机号码的字符串数组
+
+```http
+Post http://127.0.0.1:12080/api/sms/sendByPhoneNumbers
+Content-Type: application/json
+
+{
+  "fromSystem": "ceshi",
+  "phoneNumbers": ["13231899751", "15633560090", "16673135227"],
+  "content": "这是一条测试短信,请忽略...",
+  "smsType": "test",
+  "internalId": "000001"
+}
+```
+
+- sendByLoginName
+
+```http
+Post http://127.0.0.1:12080/api/sms/sendByLoginName
+Content-Type: application/json
+
+{
+  "fromSystem": "ceshi",
+  "loginName": "test_shijiazhuang",
+  "content": "这是一条测试短信,请忽略...",
+  "smsType": "test",
+  "internalId": "000001"
+}
+```
+
+- sendByLoginNames
+
+```http
+Post http://127.0.0.1:12080/api/sms/sendByLoginNames
+Content-Type: application/json
+
+{
+  "fromSystem": "ceshi",
+  "loginNames": ["test_shijiazhuang", "test_hengshui"],
+  "content": "这是一条测试短信,请忽略...sendByLoginNames",
+  "smsType": "test",
+  "internalId": "000001"
+}
+```
+
+- 正常返回值
+
 ```json
+HTTP/1.1 200 
+Content-Type: application/json
+Transfer-Encoding: chunked
+Date: Sat, 16 Jul 2022 14:05:24 GMT
+Connection: close
+
 {
-    "code": 200,
-    "success": true,
-    "message": "成功"
+  "success": true,
+  "code": 200,
+  "message": "成功",
+  "data": null
 }
+
 ```