From f4a0f2acc63d7785eab108419a4e16f5f688cb95 Mon Sep 17 00:00:00 2001
From: yujian <yujian@163.com>
Date: 星期六, 18 一月 2020 12:06:27 +0800
Subject: [PATCH] 用户注册信息

---
 fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserSystemCouponServiceImpl.java |  688 ++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 462 insertions(+), 226 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..ac3bb18 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,15 +40,16 @@
 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;
 import com.yeshi.fanli.entity.money.UserMoneyDetail;
 import com.yeshi.fanli.entity.order.CommonOrder;
+import com.yeshi.fanli.entity.system.ConfigKeyEnum;
 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.user.UserInfoExtraException;
 import com.yeshi.fanli.exception.user.UserSystemCouponException;
 import com.yeshi.fanli.log.LogHelper;
 import com.yeshi.fanli.service.inter.common.JumpDetailV2Service;
@@ -58,18 +69,24 @@
 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.TimeUtil;
 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;
@@ -139,6 +156,7 @@
 	@Resource
 	private UserOtherMsgNotificationService userOtherMsgNotificationService;
 
+	@Lazy
 	@Resource
 	private CommonOrderCountService commonOrderCountService;
 
@@ -151,6 +169,21 @@
 
 	@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) {
@@ -198,7 +231,7 @@
 	}
 
 	@Override
-	@Transactional
+	@Transactional(rollbackFor=Exception.class)
 	public UserSystemCoupon insertUserCoupon(Long uid, String couponType, String source, BigDecimal percent,
 			Boolean needNotify) throws UserSystemCouponException, Exception {
 
@@ -220,6 +253,8 @@
 			} else {
 				coupon = systemCouponService.getCouponByTypeAndPercent(couponType, percent);
 			}
+		} else if (couponType.equals(CouponTypeEnum.freeCouponGive.name())) {
+			coupon = systemCouponService.getCouponByType(couponType);
 		}
 
 		if (coupon == null) {
@@ -264,28 +299,26 @@
 		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
-			public void run() {
-				UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
-				// 娣诲姞涓�鏉℃秷鎭�
-				if (userInfoExtra != null) {
-					if (userInfoExtra.getCouponNews() == null) {
-						userInfoExtra.setCouponNews(1);
+			public void run() {  // 绂忓埄涓績绾㈢偣
+				UserInfoExtra extra = userInfoExtraService.getUserInfoExtra(uid);
+				if (extra != null) {
+					UserInfoExtra updateExtra =	new UserInfoExtra();
+					updateExtra.setId(extra.getId());
+					if (extra.getCouponNews() == null) {
+						updateExtra.setCouponNews(1);
 					} else {
-						userInfoExtra.setCouponNews(userInfoExtra.getCouponNews() + 1);
+						updateExtra.setCouponNews(extra.getCouponNews() + 1);
 					}
-
-					try {
-						userInfoExtraService.saveUserInfoExtra(userInfoExtra);
-					} catch (UserInfoExtraException e) {
-						e.printStackTrace();
-					}
+					userInfoExtraService.updateByPrimaryKeySelective(updateExtra);
 				}
-
 			}
 		});
 
@@ -312,7 +345,7 @@
 		return userCoupon;
 	}
 
-	@Transactional
+	@Transactional(rollbackFor=Exception.class)
 	@Override
 	public List<UserSystemCouponVO> getUserCouponVOList(long start, int count, Long uid, boolean changeJump)
 			throws UserSystemCouponException, Exception {
@@ -417,7 +450,7 @@
 						// 鍏嶅崟鍒搞�� 绂忓埄鍏嶅崟鍒�
 
 						// 鍏嶅崟鍟嗗搧鍒楄〃
-						jumpLink.put("url", configService.get("free_goods_list"));
+						jumpLink.put("url", configService.get(ConfigKeyEnum.freeGoodsList.getKey()));
 
 						jumpBtn = new HashMap<String, Object>();
 						jumpBtn.put("params", jumpLink);
@@ -435,7 +468,7 @@
 
 				} else if (UserSystemCoupon.STATE_IN_USE == state) {
 					// 浣跨敤涓�
-					userCouponVO.setInUseExplain(configService.get("free_coupon_using-help"));
+					userCouponVO.setInUseExplain(configService.get(ConfigKeyEnum.freeCouponUsingHelp.getKey()));
 				}
 			}
 
