From 788deca1b4a24f8a24e49c24f7d89975a1d74bbe Mon Sep 17 00:00:00 2001 From: admin <2780501319@qq.com> Date: 星期日, 03 十一月 2019 23:31:25 +0800 Subject: [PATCH] 商城订单退款处理 --- fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserSystemCouponServiceImpl.java | 311 +++++++++++++++++++++++++++++---------------------- 1 files changed, 177 insertions(+), 134 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 4f3b82c..45baec2 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,21 +12,25 @@ 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.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.google.gson.Gson; 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.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; @@ -36,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; @@ -44,7 +49,6 @@ 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.user.UserInfoExtraException; import com.yeshi.fanli.exception.user.UserSystemCouponException; import com.yeshi.fanli.log.LogHelper; @@ -76,6 +80,7 @@ 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.MQTopicName; @@ -161,12 +166,14 @@ @Resource private TokenRecordService tokenRecordService; + @Resource(name = "transactionManager") + private DataSourceTransactionManager transactionManager; + @Resource(name = "orderTransactionProducer") private TransactionProducer orderTransactionProducer; - + @Resource private UserSystemCouponActivateService userSystemCouponActivateService; - @Override public int insertSelective(UserSystemCoupon record) { @@ -877,81 +884,95 @@ // 鎻愭垚閲戦 BigDecimal money = MoneyBigDecimalUtil.mul(hongBao, percent); - UserSystemCouponUseMQMsgDTO mqMsg = new UserSystemCouponUseMQMsgDTO(userSystemCoupon.getId(), - order.getOrderId(), sourceType); + UserSystemCouponUseMQMsg mqMsg = new UserSystemCouponUseMQMsg(userSystemCoupon.getId(), order.getOrderId(), + sourceType, systemCoupon.getType().name()); // 浜嬪姟娑堟伅 - Message msg = new Message(MQTopicName.TOPIC_SYSTEM_COUPON_USE.name(),systemCoupon.getType().name(), + Message msg = new Message(MQTopicName.TOPIC_USER.name(), UserTopicTagEnum.useSystemCoupon.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; + 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); - + }, null); + System.out.println(result); + } catch (Exception e) { + throw new Exception(); + } } } @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()); - - hongBaoV2Service.insertSelective(hongBaoV2); - - // 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); - - // 鎻掑叆璧勯噾閫氱煡 - userMoneyMsgNotificationService.orderReward(uid, order.getOrderId(), order.getOrderType(), money, - userInfoService.selectByPKey(uid).getMyHongBao()); - - /* 鐢ㄦ埛鍒镐俊鎭姸鎬佸強璁板綍澶勭悊 */ - - 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); - - // 娑堟伅鎺ㄩ�� + 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 { - userOtherMsgNotificationService.rewardCouponUsed(userSystemCoupon, hongBao, money, order.getOrderId()); + // 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()); + + hongBaoV2Service.insertSelective(hongBaoV2); + + // 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); + + SystemCoupon coupon = systemCouponService.selectByPrimaryKey(userSystemCoupon.getSystemCoupon().getId()); + + // 鎻掑叆浣跨敤鍒歌褰� + UserSystemCouponRecord couponRecord = new UserSystemCouponRecord(); + couponRecord.setState(UserSystemCouponRecord.STATE_SUCCESS); + couponRecord.setGoodSource(order.getOrderType()); + couponRecord.setOrderNo(order.getOrderId()); + couponRecord.setUserSystemCoupon(userSystemCoupon); + 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, order.getOrderId()); + } catch (Exception e) { + LogHelper.errorDetailInfo(e); + } + transactionManager.commit(transactionStatus); } catch (Exception e) { - LogHelper.errorDetailInfo(e); + e.printStackTrace(); + transactionManager.rollback(transactionStatus); + throw new Exception(); } } @@ -1803,7 +1824,8 @@ 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) +")寰呮縺娲�"); + userCouponVO.setCouponEffect( + "(" + activateCount + "/" + Integer.parseInt(activateNum) + ")寰呮縺娲�"); } } else if (CouponTypeEnum.welfareFreeCoupon == type) { jumpBtn = new HashMap<String, Object>(); @@ -2078,7 +2100,6 @@ return userCouponVO; } - @Transactional @Override @@ -2422,78 +2443,100 @@ return userSystemCouponMapper.getFreeCouponByType(uid, type); } - - + @RequestSerializableByKeyService(key = "#uid") @Override - @Transactional - public void activateFreeCoupon(Long uid) { - List<UserSystemCoupon> list = userSystemCouponMapper.getNeedActivateFreeCouponByType(uid, CouponTypeEnum.freeCoupon.name()); - if (list == null || list.size() == 0) + @Transactional(rollbackFor = Exception.class) + public void triggerFreeCouponActivate(Long uid) { + UserSystemCoupon coupon = userSystemCouponMapper.getNeedActivateCouponByType(uid, + CouponTypeEnum.freeCoupon.name()); + if (coupon == null) return; - - UserSystemCoupon coupon = list.get(0); - Date nowDate = new Date(); - Date endTime2 = coupon.getEndTime(); - if (endTime2 != null && endTime2.getTime() <= nowDate.getTime()) - return; // 宸插け鏁� - SystemCoupon systemCoupon = coupon.getSystemCoupon(); - if (systemCoupon == null) - return; // 鍒稿凡涓嶅瓨鍦� + Long id = coupon.getId(); + UserSystemCouponActivate couponActivate = userSystemCouponActivateService.selectForUpdate(id); - systemCoupon = systemCouponService.selectByPrimaryKey(systemCoupon.getId()); - if (systemCoupon == null || systemCoupon.getType() != CouponTypeEnum.freeCoupon) - return; // 鍒哥被鍨嬩笉鍖归厤 + // 婵�娲绘暟閲� + boolean result = false; + int limitNum = Integer.parseInt(configService.get("free_coupon_activate_num")); - - // 娣诲姞婵�娲绘暟閲� - String activateNum = configService.get("free_coupon_activate_num"); - boolean activate = userSystemCouponActivateService.addActivateCount(coupon.getId(), Integer.parseInt(activateNum)); - - // 婵�娲诲埜 - if (activate) { - - 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); + Integer state = couponActivate.getState(); + int count = couponActivate.getCount(); + count++; + if (count >= limitNum) { + result = true; + state = UserSystemCouponActivate.STATE_END; + } - UserSystemCoupon userCoupon = new UserSystemCoupon(); - userCoupon.setId(coupon.getId()); - userCoupon.setStateActivated(1); - userCoupon.setEndTime(endTime); - userCoupon.setStartTime(nowDate); - userCoupon.setUpdateTime(new Date()); - userSystemCouponMapper.updateByPrimaryKeySelective(userCoupon); + UserSystemCouponActivate updateActivate = new UserSystemCouponActivate(); + updateActivate.setId(id); + updateActivate.setState(state); + updateActivate.setCount(count); + updateActivate.setUpdateTime(new Date()); + userSystemCouponActivateService.updateByPrimaryKeySelective(updateActivate); - // 璧犻�佽褰� - UserSystemCouponGiveRecord giveRecord = userSystemCouponGiveRecordService.getByReceiveId(coupon.getId()); - if (giveRecord == null) - return; + // 婵�娲诲鍔卞埜 + if (result) { + activateFreeCoupon(coupon, limitNum); + } + } - Long giveUid = giveRecord.getGiveUid(); - UserInfo userInfo = userInfoService.selectByPKey(giveUid); - if (userInfo == null) - return; + /** + * 婵�娲诲埜 + * + * @param coupon + * @param activateNum + */ + @Transactional + private void activateFreeCoupon(UserSystemCoupon coupon, int limitNum) { + try { + Date nowDate = new Date(); + SystemCoupon systemCoupon = coupon.getSystemCoupon(); - String beiZhu = "璇峰埌鎴戠殑-绂忓埄涓績涓煡鐪�"; - SimpleDateFormat sd = new SimpleDateFormat("yyyy.MM.dd HH:mm"); - MsgOtherCouponActivateDTO msgOther = new MsgOtherCouponActivateDTO(); - msgOther.setTitle("鍏嶅崟鍒告縺娲�"); - msgOther.setType("鍏嶅崟鍒哥郴缁熷凡鑷姩婵�娲�"); - msgOther.setExplain("婊¤冻" + systemCoupon.getActivateDay() + "澶╁唴浜х敓" + activateNum + "绗斿凡鍒拌处杩斿埄璁㈠崟"); - 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); + 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