郑永安
2023-06-19 2fcd97552d16718cc7997629fd637a73a5a4483f
src/main/java/com/gk/firework/Scheduls/WarningTask/MessageSendTask.java
对比新文件
@@ -0,0 +1,317 @@
package com.gk.firework.Scheduls.WarningTask;
import com.alibaba.fastjson.JSONObject;
import com.gk.firework.Domain.*;
import com.gk.firework.Domain.Utils.HttpUtils;
import com.gk.firework.Domain.Utils.StringUtils;
import com.gk.firework.Domain.Vo.WarnContentVo;
import com.gk.firework.Service.*;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.*;
@Configuration
@EnableScheduling
@ConditionalOnProperty(prefix = "scheduling",name = "enabled",havingValue = "true")
public class MessageSendTask {
    private Logger logger = LogManager.getLogger(MessageSendTask.class);
    @Autowired
    SmsLogService smsLogService;
    @Autowired
    WarnContentService warnContentService;
    @Autowired
    SaleOrderService saleOrderInfoService;
    @Autowired
    EnterpriseService enterpriseService;
    @Autowired
    UserService userService;
    @Autowired
    RegisterService registerService;
    public static String key = "f89279278b739f972ed922fa708eafa0";
    public final static String URL = "http://v.juhe.cn/sms/send";
    @Scheduled(cron = "0/5 * * * * ?") //每隔5秒执行一次
    private void EmailSend() throws UnsupportedEncodingException, InterruptedException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date now = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(now);
        calendar.add(Calendar.MINUTE, -10);
        Date starttime = calendar.getTime();
        String starttimeStr = sdf.format(starttime);
        String endtimeStr = sdf.format(now);
        //查询10分钟内需要发短信,但又没发送过的记录
        List<WarnContentVo> warnContentInfoList = warnContentService.selectNeedMail(starttimeStr,endtimeStr);
        if (warnContentInfoList.size() > 0) {
            for (WarnContentVo warnContentInfo : warnContentInfoList){
                if (warnContentInfo.getWarntype().equals("购买超量")){
                    Long enterpriseid = saleOrderInfoService.selectByCustomer(warnContentInfo.getCustomid());
                    List<String> mobiles = selectMobilesByEnterprise(enterpriseid);
                    String content = "姓名:"+warnContentInfo.getPurchasename()+",身份证号:"+warnContentInfo.getIdcard()+" "+warnContentInfo.getWarncontent();
                    String head = "";
                    boolean issend = sendMessage(head,mobiles,content);
                    if (issend){
                        warnContentInfo.setIssend((byte)1);
                        warnContentService.updateById(warnContentInfo);
                    }
                }else if (warnContentInfo.getWarntype().equals("库存超量")){
                    List<String> mobiles = selectMobilesByEnterprise(warnContentInfo.getEnterpriseid());
                    String content = "企业名称:"+warnContentInfo.getEnterprisename()+","+warnContentInfo.getWarncontent();
                    String head = "";
                    boolean issend = sendMessage(head,mobiles,content);
                    if (issend){
                        warnContentInfo.setIssend((byte)1);
                        warnContentService.updateById(warnContentInfo);
                    }
                }
            }
        }
    }
    @Scheduled(cron = "0/5 * * * * ?") //每隔5秒执行一次
    private void registerEmailSend() throws UnsupportedEncodingException {
        List<RegisterInfo> registerInfos = registerService.needSendSmsList();
        if (registerInfos.size() > 0){
            for (RegisterInfo registerInfo : registerInfos){
                String tplId;
                if (registerInfo.getReviewresult().equals((byte)1)){
                    tplId = "235091";
                }else {
                    tplId = "235094";
                }
                boolean isSend = sendSms(registerInfo.getEnterprisename(),registerInfo.getLegalpersonphone(),tplId);
                if (isSend){
                    registerInfo.setSmsat(new Date());
                    registerInfo.setSmstimes(registerInfo.getSmstimes()+1);
                    registerInfo.setIssms((byte)1);
                    registerService.updateById(registerInfo);
                }
            }
        }
    }
