From 89cc8f054c27f70fcfe16f14554a8a12e0c19e23 Mon Sep 17 00:00:00 2001
From: yujian <yujian@163.com>
Date: 星期三, 18 十二月 2019 09:22:31 +0800
Subject: [PATCH] 邀请统计

---
 fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserSystemCouponServiceImpl.java |  362 ++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 258 insertions(+), 104 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 56e599c..c9f73e0 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
@@ -21,11 +21,11 @@
 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;
@@ -49,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.user.UserInfoExtraException;
 import com.yeshi.fanli.exception.user.UserSystemCouponException;
 import com.yeshi.fanli.log.LogHelper;
 import com.yeshi.fanli.service.inter.common.JumpDetailV2Service;
@@ -74,15 +73,18 @@
 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;
@@ -153,6 +155,7 @@
 	@Resource
 	private UserOtherMsgNotificationService userOtherMsgNotificationService;
 
+	@Lazy
 	@Resource
 	private CommonOrderCountService commonOrderCountService;
 
@@ -174,6 +177,12 @@
 
 	@Resource
 	private UserSystemCouponActivateService userSystemCouponActivateService;
+
+	@Resource(name = "producer")
+	private Producer producer;
+	
+	@Resource
+	private UserVIPInfoService userVIPInfoService;
 
 	@Override
 	public int insertSelective(UserSystemCoupon record) {
@@ -243,6 +252,8 @@
 			} else {
 				coupon = systemCouponService.getCouponByTypeAndPercent(couponType, percent);
 			}
+		} else if (couponType.equals(CouponTypeEnum.freeCouponGive.name())) {
+			coupon = systemCouponService.getCouponByType(couponType);
 		}
 
 		if (coupon == null) {
@@ -288,30 +299,25 @@
 		userCoupon.setCreateTime(new Date());
 		userCoupon.setUpdateTime(new Date());
 		userSystemCouponMapper.insertSelective(userCoupon);
-		
-		if(coupon.getType() == CouponTypeEnum.freeCoupon) {
+
+		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);
 				}
-
 			}
 		});
 
@@ -695,6 +701,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) {
@@ -713,7 +739,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 {
@@ -790,7 +816,7 @@
 
 	}
 
-	@Transactional
+	@Transactional(rollbackFor = Exception.class)
 	@Override
 	public void useOrderCoupon(Long uid, Long id, String orderNo, Integer sourceType, AcceptData acceptData)
 			throws UserSystemCouponException, Exception {
@@ -827,44 +853,62 @@
 		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();
@@ -890,8 +934,7 @@
 			UserSystemCouponUseMQMsg mqMsg = new UserSystemCouponUseMQMsg(userSystemCoupon.getId(), order.getOrderId(),
 					sourceType, systemCoupon.getType().name());
 			// 浜嬪姟娑堟伅
-			Message msg = new Message(MQTopicName.TOPIC_USER.name(), UserTopicTagEnum.useSystemCoupon.name(),
-					new Gson().toJson(mqMsg).getBytes());
+			Message msg = MQMsgBodyFactory.create(MQTopicName.TOPIC_USER, UserTopicTagEnum.useSystemCoupon, mqMsg);
 			try {
 				SendResult result = orderTransactionProducer.send(msg, new LocalTransactionExecuter() {
 					@Override
@@ -906,7 +949,8 @@
 				}, null);
 				System.out.println(result);
 			} catch (Exception e) {
-				throw new Exception();
+				e.printStackTrace();
+				throw e;
 			}
 		}
 	}
@@ -1588,13 +1632,16 @@
 		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
@@ -1869,18 +1916,20 @@
 					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("璧犻�佷腑");
@@ -1971,7 +2020,7 @@
 		return listVO;
 	}
 
-	@Transactional
+	@Transactional(rollbackFor = Exception.class)
 	@Override
 	public UserSystemCouponVO giveCoupon(Long uid, Long id) throws UserSystemCouponException {
 		UserSystemCoupon userSystemCoupon = userSystemCouponMapper.selectByPrimaryKey(id);
@@ -2026,12 +2075,13 @@
 		}
 
 		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);
 
 		// 鍒涘缓璁板綍
@@ -2040,7 +2090,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);
 
@@ -2070,7 +2120,21 @@
 		}
 		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);
+		// 寤惰繜涓�鍒嗛挓
+		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,
@@ -2256,8 +2320,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());
@@ -2335,34 +2487,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 {
@@ -2372,12 +2506,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;
 
@@ -2449,7 +2579,10 @@
 	@RequestSerializableByKeyService(key = "#uid")
 	@Override
 	@Transactional(rollbackFor = Exception.class)
-	public void triggerFreeCouponActivate(Long uid) {
+	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)
@@ -2457,6 +2590,20 @@
 
 		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;
@@ -2470,10 +2617,17 @@
 			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);
 

--
Gitblit v1.8.0