| 
					
				 | 
			
			
				@ -2,11 +2,35 @@ package com.yihu.jw.business.sms.service; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.base.sms.BaseSmsDO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.business.sms.dao.SmsDao; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.business.sms.vo.SMSHttpVo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.exception.ApiException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.base.mysql.query.BaseJpaService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.restmodel.common.Envelop; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.restmodel.common.base.BaseEnvelop; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.util.common.SmsValidateCodeUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.util.date.DateUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.util.http.HttpClientUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import com.yihu.jw.vo.ValidateCode; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.apache.http.NameValuePair; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.apache.http.message.BasicNameValuePair; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.json.JSONObject; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.beans.factory.annotation.Autowired; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.beans.factory.annotation.Value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.data.domain.Page; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.data.domain.PageRequest; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.data.domain.Sort; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.stereotype.Service; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.transaction.annotation.Transactional; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.util.LinkedMultiValueMap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.util.MultiValueMap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import org.springframework.web.client.RestTemplate; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.text.ParseException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.text.SimpleDateFormat; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.time.LocalDateTime; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.util.ArrayList; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.util.Date; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				import java.util.List; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 * Created by chenweida on 2017/5/22. 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@ -15,16 +39,153 @@ import org.springframework.transaction.annotation.Transactional; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				public class SmsService  extends BaseJpaService<BaseSmsDO, SmsDao> { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private SmsDao smsDao; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private HttpClientUtil httpClientUtil; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    private SMSHttpVo smsHttpVo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//    @Transactional 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//    public BaseSmsDO createSms(BaseSmsDO sms) throws ApiException { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//        return smsDao.save(sms); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//    @Transactional 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//    public BaseSmsDO updateSms(BaseSmsDO sms) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//        return smsDao.save(sms); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * 发送验证码(不走权限判断,包括:注册、找回密码) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param mobile 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param ip 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @param type 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     * @throws Exception 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    @Transactional 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public BaseSmsDO createSms(BaseSmsDO sms) throws ApiException { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public BaseEnvelop send(String mobile, String ip, int type,String saasId) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        // 1、同一手机一天不允许超过5条短信 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //1.1获取一天的开始和结束时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        String today = DateUtil.getStringDateShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        Date begin = DateUtil.strToDate(today + " 00:00:00", DateUtil.YYYY_MM_DD_HH_MM_SS); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        Date end = DateUtil.strToDate(today + " 23:59:59", DateUtil.YYYY_MM_DD_HH_MM_SS); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        int smsCount = smsDao.countByMobile(mobile,begin,end); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if(smsCount>=5){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            return Envelop.getError("您的验证码次数已用完,请明天再尝试!",-1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        // 2、60秒之内不允许重复发送 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//        PageRequest pageRequest = new PageRequest(0, 1, new Sort(Sort.Direction.DESC, "id")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        List<BaseSmsDO> page = smsDao.findByMobileType(mobile,type,saasId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if (page.size()>0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//            for (BaseSmsDO sms : page) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//                if (sms == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//                    continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                // 计算间隔时间 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                Date temp = DateUtil.getNextMin(page.get(0).getCreateTime(), 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                long leftTime = (temp.getTime() - System.currentTimeMillis()) / 1000; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if (leftTime > 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    return BaseEnvelop.getError("发送短信验证码间隔时间为:60秒!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //3、生成验证码 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        ValidateCode vc = SmsValidateCodeUtils.generate(6,1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return smsDao.save(sms); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //4、保存验证码(1微信端注册,2微信端找回密码,3医生端找回密码,4患者登录,5医生登录) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        BaseSmsDO sms = new BaseSmsDO(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        sms.setMobile(mobile); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        sms.setIp(ip); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        sms.setType(type); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        sms.setCaptcha(vc.getCode()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        switch (type){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            case 1:sms.setContent("您的注册验证码为:"+vc.getCode());break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            case 2:sms.setContent("您找回密码验证码为:"+vc.getCode());break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            case 3:sms.setContent("您找回密码验证码为:"+vc.getCode());break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        sms.setDeadline(s.parse(vc.getCreateTimeString())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        sms.setStatus(1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        sms.setSaasId(saasId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        //5、 调用发送信息的接口 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//        String result = httpClientUtil.post(smsHttpVo.getUrl(), buildSmsParams(sms.getContent(), mobile), "GBK"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//        JSONObject json = toJson(result); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//        if (json == null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//            // 发送失败 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//            return BaseEnvelop.getError("短信接口请求失败!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//        } else if (json.getInt("result") != 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//            return BaseEnvelop.getError(json.getString("description")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//            //发送成功,保存到数据库 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        smsDao.save(sms); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        if(smsCount>=2&&smsCount<=5){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           return  BaseEnvelop.getSuccess("今日可重发验证码剩余"+(5-smsCount)+"次,请尽快完成验证。!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return BaseEnvelop.getSuccess("验证码发送成功!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    @Transactional 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public BaseSmsDO updateSms(BaseSmsDO sms) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return smsDao.save(sms); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    //封装发送短信的参数 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public  List<NameValuePair> buildSmsParams(String content, String mobile) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        List<NameValuePair> params = new ArrayList<NameValuePair>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        params.add(new BasicNameValuePair("SpCode", smsHttpVo.getCode())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        params.add(new BasicNameValuePair("LoginName", smsHttpVo.getName())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        params.add(new BasicNameValuePair("Password", smsHttpVo.getPassword())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        params.add(new BasicNameValuePair("MessageContent", content)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        params.add(new BasicNameValuePair("UserNumber", mobile)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        params.add(new BasicNameValuePair("SerialNumber", String.valueOf(System.currentTimeMillis()))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        params.add(new BasicNameValuePair("ScheduleTime", "")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        params.add(new BasicNameValuePair("f", "1")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return params; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    //校验验证码是否正确 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public Envelop checkSms(String mobile,String saasId,int type,String captcha){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        PageRequest pageRequest = new PageRequest(0, 1, new Sort(Sort.Direction.DESC, "id")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        List<BaseSmsDO> page = smsDao.findByMobileType(mobile,type,saasId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//        if (page != null) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//            for (BaseSmsDO sms : page) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                BaseSmsDO sms = page.get(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                String toCaptcha = sms.getCaptcha(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                Date deadline = sms.getDeadline(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if(new Date().before(deadline)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    //对比校验码是否正确 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    if(captcha.equals(toCaptcha)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        Envelop.getSuccess("验证码校验成功!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                        return Envelop.getError("验证码错误!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                }else{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    //过期 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    return Envelop.getError("验证码过期!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				//        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return Envelop.getError("未发送验证码!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    //解析短信返回的json数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    public JSONObject toJson(String result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        JSONObject json = new JSONObject(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            String[] temps = result.split("&"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            for (String temp : temps) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                if (temp.split("=").length != 2) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                String key = temp.split("=")[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                String value = temp.split("=")[1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                json.put(key, value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } catch (Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            e.printStackTrace(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				        return json; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				} 
			 |