@@ -578,7 +611,7 @@
 		return hasCoupon;
 	}
 
-	@Transactional
+	@Transactional(rollbackFor=Exception.class)
 	@Override
 	public List<UserSystemCouponVO> getOrderCouponList(Long uid) throws UserSystemCouponException, Exception {
 
@@ -601,7 +634,7 @@
 		return getEnableListByCouponId(uid, 1, couponList);
 	}
 
-	@Transactional
+	@Transactional(rollbackFor=Exception.class)
 	@Override
 	public List<UserSystemCouponVO> getGoodsCouponList(Long uid, Long auctionId)
 			throws UserSystemCouponException, Exception {
@@ -669,6 +702,26 @@
 
 		return userSystemCouponMapper.countUsableByUid(uid, listCouponId);
 	}
+	
+	
+	@Override
+	public long countGiveFreeCoupon(Long uid) {
+		if (uid == null)
+			return 0;
+
+		List<SystemCoupon> couponList = systemCouponService.getGiveFreeCouponList();
+		if (couponList == null || couponList.size() == 0)
+			return 0;
+
+		List<Long> listCouponId = new ArrayList<Long>();
+		for (SystemCoupon systemCoupon : couponList) {
+			listCouponId.add(systemCoupon.getId());
+		}
+
+		return userSystemCouponMapper.countUsableByUid(uid, listCouponId);
+	}
+
+	
 
 	@Override
 	public long countUsableRewardCoupon(Long uid) {
@@ -687,7 +740,7 @@
 		return userSystemCouponMapper.countUsableByUid(uid, listCouponId);
 	}
 
-	@Transactional
+	@Transactional(rollbackFor = Exception.class)
 	@Override
 	public void useGoodsCoupon(Long uid, Long id, Long goodId, Integer sourceType)
 			throws UserSystemCouponException, Exception {
@@ -764,7 +817,7 @@
 
 	}
 
-	@Transactional
+	@Transactional(rollbackFor = Exception.class)
 	@Override
 	public void useOrderCoupon(Long uid, Long id, String orderNo, Integer sourceType, AcceptData acceptData)
 			throws UserSystemCouponException, Exception {
@@ -794,51 +847,69 @@
 			if (systemCoupon == null)
 				throw new UserSystemCouponException(1, "鍒稿凡涓嶅瓨鍦�");
 		}
-		
+
 		if (systemCoupon.getType() != CouponTypeEnum.rebatePercentCoupon)
 			throw new UserSystemCouponException(1, "鍒哥被鍨嬩笉鍖归厤");
 
 		if (orderNo == null || orderNo.trim().length() == 0)
 			throw new UserSystemCouponException(1, "璁㈠崟鍙蜂笉瀛樺湪");
 
