3a494e59001e175d39d1bc69d4806e59be950ba5.svn-base 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  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 java.util.concurrent.CountDownLatch;
  12. import java.util.concurrent.ExecutorService;
  13. import java.util.concurrent.LinkedBlockingQueue;
  14. import java.util.concurrent.ThreadPoolExecutor;
  15. import java.util.concurrent.TimeUnit;
  16. import net.sf.json.JSONObject;
  17. import org.apache.commons.lang.time.DateUtils;
  18. import org.apache.log4j.Logger;
  19. import org.quartz.DisallowConcurrentExecution;
  20. import org.quartz.PersistJobDataAfterExecution;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.util.StringUtils;
  23. import com.chinacreator.common.exception.BusinessException;
  24. import com.chinacreator.common.util.DESUtil;
  25. import com.chinacreator.common.util.MD5;
  26. import com.chinacreator.common.util.URLUtil;
  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.BackBusiVipAsynDao;
  31. import com.chinacreator.process.dao.DictionaryDao;
  32. import com.chinacreator.process.dao.PointShopDao;
  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. * 取消队列方式
  40. * @author xu.zhou
  41. * @date 20210118
  42. * PointShopMQJob和VipRetryMQJob两个定时任务不再启用
  43. */
  44. @PersistJobDataAfterExecution
  45. @DisallowConcurrentExecution
  46. public class PointShopSyncJob {
  47. private Logger log = Logger.getLogger("pointshop");
  48. @Autowired
  49. private DictionaryDao dictionaryDao;
  50. @Autowired
  51. private PointShopDao pointShopDao;
  52. @Autowired
  53. private BackBusiVipAsynDao asyndao;
  54. public void doProcess() throws Exception {
  55. //dictionaryDao = new DictionaryDao();
  56. //pointShopDao = new PointShopDao();
  57. //asyndao = new BackBusiVipAsynDao();
  58. String trycount = dictionaryDao.getValue("vipasyntrycount");//后向产品赠送会员异步处理重试次数
  59. if(trycount == null || "".equals(trycount)) trycount = "3";
  60. log.info(Thread.currentThread().getName()+"定时任务开始");
  61. long beginTime = System.currentTimeMillis();
  62. List<HashMap> list = pointShopDao.getVipAsynData(trycount);
  63. if(list != null && list.size() > 0){
  64. //推送月份
  65. String pushmonth = new SimpleDateFormat("yyyyMM").format(new Date());
  66. CountDownLatch threadSignal = new CountDownLatch(list.size());
  67. ExecutorService executorService = new ThreadPoolExecutor(12, 16, 10L, TimeUnit.MINUTES, new LinkedBlockingQueue<Runnable>(), new ThreadPoolExecutor.CallerRunsPolicy());
  68. //去除重复数据
  69. List<HashMap> dataList = paraseData(list);
  70. log.info("数据库有效订购的用户数:"+dataList.size());
  71. for(HashMap vipmap : dataList){
  72. PointShopSynService continueService = new PointShopSynService(list.size(),threadSignal,vipmap,asyndao,dictionaryDao, pointShopDao);
  73. executorService.execute(continueService);
  74. }
  75. executorService.shutdown();
  76. try {
  77. executorService.awaitTermination(5L, TimeUnit.MINUTES);
  78. } catch (InterruptedException e) {
  79. e.printStackTrace();
  80. }
  81. }
  82. log.info(Thread.currentThread().getName()+"定时任务完成,耗时:"+(System.currentTimeMillis()-beginTime)/1000+" 秒");
  83. }
  84. /**
  85. * 去除重复数据,防止赠送会员接口被并发限制
  86. * @param dataList
  87. * @return
  88. */
  89. private List<HashMap> paraseData(List<HashMap> dataList){
  90. //去重复后的数据集
  91. List<HashMap> reDataList = new ArrayList<HashMap>();
  92. HashMap<String, List> tmpMap = new HashMap<String, List>();
  93. for (HashMap dataMap : dataList) {
  94. if(tmpMap.containsKey(dataMap.get("USERID").toString()+dataMap.get("CPID")+dataMap.get("SPID"))){
  95. log.info("重复数据,"+dataMap.get("USERID")+dataMap.get("CPID")+dataMap.get("SPID"));
  96. }else{
  97. reDataList.add(dataMap);
  98. List tmpList = new ArrayList();
  99. tmpList.add(dataMap.get("SPID"));
  100. tmpMap.put(dataMap.get("USERID").toString()+dataMap.get("CPID")+dataMap.get("SPID"), tmpList);
  101. }
  102. }
  103. return reDataList;
  104. }
  105. public static void main(String[] args) {
  106. PointShopSyncJob job = new PointShopSyncJob();
  107. try {
  108. //job.doProcess();
  109. } catch (Exception e) {
  110. // TODO Auto-generated catch block
  111. e.printStackTrace();
  112. }
  113. }
  114. }
  115. class PointShopSynService implements Runnable {
  116. private static Logger log = Logger.getLogger("pointshop");
  117. private int totalSize;
  118. private CountDownLatch threadSignal;
  119. private HashMap busimap;
  120. private DictionaryDao dictionaryDao;
  121. private BackBusiVipAsynDao asyndao;
  122. private PointShopDao pointShopDao;
  123. public PointShopSynService(int totalSize,CountDownLatch threadSignal,HashMap busimap,BackBusiVipAsynDao asyndao,DictionaryDao dictionaryDao,PointShopDao pointShopDao){
  124. this.totalSize = totalSize;
  125. this.threadSignal = threadSignal;
  126. this.busimap = busimap;
  127. this.asyndao = asyndao;
  128. this.dictionaryDao = dictionaryDao;
  129. this.pointShopDao = pointShopDao;
  130. }
  131. /**
  132. * 业务处理
  133. * @param mqBean
  134. */
  135. public void run(){
  136. long startime = System.currentTimeMillis();
  137. Map logMap = new HashMap();
  138. logMap.put("data", busimap);
  139. PointShopOrderBean psoBean = null;
  140. String resultCode = "-1";
  141. String resultInfo = "";
  142. String huchiSpid = ""; //互斥业务ID,如果不为空,则业务互斥
  143. try {
  144. //查询积分商城订购记录表
  145. psoBean = pointShopDao.getOrderRec(busimap.get("ID").toString());
  146. if(psoBean == null){
  147. throw new BusinessException("9071", "积分商城订购记录表无对应订单信息,订单流水号:"+busimap.get("ID"));
  148. }
  149. //判断业务互斥
  150. huchiSpid = checkMutual(psoBean); //判断业务互斥
  151. if(!"".equals(huchiSpid)){
  152. psoBean.setVipstatus("4");
  153. throw new BusinessException("9003","已办理互斥业务");
  154. }
  155. //业务类型,1会员,2纯免流,3会员加免流
  156. String busiType = busimap.get("BUSITYPE").toString();
  157. //获取业务结束时间
  158. String newEndtime = this.getEndTime(psoBean);
  159. //赠送会员状态,0成功,1未赠送,2赠送中,3失败,4不赠送,赠送成功后小毛会改为成功
  160. psoBean.setVipstatus("2");
  161. //办理结果编码,0成功,1待处理,2处理中,其他为异常
  162. psoBean.setResultCode("2");
  163. psoBean.setResultInfo("处理中");
  164. if("1".equals(busiType)){ //会员
  165. //更新订购状态,调会员接口
  166. String sendVipRes = invokeSendVip(psoBean);
  167. psoBean.setVipstatus("0");
  168. }else if("2".equals(busiType)){ //免流
  169. psoBean.setVipstatus("4"); //不赠送
  170. //后向订购记录表、积分商城订购记录表的ID是相同的
  171. pointShopDao.updSendVipStatus(psoBean,"TD_BACKBUSI_ORDER_REC");
  172. pointShopDao.updSendVipStatus(psoBean,"TD_POINTS_ORDER_REC");
  173. //设置订购结束时间和订购渠道
  174. psoBean.setEndtime(newEndtime);
  175. psoBean.setOrderchannel(psoBean.getAppId());
  176. //生成订购关系
  177. pointShopDao.order(psoBean);
  178. //saveOrderLog(psoBean,"0","成功"); //写订购日志
  179. }else if("3".equals(busiType)){ //会员+免流
  180. //更新订购状态,调会员接口
  181. String sendVipRes = invokeSendVip(psoBean);
  182. //赠送成功,更新或新增订购关系
  183. psoBean.setVipstatus("0");
  184. //设置订购结束时间和订购渠道
  185. psoBean.setEndtime(newEndtime);
  186. psoBean.setOrderchannel(psoBean.getAppId());
  187. //生成订购关系
  188. pointShopDao.order(psoBean);
  189. }else{
  190. psoBean.setVipstatus("5"); //赠送超时
  191. throw new BusinessException("8000","业务类型有误", new String[0]);
  192. }
  193. resultCode = "0";
  194. resultInfo = "成功";
  195. } catch (Exception e) {
  196. e.printStackTrace();
  197. if (e instanceof BusinessException) {
  198. resultInfo = ((BusinessException) e).getMessage();
  199. resultCode = ((BusinessException) e).getCode();
  200. }else{
  201. resultCode = "8000";
  202. resultInfo = "系统错误,"+e.getMessage();
  203. }
  204. } finally{
  205. threadSignal.countDown();
  206. String time = System.currentTimeMillis()-startime+"";
  207. //更新订购操作表信息,
  208. try {
  209. if(resultInfo != null && resultInfo.length()>250){
  210. resultInfo = resultInfo.substring(0,250);
  211. }
  212. if(psoBean != null){
  213. psoBean.setResultCode(resultCode);
  214. psoBean.setResultInfo(resultInfo);
  215. //更新后向产品订购记录表处理结果
  216. pointShopDao.updSendVipRes(psoBean.getVipstatus(), psoBean.getResultCode(), psoBean.getResultInfo(), psoBean.getId(), "TD_BACKBUSI_ORDER_REC", time);
  217. //更新积分商城订购记录表处理结果
  218. pointShopDao.updSendVipRes(psoBean.getVipstatus(), psoBean.getResultCode(), psoBean.getResultInfo(), psoBean.getId(), "TD_POINTS_ORDER_REC",null);
  219. saveOrderLog(psoBean); //写订购日志
  220. }else{
  221. //积分商城订购表无记录
  222. pointShopDao.updSendVipRes("5", resultCode, resultInfo, (String)busimap.get("ID"), "TD_BACKBUSI_ORDER_REC", time);
  223. }
  224. } catch (Exception e) {
  225. e.printStackTrace();
  226. log.error("更新数据出现异常,"+psoBean.getUserid()+", resultCode:"+resultCode + ", resultInfo:"+resultInfo);
  227. }
  228. //充值成功发送短信
  229. if("0".equals(resultCode)){
  230. inserSmstMq(psoBean); //发送短信
  231. }
  232. //回调通知,处理成功或者重试次数已满
  233. String bcstatus = "";
  234. try {
  235. String trycountconf = dictionaryDao.getValue("vipasyntrycount");
  236. String trycount = busimap.get("RETRYCOUNT").toString();
  237. if (StringUtils.isEmpty(trycountconf)) {
  238. trycountconf = "3";
  239. }
  240. if("0".equals(resultCode) || Integer.parseInt(trycount)+1 >= Integer.parseInt(trycountconf)){
  241. //回调积分商城通知接口
  242. this.callBack(busimap.get("ID").toString());
  243. }
  244. } catch (Exception e2) {
  245. e2.printStackTrace();
  246. }
  247. logMap.put("data2", psoBean);
  248. logMap.put("reusltCode", resultCode);
  249. logMap.put("resultInfo", resultInfo);
  250. logMap.put("bcstatus", bcstatus);
  251. log.info(JsonUtil.objectToJson(logMap));
  252. }
  253. }
  254. /**
  255. * 更新执行前状态,调接口送会员
  256. * @param psoBean
  257. * @return
  258. * @throws Exception
  259. */
  260. private String invokeSendVip(PointShopOrderBean psoBean) throws Exception{
  261. //后向订购记录表、积分商城订购记录表的ID是相同的
  262. pointShopDao.updSendVipStatus(psoBean,"TD_BACKBUSI_ORDER_REC");
  263. pointShopDao.updSendVipStatus(psoBean,"TD_POINTS_ORDER_REC");
  264. String sendVipRes = sendVip(psoBean);
  265. if("9070".equals(sendVipRes)){
  266. psoBean.setVipstatus("5"); //赠送超时
  267. throw new BusinessException("9070","赠送会员超时", new String[0]);
  268. }
  269. if(!"0".equals(sendVipRes)){ //赠送失败,再查记录表状态,(成功后小毛会改为0)
  270. //获取办理编码,如果赠送会员成功,小毛会更新vipstatus为0
  271. sendVipRes = pointShopDao.getBackVipstatus(psoBean.getId());
  272. }
  273. if(!"0".equals(sendVipRes)){//赠送未成功
  274. //未成功,当作超时处理启动重试
  275. psoBean.setVipstatus("5"); //赠送超时
  276. throw new BusinessException("9070","赠送会员超时", new String[0]);
  277. }
  278. return sendVipRes;
  279. }
  280. /**
  281. * 写订购日志
  282. * @param noBean PointShopOrderBean
  283. */
  284. private void saveOrderLog(PointShopOrderBean noBean){
  285. OrderLog orderLog = new OrderLog();
  286. orderLog.setApptype("2");
  287. orderLog.setArea(noBean.getArea());
  288. orderLog.setChannel(noBean.getOrderchannel());
  289. orderLog.setOrderstatus(0);
  290. orderLog.setStatus(0);
  291. orderLog.setCpid(noBean.getCpid());
  292. orderLog.setIsexperience(0);
  293. orderLog.setOrdertype("0");
  294. orderLog.setProvince(noBean.getProvince());
  295. orderLog.setSpid(noBean.getSpid());
  296. orderLog.setErrorcode(noBean.getResultCode());
  297. orderLog.setErrorinfo(noBean.getResultInfo());
  298. //手机号码不为空,且有办理免流业务的,记录订购日志,单独只送会员的不记订购日志
  299. if(noBean.getUserid() != null && !"null".equals(noBean.getUserid().trim()) && noBean.getUserid().trim().length() == 11 && noBean.getEndtime() != null){
  300. orderLog.setUserid(noBean.getUserid().trim());
  301. try {
  302. this.pointShopDao.addOrderLog(orderLog);
  303. } catch (Exception e) {
  304. log.error("orderId: "+noBean.getId()+", 添加日志出现异常,"+e.getMessage());
  305. e.printStackTrace();
  306. }
  307. }
  308. }
  309. /**
  310. * 查询本地订购关系表当前是否有已生效的订购关系
  311. * @param orderInfo
  312. * @return
  313. * @throws Exception
  314. */
  315. private Map hasEffect(PointShopOrderBean psoBean) throws Exception{
  316. Map reMap = new HashMap();
  317. boolean hasEffect = false;
  318. Map currOrderInfo = null;
  319. String currentTime = pointShopDao.currTime();
  320. //查询用户本地订购关系表未失效的订购数据
  321. currOrderInfo = pointShopDao.findByUserAndSpid(psoBean.getUserid(),psoBean.getCpid(),psoBean.getSpid());
  322. if(currOrderInfo != null){//本地有订购关系
  323. if(Long.parseLong(currOrderInfo.get("ENDTIME").toString()) >= Long.parseLong(currentTime)){ //结束时间大于或等于当前时间,订购关系有效
  324. hasEffect = true;
  325. }
  326. }
  327. reMap.put("hasEffect", hasEffect);
  328. reMap.put("currOrderInfo", currOrderInfo);
  329. return reMap;
  330. }
  331. /**
  332. * 判断业务是否互斥
  333. * @param orderInfo
  334. * @throws Exception
  335. */
  336. private String checkMutual(PointShopOrderBean psoBean) throws Exception{
  337. String huchiSpid = "";
  338. boolean result = false;
  339. String spid = psoBean.getSpid();
  340. List<HashMap> spList = pointShopDao.findSpInfo(spid);
  341. if(spList != null && spList.size()>0){
  342. if (spList.get(0).get("MUTEX") != null && !StringUtils.isEmpty(spList.get(0).get("MUTEX").toString())) {
  343. String[] mutexSpids = spList.get(0).get("MUTEX").toString().trim().split(",");
  344. //[{ORDERIDA=2019052, AREA=长沙, SPID=1167, PROVINCE=湖南, ID=201905241107578658666, ORDERCHANNEL=t, STATUS=1, ORDERTIME=20190524104129, USERID=18673197465, CPID=youtu}]
  345. //查询用户本地订购关系表未失效的订购数据
  346. List<HashMap> list = pointShopDao.findOrderRelaAll(psoBean.getUserid());
  347. if (list != null && list.size() > 0) {
  348. for (String mutexSpid : mutexSpids) {
  349. for (HashMap hm : list) {
  350. if (hm.get("SPID") != null && !hm.get("SPID").equals(spid) && hm.get("SPID").equals(mutexSpid)
  351. && !"2".equals(hm.get("STATUS"))) {
  352. huchiSpid = hm.get("SPID")+"";
  353. result = true;
  354. break;
  355. }
  356. }
  357. }
  358. }
  359. }
  360. }
  361. return huchiSpid;
  362. }
  363. /**
  364. * 赠送会员
  365. * @param orderInfo
  366. * @return
  367. * @throws Exception
  368. */
  369. private String sendVip(PointShopOrderBean orderBean)throws Exception{
  370. String resultcode = "3"; //失败
  371. try {
  372. //http://114.255.201.238:8090/video-activity/eshop/vip
  373. String vipurl = this.dictionaryDao.getValue("backBusiVipUrl");
  374. String timestamp = (System.currentTimeMillis() / 1000) + "";
  375. String id = orderBean.getId(); //TD_POINTS_ORDER_REC的ID,也是TD_BACKBUSI_ORDER_REC的ID
  376. String userid = orderBean.getUserid();
  377. String orderid = orderBean.getOrderNo();
  378. String cpid = orderBean.getCpid();
  379. String spid = orderBean.getSpid();
  380. //String goodscode = orderBean.getGoodsCode();
  381. String pwd = "";
  382. List<HashMap> confList = pointShopDao.getBackBusiConf(cpid, spid);
  383. pwd = confList.get(0).get("PWD").toString();
  384. userid = DESUtil.encode(userid, pwd);
  385. //MD5(orderid+userid+goodscode+pwd+timestamp)转换为十六进制ASCII 码字符串,共32 个字符,全小写 userid= Des(手机号码,pwd)
  386. //MD5(orderid+userid+timestamp+pwd)转换为十六进制ASCII 码字符串,共32 个字符,全小写
  387. String signature = MD5.MD5Encode(orderid + userid + timestamp + pwd);
  388. signature = signature.toLowerCase();
  389. vipurl = vipurl + "?userid=" + URLEncoder.encode(userid, "utf-8")+ "&id=" +id+ "&orderid="+ orderid + "&cpid=" + cpid + "&spid=" + spid + "&timestamp="
  390. + timestamp + "&signature=" + signature+ "&apptype=2";
  391. log.info("vipurl: "+vipurl);
  392. //http://114.255.201.228:86/activity/eshop/vip?userid=iafPbU9aRLghY%2FEVMXFeag%3D%3D&orderid=201906231206498662914&goodscode=pointshop130&timestamp=1561445765&signature=47fe0e3900b29ef88fd0889b7c0e4cc6&apptype=5
  393. String result = URLUtil.get(vipurl,30*1000); //调赠送会员接口,超时时间设置为10秒
  394. log.info("赠送会员结果=> userid: " +userid+", orderid: "+orderBean.getOrderNo()+" , result: "+result);
  395. Map<?,?> map = JsonUtil.jsonToMap(result);
  396. resultcode = (String)map.get("resultcode");
  397. if(resultcode.equals("0")){
  398. log.info("赠送成功");
  399. }
  400. } catch (Exception e) {
  401. e.printStackTrace();
  402. log.error("id=>"+orderBean.getId()+"=>userid: "+orderBean.getUserid()+"赠送会员失败,"+e);
  403. }
  404. return resultcode;
  405. }
  406. /**
  407. * 回调积分商城
  408. * @param outputObj
  409. * @param id 我方生成的订单流水号
  410. * @param requestId 我方生成的请求ID
  411. */
  412. private String callBack(String id){
  413. String bcstatus = "1"; //回调状态,1未回调,0回调完成,2回调异常
  414. String cbReqParams = ""; //回调请求报文
  415. String cbRspParams = ""; //回调响应报文
  416. String requestId = ""; //我方生成的请求ID
  417. try {
  418. PointShopOrderBean bean = pointShopDao.getOrderRec(id);
  419. TreeMap<String, String > orderOutObj = null;
  420. if(bean != null){
  421. requestId = bean.getRequestId();
  422. orderOutObj = new TreeMap<String, String>();
  423. orderOutObj.put("account",bean.getUserid());
  424. orderOutObj.put("orderId",bean.getId());
  425. orderOutObj.put("finishTime",bean.getFinishTime());
  426. orderOutObj.put("goodsCode",bean.getSpid());
  427. orderOutObj.put("orderNo",bean.getOrderNo());
  428. orderOutObj.put("orderTime",bean.getOrderTime());
  429. //orderOutObj.put("failDesc",bean.getResultInfo());
  430. String orderStatus = "3"; //充值状态:1充值中 2充值成功3充值失败
  431. String reusltCode = bean.getResultCode(); //办理结果编码,0成功,1待处理,2处理中,其他为异常
  432. //当会员赠送失败时,反查一下会员赠送日志表,看是否真的赠送失败,防止调接口超时获取不到真实赠送结果
  433. if(!"0".equals(reusltCode)){
  434. if(asyndao.getVipSendRes(bean.getOrderNo())){
  435. reusltCode = "0";
  436. }
  437. }
  438. if("1".equals(reusltCode) || "2".equals(reusltCode)){
  439. orderStatus = "1";
  440. }else if("0".equals(reusltCode)){
  441. orderStatus = "2";
  442. }else{ //充值失败,设置失败原因
  443. orderOutObj.put("failDesc",bean.getResultInfo());
  444. }
  445. orderOutObj.put("orderStatus",orderStatus); //充值状态:1充值中 2充值成功3充值失败
  446. }
  447. if(orderOutObj != null){
  448. String callBackUrl = this.dictionaryDao.getValue("pointShopCallBackUrl");//"http://demo.mall.10010.com:8104/jf-service/zcvcard/notify";
  449. cbReqParams = JsonUtil.objectToJson(orderOutObj);
  450. log.info("===========回调地址:"+callBackUrl);
  451. log.info("===========回调请求参数:"+cbReqParams);
  452. cbRspParams = HttpInvoke.sendHttpByPost("POST", callBackUrl, cbReqParams, getProperty());
  453. log.info("============回调响应参数:"+cbRspParams);
  454. if("0000".equals(cbRspParams)){
  455. bcstatus = "0";
  456. }
  457. }else{
  458. cbRspParams = "回调接口时未找到订购信息";
  459. log.error("订单流水号=>"+id+"=>requestId=>"+requestId+",回调接口时未找到订购信息");
  460. }
  461. } catch (Exception e) {
  462. bcstatus = "2";
  463. e.printStackTrace();
  464. log.error("订单流水号=>"+id+"=>requestId=>"+requestId+",回调接口出现异常,"+e.getMessage());
  465. cbRspParams = "返回报文: "+cbRspParams+",回调异常,"+e.getMessage();
  466. } finally{
  467. if(cbRspParams != null && cbRspParams.length()> 250){
  468. cbRspParams = cbRspParams.substring(0,250);
  469. }
  470. log.info("订单流水号=>"+id+"=>requestId=>"+requestId+"=>cbReqParams: "+cbReqParams+", cbRspParams=>"+cbRspParams);
  471. addParamsByCb(cbReqParams, cbRspParams, requestId);
  472. }
  473. return bcstatus;
  474. }
  475. /**
  476. * 添加回调报文
  477. * @param cbReqParams
  478. * @param cbRspParams
  479. * @param requestId
  480. */
  481. private void addParamsByCb(String cbReqParams,String cbRspParams, String requestId){
  482. try {
  483. //一个中文占两个 字节
  484. if(cbRspParams != null && cbRspParams.length()> 100){
  485. cbRspParams = cbRspParams.substring(0,100);
  486. }
  487. pointShopDao.updParamsByCb(cbReqParams, cbRspParams, requestId);
  488. } catch (Exception e) {
  489. e.printStackTrace();
  490. log.error("requestId: "+requestId+", 更新callBack状态出现异常,"+e.getMessage());
  491. }
  492. }
  493. /**
  494. * 解析数据
  495. * @param body
  496. * orderId TD_POINTS_ORDER_REC表ID字段,我方生成的订单流水号
  497. * orderNo 积分商城订单号
  498. * requestId 返回给客户的请求ID
  499. * @return
  500. */
  501. public PointShopMqBean transBean(Map<String, Object> body) {
  502. String jsonStr = JsonUtil.objectToJson(body);
  503. return (PointShopMqBean) JsonUtil.jsonToBean(jsonStr, PointShopMqBean.class);
  504. }
  505. /**
  506. * 发送短信
  507. * @param psoBean
  508. * @param resultCode
  509. */
  510. public void inserSmstMq(PointShopOrderBean psoBean){
  511. try{
  512. if(psoBean != null){
  513. Map<String, String> map = new HashMap<String, String>();
  514. map.put("userid", psoBean.getUserid());
  515. map.put("cpid", psoBean.getCpid());
  516. map.put("spid", psoBean.getSpid());
  517. map.put("result", "0");
  518. map.put("channel", "");
  519. map.put("style","0000");
  520. map.put("times", "");
  521. map.put("orderType", "");
  522. map.put("type", "cssms");
  523. map.put("busiType", "tran_succ");
  524. log.info(JsonUtil.objectToJson(map));
  525. String mqReciveUrl = dictionaryDao.getValue("mqReciveUrl");
  526. URLUtil.post(mqReciveUrl, JsonUtil.objectToJson(map));
  527. }
  528. }catch (Exception e){
  529. e.printStackTrace();
  530. }
  531. }
  532. /**
  533. * 获取请求属性性
  534. * @return
  535. */
  536. private static Map getProperty(){
  537. Map reqProperty = new HashMap();
  538. reqProperty.put("Content-type", "application/json;charset=UTF-8");
  539. return reqProperty;
  540. }
  541. /**
  542. * 获取endtime
  543. * @param bean PointShopOrderBean
  544. * @return
  545. */
  546. private String getEndTime(PointShopOrderBean bean)throws Exception{
  547. String endtime = pointShopDao.getBackEndtime(bean.getId());
  548. if(endtime == null || "null".equals(endtime) || endtime.length() != 14){
  549. endtime = "";
  550. }
  551. if("".equals(endtime)){
  552. String currEndtime = "";
  553. Map reMap = this.hasEffect(bean);
  554. if((Boolean)reMap.get("hasEffect")){ //存在有效订购关系
  555. Map currOrderInfo = (Map)reMap.get("currOrderInfo");
  556. currEndtime = (String)currOrderInfo.get("ENDTIME");
  557. }
  558. //[{PWD=kijkfds, NETDAYS=31, CHANNEL=test_01, NETDAYS=2, SPID=1168, BUSITYPE=3, CPID=youtu}]
  559. HashMap confHm = pointShopDao.getBackBusiConf(bean.getCpid(), bean.getSpid()).get(0);
  560. //String busiType = confHm.get("BUSITYPE")+"";
  561. if("2".equals(confHm.get("BUSITYPE")) || "3".equals(confHm.get("BUSITYPE"))){
  562. if(currEndtime != null && !"".equals(currEndtime)){
  563. endtime = pointShopDao.endtimeParamDay(confHm.get("NETDAYS")+"", currEndtime);
  564. }else{
  565. endtime = pointShopDao.currParamDay(confHm.get("NETDAYS")+"");
  566. }
  567. }
  568. }
  569. return endtime;
  570. }
  571. }