|
@@ -20,6 +20,7 @@ import shop.alien.mapper.*;
|
|
|
import shop.alien.store.service.LifeCouponService;
|
|
import shop.alien.store.service.LifeCouponService;
|
|
|
import shop.alien.store.service.LifeDiscountCouponStoreFriendService;
|
|
import shop.alien.store.service.LifeDiscountCouponStoreFriendService;
|
|
|
import shop.alien.util.common.UniqueRandomNumGenerator;
|
|
import shop.alien.util.common.UniqueRandomNumGenerator;
|
|
|
|
|
+import shop.alien.util.common.constant.OrderStatusEnum;
|
|
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
import java.math.RoundingMode;
|
|
@@ -235,48 +236,60 @@ public class LifeCouponServiceImpl extends ServiceImpl<LifeCouponMapper, LifeCou
|
|
|
OrderCouponMiddle orderCouponMiddle = orderCouponMiddleMapper.selectOne(new LambdaQueryWrapper<OrderCouponMiddle>().eq(OrderCouponMiddle::getCouponCode, quanCode));
|
|
OrderCouponMiddle orderCouponMiddle = orderCouponMiddleMapper.selectOne(new LambdaQueryWrapper<OrderCouponMiddle>().eq(OrderCouponMiddle::getCouponCode, quanCode));
|
|
|
if (!StringUtils.isEmpty(orderCouponMiddle)) {
|
|
if (!StringUtils.isEmpty(orderCouponMiddle)) {
|
|
|
LifeUserOrder lifeUserOrder = lifeUserOrderMapper.selectOne(new LambdaQueryWrapper<LifeUserOrder>().eq(LifeUserOrder::getId, orderCouponMiddle.getOrderId()));
|
|
LifeUserOrder lifeUserOrder = lifeUserOrderMapper.selectOne(new LambdaQueryWrapper<LifeUserOrder>().eq(LifeUserOrder::getId, orderCouponMiddle.getOrderId()));
|
|
|
- orderCouponMiddle.setStatus(2);
|
|
|
|
|
- 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()==2);
|
|
|
|
|
- if(isExist){
|
|
|
|
|
- lifeUserOrder.setStatus(2);
|
|
|
|
|
- lifeUserOrder.setFinishTime(new Date());
|
|
|
|
|
- lifeUserOrder.setCreatedTime(new Date());
|
|
|
|
|
- lifeUserOrderMapper.updateById(lifeUserOrder);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- StoreInfo storeInfo = storeInfoMapper.selectOne(new LambdaQueryWrapper<StoreInfo>().eq(StoreInfo::getId,lifeUserOrder.getStoreId()));
|
|
|
|
|
- // TODO 抽成比例应该从商户里取
|
|
|
|
|
- BigDecimal amounts = new BigDecimal(lifeUserOrder.getFinalPrice()).multiply(new BigDecimal(100));
|
|
|
|
|
- // 先将抽成比例转换为BigDecimal,再除以100
|
|
|
|
|
- BigDecimal commissionRate = new BigDecimal(storeInfo.getCommissionRate())
|
|
|
|
|
|
|
+ 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().filter(x -> x.getId() != orderCouponMiddle.getId())
|
|
|
|
|
+ .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);
|
|
|
|
|
+ }
|
|
|
|
|
+ // TODO 订单状态 -> 变已完成 筛选出未完成的状态
|
|
|
|
|
+ List<OrderCouponMiddle> collect = couponMiddleList.stream().filter(x -> x.getId() != orderCouponMiddle.getId())
|
|
|
|
|
+ .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);
|
|
|
|
|
+ }
|
|
|
|
|
+ // 计算总退款金额(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()));
|
|
|
|
|
+ // TODO 抽成比例应该从商户里
|
|
|
|
|
+ BigDecimal amounts = new BigDecimal(lifeUserOrder.getFinalPrice()).multiply(new BigDecimal(100)).subtract(refundAmount);
|
|
|
|
|
+ // 先将抽成比例转换为BigDecimal,再除以100
|
|
|
|
|
+ BigDecimal commissionRate = new BigDecimal(storeInfo.getCommissionRate())
|
|
|
.divide(new BigDecimal(100));
|
|
.divide(new BigDecimal(100));
|
|
|
- BigDecimal commission = amounts.multiply(commissionRate).setScale(0, RoundingMode.HALF_UP);
|
|
|
|
|
- BigDecimal money = amounts.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", "核销成功");
|
|
|
|
|
|
|
+ BigDecimal commission = amounts.multiply(commissionRate).setScale(0, RoundingMode.HALF_UP);
|
|
|
|
|
+ BigDecimal money = amounts.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 {
|
|
} else {
|
|
|
resultMap.put("code", "false");
|
|
resultMap.put("code", "false");
|
|
|
resultMap.put("message", "核销失败");
|
|
resultMap.put("message", "核销失败");
|
|
@@ -505,7 +518,7 @@ public class LifeCouponServiceImpl extends ServiceImpl<LifeCouponMapper, LifeCou
|
|
|
return R.fail("该劵不在有效期内");
|
|
return R.fail("该劵不在有效期内");
|
|
|
}
|
|
}
|
|
|
} else if (lifeCoupon.getExpirationType().equals("2")) {//类型为:2 指定时间段
|
|
} else if (lifeCoupon.getExpirationType().equals("2")) {//类型为:2 指定时间段
|
|
|
- String[] strings = lifeCoupon.getValidityPeriod() .split(",");
|
|
|
|
|
|
|
+ String[] strings = lifeCoupon.getValidityPeriod().split(",");
|
|
|
long start = Long.parseLong(strings[0]);
|
|
long start = Long.parseLong(strings[0]);
|
|
|
long end = Long.parseLong(strings[1]);
|
|
long end = Long.parseLong(strings[1]);
|
|
|
LocalDate startDate = Instant.ofEpochMilli(start)
|
|
LocalDate startDate = Instant.ofEpochMilli(start)
|