From 8b2191df2f7d94aa299bd43dcbe97c94e5a61bbd Mon Sep 17 00:00:00 2001
From: admin <weikou2014>
Date: 星期三, 20 十一月 2019 14:53:34 +0800
Subject: [PATCH] RocketMQ的消息整改

---
 fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserSystemCouponServiceImpl.java |  460 ++++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 321 insertions(+), 139 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..cf0dac1 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,26 @@
 
 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.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 +41,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 +50,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,8 +81,10 @@
 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;
@@ -161,11 +168,18 @@
 	@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;
+
 	
 
 	@Override
@@ -280,8 +294,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
@@ -824,7 +841,7 @@
 			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();
@@ -868,7 +885,7 @@
 
 			Order order = orderService.findOrderByOrderIdAndType(orderNo, sourceType);
 			if (order == null)
-				return;
+				throw new UserSystemCouponException(1, "璇ヨ鍗曚笉瀛樺湪");
 
 			/* 濂栭噾璁$畻 浠ュ強鐩稿叧绾㈠寘淇℃伅澶勭悊 */
 
@@ -877,81 +894,96 @@
 			// 鎻愭垚閲戦
 			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(),
-					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;
+			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);
-
+				}, null);
+				System.out.println(result);
+			} catch (Exception e) {
+				e.printStackTrace();
+				throw e;
+			}
 		}
 	}
 
 	@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 +1835,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>();
@@ -2045,7 +2078,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,
@@ -2078,7 +2124,6 @@
 
 		return userCouponVO;
 	}
-
 
 	@Transactional
 	@Override
@@ -2231,9 +2276,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());
@@ -2422,78 +2558,124 @@
 		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, String orderNo, Integer source) {
+		if (uid == null || source == null || StringUtil.isNullOrEmpty(orderNo)) 
 			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));
+		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;
 		
-		// 婵�娲诲埜
-		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";
+		// 楠岃瘉鍚岃鍗曟槸鍚﹀瓨鍦�
+		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;
 				}
-				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);
+		// 婵�娲绘暟閲�
+		boolean result = false;
+		int limitNum = Integer.parseInt(configService.get("free_coupon_activate_num"));
 
-				// 璧犻�佽褰�
-				UserSystemCouponGiveRecord giveRecord = userSystemCouponGiveRecordService.getByReceiveId(coupon.getId());
-				if (giveRecord == null)
-					return;
+		Integer state = couponActivate.getState();
+		int count = couponActivate.getCount();
+		count++;
+		if (count >= limitNum) {
+			result = true;
+			state = UserSystemCouponActivate.STATE_END;
+		}
 
-				Long giveUid = giveRecord.getGiveUid();
-				UserInfo userInfo = userInfoService.selectByPKey(giveUid);
-				if (userInfo == null)
-					return;
+		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);
 
-				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);
+		// 婵�娲诲鍔卞埜
+		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