MQTask.java 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584
  1. package com.iamberry.wechat.handles.mq;
  2. import java.lang.reflect.Method;
  3. import java.text.MessageFormat;
  4. import java.util.*;
  5. import java.util.concurrent.locks.Lock;
  6. import java.util.concurrent.locks.ReentrantLock;
  7. import com.fasterxml.jackson.databind.ObjectMapper;
  8. import com.auth0.jwt.internal.org.apache.commons.lang3.StringEscapeUtils;
  9. import com.iamberry.app.config.ImberryConfig;
  10. import com.iamberry.wechat.core.entity.coupon.CouponItem;
  11. import com.iamberry.wechat.core.entity.coupon.CouponItemDto;
  12. import com.iamberry.wechat.core.entity.coupon.CouponType;
  13. import com.iamberry.wechat.core.entity.ism.IntegralLog;
  14. import com.iamberry.wechat.core.entity.member.Member;
  15. import com.iamberry.wechat.core.entity.order.NumberBacklogDto;
  16. import com.iamberry.wechat.core.entity.order.Order;
  17. import com.iamberry.wechat.face.coupon.CouponItemService;
  18. import com.iamberry.wechat.face.coupon.CouponTypeService;
  19. import com.iamberry.wechat.face.ism.IntegralLogService;
  20. import com.iamberry.wechat.face.member.MemberService;
  21. import com.iamberry.wechat.face.sendmsg.CodeService;
  22. import com.iamberry.wechat.tools.*;
  23. import net.sf.json.JSONObject;
  24. import org.springframework.beans.factory.InitializingBean;
  25. import org.springframework.beans.factory.annotation.Autowired;
  26. import org.springframework.context.annotation.Lazy;
  27. import org.springframework.scheduling.annotation.Scheduled;
  28. import org.springframework.stereotype.Component;
  29. import com.iamberry.app.tool.log.RatFWLogger;
  30. import com.iamberry.wechat.core.entity.mq.MQMessage;
  31. import com.iamberry.wechat.core.entity.task.TaskModel;
  32. import com.iamberry.wechat.core.entity.task.WechatTask;
  33. import com.iamberry.wechat.core.entity.task.WechatTaskLogs;
  34. import com.iamberry.wechat.face.order.AdminOrderService;
  35. import com.iamberry.wechat.face.reback.RebackServices;
  36. import com.iamberry.wechat.face.task.WechatTaskService;
  37. import com.iamberry.zk.SpringContextHolder;
  38. /**
  39. * @company 深圳爱贝源科技有限公司
  40. * @website www.iamberry.com
  41. * @author 献
  42. * @tel 18271840547
  43. * @date 2016年11月3日
  44. * @explain MQ模拟实现
  45. */
  46. @Component(value="mqTask")
  47. @Lazy(false)
  48. public class MQTask implements InitializingBean {
  49. @Autowired
  50. private AdminOrderService adminOrderService;
  51. @Autowired
  52. private MQServiceProxy mQSerivce;
  53. @Autowired
  54. private RatFWLogger logger;
  55. @Autowired
  56. private WechatTaskService wechatTaskService;
  57. @Autowired
  58. private RebackServices rebackServices;
  59. @Autowired
  60. private CodeService codeService;
  61. @Autowired
  62. private MemberService memberService;
  63. @Autowired
  64. private CouponTypeService couponTypeService;
  65. @Autowired
  66. private CouponItemService couponItemService;
  67. @Autowired
  68. private SendMessageUtil sendMessageUtil;
  69. @Autowired
  70. private IntegralLogService integralLogService;
  71. private Lock lock = new ReentrantLock();
  72. @SuppressWarnings(value = {"unchecked", "rawtypes"})
  73. @Scheduled(cron = "0/30 * * * * ?")
  74. public void sendOrderService() {
  75. logger.info("------------task start-----------");
  76. // If the timer has not stopped, then the next time the timer can not start.
  77. lock.lock();
  78. try {
  79. // step 1, Gets the message that is not executed in the database.
  80. List<MQMessage> messages = mQSerivce.selectWaitHandlerMessage();
  81. if (messages == null || messages.size() <= 0) {
  82. return;
  83. }
  84. // step 2, Handle 10 messages at a time.
  85. for (MQMessage mqMessage : messages) {
  86. try {
  87. Object object = SpringContextHolder.getBean(mqMessage.getServiceHandlerObjectName());
  88. Class classes = object.getClass();
  89. Method method = classes.getMethod(mqMessage.getServiceHandlerMethodName(), MQMessage.class);
  90. if (method == null) {
  91. mqMessage.setServiceErrorMessage("Method is not defined:" + mqMessage.getServiceHandlerMethodName());
  92. mqMessage.setServiceStatus(2);
  93. continue;
  94. }
  95. // invoke Method.
  96. Object resultObject = method.invoke(object, mqMessage);
  97. if (!(resultObject instanceof Boolean)) {
  98. mqMessage.setServiceStatus(2);
  99. mqMessage.setServiceErrorMessage(mqMessage.getServiceHandlerObjectName() + "." + mqMessage.getServiceHandlerMethodName() + "()Return value is not type Boolean");
  100. continue;
  101. }
  102. if (!(Boolean) resultObject) {
  103. mqMessage.setServiceErrorMessage("invoke Method Error");
  104. mqMessage.setServiceStatus(2);
  105. continue;
  106. }
  107. mqMessage.setServiceStatus(1);
  108. continue;
  109. } catch (Exception e) {
  110. // TODO: handle exception
  111. mqMessage.setServiceErrorMessage(e.getMessage());
  112. mqMessage.setServiceStatus(2);
  113. continue;
  114. } finally {
  115. mqMessage.setServiceIsSend(1);
  116. }
  117. }
  118. // step 3, update Message status and serviceIsSend.
  119. mQSerivce.updateBatchMessage(messages);
  120. // step 4, is next ?
  121. /*if (messages.size() >= 10) {
  122. StaticCacheMemory.isStartTask = true;
  123. this.sendOrderService();
  124. }*/
  125. } catch (Exception e) {
  126. e.printStackTrace();
  127. logger.error(e, "MQ Task Error:" + e.getMessage());
  128. } finally {
  129. // reset lock
  130. lock.unlock();
  131. }
  132. logger.info("------------task invoke success-----------");
  133. }
  134. /**
  135. * 根据订单号拉取物流信息
  136. * @throws Exception
  137. */
  138. @Scheduled(cron = "0 0 */1 * * ?")//每小时执行一次
  139. //@Scheduled(cron = "0 0/2 * * * ?")//每2分钟执行一次
  140. //@Scheduled(cron = "*/10 * * * * ?")
  141. public void syncLgisticsInfoByOrderId() throws Exception {
  142. System.out.println("---------------- 根据订单号拉取物流信息开始 ---------------");
  143. logger.info("---------------- 根据订单号拉取物流信息开始 ---------------");
  144. lock.lock();
  145. List<Order> orderList = null;
  146. String url = NameUtils.getConfig("rst_efast_base_url");
  147. String sdId = NameUtils.getConfig("sd_id");
  148. Map<String, Object> orderData = new HashMap<String, Object>();
  149. Map<String, String> requestData = new HashMap<String, String>();
  150. com.fasterxml.jackson.databind.ObjectMapper mapper = new ObjectMapper();
  151. try {
  152. logger.info("---------------- selectProbationShopOrderList begin ---------------");
  153. orderList = wechatTaskService.selectAiberleShopOrderList();
  154. if(orderList != null && orderList.size() > 0){
  155. for (Order order:orderList) {
  156. String salesOrderid = order.getSalesOrderid();
  157. orderData.put("orderId", salesOrderid);
  158. orderData.put("sd_id", sdId);
  159. requestData.put("app_act", "rst.trade.logistics.get");
  160. String orderDataStr = mapper.writeValueAsString(orderData);
  161. requestData.put("info", orderDataStr);
  162. String result = HttpClient431Util.doPost(requestData, url);
  163. result = StringEscapeUtils.unescapeJava(result); // unicode 编码
  164. logger.info("拉取订单号为:" + order.getSalesOrderid() + "的订单,rst返回信息:" + result);
  165. JSONObject jsonObject = JSONObject.fromObject(result);
  166. String msg = jsonObject.getString("msg");
  167. logger.info("---------"+msg+"---------");
  168. if ("success".equals(msg)) {
  169. Date date = new Date();
  170. String salesPostFirm = jsonObject.getString("salesPostFirm");
  171. String salesPostNum = jsonObject.getString("salesPostNum");
  172. order.setSalesPostFirm(salesPostFirm);
  173. order.setSalesPostNum(salesPostNum);
  174. order.setSalesSendDate(date);
  175. wechatTaskService.updateAiberleShopOrder(order);
  176. }
  177. }
  178. }
  179. }catch (Exception e){
  180. logger.error("拉取订单异常",e.getMessage());
  181. }finally {
  182. lock.unlock();
  183. }
  184. logger.info("---------------- 根据订单号拉取物流信息结束 ---------------");
  185. }
  186. /**
  187. * 订阅消息
  188. */
  189. public void subscribeMessageQueue() {
  190. }
  191. // 强迫线程可见
  192. private volatile boolean oldState = true;
  193. /**
  194. * 微信定期任务奖励-上个月的定时器
  195. */
  196. @SuppressWarnings("deprecation")
  197. @Scheduled(cron = "0/59 * * * * ?")
  198. public void oldMonthTask() {
  199. if (!oldState) {
  200. logger.info("线程正忙...");
  201. return;
  202. }
  203. oldState = false;
  204. try {
  205. // 判断上一个月的数据是否奖励完成
  206. logger.info("上一个月的定时奖励任务奖励...");
  207. // 当前时间
  208. Date nowDate = new Date();
  209. // 回到上一个月
  210. nowDate.setMonth(nowDate.getMonth() - 1);
  211. // 上一个月的结束时间 类似 :2016-02-29 23:59:59
  212. Date oldMonthLastDay = DateTimeUtil.getLastDayOfYear(nowDate);
  213. // 上一个月的开始时间 类似 :2016-02-01 00:00:00
  214. Date oldMonthFirstDay = DateTimeUtil.getFirstDayOfYear(nowDate);
  215. List<WechatTask> tasks = wechatTaskService.getRunTask(oldMonthFirstDay, oldMonthLastDay);
  216. if (tasks == null || tasks.size() == 0) {
  217. logger.info("暂时没有上一个月的任务奖励...");
  218. oldState = true;
  219. return;
  220. }
  221. // 获取在上一个月销售达到X台的数据
  222. for (WechatTask wechatTask : tasks) {
  223. List<TaskModel> models = rebackServices.getByDate(wechatTask.getTaskProductType(), oldMonthFirstDay, oldMonthLastDay, wechatTask.getTaskSalesNum());
  224. if (models == null || models.size() == 0) {
  225. logger.info("暂时没有人完成上一个月的任务" + wechatTask.getTaskId() + "奖励...");
  226. continue;
  227. }
  228. // 达到的用户是否已经领取奖励
  229. for (TaskModel taskModel : models) {
  230. WechatTaskLogs logs = new WechatTaskLogs();
  231. logs.setLogsTaskId(wechatTask.getTaskId());
  232. logs.setLogsUserOpenId(taskModel.getOpenID());
  233. Integer logsID = wechatTaskService.getByTaskIdAndOpenId(logs);
  234. if (logsID != null) {
  235. // 如果当前用户已经领取了奖励,那么跳过
  236. continue;
  237. }
  238. // 若用没有领取,那么奖励
  239. try {
  240. wechatTaskService.handlerTask(taskModel.getOpenID(), wechatTask.getTaskMoney(), wechatTask.getTaskId(), wechatTask.getTaskProductType());
  241. } catch (Exception e) {
  242. logger.error(this, "对:" + taskModel.getOpenID() + ",奖励失败!error:" + e.getMessage());
  243. }
  244. }
  245. }
  246. } catch (Exception e) {
  247. logger.error(this, "发生异常,奖励失败!error:" + e.getMessage());
  248. } finally {
  249. // 归还锁
  250. oldState = true;
  251. }
  252. }
  253. // 强迫线程可见
  254. private volatile boolean nowState = true;
  255. /**
  256. * 微信定期任务奖励-本月的定时器
  257. */
  258. @Scheduled(cron = "0/59 * * * * ?")
  259. public void nowMonthTask() {
  260. if (!nowState) {
  261. logger.info("线程正忙...");
  262. return;
  263. }
  264. nowState = false;
  265. try {
  266. // 判断本月是否有奖励数据
  267. logger.info("本月的定时奖励任务奖励...");
  268. // 当前时间
  269. Date nowDate = new Date();
  270. // 上一个月的结束时间 类似 :2016-02-29 23:59:59
  271. Date oldMonthLastDay = DateTimeUtil.getLastDayOfYear(nowDate);
  272. // 上一个月的开始时间 类似 :2016-02-01 00:00:00
  273. Date oldMonthFirstDay = DateTimeUtil.getFirstDayOfYear(nowDate);
  274. List<WechatTask> tasks = wechatTaskService.getRunTask(oldMonthFirstDay, oldMonthLastDay);
  275. if (tasks == null || tasks.size() == 0) {
  276. logger.info("暂时没有本月的任务奖励...");
  277. nowState = true;
  278. return;
  279. }
  280. // 获取在上一个月销售达到X台的数据
  281. for (WechatTask wechatTask : tasks) {
  282. List<TaskModel> models = rebackServices.getByDate(wechatTask.getTaskProductType(), oldMonthFirstDay, oldMonthLastDay, wechatTask.getTaskSalesNum());
  283. if (models == null || models.size() == 0) {
  284. logger.info("暂时没有人完成本月的任务" + wechatTask.getTaskId() + "奖励...");
  285. continue;
  286. }
  287. // 达到的用户是否已经领取奖励
  288. for (TaskModel taskModel : models) {
  289. WechatTaskLogs logs = new WechatTaskLogs();
  290. logs.setLogsTaskId(wechatTask.getTaskId());
  291. logs.setLogsUserOpenId(taskModel.getOpenID());
  292. Integer logsID = wechatTaskService.getByTaskIdAndOpenId(logs);
  293. if (logsID != null) {
  294. // 如果当前用户已经领取了奖励,那么跳过
  295. continue;
  296. }
  297. // 若用没有领取,那么奖励
  298. try {
  299. wechatTaskService.handlerTask(taskModel.getOpenID(), wechatTask.getTaskMoney(), wechatTask.getTaskId(), wechatTask.getTaskProductType());
  300. } catch (Exception e) {
  301. logger.error(this, "对:" + taskModel.getOpenID() + ",奖励失败!error:" + e.getMessage());
  302. }
  303. }
  304. }
  305. } catch (Exception e) {
  306. // TODO: handle exception
  307. logger.error(this, "发生异常:" + e.getMessage());
  308. } finally {
  309. nowState = true;
  310. }
  311. }
  312. public void afterPropertiesSet() throws Exception {
  313. }
  314. /**
  315. * 待处理订单提醒---每天下午2:50,短信提醒益霜、运营一次(15814645335、18271840547);
  316. */
  317. // @SuppressWarnings(value = {"unchecked", "rawtypes"})
  318. // @Scheduled(cron = "0 50 14 * * ?")//每天下午2点50分执行一次
  319. // public void pendingOrderReminder() {
  320. // logger.info("=======发送短信通知========");
  321. // //查询待发货事项、申请退款订单、申请退货订单、申请换货订单 的数量
  322. // NumberBacklogDto numberBacklogDto = adminOrderService.selectNumberBacklog();
  323. // Integer num = (numberBacklogDto.getExchange()+numberBacklogDto.getReturnGoods()+numberBacklogDto.getReturnRefund()+numberBacklogDto.getSendTheGoods());
  324. // String text = MessageFormat.format(ImberryConfig.PENDING_ORDER_REMINDER, num);
  325. // if(num > 0){
  326. // codeService.informShipping("15814645335", text);
  327. // codeService.informShipping("18271840547", text);
  328. // }
  329. // }
  330. /**
  331. * 生日提醒 - 赠送优惠券 - 需要在0点就赠送出去
  332. * @throws Exception
  333. */
  334. // @Scheduled(cron = "0 0 */1 * * ?")//每小时执行一次
  335. // @Scheduled(cron = "0 0 9 * * ?")//每天早上9点触发
  336. // @Scheduled(cron = "0 0/2 * * * ?")//每2分钟执行一次
  337. @Scheduled(cron = "0 5 0 * * ?")//每天早上0点过5分执行
  338. public void birthDatePromptCoupon() throws Exception {
  339. logger.info("---------------- 生日提醒-赠送优惠券-开始 ---------------");
  340. List<Member> memberList = memberService.getNowBirthDate();
  341. logger.info("---今日生日的用户数量:"+memberList.size());
  342. Integer couponId = 40000;
  343. for (Member member:memberList) {
  344. CouponType couponType = couponTypeService.getCouponTypeById(couponId);
  345. Calendar calendar = Calendar.getInstance();
  346. calendar.set(Calendar.HOUR_OF_DAY,23);
  347. calendar.set(Calendar.MINUTE,59);
  348. calendar.set(Calendar.SECOND,50);
  349. //创建优惠券
  350. CouponItem couponItem = new CouponItem();
  351. String uuidStr = StrUtils.getUUID();
  352. couponItem.setCouponItemId(uuidStr);
  353. couponItem.setCouponItemUseropenid(member.getUserOpenid());
  354. couponItem.setCouponId(couponType.getCouponId());
  355. couponItem.setCouponReceiveDate(new Date());
  356. couponItem.setCouponUseEndDate(calendar.getTime());
  357. couponItem.setCouponUseStatus(1);
  358. couponItem.setCouponItemRemark(couponType.getCouponRemark());
  359. Integer flag = couponItemService.insertCouponItem(couponItem);
  360. if(flag < 1){
  361. logger.info("---生日优惠券领取失败,userOpenId:"+member.getUserOpenid() + "");
  362. }else{
  363. logger.info("---生日优惠券领取成功,userOpenId:"+member.getUserOpenid() + "");
  364. }
  365. }
  366. logger.info("---------------- 生日提醒-赠送优惠券-结束 ---------------");
  367. }
  368. /**
  369. * 生日提醒-9点通知客户今天优惠券和积分三倍情况
  370. * @throws Exception
  371. */
  372. // @Scheduled(cron = "0 0 */1 * * ?")//每小时执行一次
  373. // @Scheduled(cron = "0 0/2 * * * ?")//每2分钟执行一次
  374. @Scheduled(cron = "0 0 9 * * ?")//每天早上9点触发
  375. public void birthDatePrompt() throws Exception {
  376. logger.info("---------------- 生日提醒-提醒用户-开始 ---------------");
  377. List<Member> memberList = memberService.getNowBirthDate();
  378. logger.info("---今日生日的用户数量:"+memberList.size());
  379. for (Member member:memberList) {
  380. //推送微信模板消息
  381. try {
  382. sendMessageUtil.memberActivation(
  383. "尊敬的会员,祝您生日快乐,特送上一份生日礼包。",
  384. member.getUserTel(),
  385. String.valueOf(member.getUserSurplusIntegral()),
  386. "1、免费领取50元代金券,满99元即可使用,在会员中心-券包即可查看使用。\\\\r\\\\n" +
  387. "2、会员生日当天下单购买产品,即可享受3倍积分。\\\\r\\\\n" +
  388. "生日福利仅限生日当天领取和使用,赶快享受你的专属生日礼包吧!",
  389. member.getUserOpenid(),
  390. ResultInfo.COUPON_URL);
  391. }catch (Exception e){
  392. logger.info("推送今日生日的用户消息失败,失败openId:" + member.getUserOpenid());
  393. e.printStackTrace();
  394. }
  395. }
  396. logger.info("---------------- 生日提醒-提醒用户-结束 ---------------");
  397. }
  398. /**
  399. * 将待入账转为已入账
  400. * @throws Exception
  401. */
  402. // @Scheduled(cron = "0 0/2 * * * ?")//每2分钟执行一次
  403. @Scheduled(cron = "0 0 */1 * * ?")//每小时执行一次
  404. public void accountEntry() throws Exception {
  405. logger.info("---------------- 待入账转为已入账-开始 ---------------");
  406. List<IntegralLog> integralLogList = integralLogService.getIntegralLogListByWaitUser();
  407. if(integralLogList!=null && integralLogList.size()>0){
  408. logger.info("---------------- 当前待入账的处理数量-"+ integralLogList.size() +" ---------------");
  409. for (IntegralLog integralLog:integralLogList) {
  410. try {
  411. integralLogService.waitUser(integralLog);
  412. }catch (Exception e){
  413. logger.info("--待入账转为已入账失败;待入账积分记录id:"+integralLog.getInteLogId()+";" +
  414. "订单编号:"+ integralLog.getInteLogWaitingOrderId() +";失败原因:"+e.getMessage());
  415. e.printStackTrace();
  416. }
  417. }
  418. logger.info("---------------- 待入账转为已入账-结束 ---------------");
  419. }
  420. }
  421. /**
  422. * 20分钟刷新-未支付订单自动取消订单
  423. * @throws Exception
  424. */
  425. // @Scheduled(cron = "0 0/2 * * * ?")//每2分钟执行一次
  426. @Scheduled(cron = "0 0/5 * * * ?")//每5分钟执行一次
  427. public void cancelOrder() throws Exception {
  428. logger.info("---------------- 超过20分钟取消订单-开始 ---------------");
  429. Calendar calendar = Calendar.getInstance();
  430. calendar.setTime(new Date());
  431. calendar.add(Calendar.MINUTE, -20);//20分钟前的时间
  432. Order order = new Order();
  433. order.setCancelDate(calendar.getTime());
  434. List<Order> orderList = adminOrderService.cancelOrderList(order);
  435. if(orderList!=null && orderList.size()>0){
  436. logger.info("---------------- 当前订单处理数量-"+ orderList.size() +" ---------------");
  437. for (Order ord:orderList) {
  438. try {
  439. Integer flag = adminOrderService.cancelOrder(ord.getSalesOrderid());
  440. if(flag < 1){
  441. logger.info("---------------- 订单取消失败-订单号:"+ ord.getSalesOrderid() +" ---------------");
  442. }
  443. }catch (Exception e){
  444. e.printStackTrace();
  445. logger.info("---------------- 订单取消报错"+ e.getMessage() +"-订单号:"+ ord.getSalesOrderid() +" ---------------");
  446. }
  447. }
  448. logger.info("---------------- 超过20分钟取消订单-结束 ---------------");
  449. }
  450. }
  451. /**
  452. * 关注一个月后未注册,推送注册信息
  453. * @throws Exception
  454. */
  455. // @Scheduled(cron = "0 0/2 * * * ?")//每2分钟执行一次
  456. @Scheduled(cron = "0 0 8 * * ?")//每天早上9点触发
  457. public void mqRegisterMember() throws Exception {
  458. logger.info("---------------- 关注用户过一个月还未注册,推送注册信息-开始 ---------------");
  459. Calendar calendar = Calendar.getInstance();
  460. calendar.setTime(new Date());
  461. calendar.add(Calendar.DATE, -30);//30天前
  462. Member member = new Member();
  463. member.setUserSubDate(calendar.getTime());
  464. List<Member> memberList = memberService.getNoRegister(member);
  465. if(memberList!=null && memberList.size()>0){
  466. logger.info("---------------- 当前任务处理数量-"+ memberList.size() +" ---------------");
  467. for (Member m:memberList) {
  468. try {
  469. sendMessageUtil.registerMember(
  470. "欢迎关注Aiberle爱贝源。现在注册会员可享受多重好礼:\\\\r\\\\n" +
  471. "1.专属折扣(购买滤芯88折,其他产品95折)\\\\r\\\\n" +
  472. "2.单支滤芯买一送一\\\\r\\\\n" +
  473. "3.注册即送100积分,下单可抵扣10元",
  474. "我的爱贝源-会员中心-成为会员",
  475. "400-8006692",
  476. "赶紧注册会员吧!更多惊喜等你来!",
  477. m.getUserOpenid(),
  478. ResultInfo.HUIYUAN_URL);
  479. }catch (Exception e){
  480. logger.info("关注用户过一个月还未注册,推送注册信息失败,失败openId:" + member.getUserOpenid());
  481. e.printStackTrace();
  482. }
  483. }
  484. logger.info("---------------- 关注用户过一个月还未注册,推送注册信息-结束 ---------------");
  485. }
  486. }
  487. /**
  488. * 注册会员但未使用优惠券
  489. * 45天提醒一次 85天提醒一次
  490. * @throws Exception
  491. */
  492. // @Scheduled(cron = "0 0/2 * * * ?")//每2分钟执行一次
  493. @Scheduled(cron = "0 0 8 * * ?")//每天早上9点触发
  494. public void mqRecommendUseCoupon() throws Exception {
  495. logger.info("---------------- 注册会员未使用优惠券提醒-开始 ---------------");
  496. //45天未使用优惠券的券
  497. Calendar calendar = Calendar.getInstance();
  498. calendar.setTime(new Date());
  499. calendar.add(Calendar.DATE, -45);//45天前
  500. CouponItem couponItem = new CouponItem();
  501. couponItem.setCouponId(40001);
  502. couponItem.setCouponReceiveDate(calendar.getTime());
  503. List<CouponItemDto> couponItemDtoList = couponItemService.getNoUseCouponList(couponItem);
  504. if(couponItemDtoList!=null && couponItemDtoList.size()>0){
  505. logger.info("---------------- 45天未使用优惠券的券 - 前当前任务处理数量-"+ couponItemDtoList.size() +" ---------------");
  506. for (CouponItemDto couponItemDto:couponItemDtoList) {
  507. try {
  508. sendMessageUtil.recommendUseCoupon(
  509. "亲爱的用户,您的单支滤芯买一送一优惠券即将到期",
  510. "单支滤芯买一送一",
  511. "45天后失效",
  512. "可在“服务中心-会员中心-券包”查看,请尽快使用。",
  513. couponItemDto.getUseropenid(),
  514. ResultInfo.COUPON_URL);
  515. }catch (Exception e){
  516. logger.info("注册成功提醒使用优惠券失败,失败openId:" + couponItemDto.getUseropenid()+",优惠券ID:"+couponItemDto.getCouponItemId());
  517. e.printStackTrace();
  518. }
  519. }
  520. logger.info("---------------- 注册会员未使用优惠券提醒-结束 ---------------");
  521. }
  522. //85天未使用优惠券的券
  523. Calendar nowcalendar = Calendar.getInstance();
  524. nowcalendar.setTime(new Date());
  525. nowcalendar.add(Calendar.DATE, -85);//45天前
  526. CouponItem nowcouponItem = new CouponItem();
  527. nowcouponItem.setCouponId(40001);
  528. nowcouponItem.setCouponReceiveDate(nowcalendar.getTime());
  529. List<CouponItemDto> nowcouponItemDtoList = couponItemService.getNoUseCouponList(nowcouponItem);
  530. if(nowcouponItemDtoList!=null && nowcouponItemDtoList.size()>0){
  531. logger.info("---------------- 85天未使用优惠券的券 - 前当前任务处理数量-"+ nowcouponItemDtoList.size() +" ---------------");
  532. for (CouponItemDto couponItemDto:nowcouponItemDtoList) {
  533. try {
  534. sendMessageUtil.recommendUseCoupon(
  535. "亲爱的用户,您的单支滤芯买一送一优惠券即将到期",
  536. "单支滤芯买一送一",
  537. "5天后失效",
  538. "可在“服务中心-会员中心-券包”查看,请尽快使用。",
  539. couponItemDto.getUseropenid(),
  540. ResultInfo.COUPON_URL);
  541. }catch (Exception e){
  542. logger.info("注册成功提醒使用优惠券失败,失败openId:" + couponItemDto.getUseropenid()+",优惠券ID:"+couponItemDto.getCouponItemId());
  543. e.printStackTrace();
  544. }
  545. }
  546. }
  547. logger.info("---------------- 注册会员未使用优惠券提醒-结束 ---------------");
  548. }
  549. }