diff --git a/WebContent/Tenwa/Lease/App/Interface/Message/LBSmsNoticeTasksList.jsp b/WebContent/Tenwa/Lease/App/Interface/Message/LBSmsNoticeTasksList.jsp index 5a5c95822..ca995f85d 100644 --- a/WebContent/Tenwa/Lease/App/Interface/Message/LBSmsNoticeTasksList.jsp +++ b/WebContent/Tenwa/Lease/App/Interface/Message/LBSmsNoticeTasksList.jsp @@ -1,103 +1,113 @@ -<%@ page contentType="text/html; charset=GBK"%> -<%@ include file="/Frame/resources/include/include_begin_list.jspf"%><% - /* +<%@ page contentType="text/html; charset=GBK" %> +<%@ include file="/Frame/resources/include/include_begin_list.jspf" %> +<% + /* Author: undefined 2017-08-01 Content: History Log: */ - ASObjectModel doTemp = new ASObjectModel("LBSmsNoticeTasksList"); - doTemp.setDataQueryClass("com.amarsoft.awe.dw.ui.list.FlowMonitorListHtmlGenerator"); - CurPage.setAttribute("flowRowCount","100"); - ASObjectWindow dwTemp = new ASObjectWindow(CurPage,doTemp,request); - dwTemp.Style="1"; //--设置为Grid风格-- - dwTemp.ReadOnly = "1"; //只读模式 - dwTemp.MultiSelect = true; - dwTemp.setPageSize(pageSize==null?10:Integer.parseInt(pageSize)); - dwTemp.genHTMLObjectWindow(""); + ASObjectModel doTemp = new ASObjectModel("LBSmsNoticeTasksList"); + doTemp.setDataQueryClass("com.amarsoft.awe.dw.ui.list.FlowMonitorListHtmlGenerator"); + CurPage.setAttribute("flowRowCount", "100"); + ASObjectWindow dwTemp = new ASObjectWindow(CurPage, doTemp, request); + dwTemp.Style = "1"; //--设置为Grid风格-- + dwTemp.ReadOnly = "1"; //只读模式 + dwTemp.MultiSelect = true; + dwTemp.setPageSize(pageSize == null ? 10 : Integer.parseInt(pageSize)); + dwTemp.genHTMLObjectWindow(""); - //0、是否展示 1、 权限控制 2、 展示类型 3、按钮显示名称 4、按钮解释文字 5、按钮触发事件代码 6、 7、 8、 9、图标,CSS层叠样式 10、风格 - String sButtons[][] = { - {"true","","Button","新增","新增","newRecord()","","","","btn_icon_add",""}, - {"true","","Button","修改","修改","viewAndEdit()","","","","btn_icon_set",""}, - {"true","","Button","删除","删除","doDelete()","","","","btn_icon_delete",""}, - {"true","","Button","立即发送","立即发送","sendMessage()","","","","btn_icon_message",""}, - {"true","","Button","余额查询","余额查询","doSelect()","","","","btn_icon_information",""} - }; -%><%@include file="/Frame/resources/include/ui/include_list.jspf"%> + //0、是否展示 1、 权限控制 2、 展示类型 3、按钮显示名称 4、按钮解释文字 5、按钮触发事件代码 6、 7、 8、 9、图标,CSS层叠样式 10、风格 + String sButtons[][] = { + {"true", "", "Button", "新增", "新增", "newRecord()", "", "", "", "btn_icon_add", ""}, + {"true", "", "Button", "修改", "修改", "viewAndEdit()", "", "", "", "btn_icon_set", ""}, + {"true", "", "Button", "删除", "删除", "doDelete()", "", "", "", "btn_icon_delete", ""}, + {"true", "", "Button", "立即发送", "立即发送", "sendMessage()", "", "", "", "btn_icon_message", ""}, + {"true", "", "Button", "余额查询(普通)", "查询普通短信余额", "doSelect('01')", "", "", "", "btn_icon_information", ""}, + {"true", "", "Button", "余额查询(催收)", "查询催收短信余额", "doSelect('02')", "", "", "", "btn_icon_information", ""} + }; +%> +<%@include file="/Frame/resources/include/ui/include_list.jspf" %> -<%@ include file="/Frame/resources/include/include_end.jspf"%> \ No newline at end of file +<%@ include file="/Frame/resources/include/include_end.jspf" %> \ No newline at end of file diff --git a/WebContent/WEB-INF/etc/jbo/jbo_oti.xml b/WebContent/WEB-INF/etc/jbo/jbo_oti.xml index 69ec4224f..8e0608513 100644 --- a/WebContent/WEB-INF/etc/jbo/jbo_oti.xml +++ b/WebContent/WEB-INF/etc/jbo/jbo_oti.xml @@ -651,5 +651,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WebContent/WEB-INF/lib/SmsSdk-5.7.jar b/WebContent/WEB-INF/lib/SmsSdk-5.7.jar new file mode 100644 index 000000000..e2a3c8e2c Binary files /dev/null and b/WebContent/WEB-INF/lib/SmsSdk-5.7.jar differ diff --git a/WebContent/WEB-INF/web.xml b/WebContent/WEB-INF/web.xml index 34e2f133a..570d63cfa 100644 --- a/WebContent/WEB-INF/web.xml +++ b/WebContent/WEB-INF/web.xml @@ -121,6 +121,15 @@ 1 + + SmsRptServlet + com.ample.sms.SmsRptServlet + + DataSource + als + + + RewriteRunJavaMethodServlet com.tenwa.workflow.RewriteRunJavaMethodServlet @@ -298,6 +307,11 @@ /servlet/runflow + + SmsRptServlet + /smsRpt + + DocDownloadZipServlet /servlet/view/docDownloadZipServlet diff --git a/config/sms.properties b/config/sms.properties new file mode 100644 index 000000000..75fca3435 --- /dev/null +++ b/config/sms.properties @@ -0,0 +1,11 @@ +userid=JU9237 +pwd=507237 +ipAddress1=172.28.1.59:8803 +ipAddress2= +ipAddress3= +ipAddress4= + +log_path=/data/sms/ + +urge_userid=JU9239 +urge_pwd=507237 \ No newline at end of file diff --git a/src/com/ample/sms/FileUtil.java b/src/com/ample/sms/FileUtil.java new file mode 100644 index 000000000..2b7b5c08d --- /dev/null +++ b/src/com/ample/sms/FileUtil.java @@ -0,0 +1,65 @@ +package com.ample.sms; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.util.Calendar; + +public class FileUtil { + public static final int BUFFER_SIZE = 1024; + + public FileUtil() { + } + + public static void writeFile(String fileName, String content) { + FileOutputStream fos = null; + ByteArrayInputStream bis = null; + + try { + File file = new File(fileName); + if (!file.getParentFile().exists()) { + file.getParentFile().mkdirs(); + } + + fos = new FileOutputStream(fileName, true); + bis = new ByteArrayInputStream(content.getBytes("GBK")); + byte[] buffer = new byte[BUFFER_SIZE]; + + int ch; + while((ch = bis.read(buffer)) != -1) { + fos.write(buffer, 0, ch); + } + } catch (Exception var15) { + var15.printStackTrace(); + } finally { + try { + if (bis != null) { + bis.close(); + } + + if (fos != null) { + fos.close(); + } + } catch (Exception var14) { + var14.printStackTrace(); + } + + } + + } + + public static String getCurrTime() { + try { + Calendar calendar = Calendar.getInstance(); + String yearstr = String.valueOf(calendar.get(1)); + int month = calendar.get(2) + 1; + String monthstr = month > 9 ? String.valueOf(month) : "0" + String.valueOf(month); + int day = calendar.get(5); + String daystr = day > 9 ? String.valueOf(day) : "0" + String.valueOf(day); + return yearstr + "/" + monthstr + "/" + daystr + "/"; + } catch (Exception var6) { + var6.printStackTrace(); + return ""; + } + } +} diff --git a/src/com/ample/sms/RecvMoThread.java b/src/com/ample/sms/RecvMoThread.java new file mode 100644 index 000000000..7062f9331 --- /dev/null +++ b/src/com/ample/sms/RecvMoThread.java @@ -0,0 +1,100 @@ +package com.ample.sms; + +import com.montnets.mwgate.common.MO; +import com.montnets.mwgate.smsutil.SmsSendConn; + +import java.util.ArrayList; +import java.util.List; + +/** + * 鑾峰彇涓婅鐭俊鐨勭嚎绋 + */ +public class RecvMoThread extends Thread { + + // 鐭俊澶勭悊瀵硅薄,鍦ㄨ繖涓柟娉曚腑璋冪敤鑾峰彇涓婅鍔熻兘 + private SmsSendConn smsSendConn = null; + // 鐢ㄦ埛璐﹀彿 + private String userid = null; + // 姣忔璇锋眰鎯宠鑾峰彇涓婅鐨勬渶澶ф潯鏁 + private int retsize = 0; + + /** + * 鏋勯犲嚱鏁 + * + * @param smsSendConn + * 鐭俊澶勭悊瀵硅薄 + * @param userid + * 鐢ㄦ埛璐﹀彿 + */ + public RecvMoThread(SmsSendConn smsSendConn, String userid, int retsize) { + // 鐭俊澶勭悊瀵硅薄 + this.smsSendConn = smsSendConn; + // 鐢ㄦ埛璐﹀彿 + this.userid = userid; + // 姣忔璇锋眰鎯宠鑾峰彇涓婅鐨勬渶澶ф潯鏁 + this.retsize = retsize; + } + + /** + * 鑾峰彇涓婅鐭俊绾跨▼鐨勬柟娉 + */ + public void run() { + // 涓婅闆嗗悎 鏈泦鍚堜复鏃跺瓨鍌ㄤ笂琛岋紝闇瑕佸皢鏀跺埌鐨勪笂琛屼繚瀛樺湪涓涓槦鍒椾腑锛岀敱鍙﹀涓涓嚎绋嬪幓澶勭悊銆 + List mos = new ArrayList(); + // 杩斿洖鍊 + int result = -310099; + //涓婅瀵硅薄澹版槑 + MO mo = null; + // 寰幆璋冪敤鑾峰彇涓婅鐨勬柟娉 + while (true) { + try { + // 鍒濆鍖栬繑鍥炲 + result = -310099; + // 娓呯┖涓婅闆嗗悎涓殑瀵硅薄 + mos.clear(); + // 璋冪敤鑾峰彇涓婅鎺ュ彛 + result = smsSendConn.getMo(userid, retsize, mos); + // 濡傛灉鑾峰彇涓婅鎴愬姛锛屽苟涓旀湁涓婅 + if (result == 0 && mos != null && mos.size() > 0) { + // 鏈変笂琛 + // 娣诲姞鍒颁笂琛岄槦鍒 + // add mo queue + // 杩欓噷涓嶈鍋氬鏉傜殑鑰楁椂鐨勫鐞嗭紝灏嗘敹鍒扮殑涓婅淇濆瓨鍦ㄤ竴涓槦鍒椾腑锛岀敱鍙﹀涓涓嚎绋嬪幓澶勭悊銆 + + // 浠g爜绀轰緥鏄皢涓婅淇℃伅鎵撳嵃鍑烘潵 + System.out.println("鑾峰彇涓婅鎴愬姛锛佽幏鍙栧埌鐨勪笂琛屾湁" + mos.size() + "鏉¤褰曘"); + for (int i = 0; i < mos.size(); i++) { + mo = mos.get(i); + System.out.println("涓婅璁板綍:" +"msgid:"+mo.getMsgid() + ",mobile:" + mo.getMobile()+",countrycode:"+mo.getCountrycode() + + ",pknum:"+mo.getPknum()+",pktotal:"+mo.getPktotal()+",spno:" + mo.getSpno() + + ",exno:" + mo.getExno() + ",content:" + mo.getContent()+ ",rtime:" + mo.getRtime() ); + } + + // 缁х画寰幆 + continue; + } else { + // 濡傛灉鑾峰彇涓婅澶辫触锛屽垯灏嗛敊璇爜鎵撳嵃 + if (result != 0) { + System.out.println("鑾峰彇涓婅澶辫触锛岄敊璇爜涓:" + result); + } + + // 娌℃湁涓婅锛屽欢鏃5绉掍互涓 + try { + Thread.sleep(5000L); + } catch (Exception e) { + e.printStackTrace(); + } + } + } catch (Exception e) { + e.printStackTrace(); + // 寰幆鍑虹幇寮傚父锛屾殏鍋5绉 + try { + Thread.sleep(5000L); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + } + +} diff --git a/src/com/ample/sms/RecvRptThread.java b/src/com/ample/sms/RecvRptThread.java new file mode 100644 index 000000000..b081fec15 --- /dev/null +++ b/src/com/ample/sms/RecvRptThread.java @@ -0,0 +1,103 @@ +package com.ample.sms; + +import com.montnets.mwgate.common.RPT; +import com.montnets.mwgate.smsutil.SmsSendConn; + +import java.util.ArrayList; +import java.util.List; + +/** + * 鑾峰彇鐭俊鐘舵佹姤鍛婄殑绾跨▼ + */ +public class RecvRptThread extends Thread { + + // 鐭俊澶勭悊瀵硅薄,鍦ㄨ繖涓柟娉曚腑璋冪敤鑾峰彇鐘舵佹姤鍛婂姛鑳 + private SmsSendConn smsSendConn = null; + // 鐢ㄦ埛璐﹀彿 + private String userid = null; + // 姣忔璇锋眰鎯宠鑾峰彇鐘舵佹姤鍛婄殑鏈澶ф潯鏁 + private int retsize = 0; + + /** + * 鏋勯犲嚱鏁 + * + * @param smsSendConn + * 鐭俊澶勭悊瀵硅薄 + * @param userid + * 鐢ㄦ埛璐﹀彿 + */ + public RecvRptThread(SmsSendConn smsSendConn, String userid, int retsize) { + // 鐭俊澶勭悊瀵硅薄 + this.smsSendConn = smsSendConn; + // 鐢ㄦ埛璐﹀彿 + this.userid = userid; + // 姣忔璇锋眰鎯宠鑾峰彇鐘舵佹姤鍛婄殑鏈澶ф潯鏁 + this.retsize = retsize; + } + + /** + * 鑾峰彇鐭俊鐘舵佹姤鍛婄嚎绋嬬殑鏂规硶 + */ + public void run() { + // 鐘舵佹姤鍛婇泦鍚 鏈泦鍚堜复鏃跺瓨鍌ㄧ姸鎬佹姤鍛婏紝闇瑕佸皢鏀跺埌鐨勭姸鎬佹姤鍛婁繚瀛樺湪涓涓槦鍒椾腑锛岀敱鍙﹀涓涓嚎绋嬪幓澶勭悊 + List rpts = new ArrayList(); + // 杩斿洖鍊 + int result = -310099; + //鐘舵佹姤鍛婂璞″0鏄 + RPT rpt = null; + // 寰幆璋冪敤鑾峰彇鐘舵佹姤鍛婄殑鏂规硶 + while (true) { + try { + // 鍒濆鍖栬繑鍥炲 + result = -310099; + // 娓呯┖鐘舵佹姤鍛婇泦鍚堜腑鐨勫璞 + rpts.clear(); + // 璋冪敤鑾峰彇鐘舵佹姤鍛婃帴鍙 + result = smsSendConn.getRpt(userid, retsize, rpts); + // 濡傛灉鑾峰彇鐘舵佹姤鍛婃垚鍔燂紝骞朵笖鏈夌姸鎬佹姤鍛 + if (result == 0 && rpts != null && rpts.size() > 0) { + // 鏈夌姸鎬佹姤鍛 + // 娣诲姞鍒扮姸鎬佹姤鍛婇槦鍒 + // add rpt queue + // 杩欓噷涓嶈鍋氬鏉傜殑鑰楁椂鐨勫鐞嗭紝灏嗘敹鍒扮殑鐘舵佹姤鍛婁繚瀛樺湪涓涓槦鍒椾腑锛岀敱鍙﹀涓涓嚎绋嬪幓澶勭悊銆 + + // 浠g爜绀轰緥鏄皢鐘舵佹姤鍛婁俊鎭墦鍗板嚭鏉 + System.out.println("鑾峰彇鐘舵佹姤鍛婃垚鍔燂紒鑾峰彇鍒扮殑鐘舵佹姤鍛婃湁" + rpts.size() + + "鏉¤褰曘"); + for (int i = 0; i < rpts.size(); i++) { + rpt = rpts.get(i); + System.out.println("鐘舵佹姤鍛婅褰:" +"msgid:"+rpt.getMsgid() + ",custid:" + rpt.getCustid() + ",pknum:" + rpt.getPknum() + + ",pktotal:" + rpt.getPktotal() + ",mobile:" + rpt.getMobile()+",countrycode:"+rpt.getCountrycode() + + ",spno:" + rpt.getSpno() + ",exno:" + rpt.getExno() + ",stime:" + rpt.getStime() + + ",rtime:" + rpt.getRtime() + ",status:" + rpt.getStatus() + ",errcode:" + rpt.getErrcode() + + ",errdesc:"+rpt.getErrdesc()+ ",exdata:" + rpt.getExdata()); + } + + // 缁х画寰幆 + continue; + } else { + // 濡傛灉鑾峰彇鐘舵佹姤鍛婂け璐ワ紝鍒欏皢閿欒鐮佹墦鍗 + if (result != 0) { + System.out.println("鑾峰彇鐘舵佹姤鍛婂け璐ワ紝閿欒鐮佷负:" + result); + } + + // 娌℃湁鐘舵佹姤鍛婏紝寤舵椂5绉掍互涓 + try { + Thread.sleep(5000L); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } catch (Exception e) { + e.printStackTrace(); + // 寰幆鍑虹幇寮傚父锛屾殏鍋5绉 + try { + Thread.sleep(5000L); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + } + +} diff --git a/src/com/ample/sms/SmsController.java b/src/com/ample/sms/SmsController.java new file mode 100644 index 000000000..68f0be099 --- /dev/null +++ b/src/com/ample/sms/SmsController.java @@ -0,0 +1,184 @@ +package com.ample.sms; + +import com.amarsoft.are.jbo.*; +import com.amarsoft.are.util.StringFunction; +import com.montnets.mwgate.common.Message; +import com.montnets.mwgate.common.Remains; +import com.montnets.mwgate.smsutil.SmsSendConn; +import jbo.com.tenwa.lease.comm.LB_SMS_NOTICE_TASKS; +import jbo.oti.SMS_SEND; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; + +import java.text.SimpleDateFormat; +import java.util.Date; + +public class SmsController { + private String ids; + private String smsObjType; + + private Logger logger = Logger.getLogger(this.getClass()); + private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + + public String sendMessage(JBOTransaction tx){ + try{ + // 实例化短信处理对象 + SmsSendConn smsSendConn = new SmsSendConn(true); + //将发送过来的参数按照@切分出来 + String[] smsID = ids.split("@"); + BizObjectManager bomLSNT = JBOFactory.getBizObjectManager(LB_SMS_NOTICE_TASKS.CLASS_NAME,tx); + BizObjectManager bomSS = JBOFactory.getBizObjectManager(SMS_SEND.CLASS_NAME,tx); + for(String id:smsID){ + sendMessage(smsSendConn,id,bomLSNT,bomSS); + } + }catch(Exception e){ + e.printStackTrace(); + return "ERROR"; + } + return "SUCCESS"; + } + + public void sendMessage(SmsSendConn smsSendConn,String smsId,BizObjectManager bomLSNT,BizObjectManager bomSS) throws JBOException { + BizObject boLSNT = bomLSNT.createQuery("ID=:ID").setParameter("ID", smsId).getSingleResult(true); + int resultCode = -310099; + try { + Message message = createMessageByBizObject(boLSNT); + String smsObType = boLSNT.getAttribute("SEND_OBJ_TYPE").toString(); + if(SmsObjType.URGE_COLLECTION.getType().equals(smsObType)){ + SmsSendManager.setAccountInfo(SmsObjType.URGE_COLLECTION); + }else { + SmsSendManager.setAccountInfo(SmsObjType.NORMAL); + } + StringBuffer returnValue = new StringBuffer(); + /* + 发送短信 + */ + resultCode = smsSendConn.singleSend(message, returnValue); + boLSNT = this.saveObject(boLSNT,bomSS,returnValue.toString(),resultCode); + bomLSNT.saveObject(boLSNT); + + } catch (Exception e) { + logger.error("短信发送执行失败。", e); + } + + } + public BizObject saveObject(BizObject boLSNT,BizObjectManager bomSS,String returnValue,int resultCode) throws JBOException { + String smsStatus = "未发送"; + + // result为0:成功;非0:失败 + if (resultCode == 0) { + smsStatus = "已发送"; + System.out.println("单条发送提交成功:"+returnValue); + }else { + System.out.println("单条发送提交失败,错误码:" + resultCode); + smsStatus = "未发送"; + } + + BizObject boSS = bomSS.newObject(); + boSS.setAttributeValue("MOBILE",boLSNT.getAttribute("PHONE_NUMBER").toString()); + boSS.setAttributeValue("CONTENT",boLSNT.getAttribute("SMS_CONTENT").getString()); + boSS.setAttributeValue("SMS_ID",boLSNT.getAttribute("ID").toString()); + boSS.setAttributeValue("SEND_TIME", StringFunction.getTodayNow()); + boSS.setAttributeValue("RESULT_CODE",resultCode); + boSS.setAttributeValue("MSGID",StringUtils.substringAfterLast(returnValue.toString(),",")); + boSS.setAttributeValue("SMS_OBJ_TYPE",boLSNT.getAttribute("SEND_OBJ_TYPE").getString()); + bomSS.saveObject(boSS); + + boLSNT.setAttributeValue("SMS_TYPE","IMMEDIATELY"); + boLSNT.setAttributeValue("SEND_RESULT",smsStatus); + boLSNT.setAttributeValue("SEND_TIME",sdf.format(new Date())); + boLSNT.setAttributeValue("SEND_FLAG",resultCode == 0 ? 1 : 0); + return boLSNT; + } + + public String getSmsRemains(JBOTransaction tx){ + String result = "查询失败"; + // 实例化短信处理对象 + SmsSendConn smsSendConn = new SmsSendConn(true); + SmsSendManager.setAccountInfo("02".equals(smsObjType)?SmsObjType.URGE_COLLECTION:SmsObjType.NORMAL); + // 查询余额接口。 + Remains remains = smsSendConn.getRemains(SmsPropertiesUtil.get("userid")); + + //remains不为空 + if(remains==null) + { + return result; + } + //查询成功 + if(remains.getResult()!=0) + { + //查询失败 + System.out.println("查询失败,错误码为:" + remains.getResult()); + return "查询失败,错误码为:" + remains.getResult(); + } + //计费类型为0,条数计费 + if(remains.getChargetype()==0) + { + System.out.println("查询成功,剩余条数为:" + remains.getBalance()+"条"); + return "查询成功,剩余条数为:" + remains.getBalance()+"条"; + }else if(remains.getChargetype()==1) + { + //计费类型为1,金额计费 + System.out.println("查询成功,剩余金额为:" + remains.getMoney()+"元"); + return "查询成功,剩余金额为:" + remains.getMoney()+"元"; + }else + { + System.out.println("未知的计费类型,计费类型:"+remains.getChargetype()); + return "未知的计费类型,计费类型:"+remains.getChargetype(); + } + } + + public String recvRpt(JBOTransaction tx){ + // 实例化短信处理对象 + SmsSendConn smsSendConnRpt = new SmsSendConn(true); + // 每次请求想要获取的状态报告的最大条数。 + int retsizeRpt = 100; + // 实例化状态报告线程 + String userId = "CS1156"; + SmsRecvRptThread recvRptThread = new SmsRecvRptThread(smsSendConnRpt, userId,retsizeRpt); + // 线程获取 启动获取状态报告的线程 + recvRptThread.start(); + System.out.println("获取状态报告的线程启动成功!"); + return "获取状态报告的线程启动成功!"; + } + public Message createMessageByBizObject(BizObject bo) throws JBOException { + //调用短信接口 + String phoneNo = bo.getAttribute("PHONE_NUMBER").getString(); + String smsContent = bo.getAttribute("SMS_CONTENT").getString(); + String smsId = bo.getAttribute("ID").getString(); + // 参数类 + Message message = new Message(); + // 设置用户账号 指定用户账号发送,需要填写用户账号,不指定用户账号发送,无需填写用户账号 + // message.setUserid(userid); + // 设置手机号码 此处只能设置一个手机号码 + message.setMobile(phoneNo); + // 设置内容 + message.setContent(smsContent); + // 设置扩展号为数字字符串且长度不能超过6位,注意通道号+扩展号的总长度不能超过20位,若超出exno无效,如不需要扩展号则不用提交此字段或填空 + message.setExno(""); + // 用户自定义流水编号:最大可支持64位的ASCII字符串:字母、数字、下划线、减号,如不需要则不用提交此字段或填空 + message.setCustid(""); + // 自定义扩展数据:额外提供的最大64位长度的ASCII字符串:字母、数字、下划线、减号,作为自定义扩展数据,填写后,状态报告返回时将会包含这部分数据,如不需要则不用提交此字段或填空 + message.setExdata(smsId); + // 业务类型:最大可支持32个长度的英文字母、数字组合的字符串 + message.setSvrtype(""); + return message; + } + + + public String getSmsObjType() { + return smsObjType; + } + public void setSmsObjType(String smsObjType) { + this.smsObjType = smsObjType; + } + public String getIds() { + return ids; + } + + public void setIds(String ids) { + this.ids = ids; + } + +} diff --git a/src/com/ample/sms/SmsObjType.java b/src/com/ample/sms/SmsObjType.java new file mode 100644 index 000000000..31375cce2 --- /dev/null +++ b/src/com/ample/sms/SmsObjType.java @@ -0,0 +1,24 @@ +package com.ample.sms; + +public enum SmsObjType { + + NORMAL("01","普通"), + URGE_COLLECTION("02","催收"), + MARKETING("03","营销"); + + private String type; + private String desc; + + SmsObjType(String type, String desc) { + this.type=type; + this.desc=desc; + } + + public String getDesc() { + return this.desc; + } + + public String getType() { + return this.type; + } +} diff --git a/src/com/ample/sms/SmsPropertiesUtil.java b/src/com/ample/sms/SmsPropertiesUtil.java new file mode 100644 index 000000000..a8bcc898b --- /dev/null +++ b/src/com/ample/sms/SmsPropertiesUtil.java @@ -0,0 +1,36 @@ +package com.ample.sms; + + +import java.io.IOException; +import java.util.Map; +import java.util.Properties; +import java.util.concurrent.ConcurrentHashMap; + +public class SmsPropertiesUtil { + private static Map attributes; + + public static void load() { + attributes = new ConcurrentHashMap(); + Properties prop = new Properties(); + try { + prop.load(SmsPropertiesUtil.class.getResourceAsStream("/sms.properties")); + for(Map.Entry entry : prop.entrySet()) { + if(entry.getKey() == null || entry.getValue() == null) { + continue; + } + attributes.put(entry.getKey().toString(), entry.getValue().toString()); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void destroy() { + if(attributes != null) attributes.clear(); + } + + public static String get(String propName) { + if(attributes == null) load(); + return attributes.get(propName); + } +} diff --git a/src/com/ample/sms/SmsRecvRptThread.java b/src/com/ample/sms/SmsRecvRptThread.java new file mode 100644 index 000000000..5ded868de --- /dev/null +++ b/src/com/ample/sms/SmsRecvRptThread.java @@ -0,0 +1,98 @@ +package com.ample.sms; + +import com.montnets.mwgate.common.RPT; +import com.montnets.mwgate.smsutil.SmsSendConn; + +import java.util.ArrayList; +import java.util.List; + +public class SmsRecvRptThread extends Thread{ + // 短信处理对象,在这个方法中调用获取状态报告功能 + private SmsSendConn smsSendConn = null; + // 用户账号 + private String userid = null; + // 每次请求想要获取状态报告的最大条数 + private int retsize = 0; + + /** + * 构造函数 + * + * @param smsSendConn + * 短信处理对象 + * @param userid + * 用户账号 + */ + public SmsRecvRptThread(SmsSendConn smsSendConn, String userid, int retsize) { + // 短信处理对象 + this.smsSendConn = smsSendConn; + // 用户账号 + this.userid = userid; + // 每次请求想要获取状态报告的最大条数 + this.retsize = retsize; + } + + /** + * 获取短信状态报告线程的方法 + */ + public void run() { + // 状态报告集合 本集合临时存储状态报告,需要将收到的状态报告保存在一个队列中,由另外一个线程去处理 + List rpts = new ArrayList(); + // 返回值 + int result = -310099; + //状态报告对象声明 + RPT rpt = null; + // 循环调用获取状态报告的方法 + while (true) { + try { + // 初始化返回值 + result = -310099; + // 清空状态报告集合中的对象 + rpts.clear(); + // 调用获取状态报告接口 + result = smsSendConn.getRpt(userid, retsize, rpts); + // 如果获取状态报告成功,并且有状态报告 + if (result == 0 && rpts != null && rpts.size() > 0) { + // 有状态报告 + // 添加到状态报告队列 + // add rpt queue + // 这里不要做复杂的耗时的处理,将收到的状态报告保存在一个队列中,由另外一个线程去处理。 + + // 代码示例是将状态报告信息打印出来 + System.out.println("获取状态报告成功!获取到的状态报告有" + rpts.size() + + "条记录。"); + for (int i = 0; i < rpts.size(); i++) { + rpt = rpts.get(i); + System.out.println("状态报告记录:" +"msgid:"+rpt.getMsgid() + ",custid:" + rpt.getCustid() + ",pknum:" + rpt.getPknum() + + ",pktotal:" + rpt.getPktotal() + ",mobile:" + rpt.getMobile()+",countrycode:"+rpt.getCountrycode() + + ",spno:" + rpt.getSpno() + ",exno:" + rpt.getExno() + ",stime:" + rpt.getStime() + + ",rtime:" + rpt.getRtime() + ",status:" + rpt.getStatus() + ",errcode:" + rpt.getErrcode() + + ",errdesc:"+rpt.getErrdesc()+ ",exdata:" + rpt.getExdata()); + } + + // 继续循环 + continue; + } else { + // 如果获取状态报告失败,则将错误码打印 + if (result != 0) { + System.out.println("获取状态报告失败,错误码为:" + result); + } + + // 没有状态报告,延时5秒以上 + try { + Thread.sleep(5000L); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } catch (Exception e) { + e.printStackTrace(); + // 循环出现异常,暂停5秒 + try { + Thread.sleep(5000L); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + } +} diff --git a/src/com/ample/sms/SmsRptServlet.java b/src/com/ample/sms/SmsRptServlet.java new file mode 100644 index 000000000..f62fb57f4 --- /dev/null +++ b/src/com/ample/sms/SmsRptServlet.java @@ -0,0 +1,128 @@ +package com.ample.sms; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.montnets.mwgate.common.EncryptUtil; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; +import java.util.Iterator; + +public class SmsRptServlet extends HttpServlet{ + public SmsRptServlet() { + } + private static final long serialVersionUID = 1L; + public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + System.out.println("请求回调开始"); + response.setContentType("application/json;charset:utf-8"); + response.setHeader("Cache-Control", "no-store"); + response.setHeader("Pragma", "no-cache"); + response.setDateHeader("Expires", 0L); + response.setCharacterEncoding("utf-8"); + int result = -100999; + JSONObject resultJson = new JSONObject(); + resultJson.put("cmd","RPT_RESP"); + PrintWriter out = response.getWriter(); + try{ + if (!WriteRptThread.rptIsAlive()) { + WriteRptThread.getRptthread().start(); + } + //进行初步验证 + String userid = request.getParameter("userid"); + String pwd = request.getParameter("pwd"); + String timestamp = request.getParameter("timestamp"); + String cmd = request.getParameter("cmd"); + String seqid =request.getParameter("seqid"); + if(!(SmsPropertiesUtil.get("userid").equals(userid)||SmsPropertiesUtil.get("urge_userid").equals(userid))){ + return; + } + String normalVld = EncryptUtil.encryptPwd(userid,SmsPropertiesUtil.get("pwd"),timestamp); + String urgeVld = EncryptUtil.encryptPwd(userid,SmsPropertiesUtil.get("urge_pwd"),timestamp); + if(!(normalVld.equals(pwd)||urgeVld.equals(pwd))){ + return; + } + + String currDate = FileUtil.getCurrTime(); + String fileUrl = SmsPropertiesUtil.get("log_path") + "file/rpt/"+ currDate +"/RPT.txt"; + String rpts = request.getParameter("rpts"); + int count = 0; + if (rpts != null && rpts.length() > 0) { + Object object = JSON.parse(rpts); + if(object instanceof JSONArray){ + JSONArray jsonArray = (JSONArray)object; + for(Iterator it = jsonArray.iterator(); it.hasNext(); ++count) { + JSONObject rptJsn = (JSONObject)it.next(); + String errDesc = rptJsn.getString("errdesc"); + byte[] byte_test = errDesc.getBytes(StandardCharsets.ISO_8859_1); + errDesc = new String(byte_test,"utf-8"); + rptJsn.put("errdesc",decode(errDesc)); + JSONObject jo = new JSONObject(); + jo.put("rpt",rptJsn); + jo.put("userid",userid); + jo.put("pwd",pwd); + jo.put("timestamp",timestamp); + jo.put("cmd",cmd); + jo.put("seqid",seqid); + jo.put("fileUrl",fileUrl); + WriteRptThread.rptQueue.put(jo); + } + }else if(object instanceof JSONObject){ + JSONObject rptJsn = (JSONObject)object; + String errDesc = rptJsn.getString("errdesc"); + byte[] byte_test = errDesc.getBytes(StandardCharsets.ISO_8859_1); + errDesc = new String(byte_test,"utf-8"); + rptJsn.put("errdesc",decode(errDesc)); + JSONObject jo = new JSONObject(); + jo.put("rpt",object); + jo.put("userid",userid); + jo.put("pwd",pwd); + jo.put("timestamp",timestamp); + jo.put("cmd",cmd); + jo.put("seqid",seqid); + jo.put("fileUrl",fileUrl); + WriteRptThread.rptQueue.put(jo); + count = 1; + } + result=0; + } + + System.out.println("接收到Rpt记录:" + count + "条"); + + resultJson.put("seqid",seqid); + resultJson.put("result",result); + out.print(resultJson.toJSONString()); + out.close(); + }catch (Exception e){ + e.printStackTrace(); + //pwd = "{\"cmd\":\"RPT_RESP\",\"seqid\":" + seqid + ",\"result\":-100999}"; + resultJson.put("seqid",""); + resultJson.put("result",result); + out.print(resultJson.toJSONString()); + out.close(); + } + + + } + + public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + doPost(request, response); + } + + private String decode(String content) { + try { + return URLDecoder.decode(content, "UTF-8"); + } catch (Exception var3) { + var3.printStackTrace(); + return null; + } + } + + +} diff --git a/src/com/ample/sms/SmsSendManager.java b/src/com/ample/sms/SmsSendManager.java new file mode 100644 index 000000000..30d597366 --- /dev/null +++ b/src/com/ample/sms/SmsSendManager.java @@ -0,0 +1,245 @@ +package com.ample.sms; + +import com.montnets.mwgate.common.*; +import com.montnets.mwgate.smsutil.ConfigManager; +import com.montnets.mwgate.smsutil.SmsSendConn; + +import java.util.ArrayList; +import java.util.List; + +public class SmsSendManager { + + static { + + + // 获取全局参数单例对象 + GlobalParams globalParams = GlobalParams.getInstance(); + // 设置请求路径 + globalParams.setRequestPath("/sms/v2/std/"); + // 设置是否需要日志 1:需要日志;0:不需要日志 + globalParams.setNeedLog(0); + // 设置http连接池的连接数量 + globalParams.setPoolNumber(16); + + //设置密码加密类型 + globalParams.setPwdEncryptType(PwdEncryptEnum.MD5); + + //设置下行内容的加密类型 明文 + globalParams.setMsgMtEncrypt(ContentEncryptEnum.PLAIN); + //下行内容加密类型还有 ContentEncryptEnum.SM4_ECB_ZEROPADDING和ContentEncryptEnum.SM4_ECB_PKCS7PADDING + //如果设置为以上两种SM4加密类型,则还需要设置参数 + //globalParams.setMtKey(SecretKeyEnum.SM3HASH_KEY);或者globalParams.setMtKey(SecretKeyEnum.FIXED_KEY); + //如果设置为SecretKeyEnum.FIXED_KEY + //则还需要设置固定秘钥,秘钥是双方共同约定好的 + //globalParams.setMtFixedKey("0123456789abcdeffedcba9876543210"); + + //设置下行内容的编码类型 UTF-8 + globalParams.setMsgMtEncode(ContentEncodeEnum.UTF_8); + + //设置上行内容的加密类型 明文 + globalParams.setMsgMoEncrypt(ContentEncryptEnum.PLAIN); + //上行内容加密类型还有 ContentEncryptEnum.SM4_ECB_ZEROPADDING和ContentEncryptEnum.SM4_ECB_PKCS7PADDING + //如果设置为以上两种SM4加密类型,则还需要设置参数 + //globalParams.setMoKey(SecretKeyEnum.SM3HASH_KEY);或者globalParams.setMoKey(SecretKeyEnum.FIXED_KEY); + //如果设置为SecretKeyEnum.FIXED_KEY + //则还需要设置固定秘钥,秘钥是双方共同约定好的 + //globalParams.setMoFixedKey("0123456789abcdeffedcba9876543210"); + + // 设置用户账号信息 + setAccountInfo(SmsObjType.NORMAL); + + + } + + /** + * @description 设置用户账号信息 + */ + public static void setAccountInfo(SmsObjType smsObjType) { + // 设置用户账号信息 + + // 用户账号 + String userid = SmsPropertiesUtil.get("userid"); + // 密码 + String password = SmsPropertiesUtil.get("pwd"); + + if((SmsObjType.URGE_COLLECTION).equals(smsObjType)){ + userid = SmsPropertiesUtil.get("urge_userid"); + password = SmsPropertiesUtil.get("urge_pwd"); + } + + // 发送优先级 + int priority = 1; + // 主IP信息,请前往您的控制台获取请求域名(IP)或联系梦网客服进行获取 + String ipAddress1 = SmsPropertiesUtil.get("ipAddress1"); + + // 备用IP1信息 + String ipAddress2 = SmsPropertiesUtil.get("ipAddress2"); + // 备用IP2信息 + String ipAddress3 = SmsPropertiesUtil.get("ipAddress3"); + // 备用IP3信息 + String ipAddress4 = SmsPropertiesUtil.get("ipAddress4"); + // 返回值 + int result = -310007; + try { + // 设置用户账号信息 + result = ConfigManager.setAccountInfo(userid, password, priority, + ipAddress1, ipAddress2, ipAddress3, ipAddress4); + // 判断返回结果,0设置成功,否则失败 + if (result == 0) { + System.out.println("设置"+smsObjType.getDesc()+"用户账号信息成功!"); + } else { + System.out.println("设置"+smsObjType.getDesc()+"用户账号信息失败,错误码:" + result); + } + } catch (Exception e) { + // 异常处理 + e.printStackTrace(); + } + } + + /** + * + * @description 单条发送 + * @param smsSendConn + * 短信处理对象,在这个方法中调用发送短信功能 + * @param message + * 短信 + */ + public static void singleSend(SmsSendConn smsSendConn,Message message) { + try { + + // 返回的流水号 + StringBuffer returnValue = new StringBuffer(); + // 返回值 + int result = -310099; + // 发送短信 + result = smsSendConn.singleSend(message, returnValue); + // result为0:成功 + if (result == 0) { + System.out.println("单条发送提交成功!"); + System.out.println(returnValue.toString()); + } + // result为非0:失败 + else { + System.out.println("单条发送提交失败,错误码:" + result); + } + } catch (Exception e) { + // 异常处理 + e.printStackTrace(); + } + } + + /** + * + * @description 个性化群发 + * @param smsSendConn + * 短信处理对象,在这个方法中调用发送短信功能 + * @param userid + * 用户账号 + * 暂时还未使用。因为原有短信和定时任务逻辑单位为每条,在不进行大改动的情况下,暂时不用群发功能。 + * 原有短信发送逻辑:1.在LB_SMS_NOTICE_TASKS表中新建待发送短信, + * 2.然后在qrtz_jbo_detail和msg_send_relative中创建每条短信的定时任务,定时任务触发时间为当前时间+2秒。 + */ + public static void multiSend(SmsSendConn smsSendConn, String userid) { + try { + // List集合 + List multixMts = new ArrayList(); + // 第一条 短信对象 + MultiMt multixMt1 = new MultiMt(); + // 手机号 + multixMt1.setMobile("18101193112"); + // 短信内容 + multixMt1.setContent("测试第一条!"); + // 设置扩展号 + multixMt1.setExno(""); + // 用户自定义流水编号 + multixMt1.setCustid("111"); + // 自定义扩展数据 + multixMt1.setExdata("222"); + // 业务类型 + multixMt1.setSvrtype(""); + // 添加到集合中去 + multixMts.add(multixMt1); + + // 第二条 短信对象 + MultiMt multixMt2 = new MultiMt(); + // 手机号 + multixMt2.setMobile("18101193113"); + // 短信内容 + multixMt2.setContent("测试第二条!测试第二条!测试第二条!测试第二条!测试第二条!测试第二条!测试第二条!测试第二条!测试第二条!测试第二条!测试第二条!测试第二条!测试第二条!测试第二条!测试第二条!测试第二条!测试第二条!测试第二条!测试第二条!测试第二条!测试第二条!测试第二条!测试第二条!测试第二条!"); + // 设置扩展号 + multixMt2.setExno(""); + // 用户自定义流水编号 + multixMt2.setCustid("111"); + // 自定义扩展数据 + multixMt2.setExdata("222"); + // 业务类型 + multixMt2.setSvrtype(""); + // 添加到集合中去 + multixMts.add(multixMt2); + + // 返回的流水号 + StringBuffer returnValue = new StringBuffer(); + // 返回值 + int result = -310099; + + //设置用户账号 指定用户账号发送,需要填写用户账号,不指定用户账号发送,无需填写用户账号 + // 发送短信 + result = smsSendConn.multiSend(userid, 0L, multixMts, returnValue); + // result为0:成功 + if (result == 0) { + System.out.println("个性化群发提交成功!"); + System.out.println(returnValue.toString()); + } + // result为非0:失败 + else { + System.out.println("个性化群发提交失败,错误码:" + result); + } + } catch (Exception e) { + // 异常处理 + e.printStackTrace(); + } + + } + + /** + * 查询剩余金额或条数接口 + */ + public static void getRemains(SmsSendConn smsSendConn,String userid) + { + try + { + // 查询余额接口。 + Remains remains = smsSendConn.getRemains(userid); + + //remains不为空 + if(remains==null) + { + System.out.println("查询失败。"); + return; + } + //查询成功 + if(remains.getResult()!=0) + { + //查询失败 + System.out.println("查询失败,错误码为:" + remains.getResult()); + return; + } + //计费类型为0,条数计费 + if(remains.getChargetype()==0) + { + System.out.println("查询成功,剩余条数为:" + remains.getBalance()+"条"); + }else if(remains.getChargetype()==1) + { + //计费类型为1,金额计费 + System.out.println("查询成功,剩余金额为:" + remains.getMoney()+"元"); + }else + { + System.out.println("未知的计费类型,计费类型:"+remains.getChargetype()); + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } +} diff --git a/src/com/ample/sms/WriteRptThread.java b/src/com/ample/sms/WriteRptThread.java new file mode 100644 index 000000000..27bb98183 --- /dev/null +++ b/src/com/ample/sms/WriteRptThread.java @@ -0,0 +1,110 @@ +package com.ample.sms; + +import com.alibaba.fastjson.JSONObject; +import com.amarsoft.are.jbo.BizObject; +import com.amarsoft.are.jbo.BizObjectManager; +import com.amarsoft.are.jbo.JBOException; +import com.amarsoft.are.jbo.JBOFactory; +import jbo.com.tenwa.lease.comm.LB_SMS_NOTICE_TASKS; +import jbo.oti.SMS_RPT; + +import java.text.SimpleDateFormat; +import java.util.Iterator; +import java.util.Set; +import java.util.concurrent.LinkedBlockingQueue; + +public class WriteRptThread extends Thread{ + public static LinkedBlockingQueue rptQueue = new LinkedBlockingQueue(); + private static boolean STOP = false; + private static Thread rptThread = new WriteRptThread(); + private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + private WriteRptThread() { + } + + public void run() { + String content = ""; + String filePath = ""; + STOP = false; + try { + while(!STOP) { + JSONObject rptJson = (JSONObject)rptQueue.take(); + filePath = rptJson.get("fileUrl").toString(); + rptJson.remove("fileUrl"); + content = this.sdf.format(System.currentTimeMillis()) + " " + rptJson.toJSONString()+ "\r\n"; + FileUtil.writeFile(filePath, content); + //保存返回结果 + saveSmsRpt(rptJson); + } + } catch (Exception var5) { + var5.printStackTrace(); + STOP = true; + rptThread = null; + } + + } + + public static boolean rptIsAlive() { + return rptThread.isAlive(); + } + + public static Thread getRptthread() { + if (rptThread == null) { + rptThread = new WriteRptThread(); + } + + return rptThread; + } + public void saveSmsRpt(JSONObject jo) throws JBOException { + JSONObject rptJsn = jo.getJSONObject("rpt"); + BizObjectManager boManager = JBOFactory.getBizObjectManager(SMS_RPT.CLASS_NAME); + BizObjectManager bomLsnt = JBOFactory.getBizObjectManager(LB_SMS_NOTICE_TASKS.CLASS_NAME); + + try { + BizObject bo = boManager.newObject(); + Set rptSet = rptJsn.keySet(); + Iterator rptIt = rptSet.iterator(); + String smsId = null; + while(rptIt.hasNext()){ + String key = rptIt.next(); + bo.getAttribute(key); + //表中没有此值则跳过 + if (bo.indexOfAttribute(key) < 0) { + continue; + } + if("exdata".equals(key)){ + smsId = rptJsn.getString(key); + } + if("msgid".equals(key)){ + String msgId = rptJsn.getString(key); + int count = boManager.createQuery("MSGID=:msgid").setParameter("msgid",msgId).getTotalCount(); + if(count>0){ + return; + } + } + bo.setAttributeValue(key,rptJsn.getString(key)); + } + bo.setAttributeValue("SEQID",jo.get("seqid")); + boManager.saveObject(bo); + + if(smsId!=null&&smsId.length()>0){ + String sendResult = null; + BizObject boLsnt = bomLsnt.createQuery("ID=:smsId").setParameter("smsId",smsId).getSingleResult(true); + if(boLsnt!=null){ + if("0".equals(bo.getAttribute("STATUS").toString())){ + sendResult = "发送成功"; + }else{ + sendResult = bo.getAttribute("errdesc").toString(); + } + boLsnt.setAttributeValue("SEND_RESULT",sendResult); + bomLsnt.saveObject(boLsnt); + } + + } + + } catch (JBOException e) { + e.printStackTrace(); + } + + } +} diff --git a/src_jbo/jbo/oti/SMS_RPT.java b/src_jbo/jbo/oti/SMS_RPT.java new file mode 100644 index 000000000..8bb7f97b7 --- /dev/null +++ b/src_jbo/jbo/oti/SMS_RPT.java @@ -0,0 +1,84 @@ +package jbo.oti; + +import java.lang.String; + +/** +* 短信状态推送记录表 - JBO命名常量类