-		// 璁㈠崟
-		CommonOrderVO orderVO = commonOrderService.getCommonOrderByOrderNo(uid, orderNo, CommonOrder.STATE_JS,
-				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
-				if (downOrderTime > limitDate) {
-					Date endDay = DateUtil.plusDayDate(4, thirdCreateTime);
-					long currentTime = java.lang.System.currentTimeMillis();
-					if (endDay.getTime() > currentTime) {
-						boolean valid = false;
-						DateInfo dateInfo = DateUtil.dateDiff3(currentTime, endDay.getTime());
-						if (dateInfo != null) {
-							if (dateInfo.getDay() > 0) 
-								valid = true;
-
-							if (!valid && dateInfo.getHour() > 0)
-								valid = true;
-							
-
-							if (!valid && dateInfo.getMinute() > 0) 
-								valid = true;
-							
-							if (!valid && dateInfo.getSecond() >= 0)
-								valid = true;
-						}
-						
-						if (!valid) 
-							throw new UserSystemCouponException(1, "璇ヨ鍗曞凡涓嶈兘浣跨敤浣跨敤濂栧姳鍒革紝璇︽儏璇峰挩璇㈠鏈�");
-					}
+		// 妫�鏌ヨ鍗曞彿鏄惁缁存潈
+		List<CommonOrder> commonOrderList = commonOrderService.listBySourceTypeAndOrderId(sourceType, orderNo);
+		boolean weiquan = false;
+		if (commonOrderList != null) {
+			for (CommonOrder commonOrder : commonOrderList) {
+				if (commonOrder.getState() == CommonOrder.STATE_WQ) {
+					weiquan = true;
+					break;
 				}
 			}
+		}
+		
+		if (weiquan) {
+			throw new UserSystemCouponException(1, "浜诧紝寰堥仐鎲撅紝鍞悗缁存潈璁㈠崟涓嶈兘浣跨敤杩斿埄濂栧姳鍒竳");
+		}
+
+		
+		// 璁㈠崟
+		List<CommonOrderVO> listVo = commonOrderService.listGroupOrderNoByUid(0, 1, uid, 2, 1,1, orderNo, null, 
+				null, null, sourceType);
+		if (listVo == null || listVo.size() == 0) 
+			throw new UserSystemCouponException(1, "浜诧紝寰堥仐鎲撅紝璇ヨ鍗曞凡涓嶈兘浣跨敤杩斿埄濂栧姳鍒竳");
+		
+		CommonOrderVO orderVO = listVo.get(0);
+		
+		// 2.1鏂扮増
+		Date thirdCreateTime = orderVO.getThirdCreateTime();
+		Date accountTime = orderVO.getAccountTime();
+		if (thirdCreateTime == null || accountTime == null) 
+			throw new UserSystemCouponException(1, "璇ヨ鍗曚笉鑳戒娇鐢ㄥ鍔卞埜");
+		
+		long downOrderTime = thirdCreateTime.getTime();
+		long limitDate = TimeUtil.convertDateToTemp(Constant.VIP_ONLINE_TIME);
+		if (downOrderTime > limitDate) {
+			boolean valid = false;
+			Date endDay = DateUtil.plusDayDate(Constant.COUPON_REWARD_LIMIT_DAY, accountTime);
+			long currentTime = java.lang.System.currentTimeMillis();
+			if (endDay.getTime() > currentTime) {
+				DateInfo dateInfo = DateUtil.dateDiff3(currentTime, endDay.getTime());
+				if (dateInfo != null) {
+					if (dateInfo.getDay() > 0)
+						valid = true;
+
+					if (!valid && dateInfo.getHour() > 0)
+						valid = true;
+
+					if (!valid && dateInfo.getMinute() > 0)
+						valid = true;
+
+					if (!valid && dateInfo.getSecond() > 0)
+						valid = true;
+				}
+			}
+			
+			if (!valid)
+				throw new UserSystemCouponException(1, "璇ヨ鍗曚笉鑳戒娇鐢ㄥ鍔卞埜");
 		}
 
 		BigDecimal hongBao = orderVO.getHongBao();
@@ -852,7 +923,7 @@
 
 			Order order = orderService.findOrderByOrderIdAndType(orderNo, sourceType);
 			if (order == null)
-				return;
+				throw new UserSystemCouponException(1, "璇ヨ鍗曚笉瀛樺湪");
 
 			/* 濂栭噾璁$畻 浠ュ強鐩稿叧绾㈠寘淇℃伅澶勭悊 */
 
@@ -861,6 +932,36 @@
 			// 鎻愭垚閲戦
 			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(rollbackFor=Exception.class)
+	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 +980,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 +994,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();
 		}
 
 	}
