f4e3bba70f3d14b4b289792eabaab543109776ee.svn-base 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. package com.chinacreator.process.job;
  2. import java.net.URLEncoder;
  3. import java.text.SimpleDateFormat;
  4. import java.util.ArrayList;
  5. import java.util.Date;
  6. import java.util.HashMap;
  7. import java.util.Iterator;
  8. import java.util.List;
  9. import java.util.Map;
  10. import java.util.TreeMap;
  11. import net.sf.json.JSONObject;
  12. import org.apache.commons.lang.math.NumberUtils;
  13. import org.apache.commons.lang.time.DateFormatUtils;
  14. import org.apache.commons.lang.time.DateUtils;
  15. import org.apache.log4j.Logger;
  16. import org.quartz.DisallowConcurrentExecution;
  17. import org.quartz.PersistJobDataAfterExecution;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.util.StringUtils;
  20. import com.chinacreator.common.exception.BusinessException;
  21. import com.chinacreator.common.util.DESUtil;
  22. import com.chinacreator.common.util.MD5;
  23. import com.chinacreator.common.util.URLUtil;
  24. import com.chinacreator.process.bean.NetOrderBean;
  25. import com.chinacreator.process.bean.OrderBean;
  26. import com.chinacreator.process.bean.OrderConfigBean;
  27. import com.chinacreator.process.bean.OrderLog;
  28. import com.chinacreator.process.bean.PointShopMqBean;
  29. import com.chinacreator.process.bean.PointShopOrderBean;
  30. import com.chinacreator.process.dao.DictionaryDao;
  31. import com.chinacreator.process.dao.PointShopDao;
  32. import com.chinacreator.process.dao.YoutuActiveDao;
  33. import com.chinacreator.process.util.HttpInvoke;
  34. import com.chinacreator.process.util.JsonUtil;
  35. import com.chinacreator.video.queue.MessageService;
  36. import com.chinacreator.video.queue.bean.MessagePipe;
  37. /**
  38. * 优酷第四季度双倍会员-胡丹丹
  39. * @author xu.zhou
  40. * @date 20191111
  41. */
  42. @PersistJobDataAfterExecution
  43. @DisallowConcurrentExecution
  44. public class YoutuVipMQJob {
  45. private Logger logger = Logger.getLogger(YoutuVipMQJob.class);
  46. private Logger log = Logger.getLogger("youtuvip");
  47. @Autowired
  48. private DictionaryDao dictionaryDao;
  49. @Autowired
  50. private YoutuActiveDao youtoActiveDao;
  51. @Autowired
  52. private MessageService messageService;
  53. public void doProcess() throws Exception {
  54. logger.info("接收优酷赠送会员队列JOB启动");
  55. if (dictionaryDao.getValue("recivemq").equals("0")) {
  56. long beginTime = System.currentTimeMillis();
  57. List<MessagePipe> list = messageService.reciveBatchMessage("youtuvip", 500);
  58. logger.info("接收优酷赠送会员队列花费时间:" + (System.currentTimeMillis() - beginTime));
  59. List<Map> dataList = new ArrayList<Map>();
  60. for (MessagePipe messagePipe : list) {
  61. Map reqBean = transBean(messagePipe.getBody());
  62. dataList.add(reqBean);
  63. }
  64. //{"spid":"1167","userid":"18673197465","cpid":"youtu","sendcont":"1"}
  65. List<Map> notrepeatList = getNotRepeatData(dataList);
  66. if(notrepeatList != null && notrepeatList.size()>0){
  67. for (Map reqBean : notrepeatList) {
  68. this.handleOrder(reqBean);
  69. }
  70. }
  71. } else {
  72. logger.info("停止接收优酷赠送会员队列消息");
  73. }
  74. }
  75. /**
  76. * 业务处理
  77. * @param mqBean
  78. */
  79. public void handleOrder(Map reqBean){
  80. Map logMap = new HashMap();
  81. logMap.put("data", reqBean);
  82. String resultCode = "-1";
  83. String resultInfo = "";
  84. try {
  85. SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
  86. String currtime = sdf.format(new Date()); //当前时间
  87. String youtuVipEndtime = dictionaryDao.getValue("youtuVipEndtime");
  88. if(youtuVipEndtime == null || "".equals(youtuVipEndtime)){
  89. throw new BusinessException("8001", "无结束时间配置");
  90. }
  91. if(Long.parseLong(currtime) > Long.parseLong(youtuVipEndtime)){
  92. throw new BusinessException("8002", "活动已结束");
  93. }
  94. if(!this.hasEffect(reqBean)){
  95. throw new BusinessException("8003", "无有效订购信息,不赠送会员");
  96. }
  97. Map<String, String> reMap = sendVip(reqBean);
  98. if(!"0".equals(reMap.get("resultcode"))){//赠送未成功
  99. resultCode = reMap.get("resultcode");
  100. resultInfo = reMap.get("resultinfo");
  101. }else{
  102. resultCode = "0";
  103. resultInfo = "成功";
  104. }
  105. } catch (Exception e) {
  106. if (e instanceof BusinessException) {
  107. resultInfo = ((BusinessException) e).getMessage();
  108. resultCode = ((BusinessException) e).getCode();
  109. }else{
  110. e.printStackTrace();
  111. resultCode = "8000";
  112. resultInfo = "系统错误,"+e.getMessage();
  113. }
  114. } finally{
  115. if(!"0".equals(resultCode)){
  116. //未成功,重试赠送会员
  117. inserVipRetryMq(reqBean);
  118. }
  119. //写日志
  120. logMap.put("reusltCode", resultCode);
  121. logMap.put("resultInfo", resultInfo);
  122. log.info(JsonUtil.objectToJson(logMap));
  123. }
  124. }
  125. /**
  126. * 查询本地订购关系表当前是否有已生效的订购关系
  127. * @param orderInfo
  128. * @return
  129. * @throws Exception
  130. */
  131. private boolean hasEffect(Map reqBean) throws Exception{
  132. boolean hasEffect = false;
  133. //查询用户本地订购关系表未失效的订购数据
  134. List<NetOrderBean> orderList = youtoActiveDao.findOrder("youtu",reqBean.get("userid")+"","1167");
  135. if(orderList != null && orderList.size()>0){//本地有订购关系
  136. for(NetOrderBean bean : orderList){
  137. if("0".equals(bean.getStatus()) || "1".equals(bean.getStatus())){
  138. hasEffect = true;
  139. break;
  140. }
  141. }
  142. }
  143. return hasEffect;
  144. }
  145. /**
  146. * 赠送会员
  147. * @param orderInfo
  148. * @return
  149. * @throws Exception
  150. */
  151. private Map<String, String> sendVip(Map reqBean){
  152. Map<String, String> reMap = new HashMap<String,String>();
  153. String resultcode = "-1"; //失败
  154. String resultinfo = ""; //失败
  155. try {
  156. //测试地址:http://114.255.201.228:86/activity/joinYouku20Vip
  157. //正式地址:http://114.255.201.238:8090/video-activity/joinYouku20Vip
  158. String vipurl = this.dictionaryDao.getValue("youtuVipUrlAddr");
  159. String timestamp = (System.currentTimeMillis() / 1000) + "";
  160. String userid = (String)reqBean.get("userid");
  161. String channel = "youtu";
  162. String activetype = "27";
  163. String pwd = "ea044e50";
  164. userid = DESUtil.encode(userid, pwd);
  165. String signature = MD5.MD5Encode( userid + pwd + timestamp);
  166. signature = signature.toLowerCase();
  167. vipurl = vipurl + "?userid=" + URLEncoder.encode(userid, "utf-8")+ "&channel=" + channel + "&activetype=" + activetype + "&timestamp="
  168. + timestamp + "&signature=" + signature;
  169. logger.info("vipurl: "+vipurl);
  170. String result = URLUtil.get(vipurl,10*1000); //调赠送会员接口,超时时间设置为10秒
  171. log.info("赠送会员结果=> userid: " +userid+" , result: "+result);
  172. Map<?,?> map = JsonUtil.jsonToMap(result);
  173. resultcode = (String)map.get("resultcode");
  174. resultinfo = (String)map.get("errorinfo");
  175. } catch (Exception e) {
  176. e.printStackTrace();
  177. log.error("userid: "+reqBean.get("userid")+"赠送会员失败,"+e);
  178. resultcode = "8000";
  179. resultinfo = e.getMessage();
  180. }
  181. reMap.put("resultcode", resultcode);
  182. reMap.put("resultinfo", resultinfo);
  183. return reMap;
  184. }
  185. /**
  186. * 去重复数据
  187. * @param oldBeans
  188. * @return
  189. */
  190. public List<Map> getNotRepeatData( List<Map> oldBeans){
  191. List<Map> newBeans = new ArrayList<Map>();
  192. Map<String,Map> map = new HashMap<String, Map>();
  193. for (Map reqBean : oldBeans) {
  194. if(map.containsKey(reqBean.get("userid"))){
  195. //insertvacMq(bean);
  196. }else{
  197. map.put(reqBean.get("userid").toString(), reqBean);
  198. }
  199. }
  200. Iterator<String> it = map.keySet().iterator();
  201. while (it.hasNext()) {
  202. String key = it.next().toString();
  203. newBeans.add(map.get(key));
  204. }
  205. logger.info("优酷赠送会员:old="+oldBeans.size()+" new:"+newBeans.size());
  206. return newBeans;
  207. }
  208. /**
  209. * 解析数据
  210. * @param body
  211. * orderId TD_POINTS_ORDER_REC表ID字段,我方生成的订单流水号
  212. * orderNo 积分商城订单号
  213. * requestId 返回给客户的请求ID
  214. * @return
  215. */
  216. public Map transBean(Map<String, Object> body) {
  217. String jsonStr = JsonUtil.objectToJson(body);
  218. return (Map) JsonUtil.jsonToBean(jsonStr, Map.class);
  219. }
  220. /**
  221. * 发送赠送成功短信队列推送
  222. * @param psoBean
  223. * @param resultCode
  224. */
  225. // public void inserSmstMq(Map reqBean){
  226. // try{
  227. // if(reqBean != null){
  228. // Map<String, String> map = new HashMap<String, String>();
  229. // map.put("userid", (String)reqBean.get("userid"));
  230. // map.put("cpid", (String)reqBean.get("cpid"));
  231. // map.put("spid", (String)reqBean.get("spid"));
  232. // map.put("result", "0");
  233. // map.put("channel", "");
  234. // map.put("style","0000");
  235. // map.put("times", "");
  236. // map.put("orderType", "");
  237. // map.put("type", "cssms");
  238. // map.put("busiType", "vipsend_succ");
  239. // logger.info(JsonUtil.objectToJson(map));
  240. // String mqReciveUrl = dictionaryDao.getValue("mqReciveUrl");
  241. // URLUtil.post(mqReciveUrl, JsonUtil.objectToJson(map));
  242. // }
  243. // }catch (Exception e){
  244. // e.printStackTrace();
  245. // log.error("发送赠送成功短信队列推送出现异常,"+e.getMessage());
  246. // }
  247. // }
  248. /**
  249. * 获取请求属性性
  250. * @return
  251. */
  252. private static Map getProperty(){
  253. Map reqProperty = new HashMap();
  254. reqProperty.put("Content-type", "application/json;charset=UTF-8");
  255. return reqProperty;
  256. }
  257. /*
  258. * 赠送会员超时异步重试队列推送,最多重试三次
  259. * @param orderInfo
  260. */
  261. public void inserVipRetryMq(Map reqBean){
  262. try {
  263. String sendcont = (String)reqBean.get("sendcont");
  264. if("3".equals(sendcont)){
  265. return;
  266. }
  267. MessagePipe mpipe = new MessagePipe();
  268. mpipe.setHeader("youtuvip");
  269. mpipe.addBody("userid", (String)reqBean.get("userid"));
  270. mpipe.addBody("cpid", (String)reqBean.get("cpid"));
  271. mpipe.addBody("spid", (String)reqBean.get("spid"));
  272. mpipe.addBody("sendcont",(Integer.parseInt(sendcont)+1)+"");
  273. this.messageService.sendMessage(mpipe);
  274. } catch (Exception e) {
  275. e.printStackTrace();
  276. log.error("赠送会员超时异步重试队列推送出现异常,"+e.getMessage());
  277. }
  278. }
  279. }