Compare commits

...

3 Commits

Author SHA1 Message Date
wyn
f57f5dc9d9 退单 2026-04-28 17:21:51 +08:00
wyn
dca56c9493 退单 2026-04-27 17:53:56 +08:00
wyn
9b8b818ad1 退单 2026-04-27 17:53:41 +08:00
32 changed files with 777 additions and 42 deletions

View File

@@ -26,6 +26,10 @@ public class Constants {
* 订单状态 - 交易失败
*/
public static final String ORDER_STATUS_FAIL = "4";
/**
* 订单状态 - 交易失败
*/
public static final String ORDER_STATUS_REFUND = "6";
/**
* 订单状态 - 全部

View File

@@ -118,6 +118,10 @@ public class BuyOrderController {
private UserCourseBuyLogService userCourseBuyLogService;
@Autowired
private CourseCatalogueService courseCatalogueService;
@Autowired
private BuyOrderRefundService buyOrderRefundService;
@Autowired
private BuyOrderRefundLogService buyOrderRefundLogService;
@RequestMapping(value = "/decomposeShipment", method = RequestMethod.POST)
public R decomposeShipment(@RequestBody BuyOrderListRequestVo requestVo) {
@@ -580,7 +584,131 @@ public class BuyOrderController {
result.put("money", totalPrice);
return R.ok(result);
}
//订单退款进度
@RequestMapping("/refundDetail")
public R refundOrderDetail(@RequestBody Map params){
Object orderIdObj = params.get("orderId");
if(orderIdObj == null || orderIdObj.toString().trim().equals("")){
return R.error("orderId不能为空");
}
int order_id = Integer.parseInt(orderIdObj.toString().trim());
QueryWrapper<BuyOrderRefund> wapper = new QueryWrapper<>();
wapper.eq("order_id",order_id);
BuyOrderRefund refundInfo = buyOrderRefundService.getOne(wapper);
if(refundInfo==null){
return R.error("退款信息不存在");
}
QueryWrapper<BuyOrderRefundLog> wapper2 = new QueryWrapper<>();
wapper2.eq("refund_id",refundInfo.getId()).orderByDesc("create_time");
List<BuyOrderRefundLog> list = buyOrderRefundLogService.list(wapper2);
for (BuyOrderRefundLog log : list){
if(log.getType()==1){
log.setTitle("天医币已退还");
log.setContent("天医币已退还到账户,可在我的->天医币中查看明细");
}else if(log.getType()==2){
log.setTitle("积分已退还");
log.setContent("积分已退还到账户,可在我的->积分中查看明细");
}else if(log.getType()==3){
log.setTitle(log.getStatus()==1?"到账成功":"已退款,支付宝处理中");
log.setContent(log.getStatus()==1?"已退到您的支付宝,到账时间以支付宝处理时间为准,可前往「支付宝-账单」查看":"已将退款资金提交给支付宝处理通常情况下退款会原路退回您的支付账户预计会在1-7天内到账");
}else if(log.getType()==4){
log.setTitle(log.getStatus()==1?"到账成功":"已退款,微信处理中");
log.setContent(log.getStatus()==1?"已退到您的微信,到账时间以微信处理时间为准,可前往「微信-账单」查看":"已将退款资金提交给微信处理通常情况下退款会原路退回您的支付账户预计会在1-7天内到账");
}
}
BuyOrderRefundLog log = new BuyOrderRefundLog();
log.setId(0);
log.setRefundId(refundInfo.getId());
log.setType(0);
log.setStatus(1);
log.setCreateTime(refundInfo.getCreateTime());
log.setTitle("发起退款");
log.setContent("系统会在1-2天内提交处理");
list.add(log);
Map<String,Object> result = new HashMap<>();
BigDecimal shippingMoney = refundInfo.getDeductShipping()==1?refundInfo.getShippingMoney():BigDecimal.ZERO;
result.put("orderMoney",refundInfo.getFee().add(refundInfo.getJfDeduction().add(shippingMoney)));
result.put("refundFee",refundInfo.getFee());
result.put("payType",refundInfo.getPayType());
result.put("refundJf",refundInfo.getJfDeduction());
result.put("shippingMoney",shippingMoney);
result.put("list",list);
return R.ok().put("info",result);
}
@RequestMapping(value = "/refundOrder", method = RequestMethod.POST)
@Transactional
public R refundOrder(@RequestBody Map<String, Object> params) {
Object orderIdObject = params.get("orderId");
if(orderIdObject == null || orderIdObject.toString().trim().equals("")){
return R.error("orderId不能为空");
}
int orderId = Integer.parseInt(orderIdObject.toString());
QueryWrapper<BuyOrder> queryWapper = new QueryWrapper<>();
queryWapper.eq("order_id",orderId);
BuyOrder buyOrder = buyOrderService.getOne(queryWapper);
if(buyOrder==null){
return R.error("订单不存在");
}
MyUserEntity user = myUserService.getById(buyOrder.getUserId());
if (user == null) {
return R.error("订单对应用户不存在");
}
if (Constants.ORDER_STATUS_TO_BE_PAID.equals(buyOrder.getOrderStatus())
|| Constants.ORDER_STATUS_FAIL.equals(buyOrder.getOrderStatus())
|| Constants.ORDER_STATUS_REFUND.equals(buyOrder.getOrderStatus())
|| Constants.ORDER_STATUS_OUT_OF_TIME.equals(buyOrder.getOrderStatus())) {
return R.error("当前订单状态不支持退单");
}
// QueryWrapper<BuyOrderRefund> 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);
BigDecimal refundFee = buyOrder.getRealMoney();
BigDecimal shippingMoney = buyOrder.getShippingMoney()==null?BigDecimal.ZERO:buyOrder.getShippingMoney();
int deductShipping = params.containsKey("deductShipping") && params.get("deductShipping")!=null?Integer.parseInt(params.get("deductShipping").toString()):0;
if(refundFee.compareTo(BigDecimal.ZERO)>0 && shippingMoney.compareTo(BigDecimal.ZERO)>0 && deductShipping==1){
refundFee = refundFee.subtract(shippingMoney);
refundFee = refundFee.compareTo(BigDecimal.ZERO)>0?refundFee:BigDecimal.ZERO;
}
String remark = params.containsKey("remark") && params.get("remark").toString()!=null?params.get("remark").toString():"";
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();
if(refundFee.compareTo(BigDecimal.ZERO)>0){
transactionDetailsService.refundRecord(buyOrder,user,refundFee);
user.setPeanutCoin(user.getPeanutCoin().add(refundFee));
myUserService.updateById(user);
buyOrderRefundLogService.insertRefundLog(refundId,1,1);
}
}
buyOrderService.refundOrder(buyOrder,user,refundId);
return R.ok("ok");
}
@RequestMapping("/llll")
public R ls(){
@@ -1166,7 +1294,7 @@ public class BuyOrderController {
List<Integer> collect = shopProductBookService.getBaseMapper().selectList(new LambdaQueryWrapper<ShopProductBookEntity>()
.eq(ShopProductBookEntity::getProductId, productId)
.eq(ShopProductBookEntity::getDelFlag, 0)).stream().map(ShopProductBookEntity::getBookId).collect(Collectors.toList());
userEbookBuyService.addBookForUser(buyOrder.getUserId(), collect);
userEbookBuyService.addBookForUser(buyOrder, buyOrder.getUserId(), collect);
}
}

View File

@@ -9,9 +9,11 @@ import com.peanut.modules.book.to.UserOrderDto;
import com.peanut.modules.book.vo.UserOrderVo;
import com.peanut.modules.book.vo.request.BuyOrderListRequestVo;
import com.peanut.modules.book.vo.response.BuyOrderResponseVo;
import com.peanut.modules.common.entity.MyUserEntity;
import com.peanut.modules.common.entity.ShopProductCourseEntity;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
@@ -68,4 +70,8 @@ public interface BuyOrderService extends IService<BuyOrder> {
void addCourseToUser(String payType,BuyOrder orderEntity);
boolean checkWlOrder(String orderSn);
BigDecimal getRefundFee(Map<String, Object> params, BuyOrder buyOrder);
void refundOrder(BuyOrder buyOrder, MyUserEntity user, int refundId);
}

View File

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.peanut.common.utils.PageUtils;
import com.peanut.common.utils.R;
import com.peanut.modules.common.entity.BookForumArticlesEntity;
import com.peanut.modules.common.entity.BuyOrder;
import com.peanut.modules.common.entity.BuyOrderProduct;
import com.peanut.modules.common.entity.MyUserEntity;
import java.util.List;
import java.util.Map;
@@ -33,5 +35,7 @@ public interface MyUserService extends IService<MyUserEntity> {
boolean checkUserTelOrEmail(MyUserEntity user);
void rollbackUserPowers(BuyOrder order, List<BuyOrderProduct> orderProducts);
}

View File

@@ -2,6 +2,7 @@ package com.peanut.modules.book.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.peanut.common.utils.PageUtils;
import com.peanut.modules.common.entity.BuyOrder;
import com.peanut.modules.common.entity.ShopProduct;
import java.math.BigDecimal;
@@ -37,6 +38,6 @@ public interface ShopProductService extends IService<ShopProduct> {
PageUtils queryPageactivityprice(Map<String, Object> params);
void rollbackStock(BuyOrder buyOrder);
}

View File

@@ -27,6 +27,6 @@ public interface TransactionDetailsService extends IService<TransactionDetailsEn
void rechargeRecord(MyUserEntity user,String money,int payXxxOrderId,String AppName,String orderSn);
void refundRecord(BuyOrder buyOrder, MyUserEntity user, BigDecimal totalPrice);
}

View File

@@ -2,6 +2,8 @@ package com.peanut.modules.book.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.peanut.common.utils.PageUtils;
import com.peanut.modules.common.entity.BuyOrder;
import com.peanut.modules.common.entity.BuyOrderProduct;
import com.peanut.modules.common.entity.UserEbookBuyEntity;
import java.util.List;
@@ -23,6 +25,11 @@ public interface UserEbookBuyService extends IService<UserEbookBuyEntity> {
List<Integer> getUserBookId(Integer userId);
void addBookForUser(Integer userId, List<Integer> bookIds);
void addBookForUser(BuyOrder buyOrder, Integer userId, List<Integer> bookIds);
void rollbackUserEbooks(BuyOrder order, List<BuyOrderProduct> orderProducts);
}

View File

@@ -11,6 +11,13 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.peanut.common.utils.*;
import com.peanut.config.Constants;
import com.peanut.modules.book.service.BuyOrderService;
import com.peanut.modules.book.service.CityService;
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;
@@ -19,11 +26,12 @@ import com.peanut.modules.book.vo.UserOrderVo;
import com.peanut.modules.book.vo.request.BuyOrderListRequestVo;
import com.peanut.modules.book.vo.response.*;
import com.peanut.modules.common.entity.*;
import com.peanut.modules.common.service.UserVipService;
import com.peanut.modules.common.service.VipBuyConfigService;
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;
@@ -35,6 +43,7 @@ import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.util.*;
import java.util.stream.Collectors;
@@ -92,8 +101,24 @@ public class BuyOrderServiceImpl extends ServiceImpl<BuyOrderDao, BuyOrder> impl
private UserCourseBuyDao userCourseBuyDao;
@Autowired
private UserCourseBuyLogDao userCourseBuyLogDao;
@Autowired
private CouponService couponService;
@Autowired
private UserEbookBuyService userEbookBuyService;
protected Logger logger = LoggerFactory.getLogger(BuyOrderServiceImpl.class);
@Autowired
private JfTransactionDetailsService jfTransactionDetailsService;
@Autowired
private BuyOrderRefundLogService buyOrderRefundLogService;
@Autowired
private BuyOrderRefundService buyOrderRefundService;
@Autowired
private UserVipLogService userVipLogService;
@Autowired
private UserVipLogDao userVipLogDao;
@Autowired
private UserVipDao userVipDao;
// TODO 新版本上线后删除
@Override
@@ -412,20 +437,53 @@ public class BuyOrderServiceImpl extends ServiceImpl<BuyOrderDao, BuyOrder> impl
user.setUserVips(userVipService.list(new LambdaQueryWrapper<UserVip>()
.eq(UserVip::getUserId,user.getId()).eq(UserVip::getState,0)));
b.setUser(user);
boolean refundableStatus = false;
long timestamp = Instant.now().toEpochMilli();
long paymentDateTime = b.getPaymentDate()==null?0: b.getPaymentDate().getTime();
if (b.getVipBuyConfigId()!=0){
if(paymentDateTime > timestamp-7*24*60*60*1000){
refundableStatus = true;
}
b.setVipBuyConfigEntity(vipBuyConfigService.getById(b.getVipBuyConfigId()));
}
//添加商品信息
List<BuyOrderProduct> buyOrderProducts = buyOrderProductDao.selectList(new LambdaQueryWrapper<BuyOrderProduct>().eq(BuyOrderProduct::getOrderId, b.getOrderId()));
for (BuyOrderProduct b1:buyOrderProducts){
MPJLambdaWrapper<ShopProduct> shopProductWrapper = new MPJLambdaWrapper<>();
//关掉本次查询del_flg = 0的条件查询删除商品
shopProductWrapper.disableLogicDel().eq(ShopProduct::getProductId,b1.getProductId());
ShopProduct byId = shopProductService.getOne(shopProductWrapper);
byId.setBooks(shopProductBookService.getBookByProductId(byId.getProductId()));
b1.setProduct(byId);
b1.setExpressOrder(expressOrderDao.selectById(b1.getExpressOrderId()));
if(buyOrderProducts.size()>0){
boolean[] refundableStatusArr = new boolean[buyOrderProducts.size()];
for (int i=0;i<buyOrderProducts.size();i++){
BuyOrderProduct b1 = buyOrderProducts.get(i);
MPJLambdaWrapper<ShopProduct> shopProductWrapper = new MPJLambdaWrapper<>();
//关掉本次查询del_flg = 0的条件查询删除商品
shopProductWrapper.disableLogicDel().eq(ShopProduct::getProductId,b1.getProductId());
ShopProduct byId = shopProductService.getOne(shopProductWrapper);
byId.setBooks(shopProductBookService.getBookByProductId(byId.getProductId()));
b1.setProduct(byId);
b1.setExpressOrder(expressOrderDao.selectById(b1.getExpressOrderId()));
boolean refundableStatusProduct = false;
if(b1.getProduct().getGoodsType().equals("05") && (paymentDateTime > timestamp-7*24*60*60*1000)){
refundableStatusProduct = true;
}else if(!b1.getProduct().getGoodsType().equals("05") && b.getOrderStatus().equals("1")){
refundableStatusProduct = true;
}
refundableStatusArr[i] = refundableStatusProduct;
}
for (boolean rs : refundableStatusArr){
if(!rs){
refundableStatus = false;
break;
}else{
refundableStatus = true;
}
}
}
if(b.getOrderStatus().equals(Constants.ORDER_STATUS_REFUND)){
QueryWrapper<BuyOrderRefund> wrapperRefund = new QueryWrapper<>();
wrapperRefund.eq("order_id",b.getOrderId());
BuyOrderRefund refundInfo = buyOrderRefundService.getOne(wrapperRefund);
b.setRefundRemark(refundInfo.getRemark());
}
b.setRefundableStatus(b.getOrderStatus().equals("6")?false:refundableStatus);
b.setProductList(buyOrderProducts);
//设置快递信息传递给前端
ConsigneeVo consigneeVo = new ConsigneeVo();
@@ -481,7 +539,7 @@ public class BuyOrderServiceImpl extends ServiceImpl<BuyOrderDao, BuyOrder> impl
wrapper.eq(BuyOrder::getUserId,userOrderDto.getUserId());
// wrapper.eq(BuyOrder::getOrderType,"order");//这里有点问题
if(userOrderDto.getOrderStatus()==null){
Integer[] sts = {0,1,2,3};
Integer[] sts = {0,1,2,3,6};
wrapper.in(BuyOrder::getOrderStatus,sts);
}else{
wrapper.eq(BuyOrder::getOrderStatus,userOrderDto.getOrderStatus());
@@ -497,17 +555,40 @@ public class BuyOrderServiceImpl extends ServiceImpl<BuyOrderDao, BuyOrder> impl
//组装商品
List<BuyOrderProduct> buyOrderProducts = buyOrderProductService.getBaseMapper().selectList(new LambdaQueryWrapper<BuyOrderProduct>()
.eq(BuyOrderProduct::getOrderId, b.getOrderId()));
for (BuyOrderProduct bb : buyOrderProducts){
bb.setProduct(shopProductService.getOne(new LambdaQueryWrapper<ShopProduct>().select(ShopProduct::getProductId,ShopProduct::getProductName,ShopProduct::getProductImages,ShopProduct::getPrice,ShopProduct::getActivityPrice,ShopProduct::getIsVipPrice,ShopProduct::getGoodsType)
.eq(ShopProduct::getProductId,bb.getProductId())));
UserRecord userRecord = userRecordDao.selectOne(new QueryWrapper<UserRecord>()
.eq("userid", ShiroUtils.getUId())
.eq("orderdid", b.getOrderId())
.eq("product_id", bb.getProductId()));
if (userRecord!=null){
bb.setRecordId(userRecord.getId());
Boolean refundableStatus = false;
long paymentDateTime = b.getPaymentDate()==null?0:b.getPaymentDate().getTime();
long timestamp = Instant.now().toEpochMilli();
if (buyOrderProducts.size() > 0) {
boolean[] refundableStatusArr = new boolean[buyOrderProducts.size()];
for (int i=0;i<buyOrderProducts.size();i++){
BuyOrderProduct bb = buyOrderProducts.get(i);
bb.setProduct(shopProductService.getOne(new LambdaQueryWrapper<ShopProduct>().select(ShopProduct::getProductId, ShopProduct::getProductName, ShopProduct::getProductImages, ShopProduct::getPrice, ShopProduct::getActivityPrice, ShopProduct::getIsVipPrice, ShopProduct::getGoodsType)
.eq(ShopProduct::getProductId, bb.getProductId())));
UserRecord userRecord = userRecordDao.selectOne(new QueryWrapper<UserRecord>()
.eq("userid", ShiroUtils.getUId())
.eq("orderdid", b.getOrderId())
.eq("product_id", bb.getProductId()));
if (userRecord != null) {
bb.setRecordId(userRecord.getId());
}
boolean refundableStatusProduct = false;
if (bb.getProduct().getGoodsType().equals("05") && paymentDateTime > timestamp - 7 * 24 * 60 * 60 * 1000) {
refundableStatusProduct = true;
} else if (!bb.getProduct().getGoodsType().equals("05") && b.getOrderStatus().equals(Constants.ORDER_STATUS_TO_BE_SHIPPED)){
refundableStatusProduct = true;
}
refundableStatusArr[i] = refundableStatusProduct;
}
for (boolean rs : refundableStatusArr){
if(!rs){
refundableStatus = false;
break;
}else{
refundableStatus = true;
}
}
}
b.setRefundableStatus(b.getOrderStatus().equals("6")?false:refundableStatus);
b.setProductList(buyOrderProducts);
b.setTimestamp(b.getCreateTime().getTime()/1000);
//充值订单填充充值商品信息
@@ -653,7 +734,15 @@ public class BuyOrderServiceImpl extends ServiceImpl<BuyOrderDao, BuyOrder> impl
List<ShopProductCourseEntity> shopProductCourseEntities = this.getBaseMapper().selectJoinList(ShopProductCourseEntity.class, wrapper);
return shopProductCourseEntities;
}
public void removeCourseToUser(BuyOrder orderEntity){
QueryWrapper<UserCourseBuyLog> buyLogQueryWrapper = new QueryWrapper<>();
buyLogQueryWrapper.eq("order_sn",orderEntity.getOrderSn());
List<UserCourseBuyLog> userCourseBuyLogList = userCourseBuyLogDao.selectList(buyLogQueryWrapper);
for (UserCourseBuyLog userCourseBuyLog:userCourseBuyLogList){
userCourseBuyDao.deleteById(userCourseBuyLog.getUserCourseBuyId());
userCourseBuyLogDao.deleteById(userCourseBuyLog.getId());
}
}
@Override
public void addCourseToUser(String payType,BuyOrder orderEntity){
List<ShopProductCourseEntity> orderCourse = getOrderCourse(orderEntity.getOrderSn());
@@ -951,5 +1040,59 @@ public class BuyOrderServiceImpl extends ServiceImpl<BuyOrderDao, BuyOrder> impl
return responseVo;
}
public BigDecimal getRefundFee(Map<String, Object> params, BuyOrder buyOrder) {
Object userRefundFeeObj = params.get("refundFee");
BigDecimal refundFee = new BigDecimal(0);
if(userRefundFeeObj!=null && !userRefundFeeObj.toString().trim().equals("")){
refundFee = new BigDecimal(userRefundFeeObj.toString().trim());
}
BigDecimal realMoney = buyOrder.getRealMoney() == null ? BigDecimal.ZERO : buyOrder.getRealMoney();
BigDecimal shippingMoney = buyOrder.getShippingMoney() == null ? BigDecimal.ZERO : buyOrder.getShippingMoney();
BigDecimal maxRefundMoney = realMoney.subtract(shippingMoney);
if (maxRefundMoney.compareTo(BigDecimal.ZERO) < 0) {
maxRefundMoney = BigDecimal.ZERO;
}
if(refundFee.compareTo(maxRefundMoney)>0){
refundFee = maxRefundMoney;
}
return refundFee;
}
@Override
public void refundOrder(BuyOrder buyOrder, MyUserEntity user, int refundId){
if(buyOrder.getCouponId()!=null && buyOrder.getCouponId()!=0){
couponService.rollbackCoupon(buyOrder.getCouponId());
}
QueryWrapper<BuyOrderProduct> productQueryWrapper = new QueryWrapper<>();
productQueryWrapper.eq("order_id",buyOrder.getOrderId());
List<BuyOrderProduct> orderProducts = buyOrderProductService.list(productQueryWrapper);
//积分恢复
BigDecimal jf = buyOrder.getJfDeduction()==null?BigDecimal.ZERO : buyOrder.getJfDeduction();
if(jf.compareTo(BigDecimal.ZERO)>0){
jfTransactionDetailsService.refundJfTransaction(buyOrder,user);
user.setJf(jf.add(user.getJf()));
myUserService.updateById(user);
buyOrderRefundLogService.insertRefundLog(refundId,2,1);
}
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);
}
}
}

View File

@@ -102,4 +102,27 @@ public class MyUserServiceImpl extends ServiceImpl<MyUserDao, MyUserEntity> impl
MyUserEntity one = getOne(wrapper);
return one == null;
}
public void rollbackUserPowers(BuyOrder order, List<BuyOrderProduct> orderProducts) {
MyUserEntity user = getById(order.getUserId());
if(user == null){
return;
}
for (BuyOrderProduct buyOrderProduct : orderProducts){
Integer productId = buyOrderProduct.getProductId();
if(Arrays.asList(128, 129, 130, 131, 136, 137, 139, 1612).contains(productId)){
user.setPointPower(0);
}
if(Arrays.asList(133, 134, 135).contains(productId)){
user.setTgdzPower(0);
}
if(Arrays.asList(39, 62, 123, 127).contains(productId)){
user.setWylqPower(0);
}
if(Arrays.asList(43, 62, 124).contains(productId)){
user.setPrescriptBPower(0);
}
}
updateById(user);
}
}

View File

@@ -1,6 +1,9 @@
package com.peanut.modules.book.service.impl;
import com.peanut.common.utils.ExcludeEmptyQueryWrapper;
import com.peanut.common.utils.ShiroUtils;
import com.peanut.modules.book.service.BuyOrderProductService;
import com.peanut.modules.common.entity.BuyOrder;
import com.peanut.modules.common.entity.BuyOrderProduct;
import com.peanut.modules.common.service.UserVipService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -24,6 +27,8 @@ public class ShopProductServiceImpl extends ServiceImpl<ShopProductDao, ShopProd
@Autowired
private UserVipService userVipService;
@Autowired
private BuyOrderProductService buyOrderProductService;
@Override
public PageUtils queryPage(Map<String, Object> params) {
@@ -135,5 +140,17 @@ public class ShopProductServiceImpl extends ServiceImpl<ShopProductDao, ShopProd
return new PageUtils(page);
}
@Override
public void rollbackStock(BuyOrder buyOrder){
QueryWrapper<BuyOrderProduct> buyOrderProductQueryWrapper = new QueryWrapper<>();
buyOrderProductQueryWrapper.eq("order_id", buyOrder.getOrderId());
List<BuyOrderProduct> buyOrderProductList = buyOrderProductService.list(buyOrderProductQueryWrapper);
for (BuyOrderProduct buyOrderProduct : buyOrderProductList) {
Integer productId = buyOrderProduct.getProductId();
ShopProduct product = this.getById(productId);
product.setProductStock(product.getProductStock() + buyOrderProduct.getQuantity());
this.updateById(product);
}
}
}

View File

@@ -84,13 +84,18 @@ public class TransactionDetailsServiceImpl extends ServiceImpl<TransactionDetail
getBaseMapper().insert(transactionDetailsEntity);
}
public void refundRecord(BuyOrder buyOrder, MyUserEntity user, BigDecimal refundPrice){
TransactionDetailsEntity transactionDetailsEntity = new TransactionDetailsEntity();
transactionDetailsEntity.setUserId(user.getId());
transactionDetailsEntity.setOrderType("订单退款");
transactionDetailsEntity.setChangeAmount(refundPrice);
transactionDetailsEntity.setUserBalance(user.getPeanutCoin().add(refundPrice));
transactionDetailsEntity.setRelationId(buyOrder.getOrderId());
transactionDetailsEntity.setUserName(user.getNickname());
transactionDetailsEntity.setTel(user.getTel());
transactionDetailsEntity.setNote("订单号:" + buyOrder.getOrderSn() + " 虚拟币退款");
getBaseMapper().insert(transactionDetailsEntity);
}
}

View File

@@ -6,7 +6,11 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.peanut.common.utils.PageUtils;
import com.peanut.common.utils.Query;
import com.peanut.modules.book.service.ShopProductBookService;
import com.peanut.modules.common.dao.UserEbookBuyDao;
import com.peanut.modules.common.entity.BuyOrder;
import com.peanut.modules.common.entity.BuyOrderProduct;
import com.peanut.modules.common.entity.ShopProductBookEntity;
import com.peanut.modules.common.entity.UserEbookBuyEntity;
import com.peanut.modules.book.service.UserEbookBuyService;
import lombok.extern.slf4j.Slf4j;
@@ -16,6 +20,7 @@ import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j
@Service("userEbookBuyService")
@@ -23,6 +28,8 @@ public class UserEbookBuyServiceImpl extends ServiceImpl<UserEbookBuyDao, UserEb
@Autowired
private UserEbookBuyDao userEbookBuyDao;
@Autowired
private ShopProductBookService shopProductBookService;
@Override
public PageUtils queryPage(Map<String, Object> params) {
@@ -68,4 +75,34 @@ public class UserEbookBuyServiceImpl extends ServiceImpl<UserEbookBuyDao, UserEb
}
}
}
public void addBookForUser(BuyOrder buyOrder, Integer userId, List<Integer> bookIds) {
for (Integer i:bookIds){
List<UserEbookBuyEntity> userEbookBuyEntities = this.getBaseMapper().selectList(new LambdaQueryWrapper<UserEbookBuyEntity>().eq(UserEbookBuyEntity::getUserId, userId).eq(UserEbookBuyEntity::getBookId, i));
if(userEbookBuyEntities.size()==0){
UserEbookBuyEntity userEbookBuyEntity = new UserEbookBuyEntity();
userEbookBuyEntity.setUserId(userId);
userEbookBuyEntity.setBookId(i);
userEbookBuyEntity.setPayTime(new Date());
userEbookBuyEntity.setOrdersn(buyOrder.getOrderSn());
this.save(userEbookBuyEntity);
}
}
}
@Override
public void rollbackUserEbooks(BuyOrder order, List<BuyOrderProduct> orderProducts) {
for (BuyOrderProduct buyOrderProduct : orderProducts){
List<Integer> bookIds = shopProductBookService.getBaseMapper().selectList(new LambdaQueryWrapper<ShopProductBookEntity>()
.eq(ShopProductBookEntity::getProductId,buyOrderProduct.getProductId())
.eq(ShopProductBookEntity::getDelFlag,0)
).stream().map(ShopProductBookEntity::getBookId).collect(Collectors.toList());
for (Integer bookId:bookIds){
QueryWrapper<UserEbookBuyEntity> removeWrapper = new QueryWrapper<>();
removeWrapper.eq("user_id", order.getUserId());
removeWrapper.eq("ordersn", order.getOrderSn());
this.remove(removeWrapper);
}
}
}
}

View File

@@ -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;
}
}

View File

@@ -380,6 +380,7 @@ public class UserVipController {
MyUserEntity user = myUserDao.selectById(buyOrder.getUserId());
if (usePeanutCoin(user, totalPrice)&&useJfCoin(user,buyOrder.getJfDeduction())) {
// 更新订单状态
buyOrder.setPaymentDate(new Date());
buyOrderService.updateOrderStatus(user.getId(), buyOrder.getOrderSn(), "2");
//记录用户虚拟币消费
if(totalPrice.compareTo(BigDecimal.ZERO)>0){

View File

@@ -0,0 +1,10 @@
package com.peanut.modules.common.dao;
import com.github.yulichang.base.MPJBaseMapper;
import com.peanut.modules.common.entity.BuyOrderRefund;
import com.peanut.modules.common.entity.BuyOrderRefundLog;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface BuyOrderRefundLogDao extends MPJBaseMapper<BuyOrderRefundLog> {
}

View File

@@ -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<UserVipLog> {
public interface UserVipLogDao extends MPJBaseMapper<UserVipLog> {
List<Map<String,Object>> getUserVipLogInfo(@Param("date") String date);

View File

@@ -124,6 +124,7 @@ public class BuyOrder implements Serializable {
* 3已完成
* 4: 交易失败
* 5: 已过期
* 6: 已退款
*/
private String orderStatus;
/**
@@ -223,4 +224,9 @@ public class BuyOrder implements Serializable {
private BookEntity bookEntity;
@TableField(exist = false)
private String trainingClassIdentity;
@TableField(exist = false)
private Boolean refundableStatus;
@TableField(exist = false)
private String refundRemark;
}

View File

@@ -16,6 +16,7 @@ public class BuyOrderRefund implements Serializable {
@TableId
private Integer id;
private String refundNo;
private Integer userId;
//订单类型 线上 线下
private String type;
@@ -23,6 +24,9 @@ public class BuyOrderRefund implements Serializable {
private String orderSn;
private String payType;
private BigDecimal fee;
private BigDecimal jfDeduction;
private BigDecimal shippingMoney;
private int deductShipping;
//商品名称
private String title;
private String remark;

View File

@@ -0,0 +1,37 @@
package com.peanut.modules.common.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* 订单退款进度日志表
*
* @author yl
* @email yl328572838@163.com
* @date 2022-08-29 15:27:44
*/
@Data
@TableName("buy_order_refund_log")
public class BuyOrderRefundLog implements Serializable {
private static final long serialVersionUID = 1L;
@TableId
private Integer id;
private Integer refundId;
private Date createTime;
private int type;
private int status;
@TableField(exist = false)
private String title;
@TableField(exist = false)
private String content;
}

View File

@@ -0,0 +1,9 @@
package com.peanut.modules.common.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.peanut.modules.common.entity.BuyOrderRefund;
import com.peanut.modules.common.entity.BuyOrderRefundLog;
public interface BuyOrderRefundLogService extends IService<BuyOrderRefundLog> {
void insertRefundLog(int buyOrderRefundId, int type, int status);
}

View File

@@ -1,7 +1,12 @@
package com.peanut.modules.common.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.peanut.modules.common.entity.BuyOrder;
import com.peanut.modules.common.entity.BuyOrderRefund;
import java.math.BigDecimal;
public interface BuyOrderRefundService extends IService<BuyOrderRefund> {
int insertBuyOrderRefund(BuyOrder buyOrder, BigDecimal refundFee, int deductShipping,String remark);
String genRefundNo();
}

View File

@@ -20,6 +20,8 @@ public interface CouponService extends IService<CouponEntity> {
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<CouponHistory> getCouponListPayment(Map<String,Object> params);
//使用优惠卷
@@ -28,6 +30,8 @@ public interface CouponService extends IService<CouponEntity> {
//回滚优惠卷
void rollbackCoupon(int couponHistoryId);
void refundZSCouponHistoryByOrder(BuyOrder order);
//通过商品发放优惠卷
void insertCouponHistoryByProductId(BuyOrder order);

View File

@@ -10,4 +10,7 @@ public interface JfTransactionDetailsService extends IService<JfTransactionDetai
void recordJfTransaction(BuyOrder buyOrder, MyUserEntity user, BigDecimal jf);
void refundJfTransaction(BuyOrder buyOrder, MyUserEntity user);
void recordZsJfTransaction(BuyOrder buyOrder, MyUserEntity user, BigDecimal refundJF);
}

View File

@@ -29,4 +29,5 @@ public interface UserVipService extends IService<UserVip> {
void openVipForUser(BuyOrder buyOrder);
void refundVip(BuyOrder buyOrder);
}

View File

@@ -0,0 +1,22 @@
package com.peanut.modules.common.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.peanut.modules.common.dao.BuyOrderRefundLogDao;
import com.peanut.modules.common.entity.BuyOrderRefund;
import com.peanut.modules.common.entity.BuyOrderRefundLog;
import com.peanut.modules.common.service.BuyOrderRefundLogService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Slf4j
@Service("commonBuyOrderRefundLogService")
public class BuyOrderRefundLogServiceImpl extends ServiceImpl<BuyOrderRefundLogDao, BuyOrderRefundLog> implements BuyOrderRefundLogService {
@Override
public void insertRefundLog(int refundId, int type, int status){
BuyOrderRefundLog log = new BuyOrderRefundLog();
log.setRefundId(refundId);
log.setType(type);
log.setStatus(status);
this.save(log);
}
}

View File

@@ -2,12 +2,39 @@ package com.peanut.modules.common.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.peanut.modules.common.dao.BuyOrderRefundDao;
import com.peanut.modules.common.entity.BuyOrder;
import com.peanut.modules.common.entity.BuyOrderRefund;
import com.peanut.modules.common.service.BuyOrderRefundService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Random;
@Slf4j
@Service("commonBuyOrderRefundService")
public class BuyOrderRefundServiceImpl extends ServiceImpl<BuyOrderRefundDao, BuyOrderRefund> implements BuyOrderRefundService {
@Override
public int insertBuyOrderRefund(BuyOrder buyOrder, BigDecimal refundFee, int deductShipping,String remark){
BuyOrderRefund buyOrderRefund = new BuyOrderRefund();
buyOrderRefund.setOrderId(buyOrder.getOrderId());
buyOrderRefund.setType("线上"); //id
buyOrderRefund.setUserId(buyOrder.getUserId());
buyOrderRefund.setOrderSn(buyOrder.getOrderSn());
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);
this.save(buyOrderRefund);
return buyOrderRefund.getId();
}
@Override
public String genRefundNo() {
long time = System.currentTimeMillis();
int random = new Random().nextInt(900) + 100; // 100~999
return "RF" + time + random;
}
}

View File

@@ -16,6 +16,8 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.Instant;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@@ -73,7 +75,7 @@ public class BuyOrderServiceImpl extends ServiceImpl<BuyOrderDao, BuyOrder> impl
wrapper.eq(BuyOrder::getUserId,params.get("userId"));
wrapper.eq(BuyOrder::getCome,params.get("come"));
if(StringUtils.isEmpty(params.get("orderStatus").toString())){
Integer[] sts = {0,1,2,3};
Integer[] sts = {0,1,2,3,6};
wrapper.in(BuyOrder::getOrderStatus,sts);
}else{
wrapper.eq(BuyOrder::getOrderStatus,params.get("orderStatus").toString());
@@ -88,6 +90,7 @@ public class BuyOrderServiceImpl extends ServiceImpl<BuyOrderDao, BuyOrder> impl
}
//组装购买人
b.setUser(userDao.selectById(b.getUserId()));
boolean refundableStatus = false;
//组装充值配置详情
if (b.getProductId()!=null){
BookBuyConfigEntity bookBuyConfigEntity = bookBuyConfigDao.selectById(b.getProductId());
@@ -97,7 +100,12 @@ public class BuyOrderServiceImpl extends ServiceImpl<BuyOrderDao, BuyOrder> impl
}
b.setBookBuyConfigEntity(bookBuyConfigEntity);
}
long timestamp = Instant.now().toEpochMilli();
long paymentDateTime = b.getPaymentDate()==null?0: b.getPaymentDate().getTime();
if (b.getVipBuyConfigId()!=0){
if(paymentDateTime > timestamp-7*24*60*60*1000){
refundableStatus = true;
}
b.setVipBuyConfigEntity(vipBuyConfigDao.selectById(b.getVipBuyConfigId()));
}
if (b.getAiBuyConfigId()!=0){
@@ -107,10 +115,27 @@ public class BuyOrderServiceImpl extends ServiceImpl<BuyOrderDao, BuyOrder> impl
List<BuyOrderProduct> buyOrderProducts = buyOrderProductDao.selectList(
new LambdaQueryWrapper<BuyOrderProduct>().eq(BuyOrderProduct::getOrderId, b.getOrderId()));
if (buyOrderProducts.size() > 0) {
for (BuyOrderProduct bb : buyOrderProducts){
boolean[] refundableStatusArr = new boolean[buyOrderProducts.size()];
for (int i=0;i<buyOrderProducts.size();i++){
BuyOrderProduct bb = buyOrderProducts.get(i);
MPJLambdaWrapper<ShopProduct> w = new MPJLambdaWrapper<>();
w.disableLogicDel().eq(ShopProduct::getProductId,bb.getProductId());
bb.setProduct(shopProductDao.selectOne(w));
boolean refundableStatusProduct = false;
if(bb.getProduct().getGoodsType().equals("05") && (paymentDateTime > timestamp-7*24*60*60*1000)){
refundableStatusProduct = true;
}else if(!bb.getProduct().getGoodsType().equals("05") && b.getOrderStatus().equals("1")){
refundableStatusProduct = true;
}
refundableStatusArr[i] = refundableStatusProduct;
}
for (boolean rs : refundableStatusArr){
if(!rs){
refundableStatus = false;
break;
}else{
refundableStatus = true;
}
}
b.setProductList(buyOrderProducts);
b.setTimestamp(b.getCreateTime().getTime()/1000);
@@ -122,6 +147,7 @@ public class BuyOrderServiceImpl extends ServiceImpl<BuyOrderDao, BuyOrder> impl
b.setExpressList(expressOrders);
}
}
b.setRefundableStatus(b.getOrderStatus().equals("6")?false:refundableStatus);
}
}
return page;