@@ -987,9 +1094,9 @@
 		userRecordVO.setJumpWelfare(jumpWelfare);
 
 		// 璺宠浆濂栧姳鍒歌鍒�
-		userRecordVO.setRuleLink(configService.get("reward_coupon_help"));
+		userRecordVO.setRuleLink(configService.get(ConfigKeyEnum.rewardCouponHelp.getKey()));
 
-		String rewardCouponRemark = configService.get("reward_coupon_remark");
+		String rewardCouponRemark = configService.get(ConfigKeyEnum.rewardCouponRemark.getKey());
 		if (rewardCouponRemark != null && rewardCouponRemark.trim().length() > 0) {
 			userRecordVO.setRemark(JSONObject.fromObject(rewardCouponRemark));
 		}
@@ -1048,7 +1155,7 @@
 		String progressMsg = "";
 		String progressColor = "";
 		// 璺宠浆濂栧姳鍒歌鍒�
-		userRecordVO.setRuleLink(configService.get("free_coupon_help"));
+		userRecordVO.setRuleLink(configService.get(ConfigKeyEnum.freeCouponHelp.getKey()));
 
 		// 杩涘害锛� 1 鐏拌壊 2 绾㈣壊 3 缁胯壊
 		String progressState1 = "3";
@@ -1086,7 +1193,7 @@
 
 			jumpDetail = jumpDetailV2Service.getByTypeCache("welfareCore");
 
-			rewardCouponRemark = configService.get("free_coupon_back_remark");
+			rewardCouponRemark = configService.get(ConfigKeyEnum.freeCouponBackRemark.getKey());
 
 		} else if (UserSystemCouponRecord.STATE_FAIL_DRAWBACK == stateRecord) {
 			// 閫�娆�
@@ -1105,7 +1212,7 @@
 
 			jumpDetail = jumpDetailV2Service.getByTypeCache("welfareCore");
 
-			rewardCouponRemark = configService.get("free_coupon_back_remark");
+			rewardCouponRemark = configService.get(ConfigKeyEnum.freeCouponBackRemark.getKey());
 
 		} else if (UserSystemCouponRecord.STATE_FREE_ON == stateRecord) {
 			// 鍏嶅崟涓�
@@ -1119,7 +1226,7 @@
 				progressMsg = "鍏嶅崟鍙戣捣锛岀瓑寰呮敹璐�";
 			}
 
-			rewardCouponRemark = configService.get("free_coupon_remark");
+			rewardCouponRemark = configService.get(ConfigKeyEnum.freeCouponRemark.getKey());
 
 		} else if (UserSystemCouponRecord.STATE_SUCCESS == stateRecord) {
 			// 鍏嶅崟鎴愬姛
@@ -1141,7 +1248,7 @@
 
 			jumpDetail = jumpDetailV2Service.getByTypeCache("capitalDetails");
 
-			rewardCouponRemark = configService.get("free_coupon_remark");
+			rewardCouponRemark = configService.get(ConfigKeyEnum.freeCouponRemark.getKey());
 		}
 		userRecordVO.setProgressState(progressState);
 		userRecordVO.setPayMoney(payMoney);
@@ -1252,7 +1359,7 @@
 		}
 	}
 
-	@Transactional
+	@Transactional(rollbackFor=Exception.class)
 	@Override
 	public void updateStateByDrawback(String orderNo) throws Exception {
 
@@ -1274,7 +1381,7 @@
 		sendBackCoupon(record.getUserSystemCoupon(), record);
 	}
 
-	@Transactional
+	@Transactional(rollbackFor=Exception.class)
 	@Override
 	public void updateStateByArrivalAccount(String orderNo) throws Exception {
 
@@ -1308,7 +1415,7 @@
 		return userSystemCouponMapper.getCounponNowInvalid(count);
 	}
 
-	@Transactional
+	@Transactional(rollbackFor=Exception.class)
 	@Override
 	public boolean updateCouponRecordUsed(Long uid, String orderNo, BigDecimal payment, Long auctionId)
 			throws Exception {
@@ -1388,7 +1495,7 @@
 	}
 
 	@Override
