From b674cf50a368d005c9321fcf2989d7aa9a4a05c7 Mon Sep 17 00:00:00 2001
From: admin <weikou2014>
Date: 星期三, 30 十月 2019 15:12:31 +0800
Subject: [PATCH] 订单提醒修改

---
 fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserSystemCouponServiceImpl.java |  265 ++++++++++++++++++++++++++++++++---------------------
 1 files changed, 160 insertions(+), 105 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..15ab9f9 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,15 +12,24 @@
 
 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.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 +47,7 @@
 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;
@@ -58,6 +68,7 @@
 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;
@@ -70,6 +81,7 @@
 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.MQTopicName;
 import com.yeshi.fanli.util.taobao.TaoBaoUtil;
 import com.yeshi.fanli.vo.msg.ClientTextStyleVO;
 import com.yeshi.fanli.vo.order.CommonOrderVO;
@@ -151,6 +163,16 @@
 
 	@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) {
@@ -794,7 +816,7 @@
 			if (systemCoupon == null)
 				throw new UserSystemCouponException(1, "鍒稿凡涓嶅瓨鍦�");
 		}
-		
+
 		if (systemCoupon.getType() != CouponTypeEnum.rebatePercentCoupon)
 			throw new UserSystemCouponException(1, "鍒哥被鍨嬩笉鍖归厤");
 
@@ -806,13 +828,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 +843,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,6 +883,36 @@
 			// 鎻愭垚閲戦
 			BigDecimal money = MoneyBigDecimalUtil.mul(hongBao, percent);
 
+			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());
+			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) {
+				throw new Exception();
+			}
+		}
+	}
+
+	@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 +931,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 +945,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 +1594,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 +1724,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 +1819,12 @@
 						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) {
@@ -2044,80 +2099,6 @@
 		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
 	@Override
@@ -2461,4 +2442,78 @@
 		return userSystemCouponMapper.getFreeCouponByType(uid, type);
 	}
 
+	
+	
+	@Override
+	@Transactional
+	public void activateFreeCoupon(Long uid) {
+		List<UserSystemCoupon> list = userSystemCouponMapper.getNeedActivateFreeCouponByType(uid, CouponTypeEnum.freeCoupon.name());
+		if (list == null || list.size() == 0)
+			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; // 鍒稿凡涓嶅瓨鍦�
+
+		systemCoupon = systemCouponService.selectByPrimaryKey(systemCoupon.getId());
+		if (systemCoupon == null || systemCoupon.getType() != CouponTypeEnum.freeCoupon)
+			return; // 鍒哥被鍨嬩笉鍖归厤
+
+		
+		// 娣诲姞婵�娲绘暟閲�
+		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);
+
+				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(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() + "澶╁唴浜х敓" + 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);
+			}
+		}
+	}
 }

--
Gitblit v1.8.0