diff --git a/src/main/java/com/peanut/modules/book/controller/BuyOrderController.java b/src/main/java/com/peanut/modules/book/controller/BuyOrderController.java index 90471e6..6b416db 100644 --- a/src/main/java/com/peanut/modules/book/controller/BuyOrderController.java +++ b/src/main/java/com/peanut/modules/book/controller/BuyOrderController.java @@ -661,6 +661,12 @@ public class BuyOrderController { || Constants.ORDER_STATUS_OUT_OF_TIME.equals(buyOrder.getOrderStatus())) { return R.error("当前订单状态不支持退单"); } +// QueryWrapper refundQueryWrapper = new QueryWrapper<>(); +// refundQueryWrapper.eq("order_id",buyOrder.getOrderId()); +// long refundOrderNums = buyOrderRefundService.count(refundQueryWrapper); + if(buyOrder.getOrderStatus().equals(Constants.ORDER_STATUS_REFUND)){ + return R.error("请勿重复申请退款"); + } buyOrder.setOrderStatus(Constants.ORDER_STATUS_REFUND); buyOrderService.updateById(buyOrder); @@ -672,7 +678,23 @@ public class BuyOrderController { refundFee = refundFee.compareTo(BigDecimal.ZERO)>0?refundFee:BigDecimal.ZERO; } String remark = params.containsKey("remark") && params.get("remark").toString()!=null?params.get("remark").toString():""; - int refundId = buyOrderRefundService.insertBuyOrderRefund(buyOrder,refundFee,deductShipping,remark); + + String refundNo = buyOrderRefundService.genRefundNo(); + BuyOrderRefund buyOrderRefund = new BuyOrderRefund(); + buyOrderRefund.setRefundNo(refundNo); + buyOrderRefund.setOrderId(buyOrder.getOrderId()); + buyOrderRefund.setOrderSn(buyOrder.getOrderSn()); + buyOrderRefund.setUserId(buyOrder.getUserId()); + buyOrderRefund.setType("线上"); //id + buyOrderRefund.setPayType(buyOrder.getPaymentMethod()); + buyOrderRefund.setFee(refundFee); + buyOrderRefund.setJfDeduction(buyOrder.getJfDeduction()); + buyOrderRefund.setShippingMoney(deductShipping==1?buyOrder.getShippingMoney():BigDecimal.ZERO); + buyOrderRefund.setDeductShipping(deductShipping); + buyOrderRefund.setRemark(remark); + buyOrderRefundService.save(buyOrderRefund); + + int refundId = buyOrderRefund.getId(); if (Constants.PAYMENT_METHOD_VIRTUAL.equals(buyOrder.getPaymentMethod())) { //BigDecimal refundPeanutCoin = buyOrder.getRealMoney() == null?BigDecimal.ZERO : buyOrder.getRealMoney(); diff --git a/src/main/java/com/peanut/modules/book/service/impl/BuyOrderServiceImpl.java b/src/main/java/com/peanut/modules/book/service/impl/BuyOrderServiceImpl.java index e3ad7c2..596d59d 100644 --- a/src/main/java/com/peanut/modules/book/service/impl/BuyOrderServiceImpl.java +++ b/src/main/java/com/peanut/modules/book/service/impl/BuyOrderServiceImpl.java @@ -17,6 +17,7 @@ import com.peanut.modules.book.service.CountyService; import com.peanut.modules.book.service.ExpressOrderService; import com.peanut.modules.book.service.MyUserService; import com.peanut.modules.book.service.ProvinceService; +import com.peanut.modules.book.vo.UserVipYearVo; import com.peanut.modules.common.dao.*; import com.peanut.modules.book.service.*; import com.peanut.modules.book.to.UserOrderDto; @@ -28,7 +29,9 @@ import com.peanut.modules.common.entity.*; import com.peanut.modules.common.service.*; import com.peanut.modules.common.vo.CourseCatalogueVo; import com.peanut.modules.oss.service.OssService; +import com.qiniu.util.Json; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.time.DateUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -110,6 +113,12 @@ public class BuyOrderServiceImpl extends ServiceImpl impl private BuyOrderRefundLogService buyOrderRefundLogService; @Autowired private BuyOrderRefundService buyOrderRefundService; + @Autowired + private UserVipLogService userVipLogService; + @Autowired + private UserVipLogDao userVipLogDao; + @Autowired + private UserVipDao userVipDao; // TODO 新版本上线后删除 @Override @@ -726,17 +735,12 @@ public class BuyOrderServiceImpl extends ServiceImpl impl return shopProductCourseEntities; } public void removeCourseToUser(BuyOrder orderEntity){ - List orderCourse = getOrderCourse(orderEntity.getOrderSn()); - for (int i=0;i wrapper2 = new LambdaQueryWrapper<>(); - wrapper2.eq(UserCourseBuyLog::getOrderSn,orderEntity.getOrderSn()); - List buyCourseLogList = userCourseBuyLogDao.selectList(wrapper2); - for (UserCourseBuyLog courseLog : buyCourseLogList){ - userCourseBuyDao.deleteById(courseLog.getUserCourseBuyId()); - userCourseBuyLogDao.deleteById(courseLog.getId()); - } - + QueryWrapper buyLogQueryWrapper = new QueryWrapper<>(); + buyLogQueryWrapper.eq("order_sn",orderEntity.getOrderSn()); + List userCourseBuyLogList = userCourseBuyLogDao.selectList(buyLogQueryWrapper); + for (UserCourseBuyLog userCourseBuyLog:userCourseBuyLogList){ + userCourseBuyDao.deleteById(userCourseBuyLog.getUserCourseBuyId()); + userCourseBuyLogDao.deleteById(userCourseBuyLog.getId()); } } @Override @@ -1074,15 +1078,21 @@ public class BuyOrderServiceImpl extends ServiceImpl impl myUserService.updateById(user); buyOrderRefundLogService.insertRefundLog(refundId,2,1); } - //撤回本订单购买赠送的优惠券 - couponService.refundZSCouponHistoryByOrder(buyOrder); -// 恢复用户权益(点穴/时辰取穴/五运六气/肿瘤古方) -// myUserService.rollbackUserPowers(buyOrder, orderProducts); - //撤回电子书权限 - userEbookBuyService.rollbackUserEbooks(buyOrder, orderProducts); - //撤回课程权限 - removeCourseToUser(buyOrder); - //回滚库存 - shopProductService.rollbackStock(buyOrder); + if(buyOrder.getOrderType().equals("vip")){ + userVipService.refundVip(buyOrder); + }else{ + //撤回本订单购买赠送的优惠券 + couponService.refundZSCouponHistoryByOrder(buyOrder); + /*//恢复用户权益(点穴/时辰取穴/五运六气/肿瘤古方) + myUserService.rollbackUserPowers(buyOrder, orderProducts);*/ + //撤回电子书权限 + userEbookBuyService.rollbackUserEbooks(buyOrder, orderProducts); + //撤回课程权限 + removeCourseToUser(buyOrder); + //回滚库存 + shopProductService.rollbackStock(buyOrder); + } + } + } \ No newline at end of file diff --git a/src/main/java/com/peanut/modules/book/vo/UserVipYearVo.java b/src/main/java/com/peanut/modules/book/vo/UserVipYearVo.java new file mode 100644 index 0000000..2e13783 --- /dev/null +++ b/src/main/java/com/peanut/modules/book/vo/UserVipYearVo.java @@ -0,0 +1,46 @@ +package com.peanut.modules.book.vo; + +import com.spire.ms.System.DateTime; + +import java.io.Serializable; +import java.util.Date; + +public class UserVipYearVo implements Serializable { + private static final long serialVersionUID = 1L; + private Integer id; + private Integer year; + private Date endTime; + private Date startTime; + + public Integer getYear() { + return year; + } + + public void setYear(Integer year) { + this.year = year; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Date getEndTime() { + return endTime; + } + + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } +} diff --git a/src/main/java/com/peanut/modules/common/dao/UserVipLogDao.java b/src/main/java/com/peanut/modules/common/dao/UserVipLogDao.java index dc9587e..5c3fa57 100644 --- a/src/main/java/com/peanut/modules/common/dao/UserVipLogDao.java +++ b/src/main/java/com/peanut/modules/common/dao/UserVipLogDao.java @@ -1,6 +1,7 @@ package com.peanut.modules.common.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.github.yulichang.base.MPJBaseMapper; import com.peanut.modules.common.entity.UserVipLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -9,7 +10,7 @@ import java.util.List; import java.util.Map; @Mapper -public interface UserVipLogDao extends BaseMapper { +public interface UserVipLogDao extends MPJBaseMapper { List> getUserVipLogInfo(@Param("date") String date); diff --git a/src/main/java/com/peanut/modules/common/entity/BuyOrderRefund.java b/src/main/java/com/peanut/modules/common/entity/BuyOrderRefund.java index 3569fa4..df7f42c 100644 --- a/src/main/java/com/peanut/modules/common/entity/BuyOrderRefund.java +++ b/src/main/java/com/peanut/modules/common/entity/BuyOrderRefund.java @@ -16,6 +16,7 @@ public class BuyOrderRefund implements Serializable { @TableId private Integer id; + private String refundNo; private Integer userId; //订单类型 线上 线下 private String type; diff --git a/src/main/java/com/peanut/modules/common/service/BuyOrderRefundService.java b/src/main/java/com/peanut/modules/common/service/BuyOrderRefundService.java index 1ffa530..d560b2f 100644 --- a/src/main/java/com/peanut/modules/common/service/BuyOrderRefundService.java +++ b/src/main/java/com/peanut/modules/common/service/BuyOrderRefundService.java @@ -8,4 +8,5 @@ import java.math.BigDecimal; public interface BuyOrderRefundService extends IService { int insertBuyOrderRefund(BuyOrder buyOrder, BigDecimal refundFee, int deductShipping,String remark); + String genRefundNo(); } diff --git a/src/main/java/com/peanut/modules/common/service/CouponService.java b/src/main/java/com/peanut/modules/common/service/CouponService.java index 28b1df2..7b6c506 100644 --- a/src/main/java/com/peanut/modules/common/service/CouponService.java +++ b/src/main/java/com/peanut/modules/common/service/CouponService.java @@ -20,6 +20,8 @@ public interface CouponService extends IService { R insertCouponHistory(int couponId, int userId,int getType,int status,String remark); + R insertCouponHistory(BuyOrder buyOrder, int couponId, int userId, int getType, int status, String remark); + List getCouponListPayment(Map params); //使用优惠卷 diff --git a/src/main/java/com/peanut/modules/common/service/UserVipService.java b/src/main/java/com/peanut/modules/common/service/UserVipService.java index e7209af..69fa7c4 100644 --- a/src/main/java/com/peanut/modules/common/service/UserVipService.java +++ b/src/main/java/com/peanut/modules/common/service/UserVipService.java @@ -29,4 +29,5 @@ public interface UserVipService extends IService { void openVipForUser(BuyOrder buyOrder); + void refundVip(BuyOrder buyOrder); } diff --git a/src/main/java/com/peanut/modules/common/service/impl/BuyOrderRefundServiceImpl.java b/src/main/java/com/peanut/modules/common/service/impl/BuyOrderRefundServiceImpl.java index 09dab2f..2b84f34 100644 --- a/src/main/java/com/peanut/modules/common/service/impl/BuyOrderRefundServiceImpl.java +++ b/src/main/java/com/peanut/modules/common/service/impl/BuyOrderRefundServiceImpl.java @@ -9,6 +9,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.math.BigDecimal; +import java.util.Random; @Slf4j @Service("commonBuyOrderRefundService") @@ -30,4 +31,10 @@ public class BuyOrderRefundServiceImpl extends ServiceImpl impl return R.error("优惠券暂未开始发放"); } } - + @Override + public R insertCouponHistory(BuyOrder buyOrder, int couponId, int userId, int getType, int status, String remark) { + CouponEntity couponEntity = couponDao.selectById(couponId); + if (couponEntity.getCurrentState()==0){ + int historyCount = couponHistoryDao.selectCount(new LambdaQueryWrapper() + .eq(CouponHistory::getCouponId,couponId)).intValue(); + //是否超出总发行量 + if (historyCount historyList = couponHistoryDao.selectList(new LambdaQueryWrapper() + .eq(CouponHistory::getUserId,userId) + .eq(CouponHistory::getCouponId,couponId)); + //是否超出可持有张数 + if (historyList.size() getCouponListPayment(Map params) { List res = new ArrayList<>(); @@ -280,17 +323,25 @@ public class CouponServiceImpl extends ServiceImpl impl if (userVipList.size() > 0) { isVip = true; } + System.out.println("isVip:"+isVip); BigDecimal refundAllJF = BigDecimal.ZERO; Boolean isRefundCoupon = false; for (Map map : buyOrderProducts) { ShopProduct shopProduct = shopProductDao.selectById(map.get("product_id").toString()); + System.out.println("goodsType:"+shopProduct.getGoodsType()); if ("03".equals(shopProduct.getGoodsType())){ int couponId = Integer.parseInt(map.get("coupon_id").toString()); CouponEntity couponEntity = couponDao.selectById(couponId); //现金券 if (couponEntity.getCouponType()==0 && isVip){ BigDecimal quantity = new BigDecimal(map.get("quantity").toString()); - refundAllJF.add(couponEntity.getCouponAmount().multiply(quantity)); + BigDecimal sumRefundJF = couponEntity.getCouponAmount().multiply(quantity); + refundAllJF = refundAllJF.add(sumRefundJF); + + QueryWrapper couponHistoryRemoveWrapper = new QueryWrapper<>(); + couponHistoryRemoveWrapper.eq("order_id",order.getOrderId()); + couponHistoryRemoveWrapper.eq("status",1); + couponHistoryService.remove(couponHistoryRemoveWrapper); }else{ isRefundCoupon = true; } @@ -338,7 +389,7 @@ public class CouponServiceImpl extends ServiceImpl impl if (couponEntity.getCouponType()==0){ BigDecimal jf = BigDecimal.ZERO; for (int i=0;i0) { jf = jf.add(couponEntity.getCouponAmount()); diff --git a/src/main/java/com/peanut/modules/common/service/impl/UserVipServiceImpl.java b/src/main/java/com/peanut/modules/common/service/impl/UserVipServiceImpl.java index 301bfd8..9ff111d 100644 --- a/src/main/java/com/peanut/modules/common/service/impl/UserVipServiceImpl.java +++ b/src/main/java/com/peanut/modules/common/service/impl/UserVipServiceImpl.java @@ -1,8 +1,11 @@ package com.peanut.modules.common.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.peanut.common.utils.ShiroUtils; +import com.peanut.modules.book.vo.UserVipYearVo; import com.peanut.modules.common.dao.*; import com.peanut.modules.common.entity.*; import com.peanut.modules.common.service.UserVipLogService; @@ -12,7 +15,6 @@ import org.apache.commons.lang.time.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.math.BigDecimal; import java.util.*; @Slf4j @@ -33,6 +35,8 @@ public class UserVipServiceImpl extends ServiceImpl impleme private VipBuyConfigDao vipBuyConfigDao; @Autowired private UserVipLogService userVipLogService; + @Autowired + private UserVipLogDao userVipLogDao; @Override public boolean isVip() { @@ -401,5 +405,26 @@ public class UserVipServiceImpl extends ServiceImpl impleme } } + @Override + public void refundVip(BuyOrder buyOrder){ + MPJLambdaWrapper UserVipLogMPJLambdaWrapper = new MPJLambdaWrapper<>(); + UserVipLogMPJLambdaWrapper.leftJoin(UserVip.class,UserVip::getId,UserVipLog::getUserVipId); + UserVipLogMPJLambdaWrapper.leftJoin(BuyOrder.class,BuyOrder::getOrderSn,UserVipLog::getOrderSn); + UserVipLogMPJLambdaWrapper.leftJoin(VipBuyConfigEntity.class,VipBuyConfigEntity::getId,BuyOrder::getVipBuyConfigId); + UserVipLogMPJLambdaWrapper.selectAll(UserVip.class); + UserVipLogMPJLambdaWrapper.select(VipBuyConfigEntity::getYear); + UserVipLogMPJLambdaWrapper.eq(UserVipLog::getOrderSn,buyOrder.getOrderSn()).eq(UserVip::getState,0); + List userVipYearList = userVipLogDao.selectJoinList(UserVipYearVo.class, UserVipLogMPJLambdaWrapper); + for (UserVipYearVo userVipYearVo:userVipYearList){ + UserVip userVip = userVipDao.selectById(userVipYearVo.getId()); + userVip.setEndTime(DateUtils.addYears(userVip.getEndTime(),-userVipYearVo.getYear())); + if(userVip.getStartTime().compareTo(userVip.getEndTime())==0){ + this.removeById(userVip); + }else{ + this.updateById(userVip); + } + } + userVipLogService.remove(new QueryWrapper().eq("order_sn",buyOrder.getOrderSn()).eq("user_id",buyOrder.getUserId())); + } }