-	@Transactional
+	@Transactional(rollbackFor=Exception.class)
 	public void copyLotteryPrize(Long uid, int platform, String device) throws Exception {
 
 		return;
@@ -1471,7 +1578,7 @@
 	}
 
 	@Override
-	@Transactional
+	@Transactional(rollbackFor=Exception.class)
 	public void randomRewardCoupon(int num, Long uid, String source) throws Exception {
 		if (num < 1) {
 			return;
@@ -1526,22 +1633,25 @@
 		if (userInfoExtra == null) {
 			return;
 		}
+		
+		UserInfoExtra extra = new UserInfoExtra();
+		extra.setId(userInfoExtra.getId());
 		Integer couponNews = userInfoExtra.getCouponNews();
 		if (couponNews == null) {
-			userInfoExtra.setCouponNews(num);
+			extra.setCouponNews(num);
 		} else {
-			userInfoExtra.setCouponNews(couponNews + num);
+			extra.setCouponNews(couponNews + num);
 		}
-		userInfoExtraService.saveUserInfoExtra(userInfoExtra);
+		userInfoExtraService.saveUserInfoExtra(extra);
 	}
 
 	@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(ConfigKeyEnum.exchangeRebatePercent.getKey())), false);
 		// 娣诲姞濂栧姳鍒告秷鎭�
 		userOtherMsgNotificationService.systemGiveRewardCoupon(uid, null, MsgOtherSystemGiveDTOFactory
 				.createRewardCouponGive(num, "璇锋寜鐓ц繑鍒╁鍔卞埜瑙勫垯浣跨敤", "杩斿埄濂栧姳鍒�", orderId, orderType, reason));
@@ -1608,7 +1718,7 @@
 	}
 
 	@Override
-	@Transactional
+	@Transactional(rollbackFor=Exception.class)
 	public void exchangeCoupon(Long uid, String couponType, String source, BigDecimal percent)
 			throws UserSystemCouponException, Exception {
 		if (couponType == null || uid == null) {
@@ -1664,9 +1774,9 @@
 		insertSelective(userCoupon);
 	}
 
-	@Transactional
+	@Transactional(rollbackFor=Exception.class)
 	@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 +1871,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(ConfigKeyEnum.freeCouponActivateNum.getKey());
+							userCouponVO.setCouponEffect(
+									"(" + activateCount + "/" + Integer.parseInt(activateNum) + ")寰呮縺娲�");
+						}
 					} else if (CouponTypeEnum.welfareFreeCoupon == type) {
 						jumpBtn = new HashMap<String, Object>();
 						if (inviteCode != null && inviteCode.trim().length() > 0) {
@@ -1804,23 +1912,25 @@
 					userCouponVO.setState(UserSystemCoupon.STATE_GIVE_ONLY);
 				} else if (CouponTypeEnum.freeCoupon == type || CouponTypeEnum.welfareFreeCoupon == type
 						|| CouponTypeEnum.freeCouponBuy == type) {
-					jumpLink.put("url", configService.get("free_goods_list"));
+					jumpLink.put("url", configService.get(ConfigKeyEnum.freeGoodsList.getKey()));
 					jumpBtn = new HashMap<String, Object>();
 					jumpBtn.put("params", jumpLink);
 					jumpBtn.put("jumpDetail", jumpDetailV2Service.getByTypeCache("web"));
 				} else if (CouponTypeEnum.rebatePercentCoupon == type) {
-					// 鍙娇鐢ㄣ�� 鍙禒閫�
-					userCouponVO.setState(UserSystemCoupon.STATE_USE_GIVE);
+					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"));
+						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("璧犻�佷腑");
@@ -1830,13 +1940,13 @@
 				TokenTypeEnum tokenType = null;
 				if (CouponTypeEnum.freeCouponGive == type) {
 					userCouponVO.setState(UserSystemCoupon.STATE_GIVE_IN);
-					tips = configService.get("give_free_coupon_tips");
+					tips = configService.get(ConfigKeyEnum.giveFreeCouponTips.getKey());
 					tokenType = TokenTypeEnum.freeCoupon;
 				}
 
 				if (CouponTypeEnum.rebatePercentCoupon == type) {
 					userCouponVO.setState(UserSystemCoupon.STATE_GIVE_IN);
-					tips = configService.get("give_rebate_percent_coupon_tips");
+					tips = configService.get(ConfigKeyEnum.giveRebatePercentCouponTips.getKey());
 					tokenType = TokenTypeEnum.rebatePercentCoupon;
 				}
 
@@ -1852,7 +1962,7 @@
 								tips = tips.replace("{APP鍚嶇О}", projectChineseName);
 							}
 							tips = tips.replace("{鍙d护}", tokenRecord.getToken()).replace("{涓嬭浇閾炬帴}",
-									configService.get("app_down_link"));
+									configService.get(ConfigKeyEnum.appDownLink.getKey()));
 							userCouponVO.setGiveTips(tips);
 						}
 
