|
|
@@ -17,6 +17,7 @@ import shop.alien.entity.store.*;
|
|
|
import shop.alien.entity.store.dto.LifeDiscountCouponStoreFriendDto;
|
|
|
import shop.alien.entity.store.vo.LifeCouponStatusVo;
|
|
|
import shop.alien.mapper.*;
|
|
|
+import shop.alien.store.config.BaseRedisService;
|
|
|
import shop.alien.store.service.LifeCouponService;
|
|
|
import shop.alien.store.service.LifeDiscountCouponStoreFriendService;
|
|
|
import shop.alien.util.common.UniqueRandomNumGenerator;
|
|
|
@@ -61,6 +62,7 @@ public class LifeCouponServiceImpl extends ServiceImpl<LifeCouponMapper, LifeCou
|
|
|
|
|
|
private final StoreInfoMapper storeInfoMapper;
|
|
|
|
|
|
+ private final BaseRedisService baseRedisService;
|
|
|
|
|
|
@Override
|
|
|
public LifeCoupon addOrUpdateCoupon(LifeCoupon lifeCoupon) {
|
|
|
@@ -233,75 +235,85 @@ public class LifeCouponServiceImpl extends ServiceImpl<LifeCouponMapper, LifeCou
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public Map<String, String> newCouponVerify(String storeId, String quanCode) {
|
|
|
Map<String, String> resultMap = new HashMap<>();
|
|
|
- OrderCouponMiddle orderCouponMiddle = orderCouponMiddleMapper.selectOne(new LambdaQueryWrapper<OrderCouponMiddle>().eq(OrderCouponMiddle::getCouponCode, quanCode));
|
|
|
- if (!StringUtils.isEmpty(orderCouponMiddle)) {
|
|
|
- // 查询总订单
|
|
|
- LifeUserOrder lifeUserOrder = lifeUserOrderMapper.selectOne(new LambdaQueryWrapper<LifeUserOrder>().eq(LifeUserOrder::getId, orderCouponMiddle.getOrderId()));
|
|
|
- orderCouponMiddle.setStatus(OrderStatusEnum.USED.getStatus());
|
|
|
- orderCouponMiddle.setUsedTime(new Date());
|
|
|
- orderCouponMiddleMapper.updateById(orderCouponMiddle);
|
|
|
- //通过订单id查询中间表 如果该订单下所有劵都为已核销状态更改订单表状态为已核销
|
|
|
- List<OrderCouponMiddle> couponMiddleList = orderCouponMiddleMapper.selectList(new LambdaQueryWrapper<OrderCouponMiddle>()
|
|
|
- .eq(OrderCouponMiddle::getOrderId, lifeUserOrder.getId()));
|
|
|
- // 排除要核销的券的 所以券状态
|
|
|
- boolean isExist = couponMiddleList.stream().allMatch(str -> str.getStatus() == OrderStatusEnum.USED.getStatus());
|
|
|
- if (isExist) {
|
|
|
- lifeUserOrder.setStatus(OrderStatusEnum.USED.getStatus());
|
|
|
- lifeUserOrder.setFinishTime(new Date());
|
|
|
- lifeUserOrder.setCreatedTime(new Date());
|
|
|
- lifeUserOrderMapper.updateById(lifeUserOrder);
|
|
|
-
|
|
|
- //发放好友优惠券
|
|
|
- LifeDiscountCouponStoreFriendDto lifeDiscountCouponStoreFriendDto = new LifeDiscountCouponStoreFriendDto();
|
|
|
- lifeDiscountCouponStoreFriendDto.setOrderId(Integer.parseInt(lifeUserOrder.getId()));
|
|
|
- lifeDiscountCouponStoreFriendService.issueFriendCoupon(lifeDiscountCouponStoreFriendDto);
|
|
|
- }
|
|
|
- // 订单状态 -> 已完成 筛选出未完成的状态
|
|
|
- List<OrderCouponMiddle> collect = couponMiddleList.stream().filter(x -> x.getStatus() == OrderStatusEnum.WAIT_USE.getStatus() || x.getStatus() == OrderStatusEnum.REFUND_FAILED.getStatus())
|
|
|
- .collect(Collectors.toList());
|
|
|
- if (collect.size() == 0) {
|
|
|
- lifeUserOrder.setStatus(OrderStatusEnum.COMPLETE.getStatus());
|
|
|
- lifeUserOrder.setFinishTime(new Date());
|
|
|
- lifeUserOrder.setCreatedTime(new Date());
|
|
|
- lifeUserOrderMapper.updateById(lifeUserOrder);
|
|
|
-
|
|
|
- //发放好友优惠券
|
|
|
- LifeDiscountCouponStoreFriendDto lifeDiscountCouponStoreFriendDto = new LifeDiscountCouponStoreFriendDto();
|
|
|
- lifeDiscountCouponStoreFriendDto.setOrderId(Integer.parseInt(lifeUserOrder.getId()));
|
|
|
- lifeDiscountCouponStoreFriendService.issueFriendCoupon(lifeDiscountCouponStoreFriendDto);
|
|
|
- }
|
|
|
- // 计算总退款金额(orderCouponMiddle金额按实际的存)
|
|
|
-// BigDecimal refundAmount = couponMiddleList.stream().filter(x -> x.getStatus() == OrderStatusEnum.REFUND.getStatus()).map(x -> x.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
- StoreInfo storeInfo = storeInfoMapper.selectOne(new LambdaQueryWrapper<StoreInfo>().eq(StoreInfo::getId, lifeUserOrder.getStoreId()));
|
|
|
- // 先将抽成比例转换为BigDecimal,再除以100
|
|
|
- BigDecimal commissionRate = new BigDecimal(storeInfo.getCommissionRate())
|
|
|
- .divide(new BigDecimal(100));
|
|
|
- // 感觉有问题。HALF_UP有问题。
|
|
|
- BigDecimal commission = orderCouponMiddle.getPrice().multiply(commissionRate).setScale(2, RoundingMode.HALF_UP);
|
|
|
- BigDecimal money = orderCouponMiddle.getPrice().subtract(commission);
|
|
|
-
|
|
|
- // 插入收入明细表数据
|
|
|
- StoreIncomeDetailsRecord record = new StoreIncomeDetailsRecord();
|
|
|
- record.setStoreId(Integer.parseInt(storeId));
|
|
|
- record.setUserOrderId(orderCouponMiddle.getId());
|
|
|
- record.setIncomeType(lifeUserOrder.getCouponType());
|
|
|
- record.setBusinessId(orderCouponMiddle.getCouponId());
|
|
|
- record.setCommission(commission.intValue());
|
|
|
- record.setMoney(money.intValue());
|
|
|
- storeIncomeDetailsRecordMapper.insert(record);
|
|
|
-
|
|
|
- // 店铺账户余额增加
|
|
|
- UpdateWrapper<StoreUser> updateWrapper = new UpdateWrapper();
|
|
|
- updateWrapper.eq("store_id", storeId);
|
|
|
- updateWrapper.eq("delete_flag", 0);
|
|
|
- updateWrapper.setSql("money = money + " + money);
|
|
|
- storeUserMapper.update(null, updateWrapper);
|
|
|
-
|
|
|
- resultMap.put("code", "true");
|
|
|
- resultMap.put("message", "核销成功");
|
|
|
- } else {
|
|
|
+ String lockKey = "coupon:use:" + quanCode;
|
|
|
+ if(baseRedisService.hasKey(lockKey)) {
|
|
|
resultMap.put("code", "false");
|
|
|
- resultMap.put("message", "核销失败");
|
|
|
+ resultMap.put("message", "请勿重复核销");
|
|
|
+ return resultMap;
|
|
|
+ };
|
|
|
+ baseRedisService.setListRight(lockKey, quanCode);
|
|
|
+ try {
|
|
|
+ OrderCouponMiddle orderCouponMiddle = orderCouponMiddleMapper.selectOne(new LambdaQueryWrapper<OrderCouponMiddle>().eq(OrderCouponMiddle::getCouponCode, quanCode).in(OrderCouponMiddle::getStatus,OrderStatusEnum.WAIT_USE.getStatus(),OrderStatusEnum.REFUND_FAILED.getStatus()));
|
|
|
+ if (!StringUtils.isEmpty(orderCouponMiddle)) {
|
|
|
+ // 查询总订单
|
|
|
+ LifeUserOrder lifeUserOrder = lifeUserOrderMapper.selectOne(new LambdaQueryWrapper<LifeUserOrder>().eq(LifeUserOrder::getId, orderCouponMiddle.getOrderId()));
|
|
|
+ orderCouponMiddle.setStatus(OrderStatusEnum.USED.getStatus());
|
|
|
+ orderCouponMiddle.setUsedTime(new Date());
|
|
|
+ orderCouponMiddleMapper.updateById(orderCouponMiddle);
|
|
|
+ //通过订单id查询中间表 如果该订单下所有劵都为已核销状态更改订单表状态为已核销
|
|
|
+ List<OrderCouponMiddle> couponMiddleList = orderCouponMiddleMapper.selectList(new LambdaQueryWrapper<OrderCouponMiddle>()
|
|
|
+ .eq(OrderCouponMiddle::getOrderId, lifeUserOrder.getId()));
|
|
|
+ // 排除要核销的券的 所以券状态
|
|
|
+ boolean isExist = couponMiddleList.stream().allMatch(str -> str.getStatus() == OrderStatusEnum.USED.getStatus());
|
|
|
+ // 订单状态 -> 已完成 筛选出未完成的状态
|
|
|
+ List<OrderCouponMiddle> collect = couponMiddleList.stream().filter(x -> x.getStatus() == OrderStatusEnum.WAIT_USE.getStatus() || x.getStatus() == OrderStatusEnum.REFUND_FAILED.getStatus())
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ if (isExist) {
|
|
|
+ lifeUserOrder.setStatus(OrderStatusEnum.USED.getStatus());
|
|
|
+ lifeUserOrder.setFinishTime(new Date());
|
|
|
+ lifeUserOrder.setCreatedTime(new Date());
|
|
|
+ lifeUserOrderMapper.updateById(lifeUserOrder);
|
|
|
+
|
|
|
+ //发放好友优惠券
|
|
|
+ LifeDiscountCouponStoreFriendDto lifeDiscountCouponStoreFriendDto = new LifeDiscountCouponStoreFriendDto();
|
|
|
+ lifeDiscountCouponStoreFriendDto.setOrderId(Integer.parseInt(lifeUserOrder.getId()));
|
|
|
+ lifeDiscountCouponStoreFriendService.issueFriendCoupon(lifeDiscountCouponStoreFriendDto);
|
|
|
+ } else if (collect.size() == 0) {
|
|
|
+ lifeUserOrder.setStatus(OrderStatusEnum.COMPLETE.getStatus());
|
|
|
+ lifeUserOrder.setFinishTime(new Date());
|
|
|
+ lifeUserOrder.setCreatedTime(new Date());
|
|
|
+ lifeUserOrderMapper.updateById(lifeUserOrder);
|
|
|
+
|
|
|
+ //发放好友优惠券
|
|
|
+ LifeDiscountCouponStoreFriendDto lifeDiscountCouponStoreFriendDto = new LifeDiscountCouponStoreFriendDto();
|
|
|
+ lifeDiscountCouponStoreFriendDto.setOrderId(Integer.parseInt(lifeUserOrder.getId()));
|
|
|
+ lifeDiscountCouponStoreFriendService.issueFriendCoupon(lifeDiscountCouponStoreFriendDto);
|
|
|
+ }
|
|
|
+ // 计算总退款金额(orderCouponMiddle金额按实际的存)
|
|
|
+// BigDecimal refundAmount = couponMiddleList.stream().filter(x -> x.getStatus() == OrderStatusEnum.REFUND.getStatus()).map(x -> x.getPrice()).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ StoreInfo storeInfo = storeInfoMapper.selectOne(new LambdaQueryWrapper<StoreInfo>().eq(StoreInfo::getId, lifeUserOrder.getStoreId()));
|
|
|
+ // 先将抽成比例转换为BigDecimal,再除以100
|
|
|
+ BigDecimal commissionRate = new BigDecimal(storeInfo.getCommissionRate())
|
|
|
+ .divide(new BigDecimal(100));
|
|
|
+ // 感觉有问题。HALF_UP有问题。 price 正常存储
|
|
|
+ BigDecimal commission = orderCouponMiddle.getPrice().multiply(new BigDecimal(100).multiply(commissionRate)).setScale(2, RoundingMode.HALF_UP);
|
|
|
+ BigDecimal money = orderCouponMiddle.getPrice().multiply(new BigDecimal(100)).subtract(commission);
|
|
|
+
|
|
|
+ // 插入收入明细表数据
|
|
|
+ StoreIncomeDetailsRecord record = new StoreIncomeDetailsRecord();
|
|
|
+ record.setStoreId(Integer.parseInt(storeId));
|
|
|
+ record.setUserOrderId(orderCouponMiddle.getId());
|
|
|
+ record.setIncomeType(lifeUserOrder.getCouponType());
|
|
|
+ record.setBusinessId(orderCouponMiddle.getCouponId());
|
|
|
+ record.setCommission(commission.intValue());
|
|
|
+ record.setMoney(money.intValue());
|
|
|
+ storeIncomeDetailsRecordMapper.insert(record);
|
|
|
+
|
|
|
+ // 店铺账户余额增加
|
|
|
+ UpdateWrapper<StoreUser> updateWrapper = new UpdateWrapper();
|
|
|
+ updateWrapper.eq("store_id", storeId);
|
|
|
+ updateWrapper.eq("delete_flag", 0);
|
|
|
+ updateWrapper.setSql("money = money + " + money);
|
|
|
+ storeUserMapper.update(null, updateWrapper);
|
|
|
+
|
|
|
+ resultMap.put("code", "true");
|
|
|
+ resultMap.put("message", "核销成功");
|
|
|
+ } else {
|
|
|
+ resultMap.put("code", "false");
|
|
|
+ resultMap.put("message", "核销失败");
|
|
|
+ }
|
|
|
+ } finally {
|
|
|
+ baseRedisService.delete(lockKey);
|
|
|
}
|
|
|
return resultMap;
|
|
|
}
|
|
|
@@ -590,12 +602,13 @@ public class LifeCouponServiceImpl extends ServiceImpl<LifeCouponMapper, LifeCou
|
|
|
throw new IllegalArgumentException("小时必须在0-23之间");
|
|
|
}
|
|
|
// 处理跨天的情况,例如22点到次日3点
|
|
|
- if (buyUseStartTime > buyUseEndTime) {
|
|
|
- if(currentHour < buyUseStartTime && currentHour > buyUseEndTime){
|
|
|
- return R.fail("该劵不在有效期内");
|
|
|
- }
|
|
|
+ if (buyUseStartTime >= buyUseEndTime) {
|
|
|
+ if(currentHour<buyUseStartTime && currentHour>buyUseEndTime) {
|
|
|
+ return R.fail("该劵不在有效期内");
|
|
|
+ }
|
|
|
+
|
|
|
} else {
|
|
|
- if (currentHour < buyUseStartTime || currentHour > buyUseEndTime) {
|
|
|
+ if (!(currentHour >= buyUseStartTime && currentHour <= buyUseEndTime)) {
|
|
|
return R.fail("该劵不在有效期内");
|
|
|
}
|
|
|
}
|