View File

@@ -1,6 +1,7 @@
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.DateUtils;
@@ -8,7 +9,9 @@ import com.peanut.common.utils.R;
import com.peanut.common.utils.ShiroUtils;
import com.peanut.modules.common.dao.*;
import com.peanut.modules.common.entity.*;
import com.peanut.modules.common.service.CouponHistoryService;
import com.peanut.modules.common.service.CouponService;
import com.peanut.modules.common.service.JfTransactionDetailsService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -41,6 +44,10 @@ public class CouponServiceImpl extends ServiceImpl<CouponDao, CouponEntity> impl
private ShopProductDao shopProductDao;
@Autowired
private JfTransactionDetailsDao jfTransactionDetailsDao;
@Autowired
private JfTransactionDetailsService jfTransactionDetailsService;
@Autowired
private CouponHistoryService couponHistoryService;
@Override
public CouponEntity getByIdSetRange(int id) {
@@ -116,7 +123,50 @@ public class CouponServiceImpl extends ServiceImpl<CouponDao, CouponEntity> 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<CouponHistory>()
.eq(CouponHistory::getCouponId,couponId)).intValue();
//是否超出总发行量
if (historyCount<couponEntity.getTotalCirculation()){
List<CouponHistory> historyList = couponHistoryDao.selectList(new LambdaQueryWrapper<CouponHistory>()
.eq(CouponHistory::getUserId,userId)
.eq(CouponHistory::getCouponId,couponId));
//是否超出可持有张数
if (historyList.size()<couponEntity.getLimitedCollar()){
CouponHistory couponHistory = new CouponHistory();
couponHistory.setCouponId(couponId);
couponHistory.setUserId(userId);
couponHistory.setGetType(getType);
couponHistory.setStatus(status);
couponHistory.setRemark(remark);
couponHistory.setEffectType(couponEntity.getEffectType());
Date date = new Date();
if (couponEntity.getEffectType()==1){
couponHistory.setStartTime(date);
couponHistory.setEndTime(DateUtils.addDateDays(date,couponEntity.getValidity()));
}else if (couponEntity.getEffectType()==2){
couponHistory.setStartTime(couponEntity.getEffectTime());
couponHistory.setEndTime(couponEntity.getExpireTime());
}
if (couponHistory.getStatus()==1){
couponHistory.setUseTime(date);
}
couponHistory.setOrderId(buyOrder.getOrderId());
couponHistoryDao.insert(couponHistory);
return R.ok();
}else {
return R.error("每人限领"+couponEntity.getLimitedCollar()+"");
}
}else {
return R.error("优惠券已放完");
}
}else {
return R.error("优惠券暂未开始发放");
}
}
@Override
public List<CouponHistory> getCouponListPayment(Map<String, Object> params) {
List<CouponHistory> res = new ArrayList<>();
@@ -252,6 +302,67 @@ public class CouponServiceImpl extends ServiceImpl<CouponDao, CouponEntity> impl
}
}
@Override
public void refundZSCouponHistoryByOrder(BuyOrder order){
MPJLambdaWrapper<CouponToProduct> wrapper = new MPJLambdaWrapper();
wrapper.leftJoin(BuyOrderProduct.class,BuyOrderProduct::getProductId,CouponToProduct::getProductId);
wrapper.leftJoin(CouponEntity.class,CouponEntity::getId,CouponToProduct::getCouponId);
wrapper.eq(CouponEntity::getCurrentState,0);
wrapper.eq(BuyOrderProduct::getOrderId,order.getOrderId());
wrapper.select(CouponToProduct::getCouponId);
wrapper.select(BuyOrderProduct::getProductId);
wrapper.select(BuyOrderProduct::getQuantity);
List<Map<String,Object>> buyOrderProducts = couponToProductDao.selectJoinMaps(wrapper);
MyUserEntity userEntity = userDao.selectById(order.getUserId());
List<UserVip> userVipList = userVipDao.selectList(new LambdaQueryWrapper<UserVip>()
.eq(UserVip::getUserId, userEntity.getId())
.eq(UserVip::getState,0)
.lt(UserVip::getStartTime,order.getPaymentDate()));
boolean isVip = false;
if (userVipList.size() > 0) {
isVip = true;
}
System.out.println("isVip:"+isVip);
BigDecimal refundAllJF = BigDecimal.ZERO;
Boolean isRefundCoupon = false;
for (Map<String,Object> 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());
BigDecimal sumRefundJF = couponEntity.getCouponAmount().multiply(quantity);
refundAllJF = refundAllJF.add(sumRefundJF);
QueryWrapper<CouponHistory> couponHistoryRemoveWrapper = new QueryWrapper<>();
couponHistoryRemoveWrapper.eq("order_id",order.getOrderId());
couponHistoryRemoveWrapper.eq("status",1);
couponHistoryService.remove(couponHistoryRemoveWrapper);
}else{
isRefundCoupon = true;
}
}else{
isRefundCoupon = true;
}
}
if(refundAllJF.compareTo(BigDecimal.ZERO)>0 && userEntity.getJf().compareTo(refundAllJF)>=0){
BigDecimal userJF = userEntity.getJf().subtract(refundAllJF);
userEntity.setJf(userJF.compareTo(BigDecimal.ZERO)>=0?userJF:BigDecimal.ZERO);
userDao.updateById(userEntity);
jfTransactionDetailsService.recordZsJfTransaction(order,userEntity, refundAllJF);
}
if(isRefundCoupon){
QueryWrapper<CouponHistory> couponHistoryRemoveWrapper = new QueryWrapper<>();
couponHistoryRemoveWrapper.eq("order_id",order.getOrderId());
couponHistoryRemoveWrapper.eq("status",0);
couponHistoryService.remove(couponHistoryRemoveWrapper);
}
}
@Override
public void insertCouponHistoryByProductId(BuyOrder order) {
MPJLambdaWrapper<CouponToProduct> wrapper = new MPJLambdaWrapper();
@@ -278,7 +389,7 @@ public class CouponServiceImpl extends ServiceImpl<CouponDao, CouponEntity> impl
if (couponEntity.getCouponType()==0){
BigDecimal jf = BigDecimal.ZERO;
for (int i=0;i<Integer.parseInt(map.get("quantity").toString());i++){
R res = insertCouponHistory(couponId,order.getUserId(), 1,1,
R res = insertCouponHistory(order,couponId,order.getUserId(), 1,1,
"购买商品"+shopProduct.getProductName()+"赠送;vip用户购买预售书优惠券换积分。");
if (Integer.parseInt(res.get("code").toString())==0&&couponEntity.getCouponAmount() != null && couponEntity.getCouponAmount().compareTo(BigDecimal.ZERO)>0) {
jf = jf.add(couponEntity.getCouponAmount());

View File

@@ -22,4 +22,26 @@ public class JfTransactionDetailsServiceImpl extends ServiceImpl<JfTransactionDe
jfTransactionDetails.setRemark("消费积分抵扣:"+jf.toString()+",订单号:"+buyOrder.getOrderSn());
getBaseMapper().insert(jfTransactionDetails);
}
@Override
public void refundJfTransaction(BuyOrder buyOrder, MyUserEntity user) {
JfTransactionDetails jfTransactionDetails = new JfTransactionDetails();
jfTransactionDetails.setUserId(user.getId());
jfTransactionDetails.setChangeAmount(buyOrder.getJfDeduction());
jfTransactionDetails.setActType(0);
jfTransactionDetails.setUserBalance(user.getJf().add(buyOrder.getJfDeduction()));
jfTransactionDetails.setRelationId(buyOrder.getOrderId());
jfTransactionDetails.setRemark("订单退款:"+buyOrder.getJfDeduction().toString()+",订单号:"+buyOrder.getOrderSn());
getBaseMapper().insert(jfTransactionDetails);
}
@Override
public void recordZsJfTransaction(BuyOrder buyOrder, MyUserEntity user, BigDecimal refundJF) {
JfTransactionDetails jfTransactionDetails = new JfTransactionDetails();
jfTransactionDetails.setUserId(buyOrder.getUserId());
jfTransactionDetails.setChangeAmount(refundJF);
jfTransactionDetails.setActType(1);
jfTransactionDetails.setUserBalance(user.getJf());
jfTransactionDetails.setRelationId(buyOrder.getOrderId());
jfTransactionDetails.setRemark("订单退款,赠送积分退回:"+refundJF.toString()+",订单号:"+buyOrder.getOrderSn());
getBaseMapper().insert(jfTransactionDetails);
}
}

View File

@@ -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<UserVipDao, UserVip> 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<UserVipDao, UserVip> impleme
}
}
@Override
public void refundVip(BuyOrder buyOrder){
MPJLambdaWrapper<UserVipLog> 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<UserVipYearVo> 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<UserVipLog>().eq("order_sn",buyOrder.getOrderSn()).eq("user_id",buyOrder.getUserId()));
}
}

