9d43bed12667e69a3a0f07ff49f32a5ae43f7482.svn-base 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969
  1. package com.chinacreator.process.service;
  2. import java.net.URLEncoder;
  3. import java.sql.SQLException;
  4. import java.text.SimpleDateFormat;
  5. import java.util.ArrayList;
  6. import java.util.Arrays;
  7. import java.util.Calendar;
  8. import java.util.Date;
  9. import java.util.HashMap;
  10. import java.util.Iterator;
  11. import java.util.List;
  12. import java.util.Map;
  13. import org.apache.commons.lang.StringUtils;
  14. import org.apache.commons.lang.time.DateFormatUtils;
  15. import org.apache.log4j.Logger;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.stereotype.Component;
  18. import com.alibaba.fastjson.JSONObject;
  19. import com.chinacreator.common.exception.BusinessException;
  20. import com.chinacreator.common.util.MD5;
  21. import com.chinacreator.process.dao.CommonDao;
  22. import com.chinacreator.process.dao.DictionaryDao;
  23. import com.chinacreator.process.dao.MqSmsTempConfDao;
  24. import com.chinacreator.process.util.DesUtil;
  25. import com.chinacreator.process.util.HttpInvoke;
  26. import com.chinacreator.process.util.JsonUtil;
  27. import com.chinacreator.process.util.SHAUtil;
  28. /**
  29. * 订购退订短信模板服务类
  30. * @author xu.zhou
  31. * @date 20220902
  32. */
  33. @Component
  34. public class CShandleSmsTempService {
  35. private Logger logger = Logger.getLogger("cssms");
  36. @Autowired
  37. private CommonDao commonDao;
  38. @Autowired
  39. private MqSmsTempConfDao mqSmsConfDao;
  40. @Autowired
  41. private DictionaryDao dictionaryDao;
  42. /**
  43. * 获取调短信接口的模板参数
  44. * @param mqsmsconf
  45. * @param bodyparams
  46. * @param tmplogmap 日志对象
  47. * @return
  48. */
  49. public HashMap<String, String> getInvokeparams(HashMap mqsmsconf, HashMap<String, String> bodyparams, HashMap tmplogmap) throws Exception{
  50. //短信参数
  51. String [] smsparamsArray = mqsmsconf.get("PARAMS").toString().split("\\|");
  52. //短信参数映射
  53. String [] smsparamsmappArray = mqsmsconf.get("PARAMSMAPP").toString().split("\\|");
  54. //获取mq表的参数映射
  55. String mqparamsmapp = (String)mqsmsconf.get("MQPARAMSMAPP");
  56. //有个性化配置映射,优先级高于TB_SMSTEMP_CONF的MQPARAMSMAPP配置
  57. if(!StringUtils.isEmpty(mqparamsmapp)){
  58. smsparamsmappArray = mqparamsmapp.split("\\|");
  59. }
  60. //调接口模板参数
  61. HashMap<String, String> invokeparams = new HashMap<String, String>();
  62. String param1 = bodyparams.get("param1");
  63. String param2 = bodyparams.get("param2");
  64. String param3 = bodyparams.get("param3");
  65. String userid = bodyparams.get("userid");
  66. String param = "";
  67. //组建调接口模板参数
  68. for(int p = 0; p < smsparamsArray.length; p++){
  69. param = smsparamsArray[p];
  70. if("param1".equals(param)){ //自定义预留参数1
  71. if(!param.equals(smsparamsmappArray[p])){
  72. invokeparams.put(param, smsparamsmappArray[p]);
  73. }else{
  74. invokeparams.put(param, fullNullStr(param1));
  75. }
  76. }else if("param2".equals(param)){//自定义预留参数2
  77. if(!param.equals(smsparamsmappArray[p])){
  78. invokeparams.put(param, smsparamsmappArray[p]);
  79. }else{
  80. invokeparams.put(param, fullNullStr(param2));
  81. }
  82. }else if("param3".equals(param)){//自定义预留参数3
  83. if(!param.equals(smsparamsmappArray[p])){
  84. invokeparams.put(param, smsparamsmappArray[p]);
  85. }else{
  86. invokeparams.put(param, fullNullStr(param3));
  87. }
  88. }else if("oriuserid".equals(param)){//原始手机号码
  89. invokeparams.put(param, userid);
  90. }else if("userid".equals(param)){
  91. //模糊化
  92. String fulluserid = userid.substring(0, 3)+"****"+userid.substring(7);
  93. invokeparams.put(param, fulluserid);
  94. }else if("mm".equals(param)){
  95. invokeparams.put(param, DateFormatUtils.format(new Date(), "MM"));
  96. }else if("dd".equals(param)){
  97. invokeparams.put(param, DateFormatUtils.format(new Date(), "dd"));
  98. }else if("spname".equals(param)){
  99. if(!param.equals(smsparamsmappArray[p])){
  100. invokeparams.put(param, smsparamsmappArray[p]);
  101. }else{
  102. invokeparams.put(param, (String)mqsmsconf.get("SPNAME"));
  103. }
  104. }else if("price".equals(param)){
  105. if(!param.equals(smsparamsmappArray[p])){
  106. invokeparams.put(param, smsparamsmappArray[p]);
  107. }else{
  108. invokeparams.put(param, (String)mqsmsconf.get("PRICE"));
  109. }
  110. }else if("cpname".equals(param)){
  111. if(!param.equals(smsparamsmappArray[p])){
  112. invokeparams.put(param, smsparamsmappArray[p]);
  113. }else{
  114. invokeparams.put(param, fullNullStr((String)mqsmsconf.get("SMSCPNAME")));
  115. }
  116. }else if("maxflow".equals(param)){
  117. if(!param.equals(smsparamsmappArray[p])){
  118. invokeparams.put(param, smsparamsmappArray[p]);
  119. }else{
  120. String maxflow = (String)mqsmsconf.get("MAXFLOW");
  121. if(!StringUtils.isEmpty(maxflow)){
  122. try {
  123. //转为G
  124. maxflow = (Integer.parseInt(maxflow)/1024)+"";
  125. } catch (Exception e) {
  126. e.printStackTrace();
  127. }
  128. }
  129. invokeparams.put(param, maxflow);
  130. }
  131. }else if(param.indexOf("expdate") != -1){
  132. if(!param.equals(smsparamsmappArray[p])){
  133. invokeparams.put(param, smsparamsmappArray[p]);
  134. }else{
  135. if(param.split("-").length == 2){
  136. //计算当天时间加上多少天,含多少天,显示开始时间和结束时间
  137. SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
  138. //当前时间加多少天
  139. int day = Integer.parseInt(param.split("-")[1]);
  140. day = day - 1; //当天也包含
  141. Date currdate = new Date();
  142. Calendar ca = Calendar.getInstance();
  143. ca.setTime(currdate);
  144. ca.add(Calendar.DATE, day);
  145. Date enddate = ca.getTime();
  146. invokeparams.put(param, sdf.format(new Date())+"-"+sdf.format(enddate));
  147. }else{
  148. invokeparams.put(param, DateFormatUtils.format(new Date(), "yyyyMMdd"));
  149. }
  150. }
  151. }else if("mappid".equals(param)){//映射ID
  152. if(!param.equals(smsparamsmappArray[p])){
  153. invokeparams.put(param, smsparamsmappArray[p]);
  154. }else{
  155. //调接口获取mappid
  156. String mappid = fullNullStr(getMappidByUserid(userid, tmplogmap));
  157. invokeparams.put(param, mappid);
  158. }
  159. }else if("tranchannel".equals(param)){//办理渠道
  160. if(!param.equals(smsparamsmappArray[p])){
  161. invokeparams.put(param, smsparamsmappArray[p]);
  162. }else{
  163. //调接口获取mappid
  164. String tranchannel = fullNullStr(getTranchannel(mqsmsconf.get("BUSITYPE").toString()));
  165. invokeparams.put(param, tranchannel);
  166. }
  167. }else{//按配置的信息设置
  168. invokeparams.put(param, fullNullStr(smsparamsmappArray[p]));
  169. }
  170. }
  171. return invokeparams;
  172. }
  173. /**
  174. * 获取办理渠道的名称
  175. * @param busitype
  176. * @return
  177. * @throws SQLException
  178. */
  179. private String getTranchannel(String busitype) throws Exception{
  180. String tranchannel = "";
  181. HashMap confMap = mqSmsConfDao.getChannelConfByBusitype(busitype);
  182. if(confMap != null && confMap.size() > 0){
  183. tranchannel = (String)confMap.get("CHANNLE");
  184. }
  185. return tranchannel;
  186. }
  187. /**
  188. * 为空时返回一个空格,短信接口传空串会报错
  189. * @param p
  190. * @return
  191. */
  192. private String fullNullStr(String p){
  193. if(StringUtils.isEmpty(p)){
  194. return " ";
  195. }else{
  196. return p;
  197. }
  198. }
  199. /***
  200. * 按排序验证配置数据
  201. * busitype必须相同
  202. * 获取配置信息排序:
  203. * 配置字段:CHANNEL, SUBCHANNEL, PROVCINCE, STARTTIME, ENDTIME
  204. *
  205. * 1. CHANNEL,SUBCHANNEL,PROVINCE,STARTTIME,ENDTIME有配置
  206. * 2. CHANNEL,SUBCHANNEL,PROVINCE有配置,但STARTTIME,ENDTIME无配置
  207. * 3. CHANNEL,PROVINCE,STARTTIME,ENDTIME有配置,SUBCHANNEL无配置
  208. * 4. CHANNEL,PROVINCE有配置,SUBCHANNEL,STARTTIME,ENDTIME无配置
  209. * 5. PROVINCE,STARTTIME,ENDTIME有配置,CHANNEL,SUBCHANNEL无配置
  210. * 6. PROVINCE有配置,CHANNEL,SUBCHANNEL,STARTTIME,ENDTIME无配置
  211. * 7. CHANNEL,SUBCHANNEL,STARTTIME,ENDTIME有配置,PROVINCE无配置
  212. * 8. CHANNEL,SUBCHANNEL有配置,,PROVINCE,STARTTIME,ENDTIME无配置
  213. * 9. CHANNEL,STARTTIME,ENDTIME有配置,PROVINCE,SUBCHANNEL无配置
  214. * 10. CHANNEL有配置,,PROVINCE,SUBCHANNEL,STARTTIME,ENDTIME无配置
  215. * 11. STARTTIME,ENDTIME有配置,CHANNEL,SUBCHANNEL,PROVINCE无配置
  216. * 12. 全都无配置
  217. */
  218. public HashMap getMqSmsConfBySort(List<HashMap> confList, HashMap<String, String> bodyparams, HashMap logmap){
  219. HashMap mqsmsconf = null;
  220. //配置不能为空的参数
  221. List<String> notnullparams = new ArrayList<String>();
  222. //配置要为空的参数
  223. List<String> nulllparams = new ArrayList<String>();
  224. if(mqsmsconf == null){
  225. //* 1. CHANNEL,SUBCHANNEL,PROVINCE,STARTTIME,ENDTIME有配置
  226. notnullparams = new ArrayList<String>();
  227. nulllparams = new ArrayList<String>();
  228. notnullparams = Arrays.asList(new String[]{"CHANNEL","SUBCHANNEL","PROVINCE","STARTTIME","ENDTIME"});
  229. nulllparams = Arrays.asList(new String[]{});
  230. mqsmsconf = getMqSmsConf(confList, bodyparams, notnullparams, nulllparams, logmap);
  231. }
  232. if(mqsmsconf == null){
  233. //* 2. CHANNEL,SUBCHANNEL,PROVINCE有配置,但STARTTIME,ENDTIME无配置
  234. notnullparams = new ArrayList<String>();
  235. nulllparams = new ArrayList<String>();
  236. notnullparams = Arrays.asList(new String[]{"CHANNEL","SUBCHANNEL","PROVINCE"});
  237. nulllparams = Arrays.asList(new String[]{"STARTTIME","ENDTIME"});
  238. mqsmsconf = getMqSmsConf(confList, bodyparams, notnullparams, nulllparams, logmap);
  239. }
  240. if(mqsmsconf == null){
  241. //* 3. CHANNEL,PROVINCE,STARTTIME,ENDTIME有配置,SUBCHANNEL无配置
  242. notnullparams = new ArrayList<String>();
  243. nulllparams = new ArrayList<String>();
  244. notnullparams = Arrays.asList(new String[]{"CHANNEL","PROVINCE","STARTTIME","ENDTIME"});
  245. nulllparams = Arrays.asList(new String[]{"SUBCHANNEL"});
  246. mqsmsconf = getMqSmsConf(confList, bodyparams, notnullparams, nulllparams, logmap);
  247. }
  248. if(mqsmsconf == null){
  249. //* 4. CHANNEL,PROVINCE有配置,SUBCHANNEL,STARTTIME,ENDTIME无配置
  250. notnullparams = new ArrayList<String>();
  251. nulllparams = new ArrayList<String>();
  252. notnullparams = Arrays.asList(new String[]{"CHANNEL","PROVINCE"});
  253. nulllparams = Arrays.asList(new String[]{"SUBCHANNEL","STARTTIME","ENDTIME"});
  254. mqsmsconf = getMqSmsConf(confList, bodyparams, notnullparams, nulllparams, logmap);
  255. }
  256. if(mqsmsconf == null){
  257. //* 5. PROVINCE,STARTTIME,ENDTIME有配置,CHANNEL,SUBCHANNEL无配置
  258. notnullparams = new ArrayList<String>();
  259. nulllparams = new ArrayList<String>();
  260. notnullparams = Arrays.asList(new String[]{"PROVINCE","STARTTIME","ENDTIME"});
  261. nulllparams = Arrays.asList(new String[]{"CHANNEL","SUBCHANNEL"});
  262. mqsmsconf = getMqSmsConf(confList, bodyparams, notnullparams, nulllparams, logmap);
  263. }
  264. if(mqsmsconf == null){
  265. //* 6. PROVINCE有配置,CHANNEL,SUBCHANNEL,STARTTIME,ENDTIME无配置
  266. notnullparams = new ArrayList<String>();
  267. nulllparams = new ArrayList<String>();
  268. notnullparams = Arrays.asList(new String[]{"PROVINCE"});
  269. nulllparams = Arrays.asList(new String[]{"CHANNEL","SUBCHANNEL","STARTTIME","ENDTIME"});
  270. mqsmsconf = getMqSmsConf(confList, bodyparams, notnullparams, nulllparams, logmap);
  271. }
  272. if(mqsmsconf == null){
  273. //* 7. CHANNEL,SUBCHANNEL,STARTTIME,ENDTIME有配置,PROVINCE无配置
  274. notnullparams = new ArrayList<String>();
  275. nulllparams = new ArrayList<String>();
  276. notnullparams = Arrays.asList(new String[]{"CHANNEL","SUBCHANNEL","STARTTIME","ENDTIME"});
  277. nulllparams = Arrays.asList(new String[]{"PROVINCE"});
  278. mqsmsconf = getMqSmsConf(confList, bodyparams, notnullparams, nulllparams, logmap);
  279. }
  280. if(mqsmsconf == null){
  281. //* 8. CHANNEL,SUBCHANNEL有配置,,PROVINCE,STARTTIME,ENDTIME无配置
  282. notnullparams = new ArrayList<String>();
  283. nulllparams = new ArrayList<String>();
  284. notnullparams = Arrays.asList(new String[]{"CHANNEL","SUBCHANNEL"});
  285. nulllparams = Arrays.asList(new String[]{"PROVINCE","STARTTIME","ENDTIME"});
  286. mqsmsconf = getMqSmsConf(confList, bodyparams, notnullparams, nulllparams, logmap);
  287. }
  288. if(mqsmsconf == null){
  289. //* 9. CHANNEL,STARTTIME,ENDTIME有配置,PROVINCE,SUBCHANNEL无配置
  290. notnullparams = new ArrayList<String>();
  291. nulllparams = new ArrayList<String>();
  292. notnullparams = Arrays.asList(new String[]{"CHANNEL","STARTTIME","ENDTIME"});
  293. nulllparams = Arrays.asList(new String[]{"SUBCHANNEL","PROVINCE"});
  294. mqsmsconf = getMqSmsConf(confList, bodyparams, notnullparams, nulllparams, logmap);
  295. }
  296. if(mqsmsconf == null){
  297. //* 10. CHANNEL有配置,,PROVINCE,SUBCHANNEL,STARTTIME,ENDTIME无配置
  298. notnullparams = new ArrayList<String>();
  299. nulllparams = new ArrayList<String>();
  300. notnullparams = Arrays.asList(new String[]{"CHANNEL"});
  301. nulllparams = Arrays.asList(new String[]{"SUBCHANNEL","PROVINCE","STARTTIME","ENDTIME"});
  302. mqsmsconf = getMqSmsConf(confList, bodyparams, notnullparams, nulllparams, logmap);
  303. }
  304. if(mqsmsconf == null){
  305. //* 11. STARTTIME,ENDTIME有配置,CHANNEL,SUBCHANNEL,PROVINCE无配置
  306. notnullparams = new ArrayList<String>();
  307. nulllparams = new ArrayList<String>();
  308. notnullparams = Arrays.asList(new String[]{"STARTTIME","ENDTIME"});
  309. nulllparams = Arrays.asList(new String[]{"CHANNEL","SUBCHANNEL","PROVINCE"});
  310. mqsmsconf = getMqSmsConf(confList, bodyparams, notnullparams, nulllparams, logmap);
  311. }
  312. if(mqsmsconf == null){
  313. //* 12. 全都无配置
  314. notnullparams = new ArrayList<String>();
  315. nulllparams = new ArrayList<String>();
  316. notnullparams = Arrays.asList(new String[]{});
  317. nulllparams = Arrays.asList(new String[]{"CHANNEL","SUBCHANNEL","PROVINCE","STARTTIME","ENDTIME"});
  318. mqsmsconf = getMqSmsConf(confList, bodyparams, notnullparams, nulllparams, logmap);
  319. }
  320. return mqsmsconf;
  321. }
  322. /**
  323. * 获取短信配置数据
  324. * @param confList 配置列表
  325. * @param bodyparams 输入参数
  326. * @param notnullparams 不能为空的参数
  327. * @param nulllparams 要为空的参数
  328. * @param logmap
  329. * @return
  330. */
  331. private HashMap getMqSmsConf(List<HashMap> confList, HashMap<String, String> bodyparams, List<String> notnullparams, List<String> nulllparams, HashMap logmap){
  332. HashMap mqsmsconf = null;
  333. String confbusitype = null;
  334. for(HashMap tmphm : confList){
  335. confbusitype = tmphm.get("BUSITYPE").toString();
  336. //busiType完全相同
  337. if(confbusitype.equals(bodyparams.get("busiType"))
  338. && notNullVali(bodyparams,notnullparams,tmphm)
  339. && nullVali(bodyparams,nulllparams,tmphm)
  340. ){
  341. //验证当前是否在配置的发送时间内
  342. if(valisendtime(tmphm)){
  343. mqsmsconf = tmphm;
  344. //跳出循环
  345. break;
  346. }else{
  347. logmap.put("valitime", "当前时间不在配置范围内");
  348. }
  349. }
  350. }
  351. return mqsmsconf;
  352. }
  353. /**
  354. * 参数不能为空的验证
  355. * @param bodyparams
  356. * @param notnullparams
  357. * @param tmpconf
  358. * @return
  359. */
  360. private boolean notNullVali(HashMap<String, String> bodyparams, List<String> notnullparams, HashMap tmpconf){
  361. boolean res = true;
  362. if(notnullparams == null || notnullparams.size() == 0){
  363. return res;
  364. }
  365. String busiType = bodyparams.get("busiType"); //业务类型
  366. String channel = bodyparams.get("channel"); //渠道
  367. String subchannel = bodyparams.get("subchannel");//子渠道
  368. String province = bodyparams.get("province"); //省份
  369. for(String param : notnullparams){
  370. if("PROVINCE".equals(param) && (tmpconf.get("PROVINCE") == null || !tmpconf.get("PROVINCE").equals(province))){
  371. res = false;
  372. break;
  373. }
  374. if("SUBCHANNEL".equals(param) && (tmpconf.get("SUBCHANNEL") == null || !tmpconf.get("SUBCHANNEL").equals(subchannel))){
  375. res = false;
  376. break;
  377. }
  378. if("CHANNEL".equals(param) && (tmpconf.get("CHANNEL") == null || !tmpconf.get("CHANNEL").equals(channel))){
  379. res = false;
  380. break;
  381. }
  382. //STARTTIME和ENDTIME都为空,验证不通过
  383. if(("STARTTIME".equals(param) || "ENDTIME".equals(param)) && (tmpconf.get("STARTTIME") == null && tmpconf.get("ENDTIME") == null )){
  384. res = false;
  385. break;
  386. }
  387. }
  388. return res;
  389. }
  390. /**
  391. * 参数可以为空的验证
  392. * @param bodyparams
  393. * @param nullparams
  394. * @param tmpconf
  395. * @return
  396. */
  397. private boolean nullVali(HashMap<String, String> bodyparams, List<String> nullparams, HashMap tmpconf){
  398. boolean res = true;
  399. if(nullparams == null || nullparams.size() == 0){
  400. return res;
  401. }
  402. for(String param : nullparams){
  403. if("PROVINCE".equals(param) && tmpconf.get("PROVINCE") != null){
  404. res = false;
  405. break;
  406. }
  407. if("SUBCHANNEL".equals(param) && tmpconf.get("SUBCHANNEL") != null){
  408. res = false;
  409. break;
  410. }
  411. if("CHANNEL".equals(param) && tmpconf.get("CHANNEL") != null){
  412. res = false;
  413. break;
  414. }
  415. if("STARTTIME".equals(param) && tmpconf.get("STARTTIME") != null){
  416. res = false;
  417. break;
  418. }
  419. if("ENDTIME".equals(param) && tmpconf.get("ENDTIME") != null){
  420. res = false;
  421. break;
  422. }
  423. }
  424. return res;
  425. }
  426. /**
  427. * 判断当前时间是否在配置的时间范围内,如果有配置
  428. * @param mqsmsconf
  429. * @return true 未限制,false被限制
  430. */
  431. private boolean valisendtime(HashMap mqsmsconf){
  432. //默认为成功
  433. boolean res = true;
  434. //发送时间验证
  435. String sendstarttime = (String)mqsmsconf.get("STARTTIME");
  436. String sendendtime = (String)mqsmsconf.get("ENDTIME");
  437. String currtime = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
  438. //有配置短信发送开始时间,但当前时间小于开始时间
  439. if(!StringUtils.isEmpty(sendstarttime) && Long.parseLong(currtime) < Long.parseLong(sendstarttime)){
  440. res = false;
  441. }
  442. //有配置短信发送结束时间,但当前时间大于结束时间
  443. if(!StringUtils.isEmpty(sendendtime) && Long.parseLong(currtime) > Long.parseLong(sendendtime)){
  444. res = false;
  445. }
  446. return res;
  447. }
  448. /**
  449. * 根据手机号码获取映射ID,用于页面自动登录
  450. * @param userid
  451. * @return
  452. */
  453. private String getMappidByUserid(String userid, HashMap<String, Object> logmap){
  454. String mappid = "";
  455. String resultcode = "5000";
  456. String errorinfo = "";
  457. HashMap<String, Object> tmplogmap = new HashMap<String, Object>();
  458. try {
  459. HashMap confhm = commonDao.getInvokeUrlInfo("univideo", "usermappqrymappid", "2");
  460. if(confhm == null || confhm.size() == 0){
  461. throw new BusinessException("9012","无接口配置信息");
  462. }
  463. String url = confhm.get("INVOKEURL").toString();
  464. JSONObject params1 = JSONObject.parseObject((String)confhm.get("PARAM1"));
  465. String method = params1.getString("METHOD");
  466. int timeout = params1.getInteger("TIMEOUT");
  467. String tls = params1.getString("TLS");
  468. String contentttype = params1.getString("CONTENTTYPE");
  469. String channel = params1.getString("CHANNEL");
  470. //加密KEY
  471. String pwd = params1.getString("PWD");
  472. Map reqProperty = new HashMap();
  473. if(!StringUtils.isEmpty(contentttype)){
  474. reqProperty.put("Content-type", contentttype);
  475. }
  476. String account = userid;
  477. String timestamp = (System.currentTimeMillis())/1000+"";
  478. account = DesUtil.encode(account, pwd);
  479. String signature = account+channel+timestamp+pwd;
  480. signature = MD5.MD5Encode(signature);
  481. JSONObject params = new JSONObject();
  482. params.put("account", account);
  483. params.put("channel", channel);
  484. params.put("timestamp", timestamp);
  485. params.put("signature", signature);
  486. tmplogmap.put("invokeparams", params.toJSONString());
  487. String res = "";
  488. if(url.startsWith("https")){
  489. res = HttpInvoke.sendhttpsReqAll(method, url, params.toJSONString(), reqProperty, timeout*1000, tls);
  490. }else{
  491. res = HttpInvoke.sendHttpByPost(method, url, params.toJSONString(), reqProperty, timeout*1000);
  492. }
  493. tmplogmap.put("invokeres", res);
  494. /**
  495. {
  496.     "resultcode":"0",
  497.     "errorinfo":"ok",
  498.     "data":{
  499.         "userid":"UooUmz1MQgSRsKdMZVpGIQ==",
  500.         "mappid":"9e888164125f44359943d48b566355da"
  501.     }
  502. }
  503. **/
  504. if(!StringUtils.isEmpty(res)){
  505. JSONObject tmp = JSONObject.parseObject(res);
  506. resultcode = tmp.getString("resultcode");
  507. errorinfo = tmp.getString("errorinfo");
  508. if(tmp.getJSONObject("data") != null){
  509. mappid = tmp.getJSONObject("data").getString("mappid");
  510. }
  511. }
  512. } catch (Exception e) {
  513. if (e instanceof BusinessException) {
  514. resultcode = ((BusinessException)e).getCode();
  515. errorinfo = ((BusinessException)e).getMessage();
  516. }else{
  517. e.printStackTrace();
  518. resultcode = "8000";
  519. errorinfo = "获取映射ID出现异常,"+e.getMessage();
  520. }
  521. } finally {
  522. tmplogmap.put("resultcode", resultcode);
  523. tmplogmap.put("errorinfo", errorinfo);
  524. logmap.put("getMappidByUserid", tmplogmap);
  525. }
  526. return mappid;
  527. }
  528. /**
  529. * 发送退订营销短信
  530. * @param userid 手机嘎巴
  531. * @param spid spid
  532. * @param busitype 业务类型
  533. * @param mainlogmap 主日志对象
  534. */
  535. public void sendCancelYxSms(HashMap<String, String> bodyparams, HashMap mainlogmap){
  536. String userid = bodyparams.get("userid");
  537. String spid = bodyparams.get("spid");
  538. String busitype = bodyparams.get("busiType");
  539. if(busitype.indexOf("cancel_succ") == -1){
  540. return;
  541. }
  542. String resultcode = "5000";
  543. String errorinfo = "";
  544. String phcpid = ""; //偏好CPID
  545. String hyspid = ""; //合约产品SPID
  546. HashMap<String, Object> tmplogmap = new HashMap<String, Object>();
  547. HashMap<String, String> vargs = null;
  548. try {
  549. List<HashMap> dataList = mqSmsConfDao.qryCancelYxConf(busitype);
  550. if(dataList == null || dataList.size() == 0){
  551. throw new BusinessException("9002","业务类型【"+busitype+"】无营销配置");
  552. }
  553. tmplogmap.put("hasconf", "0");//是否有配置
  554. tmplogmap.put("userid", userid);
  555. tmplogmap.put("busitype", busitype);
  556. //调柏源用户偏好接口
  557. String res = this.invokeCancelyx(userid, tmplogmap);
  558. //res = "{\"code\":200,\"success\":true,\"data\":\"aiqy\",\"msg\":\"操作成功\"}";
  559. JSONObject resobj = JSONObject.parseObject(res);
  560. if(resobj.get("code") != null && resobj.getInteger("code") == 200
  561. && resobj.getBoolean("success") == true){ //调接口成功
  562. phcpid = resobj.getString("data");
  563. }
  564. //得到了偏好CP
  565. if(!StringUtils.isEmpty(phcpid)){
  566. //用户是否已订购偏好CP产品
  567. List<HashMap> relList = commonDao.qryRealByUserid(userid, phcpid, null,"2");
  568. //芒果CPID特殊处理,多一次查询
  569. if(relList == null || relList.size() == 0){
  570. //是mangtv,则再查一次mangtv16
  571. if("mangtv".equals(phcpid)){
  572. relList = commonDao.qryRealByUserid(userid, "mangtv16", null,"2");
  573. }else if("mangtv16".equals(phcpid)){//是mangtv16,则再查一次mangtv
  574. relList = commonDao.qryRealByUserid(userid, "mangtv", null,"2");
  575. }
  576. }
  577. //判断是否订购了后向产品,如果是,则剔除
  578. if(relList != null && relList.size()>0){
  579. Iterator<HashMap> it = relList.iterator();;
  580. HashMap hm = null;
  581. HashMap backconf = null;
  582. while(it.hasNext()){
  583. hm = it.next();
  584. //查询是否为后向产品
  585. backconf = commonDao.qryBackBusiBySpid((String)hm.get("SPID"));
  586. if(backconf != null && backconf.size() > 0){
  587. logger.info("后向产品不参与统计=>" + hm.get("SPID"));
  588. it.remove(); //移除对象
  589. }
  590. }
  591. //再次判断
  592. if(relList != null && relList.size()>0){
  593. throw new BusinessException("9013","已有【"+phcpid+"】订购关系");
  594. }
  595. }
  596. HashMap cancelyxconf = null;
  597. for(HashMap tmp : dataList){
  598. if(phcpid.equals(tmp.get("PHCPID"))){//有偏好CP配置
  599. cancelyxconf = tmp;
  600. break;
  601. }
  602. }
  603. //有营销配置
  604. if(cancelyxconf != null){
  605. tmplogmap.put("cancelyxconf", cancelyxconf);
  606. hyspid = cancelyxconf.get("HYSPID").toString();
  607. //获取合约产品的合约期
  608. HashMap hymap = commonDao.qryHyProduct(hyspid);
  609. if(hymap == null || hymap.size() == 0){
  610. throw new BusinessException("9014","合约产品【"+hyspid+"】无有效期配置");
  611. }
  612. int month = Integer.parseInt(hymap.get("MONTH").toString());
  613. //查询是否订购了合约产品
  614. List<HashMap> relList2 = commonDao.qryRealByUserid(userid, null, hyspid, null);
  615. //订购了合约主品,已失效
  616. if(relList2 != null && relList2.size()>0){
  617. boolean hasRetryOrder = mqSmsConfDao.hasRetryOrder(userid, hyspid, month);
  618. if(!hasRetryOrder){
  619. throw new BusinessException("9015","上次订购合约产品的合约期未到期,hyspid【"+hyspid+"】,month【"+month+"】");
  620. }
  621. }
  622. //是否成功发送过营销短信,且已超过合约期的月份
  623. /**
  624. boolean hasRetrySendSms = mqSmsConfDao.hasRetrySendSms(userid, hyspid, month);
  625. if(!hasRetrySendSms){
  626. throw new BusinessException("9016","上次发送营销短信未超过合约期,hyspid【"+hyspid+"】,month【"+month+"】");
  627. }
  628. **/
  629. //获取调接口参数
  630. vargs = this.getInvokeparams(cancelyxconf, bodyparams, tmplogmap);
  631. tmplogmap.put("vars", vargs);
  632. if(vargs == null || vargs.size() == 0){
  633. throw new BusinessException("9008","退订营销短信无模板参数匹配");
  634. }
  635. //模板ID
  636. String smstempid = (String)cancelyxconf.get("SMSTEMPID");
  637. tmplogmap.put("营销模板ID", smstempid);
  638. tmplogmap.put("smstype", "smsjh");
  639. //调短信发送接口
  640. String smsres = sendSMS(userid,smstempid,JsonUtil.objectToJson(vargs),"smsjh",tmplogmap);
  641. //smsres = "{\"resultcode\":\"0\",\"errorinfo\":\"\",\"taskid\":\"202208191529181184600\",\"ssmsid\":null}";
  642. tmplogmap.put("sendsmsres", smsres);
  643. JSONObject smsresobj = JSONObject.parseObject(smsres);
  644. if("0".equals(smsresobj.getString("resultcode"))){
  645. resultcode = "0";
  646. errorinfo = "ok";
  647. }else{
  648. resultcode = "9099";
  649. errorinfo = "发送短信失败," + smsres;
  650. }
  651. }else{
  652. throw new BusinessException("9009","偏好CP无模板配置【"+phcpid+"】");
  653. }
  654. }else{
  655. throw new BusinessException("9019","柏源接口无偏好CP返回");
  656. }
  657. } catch (Exception e) {
  658. if (e instanceof BusinessException) {
  659. resultcode = ((BusinessException)e).getCode();
  660. errorinfo = ((BusinessException)e).getMessage();
  661. }else{
  662. e.printStackTrace();
  663. resultcode = "8000";
  664. errorinfo = "出现异常,"+e.getMessage();
  665. }
  666. } finally {
  667. //有配置则记录数据,输出日志
  668. if("0".equals(tmplogmap.get("hasconf"))){
  669. tmplogmap.put("resultcode", resultcode);
  670. tmplogmap.put("errorinfo", errorinfo);
  671. try {
  672. HashMap<String, String> params = new HashMap<String, String>();
  673. params.put("HYSPID", hyspid);
  674. params.put("SPNAME", commonDao.qrySpinfoBySpid(spid).get("SPNAME")+"");
  675. params.put("PHCPID", phcpid);
  676. params.put("USERID", userid);
  677. params.put("RESULTCODE", resultcode);
  678. params.put("ERRORINFO", errorinfo);
  679. params.put("BUSITYPE", busitype);
  680. params.put("SPID", spid);
  681. params.put("VARGS", (vargs == null ? null : vargs.toString()));
  682. params.put("OUTPARAMS", (String)tmplogmap.get("invokeres"));
  683. boolean flag = mqSmsConfDao.addCancelyxRec(params);
  684. tmplogmap.put("addCancelyxRec", flag);
  685. } catch (Exception e) {
  686. e.printStackTrace();
  687. tmplogmap.put("addCancelyxRec", "false "+e.getMessage());
  688. }
  689. //输出日志
  690. //logger.info(logmap);
  691. mainlogmap.put("cancelyxsms", tmplogmap);
  692. }
  693. }
  694. }
  695. /**
  696. * 调柏源用户偏好接口
  697. * @param userid
  698. * @return
  699. * @throws Exception
  700. */
  701. private String invokeCancelyx(String userid, HashMap<String, Object> logmap) throws Exception{
  702. String res = "";
  703. try {
  704. HashMap confhm = commonDao.getInvokeUrlInfo("activeprocess", "foreigngetCpid", "1");
  705. if(confhm == null || confhm.size() == 0){
  706. throw new BusinessException("9012","无接口配置信息");
  707. }
  708. logmap.put("invokeconf", confhm);
  709. String url = confhm.get("INVOKEURL").toString();
  710. JSONObject params1 = JSONObject.parseObject((String)confhm.get("PARAM1"));
  711. String method = params1.getString("METHOD");
  712. int timeout = params1.getInteger("TIMEOUT");
  713. String tls = params1.getString("TLS");
  714. String contentttype = params1.getString("CONTENTTYPE");
  715. String channel = params1.getString("CHANNEL");
  716. //加密KEY
  717. String despwd = params1.getString("DESPWD");
  718. Map reqProperty = new HashMap();
  719. if(!StringUtils.isEmpty(contentttype)){
  720. reqProperty.put("Content-type", contentttype);
  721. }
  722. JSONObject content = new JSONObject();
  723. if(StringUtils.isEmpty(despwd)){ //密钥为空,参数不加密
  724. content.put("phone", userid);
  725. }else{
  726. content.put("phone", DesUtil.encode(userid, despwd));
  727. }
  728. logmap.put("invokeCancelyxparams", userid+"=>"+content.toJSONString());
  729. res = HttpInvoke.sendhttpsReqAll(method, url, content.toJSONString(), reqProperty, timeout*1000, tls);
  730. logmap.put("invokeCancelyxres", res);
  731. } catch (Exception e) {
  732. if (e instanceof BusinessException) {
  733. throw e;
  734. }else{
  735. e.printStackTrace();
  736. throw new BusinessException("8000","调柏源用户偏好接口出现异常,"+e.getMessage());
  737. }
  738. }
  739. return res;
  740. }
  741. /**
  742. * 根据短信模板发送短信
  743. * @param userid
  744. * @param tempid 模板ID
  745. * @param params 参数变量
  746. * @param smswgname 短信网关类型, sms117走117网关,smsjh走聚合网关
  747. * @return
  748. */
  749. public String sendSMS(String userid, String tempid, String params, String smswgname, HashMap<String, Object> logmap) {
  750. String res = "";
  751. try {
  752. logmap.put("vars", params);
  753. //获取发送短信的地址及其他配置
  754. HashMap confhm = commonDao.getInvokeUrlInfo("common", smswgname, "2");
  755. if(confhm == null || confhm.size() == 0){
  756. throw new BusinessException("9011","无短信接口配置信息");
  757. }
  758. String invokeurl = confhm.get("INVOKEURL").toString();
  759. JSONObject params1 = JSONObject.parseObject((String)confhm.get("PARAM1"));
  760. String smsid = params1.getString("SMSID");
  761. String key = params1.getString("PWD");
  762. String method = params1.getString("METHOD");
  763. int timeout = 0;
  764. try {
  765. timeout = params1.getInteger("TIMEOUT");
  766. } catch (Exception e) {
  767. timeout = 10;
  768. }
  769. String tls = params1.getString("TLS");
  770. String contentid = tempid;
  771. String timestamp = System.currentTimeMillis() / 1000 + "";
  772. String usermob = DesUtil.encode(userid, key);
  773. String vars = params;
  774. String sign = SHAUtil.shaEncode(smsid + usermob + timestamp + vars + contentid + key).toLowerCase();
  775. //手机号码和参数转码
  776. usermob = URLEncoder.encode(usermob, "utf-8");
  777. vars = URLEncoder.encode(vars, "utf-8");
  778. String invokeparams = "userid=" + usermob + "&smsid=" + smsid + "&timestamp=" + timestamp + "&sign=" + sign + "&contentid=" + contentid + "&vars=" + vars;
  779. String url = invokeurl+"?"+invokeparams;
  780. if(invokeurl.startsWith("https")){
  781. res = HttpInvoke.sendhttpsReqAll(method, url, null, null, timeout*1000, tls);
  782. }else{
  783. res = HttpInvoke.sendHttpByGet(invokeurl,timeout*1000);
  784. }
  785. } catch (Exception e) {
  786. e.printStackTrace();
  787. res = "发送短信出现异常,"+e.getMessage();
  788. }
  789. return res;
  790. }
  791. /**
  792. * 发送第一条短信
  793. * @param bodyparams
  794. * @param mainlogmap
  795. */
  796. public void sendFirSms(HashMap<String, String> bodyparams, HashMap mainlogmap){
  797. HashMap<String, Object> tmplogmap = new HashMap<String, Object>();
  798. String resultcode = "5000";
  799. String errorinfo = "";
  800. try {
  801. String userid = bodyparams.get("userid");
  802. String spid = bodyparams.get("spid");
  803. String busitype = bodyparams.get("busiType");
  804. //短信表配置
  805. HashMap mqsmsconf = null;
  806. List<HashMap> confList = mqSmsConfDao.getConfListBySpid(spid, busitype);
  807. if(confList == null || confList.size() == 0){
  808. throw new BusinessException("9001","sp产品短信发送无配置");
  809. }
  810. //获取短信配置信息
  811. mqsmsconf = this.getMqSmsConfBySort(confList, bodyparams, tmplogmap);
  812. if(mqsmsconf == null || mqsmsconf.size() == 0){
  813. throw new BusinessException("9003","sp产品无对应业务短信配置");
  814. }
  815. //移除时间验证失败标记
  816. tmplogmap.remove("valitime");
  817. //短信模板ID
  818. String smstempid = (String)mqsmsconf.get("SMSTEMPID");
  819. if(StringUtils.isEmpty(smstempid)){
  820. throw new BusinessException("9006","无模板ID配置");
  821. }
  822. tmplogmap.put("mqsmsconf", mqsmsconf);
  823. //获取调短信接口的模板参数
  824. HashMap<String, String> invokeparams = this.getInvokeparams(mqsmsconf, bodyparams, tmplogmap);
  825. tmplogmap.put("invokeparams", JsonUtil.objectToJson(invokeparams));
  826. //调接口参数不为空
  827. if(invokeparams != null && invokeparams.size()>0){
  828. //调接口发送短信
  829. tmplogmap.put("smstype", "sms117");
  830. String sendres = this.sendSMS(userid,smstempid,JsonUtil.objectToJson(invokeparams),"sms117", tmplogmap);
  831. tmplogmap.put("sendsmsres", sendres);
  832. //华胜数据查询小时问隔
  833. String huashengpushhour = dictionaryDao.getValue("huashengpushhour");
  834. //更新华胜推送表数据
  835. boolean updhuasheng = mqSmsConfDao.updHuaShengWaitInfo(userid, spid, busitype, huashengpushhour);
  836. tmplogmap.put("updhuasheng", updhuasheng);
  837. }
  838. resultcode = "0";
  839. errorinfo = "ok";
  840. } catch (Exception e) {
  841. if (e instanceof BusinessException) {
  842. resultcode = ((BusinessException) e).getCode();
  843. errorinfo = ((BusinessException) e).getMessage();
  844. }else{
  845. e.printStackTrace();
  846. resultcode = "8000";
  847. errorinfo = "处理出现异常,"+e.getMessage();
  848. }
  849. } finally {
  850. tmplogmap.put("resultcode", resultcode);
  851. tmplogmap.put("errorinfo", errorinfo);
  852. mainlogmap.put("sendFirSms", tmplogmap);
  853. }
  854. }
  855. /**
  856. * 发送第二条短信
  857. * @param bodyparams
  858. * @param mainlogmap
  859. */
  860. public void sendSecSms(HashMap<String, String> bodyparams, HashMap mainlogmap){
  861. HashMap<String, Object> tmplogmap = new HashMap<String, Object>();
  862. String resultcode = "5000";
  863. String errorinfo = "";
  864. try {
  865. String userid = bodyparams.get("userid");
  866. String spid = bodyparams.get("spid");
  867. String busitype = bodyparams.get("busiType");
  868. List<HashMap> confList = mqSmsConfDao.getSecConfListBySpid(spid,busitype);
  869. if(confList == null || confList.size() == 0){
  870. throw new BusinessException("9001","sp产品短信发送无配置");
  871. }
  872. HashMap mqsmsconf = getMqSmsConfBySort(confList, bodyparams, tmplogmap);
  873. if(mqsmsconf == null || mqsmsconf.size() == 0){
  874. throw new BusinessException("9003","sp产品无对应业务短信配置");
  875. }
  876. //移除时间验证失败标记
  877. tmplogmap.remove("valitime");
  878. //短信模板ID
  879. String smstempid = (String)mqsmsconf.get("SMSTEMPID");
  880. if(StringUtils.isEmpty(smstempid)){
  881. throw new BusinessException("9006","无模板ID配置");
  882. }
  883. tmplogmap.put("mqsmsconf", mqsmsconf);
  884. //获取调短信接口的模板参数
  885. HashMap<String, String> invokeparams = this.getInvokeparams(mqsmsconf, bodyparams,tmplogmap);
  886. tmplogmap.put("invokeparams", JsonUtil.objectToJson(invokeparams));
  887. //调接口参数不为空
  888. if(invokeparams != null && invokeparams.size()>0){
  889. String smswgname = (String)mqsmsconf.get("SMSWGNAME"); //发送短信网关名称
  890. if(StringUtils.isEmpty(smswgname)){
  891. smswgname = "sms117";
  892. }
  893. //调接口发送短信
  894. tmplogmap.put("smstype", smswgname);
  895. String sendres = sendSMS(userid,smstempid,JsonUtil.objectToJson(invokeparams),smswgname,tmplogmap);
  896. tmplogmap.put("sendsmsres", sendres);
  897. }
  898. resultcode = "0";
  899. errorinfo = "ok";
  900. } catch (Exception e) {
  901. if (e instanceof BusinessException) {
  902. resultcode = ((BusinessException) e).getCode();
  903. errorinfo = ((BusinessException) e).getMessage();
  904. }else{
  905. e.printStackTrace();
  906. resultcode = "8000";
  907. errorinfo = e.getMessage();
  908. }
  909. } finally {
  910. tmplogmap.put("resultcode", resultcode);
  911. tmplogmap.put("errorinfo", errorinfo);
  912. mainlogmap.put("sendSecSms", tmplogmap);
  913. }
  914. }
  915. /**
  916. * @param args
  917. */
  918. public static void main(String[] args) {
  919. // TODO Auto-generated method stub
  920. }
  921. }