From cd637932a970e7935b17d41568fe89c92775bccc Mon Sep 17 00:00:00 2001 From: admin <weikou2014> Date: 星期五, 06 十二月 2019 17:18:27 +0800 Subject: [PATCH] 双12活动添加,邀请码发布修改,爬单新规则添加 --- fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserSystemCouponServiceImpl.java | 468 +++++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 345 insertions(+), 123 deletions(-) diff --git a/fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserSystemCouponServiceImpl.java b/fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserSystemCouponServiceImpl.java index eec79be..c20246d 100644 --- a/fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserSystemCouponServiceImpl.java +++ b/fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserSystemCouponServiceImpl.java @@ -12,13 +12,23 @@ import org.springframework.context.annotation.Lazy; import org.springframework.core.task.TaskExecutor; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.DefaultTransactionDefinition; import org.yeshi.utils.DateUtil; import org.yeshi.utils.entity.DateInfo; +import com.aliyun.openservices.ons.api.Message; +import com.aliyun.openservices.ons.api.Producer; +import com.aliyun.openservices.ons.api.SendResult; +import com.aliyun.openservices.ons.api.transaction.LocalTransactionExecuter; +import com.aliyun.openservices.ons.api.transaction.TransactionProducer; +import com.aliyun.openservices.ons.api.transaction.TransactionStatus; import com.yeshi.fanli.dao.mybatis.user.UserSystemCouponMapper; +import com.yeshi.fanli.dto.mq.user.UserTopicTagEnum; +import com.yeshi.fanli.dto.mq.user.body.UserSystemCouponUseMQMsg; import com.yeshi.fanli.dto.msg.MsgOtherCouponActivateDTO; import com.yeshi.fanli.dto.msg.MsgOtherGiveContentDTO; import com.yeshi.fanli.entity.accept.AcceptData; @@ -30,6 +40,7 @@ import com.yeshi.fanli.entity.bus.user.UserInfo; import com.yeshi.fanli.entity.bus.user.UserInfoExtra; import com.yeshi.fanli.entity.bus.user.UserSystemCoupon; +import com.yeshi.fanli.entity.bus.user.UserSystemCouponActivate; import com.yeshi.fanli.entity.bus.user.UserSystemCouponGiveRecord; import com.yeshi.fanli.entity.bus.user.UserSystemCouponRecord; import com.yeshi.fanli.entity.common.JumpDetailV2; @@ -58,18 +69,23 @@ import com.yeshi.fanli.service.inter.user.TokenRecordService; import com.yeshi.fanli.service.inter.user.UserInfoExtraService; import com.yeshi.fanli.service.inter.user.UserInfoService; +import com.yeshi.fanli.service.inter.user.UserSystemCouponActivateService; import com.yeshi.fanli.service.inter.user.UserSystemCouponGiveRecordService; import com.yeshi.fanli.service.inter.user.UserSystemCouponRecordService; import com.yeshi.fanli.service.inter.user.UserSystemCouponService; import com.yeshi.fanli.service.inter.user.invite.ThreeSaleSerivce; +import com.yeshi.fanli.service.inter.user.vip.UserVIPInfoService; import com.yeshi.fanli.util.Constant; import com.yeshi.fanli.util.MoneyBigDecimalUtil; import com.yeshi.fanli.util.RedisManager; import com.yeshi.fanli.util.StringUtil; import com.yeshi.fanli.util.TokenUtil; import com.yeshi.fanli.util.VersionUtil; +import com.yeshi.fanli.util.annotation.RequestSerializableByKeyService; import com.yeshi.fanli.util.factory.UserMoneyDetailFactory; import com.yeshi.fanli.util.factory.msg.MsgOtherSystemGiveDTOFactory; +import com.yeshi.fanli.util.rocketmq.MQMsgBodyFactory; +import com.yeshi.fanli.util.rocketmq.MQTopicName; import com.yeshi.fanli.util.taobao.TaoBaoUtil; import com.yeshi.fanli.vo.msg.ClientTextStyleVO; import com.yeshi.fanli.vo.order.CommonOrderVO; @@ -151,6 +167,23 @@ @Resource private TokenRecordService tokenRecordService; + + @Resource(name = "transactionManager") + private DataSourceTransactionManager transactionManager; + + @Resource(name = "orderTransactionProducer") + private TransactionProducer orderTransactionProducer; + + @Resource + private UserSystemCouponActivateService userSystemCouponActivateService; + + @Resource(name = "producer") + private Producer producer; + + @Resource + private UserVIPInfoService userVIPInfoService; + + @Override public int insertSelective(UserSystemCoupon record) { @@ -264,8 +297,11 @@ userCoupon.setEndTime(endTime); userCoupon.setCreateTime(new Date()); userCoupon.setUpdateTime(new Date()); - // 鎻掑叆鏁版嵁搴� - insertSelective(userCoupon); + userSystemCouponMapper.insertSelective(userCoupon); + + if(coupon.getType() == CouponTypeEnum.freeCoupon) { + userSystemCouponActivateService.addActivateRecord(userCoupon.getId()); + } executor.execute(new Runnable() { @Override @@ -794,7 +830,7 @@ if (systemCoupon == null) throw new UserSystemCouponException(1, "鍒稿凡涓嶅瓨鍦�"); } - + if (systemCoupon.getType() != CouponTypeEnum.rebatePercentCoupon) throw new UserSystemCouponException(1, "鍒哥被鍨嬩笉鍖归厤"); @@ -806,13 +842,14 @@ sourceType); if (orderVO == null) throw new UserSystemCouponException(1, "璁㈠崟淇℃伅鑾峰彇澶辫触"); - + // 鐗堟湰鍖哄垎锛�2.0.2 - if (VersionUtil.greaterThan_2_0_2(acceptData.getPlatform(), acceptData.getVersion())) { + if (VersionUtil.greaterThan_2_1(acceptData.getPlatform(), acceptData.getVersion())) { Date thirdCreateTime = orderVO.getThirdCreateTime(); if (thirdCreateTime != null) { long downOrderTime = thirdCreateTime.getTime(); - long limitDate = Long.parseLong("1573315200000"); // TODO 鏃ユ湡寰呯‘瀹�2019-11-10 + long limitDate = Long.parseLong("1573315200000"); // TODO + // 鏃ユ湡寰呯‘瀹�2019-11-10 if (downOrderTime > limitDate) { Date endDay = DateUtil.plusDayDate(4, thirdCreateTime); long currentTime = java.lang.System.currentTimeMillis(); @@ -820,21 +857,20 @@ boolean valid = false; DateInfo dateInfo = DateUtil.dateDiff3(currentTime, endDay.getTime()); if (dateInfo != null) { - if (dateInfo.getDay() > 0) + if (dateInfo.getDay() > 0) valid = true; if (!valid && dateInfo.getHour() > 0) valid = true; - - if (!valid && dateInfo.getMinute() > 0) + if (!valid && dateInfo.getMinute() > 0) valid = true; - + if (!valid && dateInfo.getSecond() >= 0) valid = true; } - - if (!valid) + + if (!valid) throw new UserSystemCouponException(1, "璇ヨ鍗曞凡涓嶈兘浣跨敤浣跨敤濂栧姳鍒革紝璇︽儏璇峰挩璇㈠鏈�"); } } @@ -852,7 +888,7 @@ Order order = orderService.findOrderByOrderIdAndType(orderNo, sourceType); if (order == null) - return; + throw new UserSystemCouponException(1, "璇ヨ鍗曚笉瀛樺湪"); /* 濂栭噾璁$畻 浠ュ強鐩稿叧绾㈠寘淇℃伅澶勭悊 */ @@ -861,6 +897,37 @@ // 鎻愭垚閲戦 BigDecimal money = MoneyBigDecimalUtil.mul(hongBao, percent); + UserSystemCouponUseMQMsg mqMsg = new UserSystemCouponUseMQMsg(userSystemCoupon.getId(), order.getOrderId(), + sourceType, systemCoupon.getType().name()); + // 浜嬪姟娑堟伅 + Message msg =MQMsgBodyFactory.create(MQTopicName.TOPIC_USER, UserTopicTagEnum.useSystemCoupon, + mqMsg); + try { + SendResult result = orderTransactionProducer.send(msg, new LocalTransactionExecuter() { + @Override + public TransactionStatus execute(Message arg0, Object arg1) { + try { + useRewardCouponCore(userSystemCoupon, money, hongBao, uid, order); + return TransactionStatus.CommitTransaction; + } catch (Exception e) { + return TransactionStatus.RollbackTransaction; + } + } + }, null); + System.out.println(result); + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + } + } + + @Transactional + public void useRewardCouponCore(UserSystemCoupon userSystemCoupon, BigDecimal money, BigDecimal hongBao, Long uid, + Order order) throws Exception { + org.springframework.transaction.TransactionStatus transactionStatus = transactionManager + .getTransaction(new DefaultTransactionDefinition()); + try { // 1銆佹彃鍏ョ孩鍖呮暟鎹� HongBaoV2 hongBaoV2 = new HongBaoV2(); hongBaoV2.setMoney(money); @@ -879,14 +946,10 @@ orderHongBaoMapService.addOrderHongBaoMap(hongBaoV2, order); // 3.鎻掑叆璧勯噾鏄庣粏,鐢ㄦ埛浣欓 - UserMoneyDetail userMoneyDetail = UserMoneyDetailFactory.createOrderReward(orderNo, sourceType, money, - new UserInfo(uid)); + UserMoneyDetail userMoneyDetail = UserMoneyDetailFactory.createOrderReward(order.getOrderId(), + order.getOrderType(), money, new UserInfo(uid)); userMoneyDetailService.addUserMoneyDetail(userMoneyDetail); userInfoService.addMoney(new UserInfo(uid), money); - - // 鎻掑叆璧勯噾閫氱煡 - userMoneyMsgNotificationService.orderReward(uid, orderNo, sourceType, money, - userInfoService.selectByPKey(uid).getMyHongBao()); /* 鐢ㄦ埛鍒镐俊鎭姸鎬佸強璁板綍澶勭悊 */ @@ -897,23 +960,33 @@ userSystemCoupon.setUpdateTime(date); userSystemCouponMapper.updateByPrimaryKeySelective(userSystemCoupon); + SystemCoupon coupon = systemCouponService.selectByPrimaryKey(userSystemCoupon.getSystemCoupon().getId()); + // 鎻掑叆浣跨敤鍒歌褰� UserSystemCouponRecord couponRecord = new UserSystemCouponRecord(); couponRecord.setState(UserSystemCouponRecord.STATE_SUCCESS); - couponRecord.setGoodSource(sourceType); - couponRecord.setOrderNo(orderNo); + couponRecord.setGoodSource(order.getOrderType()); + couponRecord.setOrderNo(order.getOrderId()); couponRecord.setUserSystemCoupon(userSystemCoupon); - couponRecord.setCouponType(systemCoupon.getType().name()); + couponRecord.setCouponType(coupon.getType().name()); couponRecord.setCreateTime(date); couponRecord.setUpdateTime(date); userSystemCouponRecordService.insertSelective(couponRecord); + // 鎻掑叆璧勯噾閫氱煡 + userMoneyMsgNotificationService.orderReward(uid, order.getOrderId(), order.getOrderType(), money, + userInfoService.selectByPKey(uid).getMyHongBao()); // 娑堟伅鎺ㄩ�� try { - userOtherMsgNotificationService.rewardCouponUsed(userSystemCoupon, hongBao, money, orderNo); + userOtherMsgNotificationService.rewardCouponUsed(userSystemCoupon, hongBao, money, order.getOrderId()); } catch (Exception e) { LogHelper.errorDetailInfo(e); } + transactionManager.commit(transactionStatus); + } catch (Exception e) { + e.printStackTrace(); + transactionManager.rollback(transactionStatus); + throw new Exception(); } } @@ -1536,12 +1609,12 @@ } @Override - @Transactional(rollbackFor=Exception.class) + @Transactional(rollbackFor = Exception.class) public void systemGiveRewardCoupon(Long uid, int num, String orderId, Integer orderType, String reason) throws Exception { // 娣诲姞濂栧姳鍒� insertUserCoupon(uid, CouponTypeEnum.rebatePercentCoupon.name(), "绯荤粺璧犻��", - new BigDecimal(configService.get("exchange_rebate_percent")),false); + new BigDecimal(configService.get("exchange_rebate_percent")), false); // 娣诲姞濂栧姳鍒告秷鎭� userOtherMsgNotificationService.systemGiveRewardCoupon(uid, null, MsgOtherSystemGiveDTOFactory .createRewardCouponGive(num, "璇锋寜鐓ц繑鍒╁鍔卞埜瑙勫垯浣跨敤", "杩斿埄濂栧姳鍒�", orderId, orderType, reason)); @@ -1666,7 +1739,7 @@ @Transactional @Override - public List<UserSystemCouponVO> getCouponList(long start, int count, Long uid) + public List<UserSystemCouponVO> getCouponList(AcceptData acceptData, long start, int count, Long uid) throws UserSystemCouponException, Exception { // 杩囨湡鍒� @@ -1761,15 +1834,13 @@ listTip.add("婊¤冻鏉′欢鍚庯紝绯荤粺灏嗚嚜鍔ㄦ縺娲伙紝骞跺湪娑堟伅-鍏跺畠娑堟伅涓彁閱掋��"); userCouponVO.setTips(listTip); userCouponVO.setPopup(true); - - // 楠岃瘉鏄惁宸茬疮璁�3鍗� - executor.execute(new Runnable() { - @Override - public void run() { - freeCouponActivate(userCouponVO.getId(), uid, userCouponVO.getCreateTime()); - } - }); - + // 缁熻寰呮縺娲绘暟閲� + if (VersionUtil.greaterThan_2_0_2(acceptData.getPlatform(), acceptData.getVersion())) { + int activateCount = userSystemCouponActivateService.getActivateCount(userCouponVO.getId()); + String activateNum = configService.get("free_coupon_activate_num"); + userCouponVO.setCouponEffect( + "(" + activateCount + "/" + Integer.parseInt(activateNum) + ")寰呮縺娲�"); + } } else if (CouponTypeEnum.welfareFreeCoupon == type) { jumpBtn = new HashMap<String, Object>(); if (inviteCode != null && inviteCode.trim().length() > 0) { @@ -1809,18 +1880,20 @@ jumpBtn.put("params", jumpLink); jumpBtn.put("jumpDetail", jumpDetailV2Service.getByTypeCache("web")); } else if (CouponTypeEnum.rebatePercentCoupon == type) { - // 鍙娇鐢ㄣ�� 鍙禒閫� - userCouponVO.setState(UserSystemCoupon.STATE_USE_GIVE); - - // 璁㈠崟鍒楄〃 - jumpLink.put("state", "2"); // 宸叉敹璐� - jumpLink.put("showNav", false); // 涓嶆樉绀轰笂鏂圭粺璁′俊鎭� - jumpLink.put("type", "1"); // 杩斿埄璁㈠崟 - jumpLink.put("title", "杩斿埄璁㈠崟"); // 鏍囬鍚� - jumpLink.put("goodsType", "0"); // 璁㈠崟鏉ユ簮 - jumpBtn = new HashMap<String, Object>(); - jumpBtn.put("params", jumpLink); - jumpBtn.put("jumpDetail", jumpDetailV2Service.getByTypeCache("order_screen_list")); + if (userVIPInfoService.isVIP(uid)) { // 浼氬憳鍙彲璧犻�� + userCouponVO.setState(UserSystemCoupon.STATE_GIVE_ONLY); + } else {// 鍙娇鐢� 鍙禒閫� + userCouponVO.setState(UserSystemCoupon.STATE_USE_GIVE); + + jumpLink.put("state", "2"); // 宸叉敹璐� + jumpLink.put("showNav", false); // 涓嶆樉绀轰笂鏂圭粺璁′俊鎭� + jumpLink.put("type", "1"); // 杩斿埄璁㈠崟 + jumpLink.put("title", "杩斿埄璁㈠崟"); // 鏍囬鍚� + jumpLink.put("goodsType", "0"); // 璁㈠崟鏉ユ簮 + jumpBtn = new HashMap<String, Object>(); + jumpBtn.put("params", jumpLink); + jumpBtn.put("jumpDetail", jumpDetailV2Service.getByTypeCache("order_screen_list")); + } } } else if (UserSystemCoupon.STATE_IN_USE == state && give) { userCouponVO.setCouponEffect("璧犻�佷腑"); @@ -2010,7 +2083,20 @@ } tips = tips.replace("{鍙d护}", token).replace("{涓嬭浇閾炬帴}", configService.get("app_down_link")); - return createUserCouponVOo(userSystemCoupon, systemCoupon, giveRecord, tips); + UserSystemCouponVO couponVO = createUserCouponVOo(userSystemCoupon, systemCoupon, giveRecord, tips); + + UserSystemCouponUseMQMsg msg = new UserSystemCouponUseMQMsg(); + msg.setUserSystemCouponId(id); + msg.setCouponType(type.name()); + Message message = MQMsgBodyFactory.create(MQTopicName.TOPIC_USER, UserTopicTagEnum.systemCouponDrawback, + msg); + try { + producer.send(message); + } catch (Exception e) { + throw new UserSystemCouponException(1, "鍒涘缓璧犻�佷俊鎭け璐�"); + } + + return couponVO; } private UserSystemCouponVO createUserCouponVOo(UserSystemCoupon userSystemCoupon, SystemCoupon systemCoupon, @@ -2042,81 +2128,6 @@ userCouponVO.setRemainDays(remainDays); return userCouponVO; - } - - /** - * 鍏嶅崟鍒告縺娲� - * - * @param uid - */ - public void freeCouponActivate(Long id, Long uid, Date date) { - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - long count = commonOrderCountService.countValidOrderByDate(uid, sdf.format(date)); - - String activateNum = configService.get("free_coupon_activate_num"); - int num = Integer.parseInt(activateNum); - - if (count >= num) { - UserSystemCoupon coupon = userSystemCouponMapper.selectByPrimaryKey(id); - if (coupon == null || coupon.getState() != UserSystemCoupon.STATE_CAN_USE - || coupon.getStateActivated() != 0) - return; - - Date nowDate = new Date(); - Date endTime2 = coupon.getEndTime(); - if (endTime2 != null && endTime2.getTime() <= nowDate.getTime()) - return; - - SystemCoupon systemCoupon = coupon.getSystemCoupon(); - if (systemCoupon == null) - return; - - systemCoupon = systemCouponService.selectByPrimaryKey(systemCoupon.getId()); - if (systemCoupon == null || systemCoupon.getType() != CouponTypeEnum.freeCoupon) - return; - - try { - Integer expiryDay = systemCoupon.getExpiryDay(); - String endDay = DateUtil.plusDay(expiryDay - 1, nowDate); - SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - if (endDay != null && endDay.trim().length() > 0) { - endDay += " 23:59:59"; - } - Date endTime = format.parse(endDay); - - UserSystemCoupon userCoupon = new UserSystemCoupon(); - userCoupon.setId(coupon.getId()); - userCoupon.setStateActivated(1); - userCoupon.setEndTime(endTime); - userCoupon.setStartTime(nowDate); - userCoupon.setUpdateTime(new Date()); - userSystemCouponMapper.updateByPrimaryKeySelective(userCoupon); - - // 璧犻�佽褰� - UserSystemCouponGiveRecord giveRecord = userSystemCouponGiveRecordService.getByReceiveId(id); - if (giveRecord == null) - return; - - Long giveUid = giveRecord.getGiveUid(); - UserInfo userInfo = userInfoService.selectByPKey(giveUid); - if (userInfo == null) - return; - - String beiZhu = "璇峰埌鎴戠殑-绂忓埄涓績涓煡鐪�"; - SimpleDateFormat sd = new SimpleDateFormat("yyyy.MM.dd HH:mm"); - MsgOtherCouponActivateDTO msgOther = new MsgOtherCouponActivateDTO(); - msgOther.setTitle("鍏嶅崟鍒告縺娲�"); - msgOther.setType("鍏嶅崟鍒哥郴缁熷凡鑷姩婵�娲�"); - msgOther.setExplain("婊¤冻" + systemCoupon.getActivateDay() + "澶╁唴浜х敓" + num + "绗斿凡鍒拌处杩斿埄璁㈠崟"); - msgOther.setGiveUser("鏄电О锛�" + userInfo.getNickName() + " ID锛�" + giveUid); - msgOther.setReceiveTime(sd.format(giveRecord.getReceiveTime())); - msgOther.setValidityTime(expiryDay + "澶�"); - userOtherMsgNotificationService.giveCouponActivateMsg(uid, beiZhu, msgOther); - } catch (Exception e) { - e.printStackTrace(); - LogHelper.errorDetailInfo(e); - } - } } @Transactional @@ -2270,9 +2281,100 @@ sendBackGiveCoupon(list); } + + @Override + @RequestSerializableByKeyService(key = "#id") + @Transactional(rollbackFor = Exception.class) + public void sendBackByGiveId(Long couponId) { + if (couponId == null) + return; + + UserSystemCoupon userCoupon = userSystemCouponMapper.selectByPrimaryKey(couponId); + if (userCoupon == null) + return; + + Integer state = userCoupon.getState(); + if (state != UserSystemCoupon.STATE_IN_USE) + return; + + UserSystemCouponGiveRecord giveRecord = userSystemCouponGiveRecordService.getByCouponId(couponId); + if (giveRecord == null) + return; + + if (giveRecord.getState() != null && giveRecord.getState() != UserSystemCouponGiveRecord.STATE_INIT) + return; + + // 鏇存柊璧犻�佽褰� + UserSystemCouponGiveRecord updateRecord = new UserSystemCouponGiveRecord(); + updateRecord.setId(giveRecord.getId()); + updateRecord.setState(UserSystemCouponGiveRecord.STATE_OVERDUE); + userSystemCouponGiveRecordService.updateByPrimaryKeySelective(updateRecord); + + // 鍙d护澶辨晥 + tokenRecordService.invalidByCoupon(giveRecord.getId()); + + + Date now = new Date(); + Date endTime = userCoupon.getEndTime(); + if (endTime != null && endTime.getTime() < now.getTime()) { + List<UserSystemCoupon> list = new ArrayList<UserSystemCoupon>(); + list.add(userCoupon); + updateCounponInvalid(list); + return; + } + + // 閫�鍥炲埜 + UserSystemCoupon userSystemCoupon = new UserSystemCoupon(); + userSystemCoupon.setId(userCoupon.getId()); + userSystemCoupon.setGive(false); + userSystemCoupon.setUseTime(null); + userSystemCoupon.setState(UserSystemCoupon.STATE_CAN_USE); + userSystemCoupon.setUpdateTime(new Date()); + userSystemCouponMapper.updateByPrimaryKeySelective(userSystemCoupon); + + // 浣跨敤璁板綍 + UserSystemCouponRecord useRecord = userSystemCouponRecordService.getNearByUserCouponId(couponId); + if (useRecord != null) { + UserSystemCouponRecord useRecordUpdate = new UserSystemCouponRecord(); + useRecordUpdate.setId(useRecord.getId()); + useRecordUpdate.setState(UserSystemCouponRecord.STATE_WAIT_TIME_OUT); + useRecordUpdate.setUpdateTime(new Date()); + userSystemCouponRecordService.updateByPrimaryKeySelective(useRecordUpdate); + } + + SystemCoupon systemCoupon = userCoupon.getSystemCoupon(); + if (systemCoupon != null) + systemCoupon = systemCouponService.selectByPrimaryKey(systemCoupon.getId()); + + if (systemCoupon == null) + return; + + // 閫�鍥炴秷鎭� + String couponName = systemCoupon.getName(); + if (CouponTypeEnum.freeCouponGive == systemCoupon.getType()) { + couponName = "鍏嶅崟鍒�"; + } else if (CouponTypeEnum.rebatePercentCoupon == systemCoupon.getType()) { + couponName = "濂栧姳鍒�"; + } + + String beiZhu = "璇峰埌鎴戠殑-绂忓埄涓績鏌ョ湅"; + SimpleDateFormat sd = new SimpleDateFormat("yyyy.MM.dd HH:mm"); + MsgOtherGiveContentDTO msgOther = new MsgOtherGiveContentDTO(); + msgOther.setType(MsgOtherGiveContentDTO.TYEP_COUPON); + msgOther.setTitle(couponName + "閫�鍥�"); + msgOther.setGiveType("浣犺禒閫佺殑" + couponName + "鏈鎴愬姛棰嗗彇"); + msgOther.setGiveTime(sd.format(giveRecord.getGiveTime())); + msgOther.setReturnTime(sd.format(new Date())); + userOtherMsgNotificationService.tokenGiveMsg(giveRecord.getGiveUid(), beiZhu, msgOther); + } + + @Override public void sendBackGiveCoupon(List<UserSystemCouponGiveRecord> overdueList) { for (UserSystemCouponGiveRecord record : overdueList) { + if (record.getState() != null && record.getState() != UserSystemCouponGiveRecord.STATE_INIT) + continue; + // 鏇存柊璧犻�佽褰� UserSystemCouponGiveRecord updateRecord = new UserSystemCouponGiveRecord(); updateRecord.setId(record.getId()); @@ -2461,4 +2563,124 @@ return userSystemCouponMapper.getFreeCouponByType(uid, type); } + @RequestSerializableByKeyService(key = "#uid") + @Override + @Transactional(rollbackFor = Exception.class) + public void triggerFreeCouponActivate(Long uid, String orderNo, Integer source) { + if (uid == null || source == null || StringUtil.isNullOrEmpty(orderNo)) + return; + + UserSystemCoupon coupon = userSystemCouponMapper.getNeedActivateCouponByType(uid, + CouponTypeEnum.freeCoupon.name()); + if (coupon == null) + return; + + Long id = coupon.getId(); + UserSystemCouponActivate couponActivate = userSystemCouponActivateService.selectForUpdate(id); + if (couponActivate == null) + return; + + // 楠岃瘉鍚岃鍗曟槸鍚﹀瓨鍦� + String key = orderNo + "_" + source; + String ordernos = couponActivate.getOrdernos(); + if (!StringUtil.isNullOrEmpty(ordernos)) { + String[] array = ordernos.split(","); + if (array != null) + for (int i= 0; i < array.length; i ++) { + if (array[i].equals(key)) + return; + } + } + + // 婵�娲绘暟閲� + boolean result = false; + int limitNum = Integer.parseInt(configService.get("free_coupon_activate_num")); + + Integer state = couponActivate.getState(); + int count = couponActivate.getCount(); + count++; + if (count >= limitNum) { + result = true; + state = UserSystemCouponActivate.STATE_END; + } + + if (StringUtil.isNullOrEmpty(ordernos)) { + ordernos = key; + } else { + ordernos = ordernos + "," + key; + } + + UserSystemCouponActivate updateActivate = new UserSystemCouponActivate(); + updateActivate.setId(id); + updateActivate.setState(state); + updateActivate.setCount(count); + updateActivate.setOrdernos(ordernos); + updateActivate.setUpdateTime(new Date()); + userSystemCouponActivateService.updateByPrimaryKeySelective(updateActivate); + + // 婵�娲诲鍔卞埜 + if (result) { + activateFreeCoupon(coupon, limitNum); + } + } + + /** + * 婵�娲诲埜 + * + * @param coupon + * @param activateNum + */ + @Transactional + private void activateFreeCoupon(UserSystemCoupon coupon, int limitNum) { + try { + Date nowDate = new Date(); + SystemCoupon systemCoupon = coupon.getSystemCoupon(); + + Integer expiryDay = systemCoupon.getExpiryDay(); + String endDay = DateUtil.plusDay(expiryDay - 1, nowDate); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + if (endDay != null && endDay.trim().length() > 0) { + endDay += " 23:59:59"; + } + Date endTime = format.parse(endDay); + + UserSystemCoupon userCoupon = new UserSystemCoupon(); + userCoupon.setId(coupon.getId()); + userCoupon.setStateActivated(1); + userCoupon.setEndTime(endTime); + userCoupon.setStartTime(nowDate); + userCoupon.setUpdateTime(new Date()); + userSystemCouponMapper.updateByPrimaryKeySelective(userCoupon); + + // 娑堟伅 + executor.execute(new Runnable() { + @Override + public void run() { + UserSystemCouponGiveRecord giveRecord = userSystemCouponGiveRecordService + .getByReceiveId(coupon.getId()); + if (giveRecord == null) + return; + + Long giveUid = giveRecord.getGiveUid(); + UserInfo userInfo = userInfoService.selectByPKey(giveUid); + if (userInfo == null) + return; + + String beiZhu = "璇峰埌鎴戠殑-绂忓埄涓績涓煡鐪�"; + SimpleDateFormat sd = new SimpleDateFormat("yyyy.MM.dd HH:mm"); + MsgOtherCouponActivateDTO msgOther = new MsgOtherCouponActivateDTO(); + msgOther.setTitle("鍏嶅崟鍒告縺娲�"); + msgOther.setType("鍏嶅崟鍒哥郴缁熷凡鑷姩婵�娲�"); + msgOther.setExplain("婊¤冻" + systemCoupon.getActivateDay() + "澶╁唴浜х敓" + limitNum + "绗斿凡鍒拌处杩斿埄璁㈠崟"); + msgOther.setGiveUser("鏄电О锛�" + userInfo.getNickName() + " ID锛�" + giveUid); + msgOther.setReceiveTime(sd.format(giveRecord.getReceiveTime())); + msgOther.setValidityTime(expiryDay + "澶�"); + userOtherMsgNotificationService.giveCouponActivateMsg(coupon.getUid(), beiZhu, msgOther); + } + }); + } catch (Exception e) { + e.printStackTrace(); + LogHelper.errorDetailInfo(e); + } + } } -- Gitblit v1.8.0