View File

@@ -98,7 +98,7 @@ wxpay:
mchId: 1612860909
serialNo: 679AECB2F7AC4183033F713828892BA640E4EEE3
apiV3Key: 4aYFklzaULeGlr7oJPZ6rHWKcxjihZUF
wechatPayCertificateUrl: F:\hs\nuttyreading-java\src\main\resources\cent\wechatpay_7B5676E3CDF56680D0414A009CE501C844DBE2D6.pem
wechatPayCertificateUrl: F:\hs\nuttyreading-server\src\main\resources\cent\wechatpay_7B5676E3CDF56680D0414A009CE501C844DBE2D6.pem
privateKeyUrl: F:\hs\nuttyreading-java\src\main\resources\cent\apiclient_key.pem
keyPemPath: F:\hs\nuttyreading-java\src\main\resources\cent\apiclient_key.pem
notifyUrl: http://z6f8f828.natappfree.cc/pb/pay/payNotify
@@ -107,9 +107,9 @@ wxpay:
lsMchId: 1700371158
lsSerialNo: 3132D23C3130B74B87890DC6E7C80256C75113B9
lsApiV3Key: 4aYFklzaULeGlr7oJPZ6rHWKcxjihZUF
lsWechatPayCertificateUrl: F:\hs\nuttyreading-java\src\main\resources\cent\lscent\wechatpay_30CFE19A12EDB4D9E0C7DF01DBF457C657566D04.pem
lsPrivateKeyUrl: F:\hs\nuttyreading-java\src\main\resources\cent\lscent\apiclient_key.pem
lsKeyPemPath: F:\hs\nuttyreading-java\src\main\resources\cent\lscent\apiclient_key.pem
lsWechatPayCertificateUrl: F:\hs\nuttyreading-server\src\main\resources\cent\lscent\wechatpay_30CFE19A12EDB4D9E0C7DF01DBF457C657566D04.pem
lsPrivateKeyUrl: F:\hs\nuttyreading-server\src\main\resources\cent\lscent\apiclient_key.pem
lsKeyPemPath: F:\hs\nuttyreading-server\src\main\resources\cent\lscent\apiclient_key.pem
lsNotifyUrl: http://z6f8f828.natappfree.cc/pb/pay/lsPayNotify
lsRefundNotifyUrl: https://testapi.nuttyreading.com/pay/refundNotify

View File

@@ -11,7 +11,7 @@ connection-timeout: 6000000ms
spring:
# 环境 /dev1|test|prod
profiles:
active: prod
active: dev1
# jackson时间格式化
jackson:
time-zone: GMT+8