zhongrj
2023-10-13 73190db49cf5112d8594e6a5ec48783c83eb1a90
短信发送告警导入 excel 手机号接口新增
5 files modified
1 files added
160 ■■■■■ changed files
skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/sms/entity/SmsTemplate.java 2 ●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/controller/SmsController.java 41 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/excel/SendSmsExcel.java 22 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/mapper/SmsTemplateMapper.xml 3 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/SmsService.java 11 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/impl/SmsServiceImpl.java 81 ●●●●● patch | view | raw | blame | history
skjcmanager/skjcmanager-service-api/skjcmanager-alerts-api/src/main/java/cn/gistack/alerts/sms/entity/SmsTemplate.java
@@ -69,7 +69,7 @@
    private String remark;
    /**
     * 短信类型
     * 短信类型(登录,告警,,,)
     */
    @ApiModelProperty(value = "短信类型")
    private Integer smsType;
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/controller/SmsController.java
@@ -8,21 +8,28 @@
import cn.gistack.alerts.sms.entity.SmsRequest;
import cn.gistack.alerts.sms.entity.SmsResult;
import cn.gistack.alerts.sms.excel.SendRainSmsExcel;
import cn.gistack.alerts.sms.excel.SendSmsExcel;
import cn.gistack.alerts.sms.listener.ExcelListener;
import cn.gistack.alerts.sms.service.SmsService;
import cn.gistack.alerts.sms.util.SmsUtils;
import cn.gistack.alerts.sms.vo.SmsRequestTemplate;
import cn.gistack.alerts.sms.vo.SmsResponseVO;
import cn.gistack.sm.intelligentCall.excel.CallExcel;
import cn.gistack.system.user.entity.User;
import cn.gistack.system.user.feign.IUserClient;
import com.alibaba.excel.EasyExcel;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.excel.util.ExcelUtil;
import org.springblade.core.redis.cache.BladeRedis;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@@ -222,4 +229,38 @@
        // 导入并返回
        return R.data(smsService.batchSendSms(map));
    }
    /**
     * 导入表格发送预警短信
     * @param file excel文件
     * @param templateId 模板id
     * @param param 通用参数
     * @param content 发送内容
     * @return
     */
    @PostMapping("/import-send-sms")
    public R importSendSms(MultipartFile file,String templateId,String param,String content){
        ExcelListener<SendSmsExcel> listener = new ExcelListener<>();
        //headRowNumber(1)从第2行开始读取,使用getDatas()方法取出数据
        try {
            EasyExcel.read(file.getInputStream(), SendSmsExcel.class, listener).headRowNumber(1).sheet(0).doRead();
        } catch (IOException e) {
            e.printStackTrace();
        }
        List<SendSmsExcel> list = listener.getDatas();
        // 导入并返回
        return R.data(smsService.importSendSms(list,templateId,param,content));
    }
    /**
     * 导出模板
     */
    @GetMapping("/export-template")
    @ApiOperation(value = "导出模板")
    public void exportTemplate(HttpServletResponse response) {
        List<SendSmsExcel> list = new ArrayList<>();
        ExcelUtil.export(response, "短信发送数据模板", "短信发送数据表", list, SendSmsExcel.class);
    }
}
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/excel/SendSmsExcel.java
New file
@@ -0,0 +1,22 @@
package cn.gistack.alerts.sms.excel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.Data;
import java.io.Serializable;
@Data
@ColumnWidth(25)
@HeadRowHeight(20)
@ContentRowHeight(18)
public class SendSmsExcel implements Serializable {
    private static final long serialVersionUID = 1L;
    @ColumnWidth(15)
    @ExcelProperty("手机号码")
    private String phone;
}
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/mapper/SmsTemplateMapper.xml
@@ -17,6 +17,9 @@
        <if test="smsTemplate.type!=null and smsTemplate.type!=''">
            and type = #{smsTemplate.type}
        </if>
        <if test="smsTemplate.smsType!=null">
            and sms_type = #{smsTemplate.smsType}
        </if>
        <if test="smsTemplate.noticeMode!=null and smsTemplate.noticeMode!=''">
            and notice_mode = #{smsTemplate.noticeMode}
        </if>
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/SmsService.java
@@ -7,6 +7,7 @@
import cn.gistack.alerts.sms.entity.SmsRequest;
import cn.gistack.alerts.sms.entity.SmsResult;
import cn.gistack.alerts.sms.excel.SendRainSmsExcel;
import cn.gistack.alerts.sms.excel.SendSmsExcel;
import cn.gistack.alerts.sms.vo.SmsRequestTemplate;
import cn.gistack.alerts.sms.vo.SmsResponseVO;
@@ -105,4 +106,14 @@
     * @return
     */
    Object batchSendSms(Map<String, Object> map);
    /**
     * 导入表格发送预警短信
     * @param list 集合数据
     * @param templateId 模板id
     * @param param 通用参数
     * @param content 发送内容
     * @return
     */
    Object importSendSms(List<SendSmsExcel> list,String templateId,String param, String content);
}
skjcmanager/skjcmanager-service/skjcmanager-alerts/src/main/java/cn/gistack/alerts/sms/service/impl/SmsServiceImpl.java
@@ -18,6 +18,7 @@
import cn.gistack.alerts.sms.entity.SmsResult;
import cn.gistack.alerts.sms.entity.SmsTemplate;
import cn.gistack.alerts.sms.excel.SendRainSmsExcel;
import cn.gistack.alerts.sms.excel.SendSmsExcel;
import cn.gistack.alerts.sms.service.ISmsRecordService;
import cn.gistack.alerts.sms.service.ISmsResultService;
import cn.gistack.alerts.sms.service.ISmsTemplateService;
@@ -27,12 +28,14 @@
import cn.gistack.alerts.sms.vo.SmsResponseVO;
import cn.gistack.alerts.sms.vo.Temp;
import cn.gistack.sm.intelligentCall.entity.CallNotFillRecord;
import cn.gistack.sm.intelligentCall.excel.CallExcel;
import cn.gistack.sm.intelligentCall.feign.OutCallClient;
import cn.gistack.sm.message.entity.MessageRecord;
import cn.gistack.sm.sjztmd.feign.IAttResManagePersonClient;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import org.jetbrains.annotations.NotNull;
import org.springblade.core.redis.cache.BladeRedis;
import org.springblade.core.secure.utils.AuthUtil;
@@ -980,4 +983,82 @@
        // 返回
        return batchSendSmsMap;
    }
    /**
     * 导入表格发送预警短信
     * @param list 集合数据
     * @param templateId 模板id
     * @param param 通用参数
     * @param content 发送内容
     * @return
     */
    @Override
    public Object importSendSms(List<SendSmsExcel> list,String templateId,String param, String content) {
        // 查询短信模板
        SmsTemplate smsTemplate = smsTemplateService.getOne(new QueryWrapper<SmsTemplate>().eq("template_id", templateId));
        // 判断模板是否为具名变量模板(目前已筛选出都是具名变量模板)
        // 判断模板中是否包含参数,如果无参数,对比是否传参数
        boolean validate = validatorParam(smsTemplate,param);
        if (!validate){
            return R.data(400,"参数个数不对应,请检查后修改导入!",null);
        }
        // 转换
        List<String> stringList = list.stream().map(SendSmsExcel::getPhone).collect(Collectors.toList());
        // 获取水库个数
        List<String> errPhones = new ArrayList<>();
        // 去重
        Set<String> hashSet = new HashSet<>(stringList);
        // 拼接短信标题数组
        String [] titleArr = getSmsTitleArr(smsTemplate);
        // 批量发送不能超过1000 个号码,需分组发送
        List<String> arrayList = new ArrayList<>(hashSet);
        List<List<String>> partition = Lists.partition(arrayList, 1000);
        int i = 0;
        String errMsg = "";
        for (List<String> phoneList : partition) {
            HashSet<String> sets = new HashSet<>(phoneList);
            // 批量发送短信
            Map<String, Object> batchSendSmsMap = batchSendSms(sets, titleArr, param, smsTemplate,errPhones);
            // 取出发送结果
            ComResult<DynSMSSendDataResult> resultComResult = (ComResult<DynSMSSendDataResult>) batchSendSmsMap.get("resultComResult");
            //
            if(!resultComResult.getCode().equals(0)){
                i++;
                errMsg = resultComResult.getMsg();
                break;
            }
        }
        if (i>0){
            // 返回resultComResult
            return R.data(400,"发送失败!" + errMsg,null);
        }
        // 返回resultComResult
        return R.data(200,"发送成功!",null);
    }
    /**
     * 校验参数
     * @param smsTemplate
     * @param param
     */
    private boolean validatorParam(SmsTemplate smsTemplate, String param) {
        int length = 0;
        if (null!= param && !param.equals("")) {
            length = Arrays.asList(param.split(",")).size();
        }
        // 解析模板
        String str = smsTemplate.getContent().replaceAll("\\{.+?\\}", "%s");
        int countChar = countChar(str, '%');
        if (length==countChar){
            return true;
        }else {
            return false;
        }
    }
    public int countChar(String str, char target) {
        String targetStr = String.valueOf(target);
        String replacedStr = str.replaceAll(targetStr, "");
        return str.length() - replacedStr.length();
    }
}