From bf5c02aaecb3f7a42daa4fa356c62a2e6bca0db5 Mon Sep 17 00:00:00 2001 From: yujian <yujian@123.com> Date: 星期一, 28 十月 2019 09:55:59 +0800 Subject: [PATCH] Merge branch 'div' of ssh://193.112.35.168:29418/fanli-server into div --- fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserSystemCouponServiceImpl.java | 147 ++++++++++++++++++++++++++++++------------------ 1 files changed, 91 insertions(+), 56 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..b7c5883 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 @@ -18,9 +18,15 @@ import org.yeshi.utils.DateUtil; import org.yeshi.utils.entity.DateInfo; +import com.aliyun.openservices.ons.api.Message; +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.google.gson.Gson; import com.yeshi.fanli.dao.mybatis.user.UserSystemCouponMapper; import com.yeshi.fanli.dto.msg.MsgOtherCouponActivateDTO; import com.yeshi.fanli.dto.msg.MsgOtherGiveContentDTO; +import com.yeshi.fanli.dto.user.coupon.UserSystemCouponUseMQMsgDTO; import com.yeshi.fanli.entity.accept.AcceptData; import com.yeshi.fanli.entity.bus.msg.MsgOtherDetail.MsgTypeOtherTypeEnum; import com.yeshi.fanli.entity.bus.user.HongBaoV2; @@ -38,6 +44,8 @@ import com.yeshi.fanli.entity.system.SystemCoupon; import com.yeshi.fanli.entity.system.SystemCoupon.CouponTypeEnum; import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief; +import com.yeshi.fanli.exception.money.UserMoneyDetailException; +import com.yeshi.fanli.exception.order.HongBaoException; import com.yeshi.fanli.exception.user.UserInfoExtraException; import com.yeshi.fanli.exception.user.UserSystemCouponException; import com.yeshi.fanli.log.LogHelper; @@ -70,6 +78,8 @@ import com.yeshi.fanli.util.VersionUtil; import com.yeshi.fanli.util.factory.UserMoneyDetailFactory; import com.yeshi.fanli.util.factory.msg.MsgOtherSystemGiveDTOFactory; +import com.yeshi.fanli.util.rocketmq.MQTagConstant; +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 +161,9 @@ @Resource private TokenRecordService tokenRecordService; + + @Resource(name = "orderTransactionProducer") + private TransactionProducer orderTransactionProducer; @Override public int insertSelective(UserSystemCoupon record) { @@ -794,7 +807,7 @@ if (systemCoupon == null) throw new UserSystemCouponException(1, "鍒稿凡涓嶅瓨鍦�"); } - + if (systemCoupon.getType() != CouponTypeEnum.rebatePercentCoupon) throw new UserSystemCouponException(1, "鍒哥被鍨嬩笉鍖归厤"); @@ -806,13 +819,14 @@ sourceType); if (orderVO == null) throw new UserSystemCouponException(1, "璁㈠崟淇℃伅鑾峰彇澶辫触"); - + // 鐗堟湰鍖哄垎锛�2.0.2 if (VersionUtil.greaterThan_2_0_2(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 +834,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, "璇ヨ鍗曞凡涓嶈兘浣跨敤浣跨敤濂栧姳鍒革紝璇︽儏璇峰挩璇㈠鏈�"); } } @@ -861,59 +874,81 @@ // 鎻愭垚閲戦 BigDecimal money = MoneyBigDecimalUtil.mul(hongBao, percent); - // 1銆佹彃鍏ョ孩鍖呮暟鎹� - HongBaoV2 hongBaoV2 = new HongBaoV2(); - hongBaoV2.setMoney(money); - hongBaoV2.setType(HongBaoV2.TYPE_COUPON); - hongBaoV2.setState(HongBaoV2.STATE_YILINGQU); - hongBaoV2.setVersion(2); - hongBaoV2.setCreateTime(new Date()); - hongBaoV2.setUpdateTime(new Date()); - hongBaoV2.setUserInfo(new UserInfo(uid)); - hongBaoV2.setPreGetTime(new Date()); - hongBaoV2.setGetTime(new Date()); + UserSystemCouponUseMQMsgDTO mqMsg = new UserSystemCouponUseMQMsgDTO(userSystemCoupon.getId(), + order.getOrderId(), sourceType); + // 浜嬪姟娑堟伅 + Message msg = new Message(MQTopicName.TOPIC_SYSTEM_COUPON_USE.name(),systemCoupon.getType().name(), + new Gson().toJson(mqMsg).getBytes()); + orderTransactionProducer.send(msg, new LocalTransactionExecuter() { + @Override + public TransactionStatus execute(Message arg0, Object arg1) { + try { + useRewardCouponCore(userSystemCoupon, money, hongBao, uid, order); + return TransactionStatus.CommitTransaction; + } catch (UserMoneyDetailException e) { + return TransactionStatus.RollbackTransaction; + } + } + }, null); - hongBaoV2Service.insertSelective(hongBaoV2); + } + } - // 2.鎻掑叆鍏宠仈 - orderHongBaoMapService.addOrderHongBaoMap(hongBaoV2, order); + @Transactional + private void useRewardCouponCore(UserSystemCoupon userSystemCoupon, BigDecimal money, BigDecimal hongBao, Long uid, + Order order) throws UserMoneyDetailException { + // 1銆佹彃鍏ョ孩鍖呮暟鎹� + HongBaoV2 hongBaoV2 = new HongBaoV2(); + hongBaoV2.setMoney(money); + hongBaoV2.setType(HongBaoV2.TYPE_COUPON); + hongBaoV2.setState(HongBaoV2.STATE_YILINGQU); + hongBaoV2.setVersion(2); + hongBaoV2.setCreateTime(new Date()); + hongBaoV2.setUpdateTime(new Date()); + hongBaoV2.setUserInfo(new UserInfo(uid)); + hongBaoV2.setPreGetTime(new Date()); + hongBaoV2.setGetTime(new Date()); - // 3.鎻掑叆璧勯噾鏄庣粏,鐢ㄦ埛浣欓 - UserMoneyDetail userMoneyDetail = UserMoneyDetailFactory.createOrderReward(orderNo, sourceType, money, - new UserInfo(uid)); - userMoneyDetailService.addUserMoneyDetail(userMoneyDetail); - userInfoService.addMoney(new UserInfo(uid), money); + hongBaoV2Service.insertSelective(hongBaoV2); - // 鎻掑叆璧勯噾閫氱煡 - userMoneyMsgNotificationService.orderReward(uid, orderNo, sourceType, money, - userInfoService.selectByPKey(uid).getMyHongBao()); + // 2.鎻掑叆鍏宠仈 + orderHongBaoMapService.addOrderHongBaoMap(hongBaoV2, order); - /* 鐢ㄦ埛鍒镐俊鎭姸鎬佸強璁板綍澶勭悊 */ + // 3.鎻掑叆璧勯噾鏄庣粏,鐢ㄦ埛浣欓 + UserMoneyDetail userMoneyDetail = UserMoneyDetailFactory.createOrderReward(order.getOrderId(), + order.getOrderType(), money, new UserInfo(uid)); + userMoneyDetailService.addUserMoneyDetail(userMoneyDetail); + userInfoService.addMoney(new UserInfo(uid), money); - Date date = new Date(); - // 鏇存柊鍒哥姸鎬侊細宸蹭娇鐢� - userSystemCoupon.setState(UserSystemCoupon.STATE_END_USE); - userSystemCoupon.setUseTime(date); - userSystemCoupon.setUpdateTime(date); - userSystemCouponMapper.updateByPrimaryKeySelective(userSystemCoupon); + // 鎻掑叆璧勯噾閫氱煡 + userMoneyMsgNotificationService.orderReward(uid, order.getOrderId(), order.getOrderType(), money, + userInfoService.selectByPKey(uid).getMyHongBao()); - // 鎻掑叆浣跨敤鍒歌褰� - UserSystemCouponRecord couponRecord = new UserSystemCouponRecord(); - couponRecord.setState(UserSystemCouponRecord.STATE_SUCCESS); - couponRecord.setGoodSource(sourceType); - couponRecord.setOrderNo(orderNo); - couponRecord.setUserSystemCoupon(userSystemCoupon); - couponRecord.setCouponType(systemCoupon.getType().name()); - couponRecord.setCreateTime(date); - couponRecord.setUpdateTime(date); - userSystemCouponRecordService.insertSelective(couponRecord); + /* 鐢ㄦ埛鍒镐俊鎭姸鎬佸強璁板綍澶勭悊 */ - // 娑堟伅鎺ㄩ�� - try { - userOtherMsgNotificationService.rewardCouponUsed(userSystemCoupon, hongBao, money, orderNo); - } catch (Exception e) { - LogHelper.errorDetailInfo(e); - } + Date date = new Date(); + // 鏇存柊鍒哥姸鎬侊細宸蹭娇鐢� + userSystemCoupon.setState(UserSystemCoupon.STATE_END_USE); + userSystemCoupon.setUseTime(date); + userSystemCoupon.setUpdateTime(date); + userSystemCouponMapper.updateByPrimaryKeySelective(userSystemCoupon); + + // 鎻掑叆浣跨敤鍒歌褰� + UserSystemCouponRecord couponRecord = new UserSystemCouponRecord(); + couponRecord.setState(UserSystemCouponRecord.STATE_SUCCESS); + couponRecord.setGoodSource(order.getOrderType()); + couponRecord.setOrderNo(order.getOrderId()); + couponRecord.setUserSystemCoupon(userSystemCoupon); + couponRecord.setCouponType(userSystemCoupon.getSystemCoupon().getType().name()); + couponRecord.setCreateTime(date); + couponRecord.setUpdateTime(date); + userSystemCouponRecordService.insertSelective(couponRecord); + + // 娑堟伅鎺ㄩ�� + try { + userOtherMsgNotificationService.rewardCouponUsed(userSystemCoupon, hongBao, money, order.getOrderId()); + } catch (Exception e) { + LogHelper.errorDetailInfo(e); } } @@ -1536,12 +1571,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)); -- Gitblit v1.8.0