zhongrj
2023-06-06 5777aa66d1e16b7d8c99589aac55035b4346cc89
新增降雨告警短信发送接口
9 files modified
220 ■■■■ changed files
skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/sms/entity/SmsRecord.java 41 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/controller/SmsController.java 16 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/controller/SmsRecordController.java 3 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/mapper/SmsRecordMapper.java 7 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/mapper/SmsRecordMapper.xml 23 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/ISmsRecordService.java 12 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/SmsService.java 9 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/impl/SmsRecordServiceImpl.java 16 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/impl/SmsServiceImpl.java 93 ●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/sms/entity/SmsRecord.java
@@ -1,6 +1,10 @@
package cn.gistack.alerts.sms.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel;
@@ -9,16 +13,26 @@
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springblade.core.tenant.mp.TenantEntity;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
 * 短信发送记录
 * @author Administrator
 */
@Data
@TableName("sm_sms_record")
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value = "sm_sms_record对象", description = "短信发送记录")
public class SmsRecord extends TenantEntity {
public class SmsRecord{
    @JsonSerialize(using = ToStringSerializer.class)
    @ApiModelProperty("主键id")
    @TableId(value = "id", type = IdType.ASSIGN_ID)
    private Long id;
    /**
     * 模板id
     */
@@ -30,12 +44,6 @@
     */
    @ApiModelProperty(value = "手机号")
    private String tel;
    /**
     * 手机号(废弃)
     */
    @ApiModelProperty(value = "手机号(废弃)")
    private String phone;
    /**
     * 消息内容
@@ -62,10 +70,25 @@
    private String responseMsg;
    /**
     * 响应消息
     * 发送结果ID
     */
    @ApiModelProperty(value = "响应消息")
    @ApiModelProperty(value = "发送结果ID")
    @JsonSerialize(using = ToStringSerializer.class)
    private Long resultId;
    @JsonSerialize(using = ToStringSerializer.class)
    @ApiModelProperty("创建人")
    private Long createUser;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty("创建时间")
    private Date createTime;
    @ApiModelProperty("业务状态")
    private Integer status;
    @TableLogic
    @ApiModelProperty("是否已删除")
    private Integer isDeleted;
}
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/controller/SmsController.java
@@ -19,6 +19,7 @@
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static cn.gistack.common.cache.CacheNames.PHONE_KEY;
@@ -72,7 +73,7 @@
    /**
     * 短信动态内容发送通用方法(仅支持 具名变量 {手机号码:11} 模式的模板)
     * request 必须包含手机号,模板id,拼接好的内容
     * request
     * @param smsRequest
     * @return
     */
@@ -254,7 +255,7 @@
    /**
     * 发送 具名 变量模板短信
     * 发送 具名 变量模板短信(告警定制)
     * @param smsRequest 发送对象
     * @return
     */
@@ -262,4 +263,15 @@
    public R sendSignMsg(@RequestBody SmsRequestTemplate smsRequest){
        return R.data(smsService.sendSignMsg(smsRequest));
    }
    /**
     * 发送降雨短信
     * @param params 发送对象
     * @return
     */
    @PostMapping("/sendSignRainMsg")
    public R sendSignRainMsg(@RequestBody Map<String,Object> params){
        return R.data(smsService.sendSignRainMsg(params));
    }
}
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/controller/SmsRecordController.java
@@ -8,7 +8,6 @@
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.boot.ctrl.BladeController;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
@@ -26,7 +25,7 @@
@RestController
@RequestMapping("/smsRecord/smsRecord")
@AllArgsConstructor
public class SmsRecordController extends BladeController {
public class SmsRecordController{
   private ISmsRecordService smsRecordService;
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/mapper/SmsRecordMapper.java
@@ -21,4 +21,11 @@
     * @return
     */
    List<SmsRecordVO> selectSmsRecordPage(IPage<SmsRecordVO> page,@Param("smsRecord") SmsRecordVO smsRecord);
    /**
     * 批量插入记录
     * @param list
     * @return
     */
    int batchSaveSendRecord(@Param("list") List<SmsRecord> list);
}
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/mapper/SmsRecordMapper.xml
@@ -5,8 +5,8 @@
    <!--自定义分页列表查询-->
    <select id="selectSmsRecordPage" resultType="cn.gistack.alerts.sms.vo.SmsRecordVO">
        select * from sm_sms_record where 1=1 and is_deleted = 0
        <if test="smsRecord.phone!=null and smsRecord.phone!=''">
            and phone like concat(concat('%',#{smsRecord.phone}),'%')
        <if test="smsRecord.tel!=null and smsRecord.tel!=''">
            and tel like concat(concat('%',#{smsRecord.tel}),'%')
        </if>
        <if test="smsRecord.content!=null and smsRecord.content!=''">
            and content like concat(concat('%',#{smsRecord.content}),'%')
@@ -17,4 +17,23 @@
        order by id desc
    </select>
    <!--批量新增-->
    <insert id="batchSaveSendRecord"
            parameterType="cn.gistack.alerts.sms.entity.SmsRecord" useGeneratedKeys="true" keyProperty="id">
        insert into sm_sms_record
        (id,template_id,tel,content,response_status,response_msg,result_id,is_deleted,create_time)
        <foreach collection="list" item="item" index="index" separator=",">
            (
            #{item.id},
            #{item.templateId},
            #{item.tel},
            #{item.content},
            #{item.responseStatus},
            #{item.responseMsg},
            #{item.resultId},
            0,now()
            )
        </foreach>
    </insert>
</mapper>
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/ISmsRecordService.java
@@ -3,9 +3,11 @@
import cn.gistack.alerts.sms.entity.SmsRecord;
import cn.gistack.alerts.sms.vo.SmsRecordVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseService;
import com.baomidou.mybatisplus.extension.service.IService;
public interface ISmsRecordService extends BaseService<SmsRecord> {
import java.util.List;
public interface ISmsRecordService extends IService<SmsRecord> {
    /**
     * 自定义分页列表查询
@@ -14,4 +16,10 @@
     * @return
     */
    Object selectSmsRecordPage(IPage<SmsRecordVO> page, SmsRecordVO smsRecord);
    /**
     * 批量插入记录
     * @param list
     */
    int batchSaveSendRecord(List<SmsRecord> list);
}
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/SmsService.java
@@ -25,7 +25,7 @@
                     List<String> phoneNumbers);
    /**
     * 发送 具名 变量模板短信
     * 发送 具名 变量模板短信 (告警定制)
     * @param smsRequestTemplate
     * @return
     */
@@ -55,4 +55,11 @@
     * @return
     */
    Map<String, Object> saveInStationInfo(SmsRequestTemplate smsRequestTemplate);
    /**
     * 发送降雨短信
     * @param params 发送对象
     * @return
     */
    Object sendSignRainMsg(Map<String, Object> params);
}
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/impl/SmsRecordServiceImpl.java
@@ -5,15 +5,17 @@
import cn.gistack.alerts.sms.service.ISmsRecordService;
import cn.gistack.alerts.sms.vo.SmsRecordVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseServiceImpl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * 短信发送记录
 * @author zhongrj
 */
@Service
public class SmsRecordServiceImpl extends BaseServiceImpl<SmsRecordMapper, SmsRecord> implements ISmsRecordService {
public class SmsRecordServiceImpl extends ServiceImpl<SmsRecordMapper, SmsRecord> implements ISmsRecordService {
    /**
     * 自定义分页列表查询
@@ -30,4 +32,14 @@
        // 查询返回
        return page.setRecords(baseMapper.selectSmsRecordPage(page,smsRecord));
    }
    /**
     * 批量插入记录
     * @param list
     * @return
     */
    @Override
    public int batchSaveSendRecord(List<SmsRecord> list) {
        return baseMapper.batchSaveSendRecord(list);
    }
}
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/impl/SmsServiceImpl.java
@@ -15,10 +15,14 @@
import cn.gistack.alerts.sms.service.SmsService;
import cn.gistack.alerts.sms.util.SmsUtils;
import cn.gistack.alerts.sms.vo.SmsRequestTemplate;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import org.springblade.core.tool.api.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * 短信发送服务实现层
@@ -65,7 +69,7 @@
    }
    /**
     * 发送 具名 变量模板短信
     * 发送 具名 变量模板短信(告警定制)
     * @param smsRequestTemplate
     * @return
     */
@@ -194,12 +198,34 @@
    }
    /**
     * 发送 具名 变量模板短信--批量一次发送
     * @param title 具名变量头
     * 发送降雨短信--批量一次发送
     * @param params 具名变量头
     * @return
     */
    public Object sendSignMsg(String title, String datas, SMSSendRequest request, Integer type, SmsTemplate smsTemplate) {
        String[] titleArr = title.split(",");
    @Override
    public Object sendSignRainMsg(Map<String, Object> params) {
        String[] titleArr = params.get("title").toString().split(",");
        String data = params.get("data").toString();
        String templateId = params.get("templateId").toString();
        String content = params.get("content").toString();
        List<String> phones = (List<String>)params.get("phones");
        List<String> errPhones = new ArrayList<>();
        // 手机号去重
        Set<String> hashSet = new HashSet<>();
        for (String phone : phones) {
            hashSet.add(phone);
        }
        StringBuilder builder = new StringBuilder();
        // 变量
        for (String phone : hashSet) {
            if (validator(phone)){
                builder.append(phone+","+data).append(";");
            }else {
                // 异常手机号
                errPhones.add(phone);
            }
        }
        String datas = builder.toString();
        String[] rows = datas.split(";");
        String[][] dyns = new String[rows.length + 1][titleArr.length];
        dyns[0] = titleArr;
@@ -210,22 +236,45 @@
        }
        //请求参数
        DynSMSSendRequest sendRequest = new DynSMSSendRequest();
        sendRequest.setTemplateId(request.getTemplateId());
        sendRequest.setTemplateId(templateId);
        sendRequest.setDynData(dyns);
        // 发送
        ComResult<DynSMSSendDataResult> resultComResult = SmsUtils.dynSendMethod(sendRequest);
        SMSSendRequest request = new SMSSendRequest();
        request.setTemplateId(templateId);
        request.setMessageContent(content);
        request.setUserNumber("");
        // 先保存结果记录
        SmsResult smsResult = saveSendResult(request, rows.length);
        SmsRecord smsRecord = new SmsRecord();
        if (null != smsResult){
            // 保存记录
            smsRecord = saveSendRecord(request, resultComResult.getCode().toString(), resultComResult.getMsg(), smsResult.getId());
            List<SmsRecord> list = new ArrayList<>();
            // 遍历保存
            for (String phone : hashSet) {
                SmsRecord smsRecord = new SmsRecord();
                smsRecord.setId(IdWorker.getId());
                smsRecord.setTel(phone);
                smsRecord.setContent(content);
                smsRecord.setTemplateId(templateId);
                smsRecord.setResultId(smsResult.getId());
                smsRecord.setResponseStatus(resultComResult.getCode().toString());
                smsRecord.setResponseMsg(resultComResult.getMsg());
                // 加入集合
                list.add(smsRecord);
            }
            // 批量保存记录
            smsRecordService.batchSaveSendRecord(list);
        }
        Map<String, Object> map = new HashMap<>(2);
        map.put("smsRecord",smsRecord);
        map.put("smsResult",smsResult);
        Integer diff = phones.size() - hashSet.size();
        if (resultComResult.getCode()==0){
            String successMsg = "发送成功!共提交号码 "+phones.size()+" 个,其中重复号码 "+diff+" 个,错误号码 "
                +errPhones.size()+" 个,发送成功号码 "+ hashSet.size() + " 个。";
            // 返回
            return R.data(200,successMsg,null);
        }
        String errorMsg = "发送失败!共提交号码 "+phones.size()+" 个,其中重复号码 "+diff+" 个,错误号码 "+errPhones.size()+
            " 个,发送异常号码 "+ hashSet.size()+" 个,异常原因" + resultComResult.getMsg() + "。";
        // 返回
        return map;
        return R.data(400,errorMsg,null);
    }
@@ -274,5 +323,23 @@
        return smsRecord;
    }
    /**
     * 校验手机号码
     */
    public static boolean validator(String phone) {
        if (null!=phone && !phone.equals("")) {
            String regex = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$";
            if (phone.length() != 11) {
                return false;
            } else {
                Pattern p = Pattern.compile(regex);
                Matcher m = p.matcher(phone);
                boolean isMatch = m.matches();
                return isMatch;
            }
        }
        return false;
    }
}