@@ -1911,7 +2021,7 @@
 		return listVO;
 	}
 
-	@Transactional
+	@Transactional(rollbackFor = Exception.class)
 	@Override
 	public UserSystemCouponVO giveCoupon(Long uid, Long id) throws UserSystemCouponException {
 		UserSystemCoupon userSystemCoupon = userSystemCouponMapper.selectByPrimaryKey(id);
@@ -1938,10 +2048,10 @@
 		TokenTypeEnum tokenTypeEnum = null;
 		if (type == CouponTypeEnum.freeCouponGive) {
 			tokenTypeEnum = TokenTypeEnum.freeCoupon;
-			tips = configService.get("give_free_coupon_tips");
+			tips = configService.get(ConfigKeyEnum.giveFreeCouponTips.getKey());
 		} else if (type == CouponTypeEnum.rebatePercentCoupon) {
 			tokenTypeEnum = TokenTypeEnum.rebatePercentCoupon;
-			tips = configService.get("give_rebate_percent_coupon_tips");
+			tips = configService.get(ConfigKeyEnum.giveRebatePercentCouponTips.getKey());
 		} else {
 			throw new UserSystemCouponException(1, "璇ュ埜涓嶆敮鎸佽禒閫�");
 		}
@@ -1959,19 +2069,20 @@
 					tips = tips.replace("{APP鍚嶇О}", projectChineseName);
 				}
 				tips = tips.replace("{鍙d护}", tokenRecord.getToken()).replace("{涓嬭浇閾炬帴}",
-						configService.get("app_down_link"));
+						configService.get(ConfigKeyEnum.appDownLink.getKey()));
 
 				return createUserCouponVOo(userSystemCoupon, systemCoupon, record, tips);
 			}
 		}
 
 		Date nowDate = new Date();
+		Date endTime = DateUtil.plusDayDate(Constant.GIVE_DAYS, nowDate);
 		// 鎻掑叆璧犻�佽褰�
 		UserSystemCouponGiveRecord giveRecord = new UserSystemCouponGiveRecord();
 		giveRecord.setCouponId(id);
 		giveRecord.setGiveUid(uid);
 		giveRecord.setGiveTime(nowDate);
-		giveRecord.setEndTime(DateUtil.plusDayDate(Constant.GIVE_DAYS, nowDate));
+		giveRecord.setEndTime(endTime);
 		userSystemCouponGiveRecordService.insertSelective(giveRecord);
 
 		// 鍒涘缓璁板綍
@@ -1980,7 +2091,7 @@
 		tokenRecord.setIdentify(giveRecord.getId() + "");
 		tokenRecord.setType(tokenTypeEnum);
 		tokenRecord.setStartTime(nowDate);