+* Note: This file is generated by ADE tools, dont modify it.
+ +*/ +public interface SMS_RPT{ + /** + * 短信状态推送记录表

+ * 代表本类映射的BizObjectClass + */ + public static final String CLASS_NAME = "jbo.oti.SMS_RPT"; + /** + * 唯一标识 LONG(64)
+ */ + public static final String MSGID = "MSGID"; + /** + * 自定义流水号 STRING(50)
+ */ + public static final String CUSTID = "CUSTID"; + /** + * 当前条数 INT(32)
+ */ + public static final String PKNUM = "PKNUM"; + /** + * 总条数 INT(32)
+ */ + public static final String PKTOTAL = "PKTOTAL"; + /** + * 手机号 STRING(15)
+ */ + public static final String MOBILE = "MOBILE"; + /** + * 手机号国际区号 INT(10)
+ */ + public static final String COUNTRYCODE = "COUNTRYCODE"; + /** + * 完整的通道号 STRING(32)
+ */ + public static final String SPNO = "SPNO"; + /** + * 下行时填写的exno STRING(32)
+ */ + public static final String EXNO = "EXNO"; + /** + * 下行发送时间 STRING(32)
+ */ + public static final String STIME = "STIME"; + /** + * 状态报告返回时间 STRING(32)
+ */ + public static final String RTIME = "RTIME"; + /** + * 接收状态:0,成功;非0,失败 INT(20)
+ */ + public static final String STATUS = "STATUS"; + /** + * 状态报告错误代码 STRING(32)
+ */ + public static final String ERRCODE = "ERRCODE"; + /** + * 状态报告错误代码的描述 STRING(50)
+ */ + public static final String ERRDESC = "ERRDESC"; + /** + * 下行时填写的exdata STRING(32)
+ */ + public static final String EXDATA = "EXDATA"; + /** + * 短信类型 STRING(32)
+ */ + public static final String SMSTYPE = "SMSTYPE"; + /** + * 状态报告类型 STRING(32)
+ */ + public static final String RPTTYPE = "RPTTYPE"; + /** + * 请求消息流水号 INT(32)
+ */ + public static final String SEQID = "SEQID"; +} \ No newline at end of file diff --git a/src_jbo/jbo/oti/SMS_SEND.java b/src_jbo/jbo/oti/SMS_SEND.java new file mode 100644 index 000000000..35820902f --- /dev/null +++ b/src_jbo/jbo/oti/SMS_SEND.java @@ -0,0 +1,68 @@ +package jbo.oti; + +import java.lang.String; + +/** + * 短信发送记录表 - JBO命名常量类

+ * Note: This file is generated by ADE tools, dont modify it.
+ + */ +public interface SMS_SEND{ + /** + * 短信发送记录表

+ * 代表本类映射的BizObjectClass + */ + public static final String CLASS_NAME = "jbo.oti.SMS_SEND"; + /** + * 唯一标识 LONG(64)
+ */ + public static final String ID = "ID"; + /** + * 接口方短信唯一标识 LONG(64)
+ */ + public static final String MSGID = "MSGID"; + /** + * 手机号 STRING(15)
+ */ + public static final String MOBILE = "MOBILE"; + /** + * 短信内容 STRING(990)
+ */ + public static final String CONTENT = "CONTENT"; + /** + * STRING(20)
+ */ + public static final String EXNO = "EXNO"; + /** + * 自定义流水号 STRING(50)
+ */ + public static final String CUSTID = "CUSTID"; + /** + * 短信类型 STRING(32)
+ */ + public static final String SVRTYPE = "SVRTYPE"; + /** + * 返回结果编码 STRING(32)
+ */ + public static final String RESULT_CODE = "RESULT_CODE"; + /** + * 返回结果描述 STRING(100)
+ */ + public static final String RESULT_DESC = "RESULT_DESC"; + /** + * 下行时填写的exdata STRING(32)
+ */ + public static final String EXDATA = "EXDATA"; + /** + * 发送时间 STRING(32)
+ */ + public static final String SEND_TIME = "SEND_TIME"; + /** + * 系统中短信唯一标识 STRING(32)
+ */ + public static final String SMS_ID = "SMS_ID"; + /** + * 系统中短信唯一标识 STRING(32)
+ */ + public static final String SMS_OBJ_TYPE = "SMS_OBJ_TYPE"; +} \ No newline at end of file diff --git a/src_tenwa/com/tenwa/message/JobSendMessage.java b/src_tenwa/com/tenwa/message/JobSendMessage.java index 051dd9670..f578939e2 100644 --- a/src_tenwa/com/tenwa/message/JobSendMessage.java +++ b/src_tenwa/com/tenwa/message/JobSendMessage.java @@ -1,9 +1,9 @@ package com.tenwa.message; -import com.alibaba.fastjson.JSONObject; -import com.amarsoft.are.jbo.*; -import com.tenwa.lease.util.SendMessageUtil; -import jbo.com.tenwa.lease.comm.LB_SMS_NOTICE_TASKS; +import com.amarsoft.are.jbo.JBOException; +import com.amarsoft.are.jbo.JBOFactory; +import com.amarsoft.are.jbo.JBOTransaction; +import com.ample.sms.SmsController; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.quartz.Job; @@ -11,7 +11,6 @@ import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import java.text.SimpleDateFormat; -import java.util.Date; public class JobSendMessage implements Job{ @@ -26,34 +25,9 @@ public class JobSendMessage implements Job{ tx= JBOFactory.createJBOTransaction(); smsnoticeid = context.getJobDetail().getJobDataMap().getString("smsnoticeid"); logger.info("short message running..... LB_SMS_NOTICE_TASKS[ID]: "+smsnoticeid); - BizObjectManager bomNotice = JBOFactory.getBizObjectManager(LB_SMS_NOTICE_TASKS.CLASS_NAME,tx); - BizObject notice = bomNotice.createQuery("id=:id").setParameter("id", smsnoticeid).getSingleResult(true); - if(notice != null){ - if(notice.getAttribute("send_flag").getInt() == 0){ - String result = null; - boolean flagErrStatus = true; - try { - result = SendMessageUtil.sendMessageByHttpClient(notice.getAttribute("phone_number").getString(), notice.getAttribute("sms_content").getString()); - if(!result.matches("^[0-9].*")){ - JSONObject jsonObject = JSONObject.parseObject(result); - if(jsonObject.getIntValue("status")==100){ - flagErrStatus = false; - result = "全部成功"; - }else{ - result = getResultCodeInfoNew(jsonObject.getString("status")); - } - } - } catch (Exception e) { - logger.error("短信发送任务执行失败,LB_SMS_NOTICE_TASKS[ID] : "+smsnoticeid, e); - result = "发送失败,发送遇到异常:" + e.getMessage(); - } - notice.setAttributeValue("sms_type", "IMMEDIATELY"); - notice.setAttributeValue("send_result", result); - notice.setAttributeValue("send_time", sdf.format(new Date())); - notice.setAttributeValue("send_flag", flagErrStatus ? 0 : 1); - bomNotice.saveObject(notice); - } - } + SmsController sc = new SmsController(); + sc.setIds(smsnoticeid); + sc.sendMessage(tx); tx.commit(); } catch (Exception e) { logger.error("short message error LB_SMS_NOTICE_TASKS[ID] : "+smsnoticeid ,e); @@ -65,53 +39,4 @@ public class JobSendMessage implements Job{ } } - public static String getResultCodeInfoNew(String code){ - String codeMessage = ""; - switch(code){ - case "101": codeMessage = "参数错误"; break; - case "102": codeMessage = "号码错误"; break; - case "103": codeMessage = "当日余量不足"; break; - case "104": codeMessage = "请求超时"; break; - case "105": codeMessage = "用户余量不足"; break; - case "106": codeMessage = "非法用户"; break; - case "107": codeMessage = "提交号码超限"; break; - case "111": codeMessage = "签名不合法"; break; - case "120": codeMessage = "内容长度超长,请不要超过500个字"; break; - case "121": codeMessage = "内容中有屏蔽词"; break; - case "131": codeMessage = "IP非法"; break; - default : codeMessage = code ; break; - } - return codeMessage; - } - - public static String getResultCodeInfo(String code){ - String codeMessage = ""; - switch(code){ - case "-1": codeMessage = "签权失败"; break; - case "-2": codeMessage = "未检索到被叫号码"; break; - case "-3": codeMessage = "被叫号码过多"; break; - case "-4": codeMessage = "内容未签名"; break; - case "-5": codeMessage = "内容过长"; break; - case "-6": codeMessage = "余额不足"; break; - case "-7": codeMessage = "暂停发送"; break; - case "-8": codeMessage = "保留"; break; - case "-9": codeMessage = "定时发送时间格式错误"; break; - case "-10": codeMessage = "下发内容为空"; break; - case "-11": codeMessage = "账户无效"; break; - case "-12": codeMessage = "Ip地址非法"; break; - case "-13": codeMessage = "操作频率快"; break; - case "-14": codeMessage = "操作失败"; break; - case "-15": codeMessage = "拓展码无效"; break; - case "-16": codeMessage = "取消定时,seqid错误"; break; - case "-18": codeMessage = "暂留"; break; - case "-19": codeMessage = "未开通上行"; break; - case "-20": codeMessage = "暂留"; break; - case "-21": codeMessage = "包含屏蔽词"; break; - default : codeMessage = code; break; - } - if("0".equals(codeMessage.substring(0,1))){ - codeMessage = "操作成功"; - } - return codeMessage; - } }