//    private boolean issendTest = false;
//    @Scheduled(cron = "0/5 * * * * ?") //每隔5秒执行一次
//    private void EmailSendTest() throws UnsupportedEncodingException, InterruptedException {
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        Date now = new Date();
//        Calendar calendar = Calendar.getInstance();
//        calendar.setTime(now);
//        calendar.add(Calendar.MINUTE, -10);
//        Date starttime = calendar.getTime();
//
//        List<String> mobiles = new ArrayList<>();
//        mobiles.add("15651251027");
//        String content = "测试短信";
//        String head = "";
//        if (!issendTest){
//            issendTest = sendMessage(head,mobiles,content);
//        }
//    }
    private List<String> selectMobilesByEnterprise(Long enterpriseid) {
        List<String> mobiles = new ArrayList<> ();
        //先查直属监管部门,若不存在则再查上一级,直到查到对应监管部门用户
        Enterprise enterprise = enterpriseService.getById(enterpriseid);
        UserInfo userInfo = userService.selectSupervise(enterprise.getProvince(),enterprise.getCity(),enterprise.getDistrict(),enterprise.getStreet(),enterprise.getCommittee());
        if (userInfo == null){
            userInfo = userService.selectSupervise(enterprise.getProvince(),enterprise.getCity(),enterprise.getDistrict(),enterprise.getStreet(),null);
            if (userInfo == null){
                userInfo = userService.selectSupervise(enterprise.getProvince(),enterprise.getCity(),enterprise.getDistrict(),null,null);
                if (userInfo == null){
                    userInfo = userService.selectSupervise(enterprise.getProvince(),enterprise.getCity(),null,null,null);
                    if (userInfo == null){
                        userInfo = userService.selectSupervise(enterprise.getProvince(),null,null,null,null);
                        if (userInfo == null){
                            userInfo = userService.selectSupervise(null,null,null,null,null);
                        }
                    }
                }
            }
        }
        if (userInfo != null && StringUtils.isNotBlank(userInfo.getMobile())){
            mobiles.add(userInfo.getMobile());
        }
        return mobiles;
    }
    public Boolean sendMessage(String head,List<String> mobiles,String content) throws UnsupportedEncodingException {
        String url ="http://v.juhe.cn/sms/send";//请求接口地址
        String tpl_id = "231913";
        String dtype = "json";
        String tpl_value = "#name#=" + head + "&#code#=" + content;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat sdfstart = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
        SimpleDateFormat sdfend = new SimpleDateFormat("yyyy-MM-dd 23:59:59");
        Date now = new Date();
        String starttime  = sdfstart.format(now);
        String endtime = sdfend.format(now);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(now);
        calendar.add(Calendar.HOUR_OF_DAY, -1);
        Date onehour = calendar.getTime();
        String onehourstart = sdf.format(onehour);
        String onehourend = sdf.format(now);
        boolean issend = false;
        for (String mobile : mobiles) {
            /**运营商限制同1个号码同1个签名的内容1分钟内只能接收1条,10分钟3条,1小时内4条,一天20条,否则可能会被运营商屏蔽**/
            SmsLogInfo smsLogInfo = smsLogService.selectByTel(mobile,starttime,endtime,(byte)2);
            if (null != smsLogInfo && smsLogInfo.getTimes()>=20){
                logger.error("手机号:" + mobile + ",在时间为" + sdf.format(now) + ",当天已发出20条,无法继续发送");
                continue;
            }
            SmsLogInfo smsLogInfoHour = smsLogService.selectByTel(mobile,onehourstart,onehourend,(byte)1);
            if (null != smsLogInfoHour && smsLogInfoHour.getTimes()>=4){
                logger.error("手机号:" + mobile + ",在时间为" + sdf.format(now) + ",本小时已发出4条,无法继续发送");
                continue;
            }
            String respnse = null;
            Map params = new HashMap();//请求参数
            params.put("mobile", mobile);//接收短信的手机号码
            params.put("tpl_id", tpl_id);//短信模板ID,请参考个人中心短信模板设置
            params.put("tpl_value", tpl_value);
            params.put("key", key);//应用APPKEY(应用详细页查询)
            params.put("dtype", dtype);//返回数据的格式,xml或json,默认json
            try {
                respnse = HttpUtils.net(url, params, "GET");
                JSONObject jsonResult = JSONObject.parseObject(respnse);
                String errorcode = jsonResult.getString("error_code");
                String reason = jsonResult.getString("reason");
                if (errorcode.equals("0")) {
                    //增加发送次数
                    JSONObject result = jsonResult.getJSONObject("result");
                    Integer count = result.getInteger("count");
                    if (null !=  smsLogInfo){
                        smsLogInfo.setTimes(smsLogInfo.getTimes()+count);
                        smsLogService.updateById(smsLogInfo);
                    }else {
                        SmsLogInfo smsLogInfo1 = new SmsLogInfo();
                        smsLogInfo1.setMobile(mobile);
                        smsLogInfo1.setSendtime(now);
                        smsLogInfo1.setTimes(count);
                        smsLogInfo1.setType((byte)2);
                        smsLogService.save(smsLogInfo1);
                    }
                    issend = true;
                    if (null !=  smsLogInfoHour){
                        smsLogInfoHour.setTimes(smsLogInfoHour.getTimes()+count);
                        smsLogService.updateById(smsLogInfoHour);
                    }else {
                        SmsLogInfo smsLogInfo1 = new SmsLogInfo();
                        smsLogInfo1.setMobile(mobile);
                        smsLogInfo1.setSendtime(now);
                        smsLogInfo1.setTimes(count);
                        smsLogInfo1.setType((byte)1);
                        smsLogService.save(smsLogInfo1);
                    }
                } else {
                    logger.error("手机号:" + mobile + ",在时间为" + sdf.format(now) + "发送短信失败,原因为:" + reason);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return issend;
    }
    public Boolean sendSms(String head, String mobile, String tplId) throws UnsupportedEncodingException {
        String dtype = "json";
        String tplValue = "#name#=" + head;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat sdfstart = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
        SimpleDateFormat sdfend = new SimpleDateFormat("yyyy-MM-dd 23:59:59");
        Date now = new Date();
        String starttime  = sdfstart.format(now);
        String endtime = sdfend.format(now);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(now);
        calendar.add(Calendar.HOUR_OF_DAY, -1);
        Date onehour = calendar.getTime();
        String onehourstart = sdf.format(onehour);
        String onehourend = sdf.format(now);
        boolean isSend = false;
        /** 运营商限制同1个号码同1个签名的内容1分钟内只能接收1条,10分钟3条,1小时内4条,一天20条,否则可能会被运营商屏蔽 **/
        SmsLogInfo smsLogInfo = smsLogService.selectByTel(mobile,starttime,endtime,(byte)2);
        if (null != smsLogInfo && smsLogInfo.getTimes()>= 20){
            logger.error("手机号:" + mobile + ",在时间为" + sdf.format(now) + ",当天已发出20条,无法继续发送");
            return false;
        }
        SmsLogInfo smsLogInfoHour = smsLogService.selectByTel(mobile,onehourstart,onehourend,(byte)1);
        if (null != smsLogInfoHour && smsLogInfoHour.getTimes()>= 4){
            logger.error("手机号:" + mobile + ",在时间为" + sdf.format(now) + ",本小时已发出4条,无法继续发送");
            return false;
        }
        String response;
        Map params = new HashMap();//请求参数
        params.put("mobile", mobile);//接收短信的手机号码
        params.put("tpl_id", tplId);//短信模板ID,请参考个人中心短信模板设置
        params.put("tpl_value", tplValue);
        params.put("key", key);//应用APPKEY(应用详细页查询)
        params.put("dtype", dtype);//返回数据的格式,xml或json,默认json
        try {
            response = HttpUtils.net(URL, params, "GET");
            JSONObject jsonResult = JSONObject.parseObject(response);
            String errorcode = jsonResult.getString("error_code");
            String reason = jsonResult.getString("reason");
            if (errorcode.equals("0")) {
                //增加发送次数
                JSONObject result = jsonResult.getJSONObject("result");
                Integer count = result.getInteger("count");
                if (null !=  smsLogInfo){
                    smsLogInfo.setTimes(smsLogInfo.getTimes()+count);
                    smsLogService.updateById(smsLogInfo);
                }else {
                    SmsLogInfo smsLogInfo1 = new SmsLogInfo();
                    smsLogInfo1.setMobile(mobile);
                    smsLogInfo1.setSendtime(now);
                    smsLogInfo1.setTimes(count);
                    smsLogInfo1.setType((byte)2);
                    smsLogService.save(smsLogInfo1);
                }
                isSend = true;
                if (null !=  smsLogInfoHour){
                    smsLogInfoHour.setTimes(smsLogInfoHour.getTimes()+count);
                    smsLogService.updateById(smsLogInfoHour);
                }else {
                    SmsLogInfo smsLogInfo1 = new SmsLogInfo();
                    smsLogInfo1.setMobile(mobile);
                    smsLogInfo1.setSendtime(now);
                    smsLogInfo1.setTimes(count);
                    smsLogInfo1.setType((byte)1);
                    smsLogService.save(smsLogInfo1);
                }
            } else {
                logger.error("手机号:" + mobile + ",在时间为" + sdf.format(now) + "发送短信失败,原因为:" + reason);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return isSend;
    }
}