-		tokenRecord.setEndTime(DateUtil.plusDayDate(Constant.TOKEN_DAYS, nowDate));
+		tokenRecord.setEndTime(endTime);
 		tokenRecord.setState(0);
 		tokenRecordService.insertSelective(tokenRecord);
 
@@ -2008,9 +2119,23 @@
 		while (tips.contains("{APP鍚嶇О}")) {
 			tips = tips.replace("{APP鍚嶇О}", projectChineseName);
 		}
-		tips = tips.replace("{鍙d护}", token).replace("{涓嬭浇閾炬帴}", configService.get("app_down_link"));
+		tips = tips.replace("{鍙d护}", token).replace("{涓嬭浇閾炬帴}", configService.get(ConfigKeyEnum.appDownLink.getKey()));
 
-		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);
+		// 寤惰繜涓�鍒嗛挓
+		message.setStartDeliverTime(endTime.getTime() + 1000 * 60);
+		try {
+			producer.send(message);
+		} catch (Exception e) {
+			throw new UserSystemCouponException(1, "鍒涘缓璧犻�佷俊鎭け璐�");
+		}
+
+		return couponVO;
 	}
 
 	private UserSystemCouponVO createUserCouponVOo(UserSystemCoupon userSystemCoupon, SystemCoupon systemCoupon,
@@ -2042,81 +2167,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
@@ -2271,8 +2321,96 @@
 	}
 
 	@Override
+	@RequestSerializableByKeyService(key = "#couponId")
+	@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());
@@ -2350,34 +2488,16 @@
 	}
 
 	@Override
-	public boolean getIncludeExchange(Long uid) {
+	public boolean getValidRebateCoupon(Long uid) {
 		// 杩囨湡鍒�
 		updateInvalidSate(uid);
-
-		String percent = configService.get("exchange_rebate_percent");
-		if (StringUtil.isNullOrEmpty(percent))
-			percent = "35";
-		List<UserSystemCoupon> listCoupon = userSystemCouponMapper.getIncludeExchange(uid, Integer.parseInt(percent),
-				CouponTypeEnum.rebatePercentCoupon.name());
+		
+		List<UserSystemCouponVO> listCoupon = userSystemCouponMapper.getValidByUidAndType(uid, CouponTypeEnum.rebatePercentCoupon.name());
 		if (listCoupon == null || listCoupon.size() == 0)
 			return false;
 		return true;
 	}
 
-	@Override
-	public boolean getIncludeNotExchange(Long uid) {
-		// 杩囨湡鍒�
-		updateInvalidSate(uid);
-
-		String percent = configService.get("exchange_rebate_percent");
-		if (StringUtil.isNullOrEmpty(percent))
-			percent = "35";
-		List<UserSystemCouponVO> listCoupon = userSystemCouponMapper.getIncludeNotExchange(uid,
-				Integer.parseInt(percent), CouponTypeEnum.rebatePercentCoupon.name());
-		if (listCoupon == null || listCoupon.size() == 0)
-			return false;
-		return true;
-	}
 
 	@Override
 	public List<UserSystemCouponVO> listIncludeNotExchange(Long uid) throws Exception {
@@ -2387,12 +2507,8 @@
 		// 閫�鍥炲埜
 		sendBackTimeOutCoupon(uid);
 
-		String percent = configService.get("exchange_rebate_percent");
-		if (StringUtil.isNullOrEmpty(percent))
-			percent = "35";
 
-		List<UserSystemCouponVO> listCoupon = userSystemCouponMapper.getIncludeNotExchange(uid,
-				Integer.parseInt(percent), CouponTypeEnum.rebatePercentCoupon.name());
+		List<UserSystemCouponVO> listCoupon = userSystemCouponMapper.getValidByUidAndType(uid, CouponTypeEnum.rebatePercentCoupon.name());
 		if (listCoupon == null || listCoupon.size() == 0)
 			return null;
 
@@ -2461,4 +2577,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(ConfigKeyEnum.freeCouponActivateNum.getKey()));
+
+		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