abbc365b7c494bf2170855bc7e3aba2d241cf44e.svn-base 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884
  1. package com.chinacreator.process.job;
  2. import java.net.URLEncoder;
  3. import java.sql.SQLException;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6. import java.util.Iterator;
  7. import java.util.List;
  8. import java.util.Map;
  9. import java.util.TreeMap;
  10. import net.sf.json.JSONObject;
  11. import org.apache.commons.lang.time.DateUtils;
  12. import org.apache.log4j.Logger;
  13. import org.quartz.DisallowConcurrentExecution;
  14. import org.quartz.PersistJobDataAfterExecution;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.util.StringUtils;
  17. import com.chinacreator.common.exception.BusinessException;
  18. import com.chinacreator.common.util.DESUtil;
  19. import com.chinacreator.common.util.MD5;
  20. import com.chinacreator.common.util.URLUtil;
  21. import com.chinacreator.process.bean.BackBusiOrderRec;
  22. import com.chinacreator.process.bean.BackShareOrderBean;
  23. import com.chinacreator.process.bean.OrderLog;
  24. import com.chinacreator.process.bean.PointShopOrderBean;
  25. import com.chinacreator.process.dao.DictionaryDao;
  26. import com.chinacreator.process.dao.PointShopDao;
  27. import com.chinacreator.process.dao.VipRetryDao;
  28. import com.chinacreator.process.util.HttpInvoke;
  29. import com.chinacreator.process.util.JsonUtil;
  30. import com.chinacreator.video.queue.MessageService;
  31. import com.chinacreator.video.queue.bean.MessagePipe;
  32. /**
  33. * 后向业务会员赠送重试业务处理
  34. * @author xu.zhou
  35. * @date 20190622
  36. */
  37. @PersistJobDataAfterExecution
  38. @DisallowConcurrentExecution
  39. public class VipRetryMQJob {
  40. private Logger logger = Logger.getLogger(VipRetryMQJob.class);
  41. private Logger log = Logger.getLogger("vipretry");
  42. @Autowired
  43. private DictionaryDao dictionaryDao;
  44. @Autowired
  45. private VipRetryDao vipRetryDao;
  46. @Autowired
  47. private PointShopDao pointShopDao;
  48. @Autowired
  49. private MessageService messageService;
  50. public void doProcess() throws Exception {
  51. logger.info("接收vipretry队列JOB启动");
  52. if (dictionaryDao.getValue("recivemq").equals("0")) {
  53. long beginTime = System.currentTimeMillis();
  54. List<MessagePipe> list = messageService.reciveBatchMessage("vipretry", 500);
  55. logger.info("接收vipretry队列花费时间:" + (System.currentTimeMillis() - beginTime));
  56. List<Map> dataList = new ArrayList<Map>();
  57. for (MessagePipe messagePipe : list) {
  58. Map reqBean = transBean(messagePipe.getBody());
  59. dataList.add(reqBean);
  60. }
  61. //{id=201907181120199638342, userid=18673197465, orderid=bd84d022-5bd6-4e71-b8ef-52a347fe4994, type=vipretry}
  62. // List<Map> dataList = new ArrayList<Map>();
  63. // Map<String, Object> body = new HashMap<String, Object>();
  64. // body.put("userid", "18673197465");
  65. // body.put("orderid", "bd84d022-5bd6-4e71-b8ef-52a347fe4994");
  66. // body.put("id", "201907181120199638342");
  67. // dataList.add(body);
  68. //去重复数据
  69. List<Map> notrepeatList = getNotRepeatData(dataList);
  70. if(notrepeatList != null && notrepeatList.size()>0){
  71. for (Map reqBean : notrepeatList) {
  72. this.handleOrder(reqBean);
  73. }
  74. }
  75. } else {
  76. logger.info("停止接收vipretry队列消息");
  77. }
  78. }
  79. public void handleOrder(Map reqBean){
  80. try {
  81. PointShopOrderBean orderBean = vipRetryDao.getPSOrderRec(reqBean.get("id")+"");
  82. if(orderBean != null){
  83. log.info(reqBean.get("id")+"=>积分商城会员重试");
  84. handleOrderPointShop(reqBean); //积分商城业务
  85. }else{
  86. log.info(reqBean.get("id")+"=>后向专属会员重试");
  87. handleOrderBack(reqBean); //后向专属业务
  88. }
  89. } catch (Exception e) {
  90. e.printStackTrace();
  91. }
  92. }
  93. /**
  94. * 积分商城业务处理
  95. * @param psqBean
  96. */
  97. public void handleOrderPointShop(Map reqBean){
  98. Map logMap = new HashMap();
  99. logMap.put("data", reqBean);
  100. BackBusiOrderRec orderBean = null;
  101. PointShopOrderBean psoBean = null;
  102. String resultCode = "-1";
  103. String resultInfo = "";
  104. String huchiSpid = ""; //互斥业务ID,如果不为空,则业务互斥
  105. try {
  106. //获取订单信息
  107. orderBean = vipRetryDao.getOrderRec(reqBean.get("id")+"");
  108. if(orderBean == null
  109. || !orderBean.getOrderid().equals(reqBean.get("orderid"))
  110. || !orderBean.getUserid().equals(reqBean.get("userid"))){
  111. throw new BusinessException("9071", "无对应订单信息,"+reqBean.get("id"));
  112. }
  113. psoBean = pointShopDao.getOrderRec(reqBean.get("id")+"");
  114. //5代表赠送会员超时
  115. if(!"5".equals(orderBean.getVipstatus())){
  116. //throw new BusinessException("9072", "vip处理状态异常,"+orderBean.getVipstatus());
  117. }
  118. //判断重试时间是否大于订购记录时间2分钟以上,防止并发请求
  119. if(!vipRetryDao.getMinNum(orderBean.getInserttime(),2)){
  120. throw new BusinessException("9073", "重试时间与订购时间相差小于2分钟");
  121. }
  122. //判断业务互斥
  123. huchiSpid = checkMutual(orderBean); //判断业务互斥
  124. if(!"".equals(huchiSpid)){
  125. orderBean.setVipstatus("4"); //设置为不赠送
  126. throw new BusinessException("9003","已办理互斥业务");
  127. }
  128. //获取业务结束时间
  129. String newEndtime = this.getEndTime(orderBean);
  130. //VIPSTATUS IS '赠送会员状态,0成功,1待赠送,2赠送中,3失败,4不赠送,5返回9070,,7重试失败
  131. orderBean.setVipstatus("2");
  132. orderBean.setResultcode("2");
  133. orderBean.setResultinfo("重试中");
  134. vipRetryDao.updBusiStatus(orderBean,"TD_BACKBUSI_ORDER_REC");
  135. vipRetryDao.updBusiStatus(orderBean,"TD_POINTS_ORDER_REC");
  136. String sendVipRes = sendVip(orderBean); //赠送会员
  137. if("9070".equals(sendVipRes)){
  138. orderBean.setVipstatus("5"); //赠送超时
  139. throw new BusinessException("9070","赠送会员超时", new String[0]);
  140. }
  141. //小毛会更新vipstatus值,不以接口返回的为准
  142. if(!"0".equals(sendVipRes)){ //赠送失败,再查记录表状态,(成功后小毛会改为0)
  143. sendVipRes = vipRetryDao.getVipstatus(orderBean.getId());
  144. }
  145. //赠送成功
  146. if("0".equals(sendVipRes)){
  147. orderBean.setVipstatus("0");
  148. if("3".equals(orderBean.getBusitype())){//会员+免流,入订购关系
  149. // String newEndtime = vipRetryDao.curr31Day();
  150. // //查询本地订购关系表当前是否有已生效的订购关系
  151. // Map reMap = this.hasEffect(orderBean);
  152. // if((Boolean)reMap.get("hasEffect")){ //存在有效订购关系
  153. // Map currOrderInfo = (Map)reMap.get("currOrderInfo");
  154. // newEndtime = vipRetryDao.endtime31Day(currOrderInfo.get("ENDTIME").toString());
  155. // }
  156. orderBean.setEndtime(newEndtime);
  157. vipRetryDao.order(orderBean); //新增或更新订购关系
  158. }
  159. }else{
  160. orderBean.setVipstatus("7");
  161. throw new BusinessException("9002","赠送会员未成功", new String[0]);
  162. }
  163. resultCode = "0";
  164. resultInfo = "重试成功";
  165. } catch (Exception e) {
  166. e.printStackTrace();
  167. if (e instanceof BusinessException) {
  168. resultInfo = ((BusinessException) e).getMessage();
  169. resultCode = ((BusinessException) e).getCode();
  170. }else{
  171. resultCode = "8000";
  172. resultInfo = "系统错误,"+e.getMessage();
  173. }
  174. } finally{
  175. String bcstatus = "";
  176. //存在有效订购记录,更新订购操作表信息:9071无订购信息,9072vip处理状态异常,9073时间不合法
  177. if(orderBean != null && !"9071".equals(resultCode) && !"9072".equals(resultCode) && !"9073".equals(resultCode)){
  178. orderBean.setResultcode(resultCode);
  179. orderBean.setResultinfo(resultInfo);
  180. orderBean.setRetrychannel("0");
  181. orderBean.setRetrycount(Integer.parseInt(orderBean.getRetrycount())+1+"");
  182. vipRetryDao.updOrderRecByVipRetry(orderBean); //更新订购记录表数据
  183. psoBean.setVipstatus(orderBean.getVipstatus());
  184. psoBean.setResultCode(orderBean.getResultcode());
  185. psoBean.setResultInfo(orderBean.getResultinfo());
  186. pointShopDao.updBusiStatus(psoBean, "TD_POINTS_ORDER_REC");
  187. //回调通知
  188. bcstatus = this.callBackPointShop(psoBean.getId(),psoBean.getRequestId());
  189. //记录订购日志
  190. saveOrderLog(orderBean);
  191. }
  192. //充值成功发送短信
  193. if("0".equals(orderBean.getResultcode())){
  194. inserSmstMq(orderBean); //成功发短信
  195. }
  196. //发送业务互斥短信
  197. if("9003".equals(resultCode)){
  198. //this.inserSmstMqHuChi(orderBean,huchiSpid); //发送业务互斥短信
  199. }
  200. //重试时间不合法,重新掖入到队列
  201. if("9073".equals(resultCode)){
  202. inserVipRetryMq(orderBean);
  203. }
  204. logMap.put("data2", orderBean);
  205. logMap.put("reusltCode", resultCode);
  206. logMap.put("resultInfo", resultInfo);
  207. logMap.put("bcstatus", bcstatus);
  208. log.info(JsonUtil.objectToJson(logMap));
  209. }
  210. }
  211. /**
  212. * 业务处理
  213. * @param psqBean
  214. */
  215. public void handleOrderBack(Map reqBean){
  216. Map logMap = new HashMap();
  217. logMap.put("data", reqBean);
  218. BackBusiOrderRec orderBean = null;
  219. String resultCode = "-1";
  220. String resultInfo = "";
  221. String huchiSpid = ""; //互斥业务ID,如果不为空,则业务互斥
  222. try {
  223. //获取订单信息
  224. orderBean = vipRetryDao.getOrderRec(reqBean.get("id").toString());
  225. if(orderBean == null
  226. || !orderBean.getOrderid().equals(reqBean.get("orderid"))
  227. || !orderBean.getUserid().equals(reqBean.get("userid"))){
  228. throw new BusinessException("9071", "无对应订单信息,"+reqBean.get("id"));
  229. }
  230. //5代表赠送会员超时
  231. if(!"5".equals(orderBean.getVipstatus())){
  232. //throw new BusinessException("9072", "vip处理状态异常,"+orderBean.getVipstatus());
  233. }
  234. //判断重试时间是否大于订购记录时间2分钟以上,防止并发请求
  235. if(!vipRetryDao.getMinNum(orderBean.getInserttime(),2)){
  236. throw new BusinessException("9073", "重试时间与订购时间相差小于2分钟");
  237. }
  238. //判断业务互斥
  239. huchiSpid = checkMutual(orderBean); //判断业务互斥
  240. if(!"".equals(huchiSpid)){
  241. orderBean.setVipstatus("4"); //设置为不赠送
  242. throw new BusinessException("9003","已办理互斥业务");
  243. }
  244. List<HashMap> confList = vipRetryDao.getBackBusiConf(orderBean.getCpid(), orderBean.getSpid());
  245. HashMap confHm = confList.get(0);
  246. //是否为复合产品,0是,为空或为1时不是
  247. String hasfh = confHm.get("HASFH") == null ? "": confHm.get("HASFH")+"";
  248. //调能力平台标识:0调能力平台并以结果落订购关系,1调能力平台其结果不影响订购关系,为空时不调能力平台
  249. String hasshare = confHm.get("HASSHARE") == null ? "": confHm.get("HASSHARE")+"";
  250. //获取业务结束时间
  251. String newEndtime = this.getEndTime(orderBean);
  252. //VIPSTATUS IS '赠送会员状态,0成功,1待赠送,2赠送中,3失败,4不赠送,5返回9070,,7重试失败
  253. orderBean.setVipstatus("2");
  254. orderBean.setResultcode("2");
  255. orderBean.setResultinfo("重试中");
  256. vipRetryDao.updBusiStatus(orderBean,"TD_BACKBUSI_ORDER_REC");
  257. String sendVipRes = sendVip(orderBean); //赠送会员
  258. if("9070".equals(sendVipRes)){
  259. orderBean.setVipstatus("5"); //赠送超时
  260. throw new BusinessException("9070","赠送会员超时", new String[0]);
  261. }
  262. //小毛会更新vipstatus值,不以接口返回的为准
  263. if(!"0".equals(sendVipRes)){ //赠送失败,再查记录表状态,(成功后小毛会改为0)
  264. if("0".equals(hasfh)){//是复合产品
  265. //0:成功, -1:部分成功 , 1:失败, 其他可以作为超时处理。
  266. if("-1".equals(sendVipRes)){//部分成功
  267. sendVipRes = "0";
  268. orderBean.setResultinfo("部分成功");
  269. }
  270. }else{
  271. sendVipRes = vipRetryDao.getVipstatus(orderBean.getId());
  272. }
  273. }
  274. //赠送成功
  275. if("0".equals(sendVipRes)){
  276. orderBean.setVipstatus("0");
  277. if("3".equals(orderBean.getBusitype())){//会员+免流,入订购关系
  278. // String newEndtime = vipRetryDao.curr31Day();
  279. // //查询本地订购关系表当前是否有已生效的订购关系
  280. // Map reMap = this.hasEffect(orderBean);
  281. // if((Boolean)reMap.get("hasEffect")){ //存在有效订购关系
  282. // Map currOrderInfo = (Map)reMap.get("currOrderInfo");
  283. // newEndtime = vipRetryDao.endtime31Day(currOrderInfo.get("ENDTIME").toString());
  284. // }
  285. orderBean.setEndtime(newEndtime);
  286. orderBean.setOrderchannle(orderBean.getChannel());
  287. orderBean.setChannel("");
  288. //调能力平台
  289. this.shareOrder(orderBean, hasshare);
  290. vipRetryDao.order(orderBean); //新增或更新订购关系
  291. }
  292. }else{
  293. orderBean.setVipstatus("7");
  294. throw new BusinessException("9002","赠送会员未成功", new String[0]);
  295. }
  296. resultCode = "0";
  297. resultInfo = "重试成功";
  298. if("部分成功".equals(orderBean.getResultinfo())){
  299. resultInfo = "部分成功";
  300. }
  301. } catch (Exception e) {
  302. e.printStackTrace();
  303. if (e instanceof BusinessException) {
  304. resultInfo = e.getMessage();
  305. resultCode = ((BusinessException) e).getCode();
  306. }else{
  307. resultCode = "8000";
  308. resultInfo = "系统错误,"+e.getMessage();
  309. }
  310. } finally{
  311. String bcstatus = "";
  312. //存在有效订购记录,更新订购操作表信息
  313. if(!"9071".equals(resultCode) && !"9072".equals(resultCode) && !"9073".equals(resultCode)){
  314. orderBean.setResultcode(resultCode);
  315. orderBean.setResultinfo(resultInfo);
  316. orderBean.setRetrychannel("0");
  317. orderBean.setRetrycount(Integer.parseInt(orderBean.getRetrycount())+1+"");
  318. vipRetryDao.updOrderRecByVipRetry(orderBean); //更新订购记录表数据
  319. //回调通知
  320. bcstatus = this.callBack(orderBean);
  321. //记录订购日志
  322. saveOrderLog(orderBean);
  323. }
  324. //充值成功发送短信
  325. if("0".equals(orderBean.getResultcode())){
  326. inserSmstMq(orderBean); //成功发短信
  327. }
  328. //重试时间不合法,重新掖入到队列
  329. if("9073".equals(resultCode)){
  330. inserVipRetryMq(orderBean);
  331. }
  332. logMap.put("data2", orderBean);
  333. logMap.put("reusltCode", resultCode);
  334. logMap.put("resultInfo", resultInfo);
  335. logMap.put("bcstatus", bcstatus);
  336. log.info(JsonUtil.objectToJson(logMap));
  337. }
  338. }
  339. /**
  340. * 写订购日志
  341. * @param orderInfo
  342. * @param errorcode
  343. * @param errorinfo
  344. */
  345. private void saveOrderLog(BackBusiOrderRec orderBean){
  346. try {
  347. OrderLog orderLog = new OrderLog();
  348. orderLog.setApptype("2");
  349. orderLog.setArea(orderBean.getArea());
  350. orderLog.setChannel(orderBean.getChannel());
  351. orderLog.setOrderstatus(0);
  352. orderLog.setStatus(0);
  353. orderLog.setCpid(orderBean.getCpid());
  354. orderLog.setIsexperience(0);
  355. orderLog.setOrdertype("0");
  356. orderLog.setProvince(orderBean.getProvince());
  357. orderLog.setSpid(orderBean.getSpid());
  358. orderLog.setErrorcode(orderBean.getResultcode());
  359. orderLog.setErrorinfo(orderBean.getResultinfo());
  360. orderLog.setUserid(orderBean.getUserid().trim());
  361. this.vipRetryDao.addOrderLog(orderLog);
  362. } catch (Exception e) {
  363. log.error("orderId: "+orderBean.getId()+", 添加日志出现异常,"+e.getMessage());
  364. e.printStackTrace();
  365. }
  366. }
  367. /**
  368. * 查询本地订购关系表当前是否有已生效的订购关系
  369. * @param orderInfo
  370. * @return
  371. * @throws Exception
  372. */
  373. private Map hasEffect(BackBusiOrderRec orderBean) throws Exception{
  374. Map reMap = new HashMap();
  375. boolean hasEffect = false;
  376. Map currOrderInfo = null;
  377. String currentTime = vipRetryDao.currTime();
  378. //查询用户本地订购关系表未失效的订购数据
  379. currOrderInfo = vipRetryDao.findByUserAndSpid(orderBean.getUserid(),orderBean.getCpid(),orderBean.getSpid());
  380. if(currOrderInfo != null){//本地有订购关系
  381. if(Long.parseLong(currOrderInfo.get("ENDTIME").toString()) >= Long.parseLong(currentTime)){ //结束时间大于或等于当前时间,订购关系有效
  382. hasEffect = true;
  383. }
  384. }
  385. reMap.put("hasEffect", hasEffect);
  386. reMap.put("currOrderInfo", currOrderInfo);
  387. return reMap;
  388. }
  389. /**
  390. * 判断业务是否互斥
  391. * @param orderInfo
  392. * @throws Exception
  393. */
  394. private String checkMutual(BackBusiOrderRec orderBean) throws Exception{
  395. String huchiSpid = "";
  396. boolean result = false;
  397. String spid = orderBean.getSpid();
  398. List<HashMap> spList = vipRetryDao.findSpInfo(spid);
  399. if(spList != null && spList.size()>0){
  400. if (spList.get(0).get("MUTEX") != null && !StringUtils.isEmpty(spList.get(0).get("MUTEX").toString())) {
  401. String[] mutexSpids = spList.get(0).get("MUTEX").toString().trim().split(",");
  402. //[{ORDERIDA=2019052, AREA=长沙, SPID=1167, PROVINCE=湖南, ID=201905241107578658666, ORDERCHANNEL=t, STATUS=1, ORDERTIME=20190524104129, USERID=18673197465, CPID=youtu}]
  403. //查询用户本地订购关系表未失效的订购数据
  404. List<HashMap> list = vipRetryDao.findOrderRelaAll(orderBean.getUserid());
  405. if (list != null && list.size() > 0) {
  406. for (String mutexSpid : mutexSpids) {
  407. for (HashMap hm : list) {
  408. if (hm.get("SPID") != null && !hm.get("SPID").equals(spid) && hm.get("SPID").equals(mutexSpid)
  409. && !"2".equals(hm.get("STATUS"))) {
  410. huchiSpid = hm.get("SPID")+"";
  411. result = true;
  412. break;
  413. }
  414. }
  415. }
  416. }
  417. }
  418. }
  419. return huchiSpid;
  420. }
  421. /**
  422. * 调接口送会员
  423. * @param orderInfo
  424. * @return
  425. * @throws Exception
  426. */
  427. private String sendVip(BackBusiOrderRec orderBean) throws Exception{
  428. String resultcode = "3";
  429. try {
  430. //http://114.255.201.228:86/activity/youkuHX
  431. String vipurl = this.dictionaryDao.getValue("backBusiVipUrl");
  432. String timestamp = (System.currentTimeMillis() / 1000) + "";
  433. String userid = orderBean.getUserid();
  434. String orderid = orderBean.getOrderid();
  435. String channel = orderBean.getChannel();
  436. String cpid = orderBean.getCpid();
  437. String spid = orderBean.getSpid();
  438. String pwd = "";
  439. List<HashMap> confList = vipRetryDao.getBackBusiConf(cpid, spid);
  440. pwd = confList.get(0).get("PWD").toString();
  441. if("0".equals(confList.get(0).get("HASFH"))){ //是复合产品
  442. vipurl = this.dictionaryDao.getValue("backBusiGroupVipUrl");
  443. }
  444. userid = DESUtil.encode(userid, pwd);
  445. //MD5(orderid+userid+goodscode+pwd+timestamp)转换为十六进制ASCII 码字符串,共32 个字符,全小写 userid= Des(手机号码,pwd)
  446. //MD5(orderid+userid+timestamp+pwd)转换为十六进制ASCII 码字符串,共32 个字符,全小写
  447. String signature = MD5.MD5Encode(orderid + userid + timestamp + pwd);
  448. signature = signature.toLowerCase();
  449. vipurl = vipurl + "?userid=" + URLEncoder.encode(userid, "utf-8")+ "&orderid="+ orderid + "&cpid=" + cpid + "&spid=" + spid + "&timestamp="
  450. + timestamp + "&signature=" + signature+ "&apptype=2";
  451. logger.info("vipurl: "+vipurl);
  452. //http://114.255.201.228:86/activity/eshop/vip?userid=iafPbU9aRLghY%2FEVMXFeag%3D%3D&orderid=201906231206498662914&goodscode=pointshop130&timestamp=1561445765&signature=47fe0e3900b29ef88fd0889b7c0e4cc6&apptype=5
  453. String result = URLUtil.get(vipurl,30*1000); //调赠送会员接口,超时时间设置为10秒
  454. log.info("赠送会员重试结果=> userid: " +userid+", orderid: "+orderBean.getOrderid()+" , result: "+result);
  455. Map<?,?> map = JsonUtil.jsonToMap(result);
  456. resultcode = (String)map.get("resultcode");
  457. if(resultcode.equals("0")){
  458. logger.info("赠送成功");
  459. }
  460. } catch (Exception e) {
  461. e.printStackTrace();
  462. logger.error("userid: "+orderBean.getUserid()+"赠送会员失败,"+e);
  463. if(e.getMessage() != null && e.getMessage().indexOf("TimeoutException") != -1){//超时异常
  464. orderBean.setVipstatus("5"); //赠送超时
  465. throw new BusinessException("9070","赠送会员超时", new String[0]);
  466. }else{
  467. orderBean.setVipstatus("7");
  468. throw new BusinessException("9002","赠送会员未成功", new String[0]);
  469. }
  470. }
  471. return resultcode;
  472. }
  473. /**
  474. * 回调通知
  475. * @param orderBean
  476. * @return 0成功,1未回调,2出现异常
  477. */
  478. private String callBack(BackBusiOrderRec orderBean){
  479. String resultcode = "1";
  480. try {
  481. String userid = orderBean.getUserid();
  482. HashMap channelInfo = vipRetryDao.getChannelPwdByChannel(orderBean.getChannel());
  483. if(channelInfo == null || channelInfo.size() == 0){
  484. channelInfo = vipRetryDao.getChannelPwdByChannel(orderBean.getOrderchannle());
  485. }
  486. String pwd = channelInfo.get("PASSWORD")+"";
  487. userid = DESUtil.encode(userid, pwd);
  488. userid = URLEncoder.encode(userid, "utf-8");
  489. String vipRetryCallBackUrl = this.dictionaryDao.getValue("vipRetryCallBackUrl");//回调接口地址
  490. vipRetryCallBackUrl += "?orderid="+orderBean.getOrderid()+"&resultcode="+orderBean.getResultcode()+"&resultinfo="+URLEncoder.encode(orderBean.getResultinfo(),"utf-8")+"&userid="+userid;
  491. log.info("===========回调地址:"+vipRetryCallBackUrl);
  492. String result = URLUtil.get(vipRetryCallBackUrl,60*1000); //调赠送会员接口,超时时间设置为10秒
  493. log.info("回调通知接口返回信息=>userid: " +userid+", orderid: "+orderBean.getOrderid()+", result: "+result);
  494. Map<?,?> map = JsonUtil.jsonToMap(result);
  495. resultcode = (String)map.get("result");
  496. } catch (Exception e) {
  497. resultcode = "2";
  498. e.printStackTrace();
  499. log.error("orderId=>"+orderBean.getId()+",回调接口出现异常,"+e.getMessage());
  500. }
  501. return resultcode;
  502. }
  503. /**
  504. * 去重复数据
  505. * @param oldBeans
  506. * @return
  507. */
  508. public List<Map> getNotRepeatData( List<Map> oldBeans){
  509. List<Map> newBeans = new ArrayList<Map>();
  510. Map<String,Map> map = new HashMap<String, Map>();
  511. for (Map reqBean : oldBeans) {
  512. if(map.containsKey(reqBean.get("id"))){
  513. //insertvacMq(bean);
  514. }else{
  515. map.put(reqBean.get("id").toString(), reqBean);
  516. }
  517. }
  518. Iterator<String> it = map.keySet().iterator();
  519. while (it.hasNext()) {
  520. String key = it.next().toString();
  521. newBeans.add(map.get(key));
  522. }
  523. logger.info("积分商城:old="+oldBeans.size()+" new:"+newBeans.size());
  524. return newBeans;
  525. }
  526. public Map transBean(Map<String, Object> body) {
  527. String jsonStr = JsonUtil.objectToJson(body);
  528. return (Map) JsonUtil.jsonToBean(jsonStr, Map.class);
  529. }
  530. /**
  531. * 推送办理成功的短信到队列
  532. * @param orderInfo
  533. */
  534. public void inserSmstMq(BackBusiOrderRec orderBean){
  535. try{
  536. Map<String, String> map = new HashMap<String, String>();
  537. map.put("userid", orderBean.getUserid());
  538. map.put("cpid", orderBean.getCpid());
  539. map.put("spid", orderBean.getSpid());
  540. map.put("result", "0");
  541. map.put("channel", "");
  542. map.put("style","0000");
  543. map.put("times", "");
  544. map.put("orderType", "");
  545. map.put("type", "cssms");
  546. map.put("busiType", "tran_succ"); //订购成功短信
  547. //logger.info("++++++map:"+map);
  548. String mqReciveUrl = dictionaryDao.getValue("mqReciveUrl");
  549. URLUtil.post(mqReciveUrl, JsonUtil.objectToJson(map));
  550. }catch (Exception e){
  551. e.printStackTrace();
  552. }
  553. }
  554. /**
  555. * 获取请求属性性
  556. * @return
  557. */
  558. private static Map getProperty(){
  559. Map reqProperty = new HashMap();
  560. reqProperty.put("Content-type", "application/json;charset=UTF-8");
  561. return reqProperty;
  562. }
  563. /**
  564. * 赠送会员超时异步重试
  565. * @param orderInfo
  566. */
  567. public void inserVipRetryMq(BackBusiOrderRec bean){
  568. try{
  569. Map<String, String> map = new HashMap<String, String>();
  570. map.put("userid", bean.getUserid());
  571. map.put("id", bean.getId());
  572. map.put("orderid", bean.getOrderid());
  573. map.put("type", "vipretry");
  574. //System.out.println("==============赠送会员失败,"+map);
  575. String mqReciveUrl = dictionaryDao.getValue("mqReciveUrl");
  576. URLUtil.post(mqReciveUrl, JsonUtil.objectToJson(map));
  577. }catch (Exception e){
  578. e.printStackTrace();
  579. }
  580. }
  581. /**
  582. * 发送业务互斥短信
  583. * @param inputObj
  584. * @param huchiSpid
  585. */
  586. // public void inserSmstMqHuChi(BackBusiOrderRec psoBean, String huchiSpid){
  587. // try{
  588. // String huchiSpName = "";
  589. // List<HashMap> spList2 = pointShopDao.findSpInfo(huchiSpid);
  590. // if(spList2 != null && spList2.size()>0 && spList2.get(0).get("SPNAME") != null){
  591. // huchiSpName = spList2.get(0).get("SPNAME").toString();
  592. // }
  593. // String bt = psoBean.getBusitype();
  594. // //免流,或者免流+会员,业务互斥要发短信
  595. // if(("2".equals(bt) || "3".equals(bt)) && !"".equals(huchiSpName)){
  596. // String succFlag = "fail";
  597. // String busiType = "tran_cdn_fail"; //免流业务互斥短信
  598. // if("3".equals(bt)){
  599. // busiType = "tran_vipcdn_cdnfail"; //免流+会员业务互斥短信
  600. // }
  601. //
  602. // Map<String, String> map = new HashMap<String, String>();
  603. // map.put("userid", psoBean.getUserid());
  604. // map.put("cpid", psoBean.getCpid());
  605. // map.put("spid", psoBean.getSpid());
  606. // map.put("result", "0");
  607. // map.put("channel", "");
  608. // map.put("param1", huchiSpName);
  609. // map.put("style","0000");
  610. // map.put("times", "");
  611. // map.put("orderType", "");
  612. // map.put("type", "cssms");
  613. // map.put("busiType", busiType);
  614. // logger.info(JsonUtil.objectToJson(map));
  615. // String mqReciveUrl = dictionaryDao.getValue("mqReciveUrl");
  616. // //开发环境
  617. // //URLUtil.post("http://172.16.33.16:8082/mq-service/recive.do", JsonUtil.objectToJson(map));
  618. // //测试环境
  619. // //URLUtil.post("http://10.199.99.177:86/mq-service/recive.do", JsonUtil.objectToJson(map));
  620. // //生产环境
  621. // //URLUtil.post("http://10.199.99.144:8090/mq-service/recive.do", JsonUtil.objectToJson(map));
  622. //
  623. // URLUtil.post(mqReciveUrl, JsonUtil.objectToJson(map));
  624. // }
  625. // }catch (Exception e){
  626. // e.printStackTrace();
  627. // }
  628. // }
  629. /**
  630. * 回调积分商城
  631. * @param outputObj
  632. * @param id 我方生成的订单流水号
  633. * @param requestId 我方生成的请求ID
  634. */
  635. private String callBackPointShop(String id,String requestId){
  636. String bcstatus = "1"; //回调状态,1未回调,0回调完成,2回调异常
  637. String cbReqParams = ""; //回调请求报文
  638. String cbRspParams = ""; //回调响应报文
  639. try {
  640. PointShopOrderBean bean = pointShopDao.getOrderRec(id);
  641. TreeMap<String, String > orderOutObj = null;
  642. if(bean != null){
  643. orderOutObj = new TreeMap<String, String>();
  644. orderOutObj.put("account",bean.getUserid());
  645. orderOutObj.put("orderId",bean.getId());
  646. orderOutObj.put("finishTime",bean.getFinishTime());
  647. orderOutObj.put("goodsCode",bean.getSpid());
  648. orderOutObj.put("orderNo",bean.getOrderNo());
  649. orderOutObj.put("orderTime",bean.getOrderTime());
  650. String orderStatus = "3"; //充值状态:1充值中 2充值成功3充值失败
  651. String reusltCode = bean.getResultCode(); //办理结果编码,0成功,1待处理,2处理中,其他为异常
  652. if("1".equals(reusltCode) || "2".equals(reusltCode)){
  653. orderStatus = "1";
  654. }else if("0".equals(reusltCode)){
  655. orderStatus = "2";
  656. }else{ //充值失败,设置失败原因
  657. orderOutObj.put("failDesc",bean.getResultInfo());
  658. }
  659. orderOutObj.put("orderStatus",orderStatus);
  660. }
  661. if(orderOutObj != null){
  662. String callBackUrl = this.dictionaryDao.getValue("pointShopCallBackUrl");//"http://demo.mall.10010.com:8104/jf-service/zcvcard/notify";
  663. cbReqParams = JsonUtil.objectToJson(orderOutObj);
  664. logger.info("===========回调地址:"+callBackUrl);
  665. logger.info("===========回调请求参数:"+cbReqParams);
  666. cbRspParams = HttpInvoke.sendHttpByPost("POST", callBackUrl, cbReqParams, getProperty());
  667. logger.info("============回调响应参数:"+cbRspParams);
  668. if("0000".equals(cbRspParams)){
  669. bcstatus = "0";
  670. }
  671. /* Map json = JsonUtil.jsonToMap(cbRspParams);
  672. if(json != null){
  673. String result = json.get("result")+"";
  674. if("0000".equals(result)){
  675. bcstatus = "0";
  676. }
  677. }*/
  678. }else{
  679. cbRspParams = "回调接口时未找到订购信息";
  680. log.error("订单流水号=>"+id+"=>requestId=>"+requestId+",回调接口时未找到订购信息");
  681. }
  682. } catch (Exception e) {
  683. bcstatus = "2";
  684. e.printStackTrace();
  685. log.error("订单流水号=>"+id+"=>requestId=>"+requestId+",回调接口出现异常,"+e.getMessage());
  686. cbRspParams = "返回报文: "+cbRspParams+",回调异常,"+e.getMessage();
  687. } finally{
  688. log.info("订单流水号=>"+id+"=>requestId=>"+requestId+"=>cbReqParams: "+cbReqParams+", cbRspParams=>"+cbRspParams);
  689. addParamsByCb(cbReqParams, cbRspParams, requestId);
  690. }
  691. return bcstatus;
  692. }
  693. /**
  694. * 添加回调报文
  695. * @param cbReqParams
  696. * @param cbRspParams
  697. * @param requestId
  698. */
  699. private void addParamsByCb(String cbReqParams,String cbRspParams, String requestId){
  700. try {
  701. //System.out.println(cbRspParams);
  702. //System.out.println(cbRspParams.length());
  703. //一个中文占两个 字节
  704. if(cbRspParams != null && cbRspParams.length()> 250){
  705. cbRspParams = cbRspParams.substring(0,250);
  706. }
  707. pointShopDao.updParamsByCb(cbReqParams, cbRspParams, requestId);
  708. } catch (Exception e) {
  709. e.printStackTrace();
  710. log.error("requestId: "+requestId+", 更新callBack状态出现异常,"+e.getMessage());
  711. }
  712. }
  713. /**
  714. * 获取endtime
  715. * @param bean BackBusiOrderRec
  716. * @return
  717. */
  718. private String getEndTime(BackBusiOrderRec bean)throws Exception{
  719. String endtime = pointShopDao.getBackEndtime(bean.getId());
  720. if(endtime == null || "null".equals(endtime) || endtime.length() != 14){
  721. endtime = "";
  722. }
  723. if("".equals(endtime)){
  724. String currEndtime = "";
  725. Map reMap = this.hasEffect(bean);
  726. if((Boolean)reMap.get("hasEffect")){ //存在有效订购关系
  727. Map currOrderInfo = (Map)reMap.get("currOrderInfo");
  728. currEndtime = (String)currOrderInfo.get("ENDTIME");
  729. }
  730. //[{PWD=kijkfds, NETDAYS=31, CHANNEL=test_01, NETDAYS=2, SPID=1168, BUSITYPE=3, CPID=youtu}]
  731. HashMap confHm = pointShopDao.getBackBusiConf(bean.getCpid(), bean.getSpid()).get(0);
  732. //String busiType = confHm.get("BUSITYPE")+"";
  733. if("2".equals(confHm.get("BUSITYPE")) || "3".equals(confHm.get("BUSITYPE"))){
  734. if(currEndtime != null && !"".equals(currEndtime)){
  735. endtime = pointShopDao.endtimeParamDay(confHm.get("NETDAYS")+"", currEndtime);
  736. }else{
  737. endtime = pointShopDao.currParamDay(confHm.get("NETDAYS")+"");
  738. }
  739. }
  740. }
  741. return endtime;
  742. }
  743. /**
  744. * 调能力平台
  745. * @param orderInfo
  746. * @param hasshare //调能力平台标识:0调能力平台并以结果落订购关系,1调能力平台其结果不影响订购关系,为空时不调能力平台,
  747. * @throws Exception
  748. */
  749. private void shareOrder(BackBusiOrderRec orderBean, String hasshare) throws Exception{
  750. if("0".equals(hasshare) || "1".equals(hasshare)){
  751. String shareErcode = "0";
  752. String shareErnfo = "成功";
  753. if("0".equals(hasshare)){//以能力平台调用结果落订购关系的要设置渠道为SHARE,此渠道记录在订购关系表和订购日志表中
  754. orderBean.setChannel("SHARE");
  755. }
  756. try {
  757. shareOrder(orderBean.getUserid(),orderBean.getCpid(),orderBean.getSpid());
  758. } catch (BusinessException e) {
  759. e.printStackTrace();
  760. shareErcode = e.getCode();
  761. shareErnfo = e.getMessage();
  762. if("0".equals(hasshare)){
  763. throw new BusinessException("8888","调用能力共享平台订购接口失败");
  764. }
  765. } finally {
  766. saveBackShareLog(orderBean,shareErcode,shareErnfo);
  767. }
  768. }
  769. }
  770. /**
  771. * 写后向订购能力平台日志
  772. * @param orderInfo
  773. * @param errorcode
  774. * @param errorinfo
  775. */
  776. public void saveBackShareLog(BackBusiOrderRec orderBean,String errorcode,String errorinfo){
  777. try {
  778. BackShareOrderBean bso = new BackShareOrderBean();
  779. bso.setUserid(orderBean.getUserid());
  780. bso.setErrorcode(errorcode);
  781. bso.setErrorinfo(errorinfo);
  782. bso.setCpid(orderBean.getCpid());
  783. bso.setSpid(orderBean.getSpid());
  784. vipRetryDao.addShareOrderLog(bso);
  785. } catch (Exception e) {
  786. e.printStackTrace();
  787. log.error("userid:"+orderBean.getUserid()+",写后向订购能力平台日志出现异常,"+e.getMessage());
  788. }
  789. }
  790. /**
  791. * 订购
  792. * @param userid
  793. * @param cpid
  794. * @param spid
  795. * @throws BusinessException
  796. */
  797. public void shareOrder(String userid,String cpid,String spid) throws BusinessException{
  798. String result ="";
  799. String url = "";
  800. try{
  801. url = dictionaryDao.getValue("shareOrderUrl");
  802. result = URLUtil.get(url+"?cpid="+cpid+"&spid="+spid+"&userid="+userid,15000);
  803. }catch (Exception e) {
  804. log.error("****:"+userid+cpid+spid+":"+e.getMessage());
  805. if(e.getMessage().indexOf("connect timed out")!= -1) { //如果连接超时就再重试一次
  806. try {
  807. result = URLUtil.get(url+"?cpid="+cpid+"&spid="+spid+"&userid="+userid,15000);
  808. log.info(userid+cpid+spid+"重试:"+result);
  809. if(result.indexOf("您已订购,请勿重复")!= -1){ //包含您已订购,请勿重复订购
  810. result = "{\"resultCode\":0,\"resultInfo\":\"成功!\",\"data\":null}";
  811. }
  812. }catch (Exception e1){
  813. throw new BusinessException("9170", "调用能力共享平台订购接口异常!");
  814. }
  815. }else {
  816. throw new BusinessException("9170", "调用能力共享平台订购接口异常");
  817. }
  818. }
  819. JSONObject obj = JSONObject.fromObject(result);
  820. if(!obj.getString("resultCode").equals("0")){
  821. throw new BusinessException(obj.getString("resultCode"), obj.getString("resultInfo"));
  822. }
  823. }
  824. }