93902f4de02da83f696023e08ef93b9e10f8e229.svn-base 48 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003
  1. package com.chinacreator.process.job;
  2. import com.chinacreator.common.exception.BusinessException;
  3. import com.chinacreator.common.util.DESUtil;
  4. import com.chinacreator.common.util.MD5;
  5. import com.chinacreator.common.util.URLUtil;
  6. import com.chinacreator.process.bean.*;
  7. import com.chinacreator.process.dao.*;
  8. import com.chinacreator.process.service.*;
  9. import com.chinacreator.process.util.JsonUtil;
  10. import com.chinacreator.video.queue.MessageService;
  11. import com.chinacreator.video.queue.bean.MessagePipe;
  12. import org.apache.commons.lang.StringUtils;
  13. import org.apache.commons.lang.math.NumberUtils;
  14. import org.apache.log4j.Logger;
  15. import org.quartz.DisallowConcurrentExecution;
  16. import org.quartz.PersistJobDataAfterExecution;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import java.net.URLEncoder;
  19. import java.sql.SQLException;
  20. import java.text.SimpleDateFormat;
  21. import java.util.ArrayList;
  22. import java.util.Date;
  23. import java.util.HashMap;
  24. import java.util.List;
  25. import java.util.Map;
  26. import java.util.UUID;
  27. //import com.chinacreator.process.service.OrderToVipService;
  28. @PersistJobDataAfterExecution
  29. @DisallowConcurrentExecution
  30. public class ReciveMQJob {
  31. private Logger log = Logger.getLogger("recivemq");
  32. private Logger sendviplog = Logger.getLogger("ordersendvip");
  33. private Logger logger = Logger.getLogger(ReciveMQJob.class);
  34. @Autowired
  35. private MessageService messageService;
  36. @Autowired
  37. private ActivityConfigDao activityConfigDao;
  38. @Autowired
  39. private BlackWhiteDao blackWhiteDao;
  40. @Autowired
  41. private CallerAreacodeDao callerAreacodeDao;
  42. @Autowired
  43. private DictionaryDao dictionaryDao;
  44. @Autowired
  45. private ComOrderService comOrderService;
  46. @Autowired
  47. private BestvOrderService bestvOrderService;
  48. @Autowired
  49. private CctvOrderService cctvOrderService;
  50. @Autowired
  51. private AqiyOrderService aqiyOrderService;
  52. @Autowired
  53. private AqiyMonthOrderService aqiyMonthOrderService;
  54. @Autowired
  55. private ActivityHandleService activityHandleService;
  56. @Autowired
  57. private FhGoodsHandleService fhGoodsHandleService;
  58. @Autowired
  59. private YoutuOrderService youtuOrderService;
  60. //@Autowired
  61. //private OrderToVipService orderToVipService;
  62. @Autowired
  63. private OrderSendVipDao orderSendVipDao;
  64. @Autowired
  65. private SPDao spDao;
  66. @Autowired
  67. private CPDao cpDao;
  68. public void doProcess() throws Exception {
  69. logger.info("接收订购队列JOB启动");
  70. if (dictionaryDao.getValue("recivemq").equals("0")) {
  71. long beginTime = System.currentTimeMillis();
  72. List<MessagePipe> list = messageService
  73. .reciveBatchMessage("order", 500);
  74. logger.info("接收订购队列花费时间:" + (System.currentTimeMillis() - beginTime));
  75. for (MessagePipe messagePipe : list) {
  76. LogBean logBean = new LogBean();
  77. try {
  78. OrderBean orderBean = transBean(messagePipe.getBody());
  79. logBean.setUserid(orderBean.getUserid());
  80. logBean.setInputParm(JsonUtil.objectToJson(orderBean));
  81. if (StringUtils.isEmpty(orderBean.getProvince())) {
  82. AreaInfo areaInfo = callerAreacodeDao.findByCallerhead(orderBean.getUserid().substring(0, 7));
  83. if (areaInfo != null) {
  84. orderBean.setProvince(areaInfo.getProvince());
  85. orderBean.setArea(areaInfo.getArea());
  86. }
  87. }
  88. ActivityConfigBean activityConfigBean = activityConfigDao
  89. .findByCallerhead(orderBean.getCpid(),
  90. orderBean.getSpid(), orderBean.getProvince());
  91. if (activityConfigBean == null) {
  92. throw new BusinessException("9030", "非活动产品或者活动结束");
  93. }
  94. //设置ActiveType
  95. orderBean.setActiveType(activityConfigBean.getActiveType());
  96. if (blackWhiteDao.isWhite(orderBean.getUserid())) {//是白名单
  97. orderBean.setIsWhite(0);
  98. } else {
  99. orderBean.setIsWhite(1);
  100. }
  101. if (orderBean.getOrderType().equals("0")) {
  102. if ((NumberUtils.toLong(orderBean.getUpdateTime()) < NumberUtils
  103. .toLong(activityConfigBean.getBegintime()) || NumberUtils
  104. .toLong(orderBean.getUpdateTime()) > NumberUtils
  105. .toLong(activityConfigBean.getEndtime()))
  106. && (orderBean.getIsWhite() == 1)) {
  107. throw new BusinessException("9031", "非活动产品或者活动结束");
  108. }
  109. } else {
  110. if ((NumberUtils.toLong(orderBean.getUpdateTime()) < NumberUtils
  111. .toLong(activityConfigBean.getBegintime()) || NumberUtils
  112. .toLong(orderBean.getUpdateTime()) > NumberUtils
  113. .toLong(activityConfigBean.getCancelendtime()))
  114. && (orderBean.getIsWhite() == 1)) {
  115. throw new BusinessException("9032", "非活动产品或者活动结束");
  116. }
  117. }
  118. //获取子业务数据
  119. List<OrderBean> subOrderList = this.getSubPorduct(orderBean);
  120. if (subOrderList != null && subOrderList.size() > 0) {
  121. for (OrderBean bean : subOrderList) {//逐个处理
  122. commUpdateHandle(bean);
  123. }
  124. } else {
  125. commUpdateHandle(orderBean);
  126. }
  127. //订购送会员
  128. //if (orderBean.getOrderType().equals("0")) {//订购
  129. //orderToVipService.sendVip(orderBean);
  130. //}
  131. } catch (Exception e) {
  132. e.printStackTrace();
  133. logger.error("执行出错:" + logBean.getUserid() + "=>" + e);
  134. logBean.setErrorInfo("系统错误");
  135. logBean.setResultCode("8000");
  136. if (e instanceof BusinessException) {
  137. logBean.setErrorInfo(e.getMessage());
  138. logBean.setResultCode(((BusinessException) e).getCode());
  139. }
  140. } finally {
  141. log.info(JsonUtil.objectToJson(logBean));
  142. }
  143. }
  144. } else {
  145. logger.info("停止接收队列消息");
  146. }
  147. }
  148. /**
  149. * 真正业务处理
  150. *
  151. * @param orderBean
  152. * @throws Exception
  153. */
  154. public void commUpdateHandle(OrderBean orderBean) throws Exception {
  155. //添加订购关系是否有异常
  156. boolean haserror = false;
  157. try {
  158. //是复合产品
  159. if (!StringUtils.isEmpty(orderBean.getFhcpid()) && !StringUtils.isEmpty(orderBean.getFhspid())) {
  160. //复合产品不重设activeType,走专用通道
  161. fhGoodsHandleService.handle(orderBean);
  162. } else {//非复合产品
  163. //这部分代码不方便去除,因为TB_ACTIVITY_CONFIG表同样的SPID和CPID但ActiveType值可能不一样,比如leshilt952
  164. if (orderBean.getCpid().equals("bestv") && orderBean.getSpid().equals("980")) {
  165. orderBean.setActiveType(4);
  166. } else if (orderBean.getCpid().equals("changshi") && orderBean.getSpid().equals("1150")) {
  167. orderBean.setActiveType(5);
  168. } else if (orderBean.getCpid().equals("cctv") && orderBean.getSpid().equals("10081")) {
  169. orderBean.setActiveType(8);
  170. } else if (orderBean.getCpid().equals("aiqy") && orderBean.getSpid().equals("1017")) {
  171. //orderBean.setActiveType(9);
  172. } else if (orderBean.getCpid().equals("leshilt") && orderBean.getSpid().equals("952")) {
  173. orderBean.setActiveType(13);
  174. } else if (orderBean.getCpid().equals("aiqy") && orderBean.getSpid().equals("1018")) {
  175. orderBean.setActiveType(20);
  176. }
  177. //生成活动关系入口配置信息
  178. String activehandle = orderBean.getActivehandle();
  179. //20210802生成活动关系入口改为配置化
  180. if(!StringUtils.isEmpty(activehandle)){
  181. if(activehandle.indexOf("bestvOrderService") != -1){
  182. if (orderBean.getOrderType().equals("0")) {//订购
  183. bestvOrderService.order(orderBean);
  184. } else {//退订
  185. bestvOrderService.cancel(orderBean);
  186. }
  187. }else if(activehandle.indexOf("cctvOrderService") != -1){
  188. cctvOrderService.handle(orderBean);
  189. //一般都走这个处理入口
  190. }else if(activehandle.indexOf("aqiyOrderService") != -1){
  191. aqiyOrderService.handle(orderBean);
  192. //生成活动关系后要赠送流量的走这个入口
  193. }else if(activehandle.indexOf("youtuOrderService") != -1){
  194. youtuOrderService.handle(orderBean);
  195. }else if(activehandle.indexOf("aqiyMonthOrderService") != -1){
  196. aqiyMonthOrderService.handle(orderBean);
  197. }else if(activehandle.indexOf("activityHandleService") != -1){
  198. activityHandleService.handle(orderBean);
  199. }else {//没配置的或者匹配不上的都走公共通道
  200. if (orderBean.getOrderType().equals("0")) {//订购
  201. comOrderService.order(orderBean);
  202. } else {//退订
  203. comOrderService.cancel(orderBean);
  204. }
  205. }
  206. }else {
  207. if (orderBean.getOrderType().equals("0")) {//订购
  208. comOrderService.order(orderBean);
  209. } else {//退订
  210. comOrderService.cancel(orderBean);
  211. }
  212. }
  213. /****
  214. switch (orderBean.getActiveType()) {
  215. case 4: //bestv 980
  216. if (orderBean.getOrderType().equals("0")) {//订购
  217. bestvOrderService.order(orderBean);
  218. } else {//退订
  219. bestvOrderService.cancel(orderBean);
  220. }
  221. break;
  222. case 8:
  223. cctvOrderService.handle(orderBean); //cctv 10081
  224. break;
  225. case 9:
  226. aqiyOrderService.handle(orderBean); //aiqy 1017
  227. break;
  228. case 13:
  229. aqiyOrderService.handle(orderBean); //leshilt 952
  230. break;
  231. case 20:
  232. aqiyOrderService.handle(orderBean); //aiqy 1018
  233. break;
  234. case 12:
  235. aqiyOrderService.handle(orderBean); //leshilt 954
  236. break;
  237. case 16:
  238. youtuOrderService.handle(orderBean);//芒果TV16元(mangtv16 1006)
  239. break;
  240. case 18:
  241. aqiyMonthOrderService.handle(orderBean); //aiqy 1017 已失效
  242. break;
  243. case 21:
  244. activityHandleService.handle(orderBean); //youtu 21156
  245. break;
  246. case 22:
  247. youtuOrderService.handle(orderBean);//优酷20元(youtu 1167)
  248. break;
  249. case 23:
  250. aqiyOrderService.handle(orderBean);//华数 (huashuapp 10206)
  251. break;
  252. case 24:
  253. aqiyOrderService.handle(orderBean);//PPTV16元(pptv 10)
  254. break;
  255. case 25:
  256. aqiyOrderService.handle(orderBean);//风行12元
  257. break;
  258. case 43:
  259. aqiyOrderService.handle(orderBean);//sohutv 搜狐18元
  260. break;
  261. case 45:
  262. aqiyOrderService.handle(orderBean);//xueguoxue 学国学12元
  263. break;
  264. case 46:
  265. aqiyOrderService.handle(orderBean);//zmkb 最美课本
  266. break;
  267. case 82:
  268. aqiyOrderService.handle(orderBean);//哔哩哔哩 20
  269. break;
  270. case 49:
  271. aqiyOrderService.handle(orderBean);//cpid:ppsport spid:36
  272. break;
  273. case 50:
  274. aqiyOrderService.handle(orderBean);//cpid:aiqy spid:1035
  275. break;
  276. case 51:
  277. aqiyOrderService.handle(orderBean);//cpid:changshi spid:99144185
  278. break;
  279. case 52:
  280. aqiyOrderService.handle(orderBean);//cpid:mangtv16 spid:1008
  281. break;
  282. case 53:
  283. aqiyOrderService.handle(orderBean);//cpid:aiqy spid:1017
  284. break;
  285. case 83:
  286. aqiyOrderService.handle(orderBean);
  287. break;
  288. case 84:
  289. aqiyOrderService.handle(orderBean);
  290. break;
  291. case 85:
  292. aqiyOrderService.handle(orderBean);
  293. break;
  294. case 86:
  295. aqiyOrderService.handle(orderBean);
  296. break;
  297. case 87:
  298. aqiyOrderService.handle(orderBean);
  299. break;
  300. case 88:
  301. aqiyOrderService.handle(orderBean);
  302. break;
  303. default:
  304. if (orderBean.getOrderType().equals("0")) {//订购
  305. comOrderService.order(orderBean);
  306. } else {//退订
  307. comOrderService.cancel(orderBean);
  308. }
  309. break;
  310. }
  311. *****/
  312. }
  313. } catch (Exception e) {
  314. haserror = true;
  315. throw e;
  316. } finally {
  317. //添加成功,走实时送会员流程
  318. if (!haserror) {
  319. /***
  320. if (straightBoolean(orderBean)) {
  321. logger.info("芒果活动会员直充开始");
  322. invokeVip(orderBean);
  323. logger.info("芒果活动会员直充结束");
  324. } else {***/
  325. //根据渠道和SPID送会员,走会员领取接口
  326. sendVip(orderBean);
  327. //爱奇艺1017送两个会员,走直充接口
  328. //sendQiqyVip(orderBean);
  329. //走直充送会员
  330. sendVipByZc(orderBean);
  331. //}
  332. }
  333. }
  334. }
  335. /**
  336. * 芒果会员直充资格判断
  337. *
  338. * @param orderBean
  339. * @return
  340. */
  341. public boolean straightBoolean(OrderBean orderBean) throws Exception {
  342. logger.info("队列数据:" + orderBean.toString());
  343. try {
  344. //渠道判断
  345. String channel = orderBean.getChannel();
  346. //渠道为空,或不是以WP_开头,不处理
  347. if (StringUtils.isEmpty(channel) || !channel.startsWith("WP_")) {
  348. return false;
  349. }
  350. String straightTime = dictionaryDao.getValue("straightTime");
  351. logger.info("字典表中获取的数据:" + straightTime);
  352. String[] split = straightTime.split(",");
  353. //spid判断
  354. if (!split[0].equals(orderBean.getSpid())) {
  355. logger.info("芒果会员参数1" + !split[0].equals(orderBean.getSpid()));
  356. return false;
  357. }
  358. //复合产品,验证的是子产品的SPID,不处理
  359. if (!StringUtils.isEmpty(orderBean.getFhcpid()) && !StringUtils.isEmpty(orderBean.getFhspid())) {
  360. return false;
  361. }
  362. //时间判断
  363. String[] time = split[1].split("\\|");
  364. SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
  365. long startTime = sdf.parse(time[0]).getTime();
  366. long endTime = sdf.parse(time[1]).getTime();
  367. long nowTime = sdf.parse(orderBean.getUpdateTime()).getTime();
  368. if (nowTime < startTime || nowTime > endTime) {
  369. logger.info("芒果会员参数2" + (nowTime < startTime || nowTime > endTime));
  370. return false;
  371. }
  372. logger.info("芒果会员参数3" + "0".equals(orderBean.getOrderType()));
  373. //判断是否订购
  374. return "0".equals(orderBean.getOrderType());
  375. } catch (Exception e) {
  376. logger.info("芒果活动会员直充出错");
  377. e.printStackTrace();
  378. return false;
  379. }
  380. }
  381. public OrderBean transBean(Map<String, Object> body) {
  382. String jsonStr = JsonUtil.objectToJson(body);
  383. return (OrderBean) JsonUtil.jsonToBean(jsonStr, OrderBean.class);
  384. }
  385. /**
  386. * 判断是否复合产品,获取可赠送会员的子业务列表
  387. *
  388. * @param orderBean
  389. * @return
  390. * @throws Exception
  391. */
  392. private List<OrderBean> getSubPorduct(OrderBean orderBean) throws Exception {
  393. List<OrderBean> resultData = new ArrayList<OrderBean>();
  394. try {
  395. //查询是否复合产品
  396. List<HashMap> fhGoods = spDao.getFhGoods(orderBean.getSpid());
  397. if (fhGoods.size() > 0) {//复合产品
  398. logger.info("是复合产品");
  399. //获取子业务列表
  400. List<HashMap> reList = spDao.getSubSpInfo(orderBean.getSpid());
  401. if (reList != null && reList.size() > 0) {
  402. logger.info(orderBean.getCpid() + ">>>" + orderBean.getSpid() + ",子业务数据条数为:" + reList.size());
  403. for (HashMap hm : reList) {//遍历子业务列表
  404. resultData.add(cloneBean(orderBean, hm.get("CPID") + "", hm.get("SPID") + ""));
  405. logger.info("要处理的子业务:" + hm.get("CPID") + ">>>" + hm.get("SPID"));
  406. }
  407. } else {
  408. throw new BusinessException("9061", "复合产品无子业务配置");
  409. }
  410. logger.info("要处理的子业务条数:" + resultData.size());
  411. } else {//非复合产品
  412. logger.info("不是复合产品");
  413. }
  414. } catch (SQLException e) {
  415. throw new BusinessException("9060", "查询子产品出现异常," + e.getMessage());
  416. }
  417. return resultData;
  418. }
  419. /**
  420. * 克隆对象
  421. *
  422. * @param orderBean
  423. * @param subCpid 子产品CPID
  424. * @param subSpid 子产品SPID
  425. * @return
  426. */
  427. private OrderBean cloneBean(OrderBean orderBean, String subCpid, String subSpid) {
  428. OrderBean bean = new OrderBean();
  429. bean.setFhcpid(orderBean.getCpid());
  430. bean.setFhspid(orderBean.getSpid());
  431. bean.setCpid(subCpid);
  432. bean.setSpid(subSpid);
  433. bean.setUserid(orderBean.getUserid());
  434. bean.setOrderType(orderBean.getOrderType());
  435. bean.setOrderstatus(orderBean.getOrderType());
  436. bean.setProvince(orderBean.getProvince());
  437. bean.setArea(orderBean.getArea());
  438. bean.setUpdateTime(orderBean.getUpdateTime());
  439. bean.setActivated(orderBean.getActivated());
  440. if ("0".equals(orderBean.getOrderType())) {//y订购
  441. bean.setOrderchannel(orderBean.getChannel());
  442. bean.setOrdertime(orderBean.getUpdateTime());
  443. bean.setOrderstatus("0");
  444. } else {//退订
  445. bean.setCanceltime(orderBean.getUpdateTime());
  446. bean.setCancelchannel(orderBean.getChannel());
  447. bean.setOrderstatus("1");
  448. }
  449. //使用复合产品的activeType
  450. bean.setActiveType(orderBean.getActiveType());
  451. return bean;
  452. }
  453. /**
  454. * 实时送会员
  455. *
  456. * @param orderBean
  457. */
  458. private void sendVip(OrderBean orderBean) {
  459. //只处理订购
  460. if (!"0".equals(orderBean.getOrderType())) return;
  461. //复合产品,生成活动关系时是每个子业务一条活动关系,验证的是子产品的SPID,不处理
  462. if (!StringUtils.isEmpty(orderBean.getFhcpid()) && !StringUtils.isEmpty(orderBean.getFhspid())) {
  463. return;
  464. }
  465. boolean flag = false;
  466. long startime = System.currentTimeMillis();
  467. Map logMap = new HashMap();
  468. logMap.put("data", orderBean);
  469. String resultcode = "-1";
  470. String errorinfo = "";
  471. String sendno = ""; //赠送记录表的ID,用于更新数据
  472. boolean hassend = false; //是否赠送
  473. try {
  474. SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
  475. String currtime = sdf.format(new Date()); //当前时间
  476. String userid = orderBean.getUserid();
  477. String cpid = orderBean.getCpid();
  478. String spid = orderBean.getSpid();
  479. String orderchannel = orderBean.getOrderchannel();
  480. //手厅传的渠道标识与订购疯关系表不相同
  481. String channel = orderBean.getChannel();
  482. //String sendmonth = ""; //赠送月份
  483. String ordertime = ""; //订购时间
  484. List<HashMap> confList = orderSendVipDao.qryOrderSendvipConf(cpid, spid);
  485. if (confList != null && confList.size() > 0) {
  486. if (StringUtils.isEmpty(orderchannel) && StringUtils.isEmpty(channel)){
  487. throw new BusinessException("5006", "订购渠道为空,orderchannel=>"+orderchannel);
  488. }
  489. List<HashMap> orderList = orderSendVipDao.findOrderRel(userid, spid);
  490. if (orderList != null && orderList.size() > 0) {
  491. HashMap orderMap = orderList.get(0);
  492. //sendmonth = orderMap.get("ORDERTIME").toString().substring(0, 6);
  493. ordertime = orderMap.get("ORDERTIME").toString();
  494. //如果订购渠道为空,从订购关系中获取订购渠道
  495. //if (StringUtils.isEmpty(orderchannel)) {
  496. //orderchannel = (String) orderMap.get("ORDERCHANNEL");
  497. //}
  498. if( orderchannel != null && channel != null
  499. && !orderchannel.equals(orderMap.get("ORDERCHANNEL"))
  500. && !channel.equals(orderMap.get("ORDERCHANNEL"))){
  501. throw new BusinessException("5005", "渠道与订购关系表的渠道不一致,orderchannel=>"+orderchannel);
  502. }
  503. logMap.put("orderchannel", orderchannel);
  504. logMap.put("channel", channel);
  505. String confChannel = "";
  506. String starttime = "";
  507. String endtime = "";
  508. //判断订购渠道是否有配置
  509. for (HashMap confMap : confList) {
  510. flag = false;
  511. starttime = (String)confMap.get("STARTTIME");
  512. endtime = (String)confMap.get("ENDTIME");
  513. confChannel = confMap.get("CHANNEL").toString().trim();
  514. //订购渠道与配置渠道相同,或者配置渠道不限制
  515. if (confChannel.equals(orderchannel)
  516. || confChannel.equals(channel)
  517. || "*".equals(confChannel)
  518. //配置渠道以指定字符开头且订购渠道是以指定渠道开头,芒果16元
  519. || (confChannel.indexOf("*") != -1 && orderchannel != null && orderchannel.indexOf(confChannel.split("\\*")[0]) == 0)
  520. || (confChannel.indexOf("*") != -1 && channel != null && channel.indexOf(confChannel.split("\\*")[0]) == 0)) {
  521. /**************************判断时间是否合法开始************************/
  522. //开始时间和结束时间都不为空且当前时间包含在两者之间
  523. if (!StringUtils.isEmpty(starttime) && !StringUtils.isEmpty(endtime)
  524. && Long.parseLong(currtime) >= Long.parseLong(starttime.trim())
  525. && Long.parseLong(currtime) <= Long.parseLong(endtime.trim())){
  526. flag = true;
  527. break;
  528. //开始时间不为空,结束时间为空,当前时间大于或等于开始时间
  529. }else if (!StringUtils.isEmpty(starttime) && StringUtils.isEmpty(endtime)
  530. && Long.parseLong(currtime) >= Long.parseLong(starttime.trim())){
  531. flag = true;
  532. break;
  533. //开始时间为空,结束时间不为空,当前时间小于或等于结束时间
  534. }else if (StringUtils.isEmpty(starttime) && !StringUtils.isEmpty(endtime)
  535. && Long.parseLong(currtime) <= Long.parseLong(endtime.trim())){
  536. flag = true;
  537. break;
  538. //开始时间为空且结束时间也为空
  539. }else if (StringUtils.isEmpty(starttime) && StringUtils.isEmpty(endtime)){
  540. flag = true;
  541. break;
  542. }else{
  543. throw new BusinessException("5004", "当前时间未包含在配置时间内");
  544. }
  545. /**************************判断时间是否合法结束************************/
  546. }
  547. }
  548. //订购渠道有配置
  549. if (flag) {
  550. //logMap.put("sendmonth", sendmonth);
  551. logMap.put("ordertime", ordertime);
  552. logMap.put("status", orderMap.get("STATUS"));
  553. if ("0".equals(orderMap.get("STATUS")) || "1".equals(orderMap.get("STATUS"))) {
  554. hassend = true;
  555. sendno = orderSendVipDao.getNo();
  556. logMap.put("sendno", sendno);
  557. HashMap<String, String> params = new HashMap<String, String>();
  558. params.put("ID", sendno);
  559. params.put("USERID", userid);
  560. params.put("CPID", cpid);
  561. params.put("SPID", spid);
  562. //params.put("SENDMONTH", sendmonth);
  563. params.put("RESULTCODE", "2");
  564. params.put("RESULTINFO", "赠送中");
  565. params.put("ORDERTIME", ordertime);
  566. params.put("ORDERCHANNEL", orderchannel);
  567. orderSendVipDao.addSendvipRec(params);
  568. String result = invokeVip(orderBean);
  569. logMap.put("result", result);
  570. if (result != null && !"".equals(result)) {
  571. Map<?, ?> map = JsonUtil.jsonToMap(result);
  572. resultcode = (String) map.get("resultcode");
  573. errorinfo = (String) map.get("errorinfo");
  574. }
  575. } else {
  576. throw new BusinessException("5002", "订购关系已失效");
  577. }
  578. } else {
  579. throw new BusinessException("5003", "非指定渠道," + orderchannel);
  580. }
  581. } else {
  582. throw new BusinessException("5001", "无订购关系");
  583. }
  584. }
  585. } catch (Exception e) {
  586. if (e instanceof BusinessException) {
  587. errorinfo = ((BusinessException) e).getMessage();
  588. resultcode = ((BusinessException) e).getCode();
  589. } else {
  590. e.printStackTrace();
  591. resultcode = "8000";
  592. errorinfo = "处理数据出现异常," + e.getMessage();
  593. sendviplog.error("处理出现异常," + e.getMessage() + ",data: " + JsonUtil.objectToJson(orderBean));
  594. }
  595. } finally {
  596. if (hassend) {
  597. try {
  598. if (errorinfo != null && errorinfo.length() > 500) {
  599. errorinfo = errorinfo.substring(0, 500);
  600. }
  601. boolean updRes = orderSendVipDao.updatePush(sendno, resultcode, errorinfo);
  602. sendviplog.info("updRes=>" + updRes);
  603. } catch (Exception e2) {
  604. e2.printStackTrace();
  605. errorinfo = "更新领取结果出现异常," + e2.getMessage();
  606. sendviplog.error(errorinfo);
  607. }
  608. }
  609. //写日志
  610. logMap.put("hassend", hassend);
  611. logMap.put("resultcode", resultcode);
  612. logMap.put("errorinfo", errorinfo);
  613. logMap.put("time", (System.currentTimeMillis() - startime) + "");
  614. sendviplog.info(JsonUtil.objectToJson(logMap));
  615. }
  616. }
  617. /**
  618. * 调接口送会员
  619. *
  620. * @param
  621. * @return
  622. * @throws Exception
  623. */
  624. private String invokeVip(OrderBean orderBean) throws Exception {
  625. String result = "";
  626. try {
  627. String vipurl = this.dictionaryDao.getValue("joinActivityUrl");
  628. String timestamp = (System.currentTimeMillis() / 1000) + "";
  629. String userid = orderBean.getUserid();
  630. String channel = orderBean.getChannel();
  631. String usertype = "4"; //会员账号类型 4:手机号
  632. String userval = userid;
  633. String pwd = "";
  634. CPInfo cpinfo = cpDao.findById(orderBean.getCpid());
  635. if (cpinfo != null) {
  636. pwd = cpinfo.getNetpwd();
  637. }
  638. userid = DESUtil.encode(userid, pwd);
  639. String signature = MD5.MD5Encode(userid + userval + pwd + timestamp);
  640. signature = signature.toLowerCase();
  641. vipurl = vipurl + "?userid=" + URLEncoder.encode(userid, "utf-8") + "&usertype=" + usertype + "&userval=" + userval + "&channel=" + channel + "&timestamp="
  642. + timestamp + "&signature=" + signature + "&activetype=" + orderBean.getActiveType();
  643. sendviplog.info("vipurl: " + vipurl);
  644. result = URLUtil.get(vipurl, 30 * 1000); //调赠送会员接口,超时时间设置为10秒
  645. sendviplog.info("赠送会员结果=> userid: " + userval + ", spid: " + orderBean.getSpid() + " , result: " + result);
  646. } catch (Exception e) {
  647. e.printStackTrace();
  648. sendviplog.error("userid: " + orderBean.getUserid() + "赠送会员出现异常," + e);
  649. if (e.getMessage() != null && e.getMessage().indexOf("TimeoutException") != -1) {//超时异常
  650. throw new BusinessException("9070", "赠送会员超时", new String[0]);
  651. } else {
  652. throw new BusinessException("9002", "赠送会员未成功," + e.getMessage(), new String[0]);
  653. }
  654. }
  655. return result;
  656. }
  657. /**
  658. * 调直充接口送会员
  659. * @param
  660. * @return
  661. * @throws Exception
  662. */
  663. private String invokeVipByZc(OrderBean orderBean, HashMap confmp) throws Exception {
  664. String result = "";
  665. try {
  666. String basevipurl = this.dictionaryDao.getValue("giveVipUrl");
  667. String vipurl = basevipurl;
  668. String apptype = "2";
  669. String orderid = UUID.randomUUID().toString().replaceAll("-", "").substring(0, 16);
  670. String timestamp = System.currentTimeMillis() + "";
  671. String userid = orderBean.getUserid();
  672. String channel = orderBean.getSpid(); //渠道传SPID
  673. String usertype = "4"; //会员账号类型 4:手机号
  674. String userval = userid;
  675. String vipid = confmp.get("VIPID").toString();
  676. String viptype = confmp.get("VIPTYPE").toString();
  677. String pwd = confmp.get("VIPPWD").toString();
  678. String vipval = "1";
  679. String signature = MD5.MD5Encode(orderid+channel+vipid+userval+pwd+timestamp);
  680. signature = signature.toLowerCase();
  681. //直充接口新参数
  682. //产品名称
  683. String productName = URLEncoder.encode(confmp.get("PRODUCTNAME") == null ? "" : confmp.get("PRODUCTNAME").toString(),"utf-8");
  684. //产品ID
  685. String productId = confmp.get("PRODUCTID") == null ? "" : confmp.get("PRODUCTID").toString();
  686. //订购状态,0订购,1退订
  687. String orderType = orderBean.getOrderType();
  688. vipurl = vipurl + "?userval=" + URLEncoder.encode(userval,"utf-8") + "&usertype=" + usertype + "&channel=" + channel + "&timestamp="
  689. + timestamp + "&signature=" + signature + "&orderid=" + orderid + "&viptype=" + viptype + "&vipid=" + vipid + "&vipval="+vipval + "&apptype=" + apptype
  690. + "&productName="+productName + "&productId=" + productId + "&orderType=" + orderType;
  691. sendviplog.info("vipurl: " + vipurl);
  692. //第一次直充会员
  693. result = URLUtil.get(vipurl, 30 * 1000); //调赠送会员接口,超时时间设置为10秒
  694. sendviplog.info("爱奇异第一次直充会员结果=> userid: " + userval + ", spid: " + orderBean.getSpid() + " , result: " + result);
  695. } catch (Exception e) {
  696. e.printStackTrace();
  697. sendviplog.error("userid: " + orderBean.getUserid() + "赠送会员出现异常," + e);
  698. if (e.getMessage() != null && e.getMessage().indexOf("TimeoutException") != -1) {//超时异常
  699. throw new BusinessException("9070", "赠送会员超时", new String[0]);
  700. } else {
  701. throw new BusinessException("9002", "赠送会员未成功," + e.getMessage(), new String[0]);
  702. }
  703. }
  704. return result;
  705. }
  706. /**
  707. * 1017 aiqy WO+视频爱奇艺定向流量包月
  708. * 活动时间上线时间12月17日——12月30日(晚间下线)
  709. * 活动上线之后用户订购,直接充值两个爱奇艺7日会员。退订再订购也直充
  710. * 如果用户在活动上线前已经完成订购,需要通过退订再订购触发直充会员
  711. * @param orderBean
  712. * @return
  713. */
  714. /***
  715. private String sendQiqyVip(OrderBean orderBean){
  716. String result = "";
  717. try {
  718. //只处理1017的订购
  719. if(!"1017".equals(orderBean.getSpid()) || !"0".equals(orderBean.getOrderType())){
  720. return "非指定产品或者非订购操作";
  721. }
  722. if (!StringUtils.isEmpty(orderBean.getFhcpid()) && !StringUtils.isEmpty(orderBean.getFhspid())) {
  723. return "复合产品,不赠送";
  724. }
  725. String currTime = new SimpleDateFormat("yyyyMMddhhmmss").format(new Date());
  726. String offlinetime = this.dictionaryDao.getValue("aiqy15vipendtime");
  727. if(Long.parseLong(currTime) > Long.parseLong(offlinetime)){
  728. return "活动已过期";
  729. }
  730. String basevipurl = this.dictionaryDao.getValue("giveVipUrl");
  731. String vipurl = basevipurl;
  732. String apptype = "2";
  733. String orderid = UUID.randomUUID().toString().replaceAll("-", "").substring(0, 16);
  734. String timestamp = System.currentTimeMillis() + "";
  735. String userid = orderBean.getUserid();
  736. String channel = orderBean.getSpid(); //渠道传SPID
  737. String usertype = "4"; //会员账号类型 4:手机号
  738. String userval = userid;
  739. String vipid = "00501";
  740. String viptype = "aiqyVip";
  741. String pwd = "ahd7aqy2";
  742. String vipval = "1";
  743. String signature = MD5.MD5Encode(orderid+channel+vipid+userval+pwd+timestamp);
  744. signature = signature.toLowerCase();
  745. vipurl = vipurl + "?userval=" + URLEncoder.encode(userval,"utf-8") + "&usertype=" + usertype + "&channel=" + channel + "&timestamp="
  746. + timestamp + "&signature=" + signature + "&orderid=" + orderid + "&viptype=" + viptype + "&vipid=" + vipid + "&vipval="+vipval + "&apptype=" + apptype;
  747. sendviplog.info("vipurl: " + vipurl);
  748. //第一次直充会员
  749. result = URLUtil.get(vipurl, 30 * 1000); //调赠送会员接口,超时时间设置为10秒
  750. sendviplog.info("爱奇异第一次直充会员结果=> userid: " + userval + ", spid: " + orderBean.getSpid() + " , result: " + result);
  751. //第二次直充会员
  752. vipurl = basevipurl;
  753. orderid = UUID.randomUUID().toString().replaceAll("-", "").substring(0, 16);
  754. timestamp = System.currentTimeMillis() + "";
  755. signature = MD5.MD5Encode(orderid+channel+vipid+userval+pwd+timestamp);
  756. vipurl = vipurl + "?userval=" + URLEncoder.encode(userval,"utf-8") + "&usertype=" + usertype + "&channel=" + channel + "&timestamp="
  757. + timestamp + "&signature=" + signature + "&orderid=" + orderid + "&viptype=" + viptype + "&vipid=" + vipid + "&vipval="+vipval + "&apptype=" + apptype;
  758. sendviplog.info("vipurl: " + vipurl);
  759. result = URLUtil.get(vipurl, 30 * 1000); //调赠送会员接口,超时时间设置为10秒
  760. sendviplog.info("爱奇异第二次直充会员结果=> userid: " + userval + ", spid: " + orderBean.getSpid() + " , result: " + result);
  761. } catch (Exception e) {
  762. e.printStackTrace();
  763. result = "赠送会员异常,"+e.getMessage();
  764. sendviplog.info("爱奇异直充会员出现异常:"+result+",userid:"+orderBean.getUserid());
  765. }
  766. return result;
  767. }
  768. ******/
  769. /**
  770. * 直充方式送会员
  771. * @param orderBean
  772. * @return
  773. */
  774. /**
  775. * 实时送会员
  776. *
  777. * @param orderBean
  778. */
  779. private void sendVipByZc(OrderBean orderBean) {
  780. //只处理订购
  781. if (!"0".equals(orderBean.getOrderType())) return;
  782. //复合产品,生成活动关系时是每个子业务一条活动关系,验证的是子产品的SPID,不处理
  783. if (!StringUtils.isEmpty(orderBean.getFhcpid()) && !StringUtils.isEmpty(orderBean.getFhspid())) {
  784. return;
  785. }
  786. boolean flag = false;
  787. long startime = System.currentTimeMillis();
  788. Map logMap = new HashMap();
  789. logMap.put("data", orderBean);
  790. String resultcode = "-1";
  791. String errorinfo = "";
  792. String sendno = ""; //赠送记录表的ID,用于更新数据
  793. boolean hassend = false; //是否赠送
  794. try {
  795. SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
  796. String currtime = sdf.format(new Date()); //当前时间
  797. String userid = orderBean.getUserid();
  798. String cpid = orderBean.getCpid();
  799. String spid = orderBean.getSpid();
  800. String orderchannel = orderBean.getOrderchannel();
  801. //手厅传的渠道标识与订购疯关系表不相同
  802. String channel = orderBean.getChannel();
  803. //String sendmonth = ""; //赠送月份
  804. String ordertime = ""; //订购时间
  805. List<HashMap> confList = orderSendVipDao.qryOrderSendvipConfByZc(cpid, spid);
  806. if (confList != null && confList.size() > 0) {
  807. if (StringUtils.isEmpty(orderchannel) && StringUtils.isEmpty(channel)){
  808. throw new BusinessException("5006", "订购渠道为空,orderchannel=>"+orderchannel);
  809. }
  810. //sendviplog.info("confList=>"+confList);
  811. List<HashMap> orderList = orderSendVipDao.findOrderRel(userid, spid);
  812. if (orderList != null && orderList.size() > 0) {
  813. HashMap orderMap = orderList.get(0);
  814. ordertime = orderMap.get("ORDERTIME").toString();
  815. if( orderchannel != null && channel != null
  816. && !orderchannel.equals(orderMap.get("ORDERCHANNEL"))
  817. && !channel.equals(orderMap.get("ORDERCHANNEL"))){
  818. throw new BusinessException("5005", "渠道与订购关系表的渠道不一致,orderchannel=>"+orderchannel);
  819. }
  820. logMap.put("orderchannel", orderchannel);
  821. logMap.put("channel", channel);
  822. String confChannel = "";
  823. String starttime = "";
  824. String endtime = "";
  825. HashMap cm = null;
  826. //判断订购渠道是否有配置
  827. for (HashMap confMap : confList) {
  828. flag = false;
  829. starttime = (String)confMap.get("STARTTIME");
  830. endtime = (String)confMap.get("ENDTIME");
  831. confChannel = confMap.get("CHANNEL").toString().trim();
  832. //订购渠道与配置渠道相同,或者配置渠道不限制
  833. if (confChannel.equals(orderchannel)
  834. || confChannel.equals(channel)
  835. || "*".equals(confChannel)
  836. //配置渠道以指定字符开头且订购渠道是以指定渠道开头,芒果16元
  837. || (confChannel.indexOf("*") != -1 && orderchannel != null && orderchannel.indexOf(confChannel.split("\\*")[0]) == 0)
  838. || (confChannel.indexOf("*") != -1 && channel != null && channel.indexOf(confChannel.split("\\*")[0]) == 0)) {
  839. /**************************判断时间是否合法开始************************/
  840. //开始时间和结束时间都不为空且当前时间包含在两者之间
  841. if (!StringUtils.isEmpty(starttime) && !StringUtils.isEmpty(endtime)
  842. && Long.parseLong(currtime) >= Long.parseLong(starttime.trim())
  843. && Long.parseLong(currtime) <= Long.parseLong(endtime.trim())){
  844. flag = true;
  845. cm = confMap;
  846. break;
  847. //开始时间不为空,结束时间为空,当前时间大于或等于开始时间
  848. }else if (!StringUtils.isEmpty(starttime) && StringUtils.isEmpty(endtime)
  849. && Long.parseLong(currtime) >= Long.parseLong(starttime.trim())){
  850. flag = true;
  851. cm = confMap;
  852. break;
  853. //开始时间为空,结束时间不为空,当前时间小于或等于结束时间
  854. }else if (StringUtils.isEmpty(starttime) && !StringUtils.isEmpty(endtime)
  855. && Long.parseLong(currtime) <= Long.parseLong(endtime.trim())){
  856. flag = true;
  857. cm = confMap;
  858. break;
  859. //开始时间为空且结束时间也为空
  860. }else if (StringUtils.isEmpty(starttime) && StringUtils.isEmpty(endtime)){
  861. flag = true;
  862. cm = confMap;
  863. break;
  864. }else{
  865. //sendviplog.info("starttime=>"+starttime+", endtime=>"+endtime+", currtime=>"+currtime);
  866. throw new BusinessException("5004", "当前时间未包含在配置时间内");
  867. }
  868. /**************************判断时间是否合法结束************************/
  869. }
  870. }
  871. //订购渠道有配置
  872. if (flag) {
  873. //logMap.put("sendmonth", sendmonth);
  874. logMap.put("ordertime", ordertime);
  875. logMap.put("status", orderMap.get("STATUS"));
  876. if ("0".equals(orderMap.get("STATUS")) || "1".equals(orderMap.get("STATUS"))) {
  877. hassend = true;
  878. sendno = orderSendVipDao.getNo();
  879. logMap.put("sendno", sendno);
  880. HashMap<String, String> params = new HashMap<String, String>();
  881. params.put("ID", sendno);
  882. params.put("USERID", userid);
  883. params.put("CPID", cpid);
  884. params.put("SPID", spid);
  885. //params.put("SENDMONTH", sendmonth);
  886. params.put("RESULTCODE", "2");
  887. params.put("RESULTINFO", "赠送中");
  888. params.put("ORDERTIME", ordertime);
  889. params.put("ORDERCHANNEL", orderchannel);
  890. orderSendVipDao.addSendvipRec(params);
  891. String result = invokeVipByZc(orderBean, cm);
  892. logMap.put("result", result);
  893. if (result != null && !"".equals(result)) {
  894. Map<?, ?> map = JsonUtil.jsonToMap(result);
  895. resultcode = (String) map.get("resultcode");
  896. errorinfo = (String) map.get("errorinfo");
  897. }
  898. } else {
  899. throw new BusinessException("5002", "订购关系已失效");
  900. }
  901. } else {
  902. throw new BusinessException("5003", "非指定渠道," + orderchannel);
  903. }
  904. } else {
  905. throw new BusinessException("5001", "无订购关系");
  906. }
  907. }
  908. } catch (Exception e) {
  909. if (e instanceof BusinessException) {
  910. errorinfo = ((BusinessException) e).getMessage();
  911. resultcode = ((BusinessException) e).getCode();
  912. } else {
  913. e.printStackTrace();
  914. resultcode = "8000";
  915. errorinfo = "处理数据出现异常," + e.getMessage();
  916. sendviplog.error("处理出现异常," + e.getMessage() + ",data: " + JsonUtil.objectToJson(orderBean));
  917. }
  918. } finally {
  919. if (hassend) {
  920. try {
  921. if (errorinfo != null && errorinfo.length() > 500) {
  922. errorinfo = errorinfo.substring(0, 500);
  923. }
  924. boolean updRes = orderSendVipDao.updatePush(sendno, resultcode, errorinfo);
  925. sendviplog.info("updRes=>" + updRes);
  926. } catch (Exception e2) {
  927. e2.printStackTrace();
  928. errorinfo = "更新领取结果出现异常," + e2.getMessage();
  929. sendviplog.error(errorinfo);
  930. }
  931. }
  932. //写日志
  933. logMap.put("hassend", hassend);
  934. logMap.put("resultcode", resultcode);
  935. logMap.put("errorinfo", errorinfo);
  936. logMap.put("time", (System.currentTimeMillis() - startime) + "");
  937. sendviplog.info(JsonUtil.objectToJson(logMap));
  938. }
  939. }
  940. }