修正项目
This commit is contained in:
		@@ -0,0 +1,23 @@
 | 
			
		||||
package com.yovinchen.xlcs;
 | 
			
		||||
 | 
			
		||||
import org.springframework.boot.SpringApplication;
 | 
			
		||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
 | 
			
		||||
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 | 
			
		||||
import org.springframework.cloud.openfeign.EnableFeignClients;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClassName: ServiceOrderApplication
 | 
			
		||||
 * Package: com.yovinchen.xlcs
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @Create 2023/10/11 19:09
 | 
			
		||||
 */
 | 
			
		||||
@SpringBootApplication
 | 
			
		||||
@EnableDiscoveryClient
 | 
			
		||||
@EnableFeignClients
 | 
			
		||||
public class ServiceOrderApplication {
 | 
			
		||||
 | 
			
		||||
    public static void main(String[] args) {
 | 
			
		||||
        SpringApplication.run(ServiceOrderApplication.class, args);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,20 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.controller;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.RestController;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 购物车表 前端控制器
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("/order/cart-info")
 | 
			
		||||
public class CartInfoController {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,20 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.controller;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.RestController;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 订单配送表 前端控制器
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("/order/order-deliver")
 | 
			
		||||
public class OrderDeliverController {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,80 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.controller;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.common.auth.AuthContextHolder;
 | 
			
		||||
import com.yovinchen.xlcs.common.result.Result;
 | 
			
		||||
import com.yovinchen.xlcs.model.order.OrderInfo;
 | 
			
		||||
import com.yovinchen.xlcs.order.service.OrderInfoService;
 | 
			
		||||
import com.yovinchen.xlcs.vo.order.OrderConfirmVo;
 | 
			
		||||
import com.yovinchen.xlcs.vo.order.OrderSubmitVo;
 | 
			
		||||
import com.yovinchen.xlcs.vo.order.OrderUserQueryVo;
 | 
			
		||||
import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
			
		||||
import io.swagger.annotations.ApiOperation;
 | 
			
		||||
import io.swagger.annotations.ApiParam;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.web.bind.annotation.*;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 订单 前端控制器
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("/api/order")
 | 
			
		||||
public class OrderInfoController {
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private OrderInfoService orderInfoService;
 | 
			
		||||
 | 
			
		||||
    @ApiOperation(value = "订单查询")
 | 
			
		||||
    @GetMapping("auth/findUserOrderPage/{page}/{limit}")
 | 
			
		||||
    public Result findUserOrderPage(
 | 
			
		||||
            @ApiParam(name = "page", value = "当前页码", required = true)
 | 
			
		||||
            @PathVariable Long page,
 | 
			
		||||
            @ApiParam(name = "limit", value = "每页记录数", required = true)
 | 
			
		||||
            @PathVariable Long limit,
 | 
			
		||||
            @ApiParam(name = "orderVo", value = "查询对象", required = false)
 | 
			
		||||
            OrderUserQueryVo orderUserQueryVo) {
 | 
			
		||||
        //获取userId
 | 
			
		||||
        Long userId = AuthContextHolder.getUserId();
 | 
			
		||||
        orderUserQueryVo.setUserId(userId);
 | 
			
		||||
 | 
			
		||||
        //分页查询条件
 | 
			
		||||
        Page<OrderInfo> pageParam = new Page<>(page, limit);
 | 
			
		||||
        IPage<OrderInfo> pageModel = orderInfoService.getOrderInfoByUserIdPage(pageParam, orderUserQueryVo);
 | 
			
		||||
        return Result.ok(pageModel);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @ApiOperation("确认订单")
 | 
			
		||||
    @GetMapping("auth/confirmOrder")
 | 
			
		||||
    public Result confirm() {
 | 
			
		||||
        OrderConfirmVo orderConfirmVo = orderInfoService.confirmOrder();
 | 
			
		||||
        return Result.ok(orderConfirmVo);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @ApiOperation("生成订单")
 | 
			
		||||
    @PostMapping("auth/submitOrder")
 | 
			
		||||
    public Result submitOrder(@RequestBody OrderSubmitVo orderParamVo) {
 | 
			
		||||
        Long orderId = orderInfoService.submitOrder(orderParamVo);
 | 
			
		||||
        return Result.ok(orderId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    @ApiOperation("获取订单详情")
 | 
			
		||||
    @GetMapping("auth/getOrderInfoById/{orderId}")
 | 
			
		||||
    public Result getOrderInfoById(@PathVariable("orderId") Long orderId) {
 | 
			
		||||
        OrderInfo orderInfo = orderInfoService.getOrderInfoById(orderId);
 | 
			
		||||
        return Result.ok(orderInfo);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @ApiOperation(value = "根据orderNo查询订单信息")
 | 
			
		||||
    @GetMapping("inner/getOrderInfo/{orderNo}")
 | 
			
		||||
    public OrderInfo getOrderInfo(@PathVariable("orderNo") String orderNo) {
 | 
			
		||||
        return orderInfoService.getOrderInfoByOrderNo(orderNo);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,20 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.controller;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.RestController;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 订单项信息 前端控制器
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("/order/order-item")
 | 
			
		||||
public class OrderItemController {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,20 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.controller;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.RestController;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 订单操作日志记录 前端控制器
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("/order/order-log")
 | 
			
		||||
public class OrderLogController {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,20 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.controller;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.RestController;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 订单退货申请 前端控制器
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("/order/order-return-apply")
 | 
			
		||||
public class OrderReturnApplyController {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,20 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.controller;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.RestController;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 退货原因表 前端控制器
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("/order/order-return-reason")
 | 
			
		||||
public class OrderReturnReasonController {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,20 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.controller;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.RestController;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 订单设置表 前端控制器
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("/order/order-set")
 | 
			
		||||
public class OrderSetController {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,20 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.controller;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.RestController;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 支付信息表 前端控制器
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("/order/payment-info")
 | 
			
		||||
public class PaymentInfoController {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,20 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.controller;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import org.springframework.web.bind.annotation.RequestMapping;
 | 
			
		||||
import org.springframework.web.bind.annotation.RestController;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 退款信息表 前端控制器
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
@RestController
 | 
			
		||||
@RequestMapping("/order/refund-info")
 | 
			
		||||
public class RefundInfoController {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -0,0 +1,17 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.mapper;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.CartInfo;
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 购物车表 Mapper 接口
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
public interface CartInfoMapper extends BaseMapper<CartInfo> {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,17 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.mapper;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.OrderDeliver;
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 订单配送表 Mapper 接口
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
public interface OrderDeliverMapper extends BaseMapper<OrderDeliver> {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,18 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.mapper;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.OrderInfo;
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
import org.springframework.stereotype.Repository;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 订单 Mapper 接口
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
@Repository
 | 
			
		||||
public interface OrderInfoMapper extends BaseMapper<OrderInfo> {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,18 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.mapper;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.OrderItem;
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
import org.springframework.stereotype.Repository;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 订单项信息 Mapper 接口
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
@Repository
 | 
			
		||||
public interface OrderItemMapper extends BaseMapper<OrderItem> {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,17 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.mapper;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.OrderLog;
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 订单操作日志记录 Mapper 接口
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
public interface OrderLogMapper extends BaseMapper<OrderLog> {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,16 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.mapper;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.OrderReturnApply;
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 订单退货申请 Mapper 接口
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
public interface OrderReturnApplyMapper extends BaseMapper<OrderReturnApply> {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,16 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.mapper;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.OrderReturnReason;
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 退货原因表 Mapper 接口
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
public interface OrderReturnReasonMapper extends BaseMapper<OrderReturnReason> {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,16 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.mapper;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.OrderSet;
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 订单设置表 Mapper 接口
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
public interface OrderSetMapper extends BaseMapper<OrderSet> {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,16 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.mapper;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.PaymentInfo;
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 支付信息表 Mapper 接口
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
public interface PaymentInfoMapper extends BaseMapper<PaymentInfo> {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,16 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.mapper;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.RefundInfo;
 | 
			
		||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 退款信息表 Mapper 接口
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
public interface RefundInfoMapper extends BaseMapper<RefundInfo> {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 | 
			
		||||
<mapper namespace="com.yovinchen.xlcs.order.mapper.CartInfoMapper">
 | 
			
		||||
 | 
			
		||||
</mapper>
 | 
			
		||||
@@ -0,0 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 | 
			
		||||
<mapper namespace="com.yovinchen.xlcs.order.mapper.OrderDeliverMapper">
 | 
			
		||||
 | 
			
		||||
</mapper>
 | 
			
		||||
@@ -0,0 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 | 
			
		||||
<mapper namespace="com.yovinchen.xlcs.order.mapper.OrderInfoMapper">
 | 
			
		||||
 | 
			
		||||
</mapper>
 | 
			
		||||
@@ -0,0 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 | 
			
		||||
<mapper namespace="com.yovinchen.xlcs.order.mapper.OrderItemMapper">
 | 
			
		||||
 | 
			
		||||
</mapper>
 | 
			
		||||
@@ -0,0 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 | 
			
		||||
<mapper namespace="com.yovinchen.xlcs.order.mapper.OrderLogMapper">
 | 
			
		||||
 | 
			
		||||
</mapper>
 | 
			
		||||
@@ -0,0 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 | 
			
		||||
<mapper namespace="com.yovinchen.xlcs.order.mapper.OrderReturnApplyMapper">
 | 
			
		||||
 | 
			
		||||
</mapper>
 | 
			
		||||
@@ -0,0 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 | 
			
		||||
<mapper namespace="com.yovinchen.xlcs.order.mapper.OrderReturnReasonMapper">
 | 
			
		||||
 | 
			
		||||
</mapper>
 | 
			
		||||
@@ -0,0 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 | 
			
		||||
<mapper namespace="com.yovinchen.xlcs.order.mapper.OrderSetMapper">
 | 
			
		||||
 | 
			
		||||
</mapper>
 | 
			
		||||
@@ -0,0 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 | 
			
		||||
<mapper namespace="com.yovinchen.xlcs.order.mapper.PaymentInfoMapper">
 | 
			
		||||
 | 
			
		||||
</mapper>
 | 
			
		||||
@@ -0,0 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 | 
			
		||||
<mapper namespace="com.yovinchen.xlcs.order.mapper.RefundInfoMapper">
 | 
			
		||||
 | 
			
		||||
</mapper>
 | 
			
		||||
@@ -0,0 +1,44 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.receiver;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.mq.constant.MqConst;
 | 
			
		||||
import com.yovinchen.xlcs.order.service.OrderInfoService;
 | 
			
		||||
import com.rabbitmq.client.Channel;
 | 
			
		||||
import org.springframework.amqp.core.Message;
 | 
			
		||||
import org.springframework.amqp.rabbit.annotation.Exchange;
 | 
			
		||||
import org.springframework.amqp.rabbit.annotation.Queue;
 | 
			
		||||
import org.springframework.amqp.rabbit.annotation.QueueBinding;
 | 
			
		||||
import org.springframework.amqp.rabbit.annotation.RabbitListener;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
import org.springframework.util.StringUtils;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * ClassName: OrderReceiver
 | 
			
		||||
 * Package: com.yovinchen.xlcs.order.receiver
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @Create 2023/10/13 14:15
 | 
			
		||||
 */
 | 
			
		||||
@Component
 | 
			
		||||
public class OrderReceiver {
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private OrderInfoService orderInfoService;
 | 
			
		||||
 | 
			
		||||
    //订单支付成功,更新订单状态,扣减库存
 | 
			
		||||
    @RabbitListener(bindings = @QueueBinding(
 | 
			
		||||
            value = @Queue(value = MqConst.QUEUE_ORDER_PAY, durable = "true"),
 | 
			
		||||
            exchange = @Exchange(value = MqConst.EXCHANGE_PAY_DIRECT),
 | 
			
		||||
            key = {MqConst.ROUTING_PAY_SUCCESS}
 | 
			
		||||
    ))
 | 
			
		||||
    public void orderPay(String orderNo,
 | 
			
		||||
                         Message message,
 | 
			
		||||
                         Channel channel) throws IOException {
 | 
			
		||||
        if (!StringUtils.isEmpty(orderNo)) {
 | 
			
		||||
            orderInfoService.orderPay(orderNo);
 | 
			
		||||
        }
 | 
			
		||||
        channel.basicAck(message.getMessageProperties().getDeliveryTag(),
 | 
			
		||||
                false);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,16 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.service;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.CartInfo;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 购物车表 服务类
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
public interface CartInfoService extends IService<CartInfo> {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,16 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.service;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.OrderDeliver;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 订单配送表 服务类
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
public interface OrderDeliverService extends IService<OrderDeliver> {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,67 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.service;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.OrderInfo;
 | 
			
		||||
import com.yovinchen.xlcs.vo.order.OrderConfirmVo;
 | 
			
		||||
import com.yovinchen.xlcs.vo.order.OrderSubmitVo;
 | 
			
		||||
import com.yovinchen.xlcs.vo.order.OrderUserQueryVo;
 | 
			
		||||
import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 订单 服务类
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
public interface OrderInfoService extends IService<OrderInfo> {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 确认订单
 | 
			
		||||
     *
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    OrderConfirmVo confirmOrder();
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 生成订单
 | 
			
		||||
     *
 | 
			
		||||
     * @param orderParamVo
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    Long submitOrder(OrderSubmitVo orderParamVo);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取订单详情
 | 
			
		||||
     *
 | 
			
		||||
     * @param orderId
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    OrderInfo getOrderInfoById(Long orderId);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据orderNo查询订单信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param orderNo
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    OrderInfo getOrderInfoByOrderNo(String orderNo);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 订单支付成功,更新订单状态,扣减库存
 | 
			
		||||
     *
 | 
			
		||||
     * @param orderNo
 | 
			
		||||
     */
 | 
			
		||||
    void orderPay(String orderNo);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 订单查询
 | 
			
		||||
     *
 | 
			
		||||
     * @param pageParam
 | 
			
		||||
     * @param orderUserQueryVo
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    IPage<OrderInfo> getOrderInfoByUserIdPage(Page<OrderInfo> pageParam, OrderUserQueryVo orderUserQueryVo);
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,16 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.service;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.OrderItem;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 订单项信息 服务类
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
public interface OrderItemService extends IService<OrderItem> {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,16 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.service;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.OrderLog;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 订单操作日志记录 服务类
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
public interface OrderLogService extends IService<OrderLog> {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,16 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.service;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.OrderReturnApply;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 订单退货申请 服务类
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
public interface OrderReturnApplyService extends IService<OrderReturnApply> {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,16 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.service;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.OrderReturnReason;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 退货原因表 服务类
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
public interface OrderReturnReasonService extends IService<OrderReturnReason> {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,16 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.service;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.OrderSet;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 订单设置表 服务类
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
public interface OrderSetService extends IService<OrderSet> {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,16 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.service;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.PaymentInfo;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 支付信息表 服务类
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
public interface PaymentInfoService extends IService<PaymentInfo> {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,16 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.service;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.RefundInfo;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.IService;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 退款信息表 服务类
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
public interface RefundInfoService extends IService<RefundInfo> {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,20 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.service.impl;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.CartInfo;
 | 
			
		||||
import com.yovinchen.xlcs.order.mapper.CartInfoMapper;
 | 
			
		||||
import com.yovinchen.xlcs.order.service.CartInfoService;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 购物车表 服务实现类
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class CartInfoServiceImpl extends ServiceImpl<CartInfoMapper, CartInfo> implements CartInfoService {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,20 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.service.impl;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.OrderDeliver;
 | 
			
		||||
import com.yovinchen.xlcs.order.mapper.OrderDeliverMapper;
 | 
			
		||||
import com.yovinchen.xlcs.order.service.OrderDeliverService;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 订单配送表 服务实现类
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class OrderDeliverServiceImpl extends ServiceImpl<OrderDeliverMapper, OrderDeliver> implements OrderDeliverService {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,532 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.service.impl;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.client.activity.ActivityFeignClient;
 | 
			
		||||
import com.yovinchen.xlcs.client.cart.CartFeignClient;
 | 
			
		||||
import com.yovinchen.xlcs.client.product.ProductFeignClient;
 | 
			
		||||
import com.yovinchen.xlcs.client.user.UserFeignClient;
 | 
			
		||||
import com.yovinchen.xlcs.common.auth.AuthContextHolder;
 | 
			
		||||
import com.yovinchen.xlcs.common.constant.RedisConst;
 | 
			
		||||
import com.yovinchen.xlcs.common.exception.xlcsException;
 | 
			
		||||
import com.yovinchen.xlcs.common.result.ResultCodeEnum;
 | 
			
		||||
import com.yovinchen.xlcs.common.utils.DateUtil;
 | 
			
		||||
import com.yovinchen.xlcs.enums.*;
 | 
			
		||||
import com.yovinchen.xlcs.model.activity.ActivityRule;
 | 
			
		||||
import com.yovinchen.xlcs.model.activity.CouponInfo;
 | 
			
		||||
import com.yovinchen.xlcs.model.order.CartInfo;
 | 
			
		||||
import com.yovinchen.xlcs.model.order.OrderInfo;
 | 
			
		||||
import com.yovinchen.xlcs.model.order.OrderItem;
 | 
			
		||||
import com.yovinchen.xlcs.enums.*;
 | 
			
		||||
import com.yovinchen.xlcs.mq.constant.MqConst;
 | 
			
		||||
import com.yovinchen.xlcs.mq.service.RabbitService;
 | 
			
		||||
import com.yovinchen.xlcs.order.mapper.OrderInfoMapper;
 | 
			
		||||
import com.yovinchen.xlcs.order.mapper.OrderItemMapper;
 | 
			
		||||
import com.yovinchen.xlcs.order.service.OrderInfoService;
 | 
			
		||||
import com.yovinchen.xlcs.order.service.OrderItemService;
 | 
			
		||||
import com.yovinchen.xlcs.vo.order.CartInfoVo;
 | 
			
		||||
import com.yovinchen.xlcs.vo.order.OrderConfirmVo;
 | 
			
		||||
import com.yovinchen.xlcs.vo.order.OrderSubmitVo;
 | 
			
		||||
import com.yovinchen.xlcs.vo.order.OrderUserQueryVo;
 | 
			
		||||
import com.yovinchen.xlcs.vo.product.SkuStockLockVo;
 | 
			
		||||
import com.yovinchen.xlcs.vo.user.LeaderAddressVo;
 | 
			
		||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 | 
			
		||||
import com.baomidou.mybatisplus.core.metadata.IPage;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.data.redis.core.BoundHashOperations;
 | 
			
		||||
import org.springframework.data.redis.core.RedisTemplate;
 | 
			
		||||
import org.springframework.data.redis.core.script.DefaultRedisScript;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
import org.springframework.util.CollectionUtils;
 | 
			
		||||
import org.springframework.util.StringUtils;
 | 
			
		||||
 | 
			
		||||
import java.math.BigDecimal;
 | 
			
		||||
import java.math.RoundingMode;
 | 
			
		||||
import java.util.*;
 | 
			
		||||
import java.util.concurrent.TimeUnit;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 订单 服务实现类
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo> implements OrderInfoService {
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private UserFeignClient userFeignClient;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private CartFeignClient cartFeignClient;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private ActivityFeignClient activityFeignClient;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private ProductFeignClient productFeignClient;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RedisTemplate redisTemplate;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private RabbitService rabbitService;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private OrderItemService orderItemService;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private OrderItemMapper orderItemMapper;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 确认订单
 | 
			
		||||
     *
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public OrderConfirmVo confirmOrder() {
 | 
			
		||||
        //获取用户id
 | 
			
		||||
        Long userId = AuthContextHolder.getUserId();
 | 
			
		||||
 | 
			
		||||
        //获取用户对应团长信息
 | 
			
		||||
        LeaderAddressVo leaderAddressVo = userFeignClient.getUserAddressByUserId(userId);
 | 
			
		||||
 | 
			
		||||
        //获取购物车里面选中的商品
 | 
			
		||||
        List<CartInfo> cartInfoList = cartFeignClient.getCartCheckedList(userId);
 | 
			
		||||
 | 
			
		||||
        //唯一标识订单
 | 
			
		||||
        String orderNo = System.currentTimeMillis() + "";
 | 
			
		||||
        redisTemplate.opsForValue().set(RedisConst.ORDER_REPEAT + orderNo, orderNo, 24, TimeUnit.HOURS);
 | 
			
		||||
 | 
			
		||||
        //获取购物车满足条件活动和优惠卷信息
 | 
			
		||||
        OrderConfirmVo orderConfirmVo = activityFeignClient.findCartActivityAndCoupon(cartInfoList, userId);
 | 
			
		||||
        //封装其他值
 | 
			
		||||
        orderConfirmVo.setLeaderAddressVo(leaderAddressVo);
 | 
			
		||||
        orderConfirmVo.setOrderNo(orderNo);
 | 
			
		||||
 | 
			
		||||
        return orderConfirmVo;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 生成订单
 | 
			
		||||
     *
 | 
			
		||||
     * @param orderParamVo
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public Long submitOrder(OrderSubmitVo orderParamVo) {
 | 
			
		||||
        //第一步 设置给哪个用户生成订单  设置orderParamVo的userId
 | 
			
		||||
        Long userId = AuthContextHolder.getUserId();
 | 
			
		||||
        orderParamVo.setUserId(userId);
 | 
			
		||||
 | 
			
		||||
        //第二步 订单不能重复提交,重复提交验证
 | 
			
		||||
        // 通过redis + lua脚本进行判断
 | 
			
		||||
        //// lua脚本保证原子性操作
 | 
			
		||||
        //1 获取传递过来的订单 orderNo
 | 
			
		||||
        String orderNo = orderParamVo.getOrderNo();
 | 
			
		||||
        if (StringUtils.isEmpty(orderNo)) {
 | 
			
		||||
            throw new xlcsException(ResultCodeEnum.ILLEGAL_REQUEST);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //2 拿着orderNo 到 redis进行查询,
 | 
			
		||||
        String script = "if(redis.call('get', KEYS[1]) == ARGV[1]) then return redis.call('del', KEYS[1]) else return 0 end";
 | 
			
		||||
        //3 如果redis有相同orderNo,表示正常提交订单,把redis的orderNo删除
 | 
			
		||||
        Boolean flag = (Boolean) redisTemplate.execute(new DefaultRedisScript(script, Boolean.class), Collections.singletonList(RedisConst.ORDER_REPEAT + orderNo), orderNo);
 | 
			
		||||
        //4 如果redis没有相同orderNo,表示重复提交了,不能再往后进行
 | 
			
		||||
        if (Boolean.FALSE.equals(flag)) {
 | 
			
		||||
            throw new xlcsException(ResultCodeEnum.REPEAT_SUBMIT);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //第三步 验证库存 并且 锁定库存
 | 
			
		||||
        // 比如仓库有10个西红柿,我想买2个西红柿
 | 
			
		||||
        // ** 验证库存,查询仓库里面是是否有充足西红柿
 | 
			
		||||
        // ** 库存充足,库存锁定 2锁定(目前没有真正减库存)
 | 
			
		||||
        //1、远程调用service-cart模块,获取当前用户购物车商品(选中的购物项)
 | 
			
		||||
        List<CartInfo> cartInfoList = cartFeignClient.getCartCheckedList(userId);
 | 
			
		||||
 | 
			
		||||
        //2、购物车有很多商品,商品不同类型,重点处理普通类型商品
 | 
			
		||||
        List<CartInfo> commonSkuList = cartInfoList.stream().filter(cartInfo -> Objects.equals(cartInfo.getSkuType(), SkuType.COMMON.getCode())).collect(Collectors.toList());
 | 
			
		||||
 | 
			
		||||
        //3、把获取购物车里面普通类型商品list集合,
 | 
			
		||||
        // List<CartInfo>转换List<SkuStockLockVo>
 | 
			
		||||
        if (!CollectionUtils.isEmpty(commonSkuList)) {
 | 
			
		||||
            List<SkuStockLockVo> commonStockLockVoList = commonSkuList.stream().map(item -> {
 | 
			
		||||
                SkuStockLockVo skuStockLockVo = new SkuStockLockVo();
 | 
			
		||||
                skuStockLockVo.setSkuId(item.getSkuId());
 | 
			
		||||
                skuStockLockVo.setSkuNum(item.getSkuNum());
 | 
			
		||||
                return skuStockLockVo;
 | 
			
		||||
            }).collect(Collectors.toList());
 | 
			
		||||
 | 
			
		||||
            //4、远程调用service-product模块实现锁定商品
 | 
			
		||||
            //// 验证库存并锁定库存,保证具备原子性
 | 
			
		||||
            Boolean isLockSuccess = productFeignClient.checkAndLock(commonStockLockVoList, orderNo);
 | 
			
		||||
            if (!isLockSuccess) {//库存锁定失败
 | 
			
		||||
                throw new xlcsException(ResultCodeEnum.ORDER_STOCK_FALL);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //第四步 下单过程
 | 
			
		||||
        //1 向两张表添加数据
 | 
			
		||||
        // order_info 和 order_item
 | 
			
		||||
        Long orderId = this.saveOrder(orderParamVo, cartInfoList);
 | 
			
		||||
 | 
			
		||||
        //下单完成,删除购物车记录
 | 
			
		||||
        //发送mq消息
 | 
			
		||||
        rabbitService.sendMessage(MqConst.EXCHANGE_ORDER_DIRECT, MqConst.ROUTING_DELETE_CART, orderParamVo.getUserId());
 | 
			
		||||
 | 
			
		||||
        //第五步 返回订单id
 | 
			
		||||
        return orderId;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //下单过程向两张表添加数据
 | 
			
		||||
    private Long saveOrder(OrderSubmitVo orderParamVo, List<CartInfo> cartInfoList) {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        if (CollectionUtils.isEmpty(cartInfoList)) {
 | 
			
		||||
            throw new xlcsException(ResultCodeEnum.DATA_ERROR);
 | 
			
		||||
        }
 | 
			
		||||
        //查询用户提货点和团长信息
 | 
			
		||||
        Long userId = AuthContextHolder.getUserId();
 | 
			
		||||
        LeaderAddressVo leaderAddressVo = userFeignClient.getUserAddressByUserId(userId);
 | 
			
		||||
        if (leaderAddressVo == null) {
 | 
			
		||||
            throw new xlcsException(ResultCodeEnum.DATA_ERROR);
 | 
			
		||||
        }
 | 
			
		||||
        //计算金额
 | 
			
		||||
        //营销活动金额
 | 
			
		||||
        Map<String, BigDecimal> activitySplitAmount = this.computeActivitySplitAmount(cartInfoList);
 | 
			
		||||
        //优惠卷金额
 | 
			
		||||
        Map<String, BigDecimal> couponInfoSplitAmount = this.computeCouponInfoSplitAmount(cartInfoList, orderParamVo.getCouponId());
 | 
			
		||||
 | 
			
		||||
        //封装订单项数据
 | 
			
		||||
        List<OrderItem> orderItemList = new ArrayList<>();
 | 
			
		||||
        for (CartInfo cartInfo : cartInfoList) {
 | 
			
		||||
            OrderItem orderItem = new OrderItem();
 | 
			
		||||
            orderItem.setId(null);
 | 
			
		||||
            orderItem.setCategoryId(cartInfo.getCategoryId());
 | 
			
		||||
            if (cartInfo.getSkuType() == SkuType.COMMON.getCode()) {
 | 
			
		||||
                orderItem.setSkuType(SkuType.COMMON);
 | 
			
		||||
            } else {
 | 
			
		||||
                orderItem.setSkuType(SkuType.SECKILL);
 | 
			
		||||
            }
 | 
			
		||||
            orderItem.setSkuId(cartInfo.getSkuId());
 | 
			
		||||
            orderItem.setSkuName(cartInfo.getSkuName());
 | 
			
		||||
            orderItem.setSkuPrice(cartInfo.getCartPrice());
 | 
			
		||||
            orderItem.setImgUrl(cartInfo.getImgUrl());
 | 
			
		||||
            orderItem.setSkuNum(cartInfo.getSkuNum());
 | 
			
		||||
            orderItem.setLeaderId(orderParamVo.getLeaderId());
 | 
			
		||||
            //营销活动金额
 | 
			
		||||
            BigDecimal activityAmount = activitySplitAmount.get("activity:" + orderItem.getSkuId());
 | 
			
		||||
            if (activityAmount == null) {
 | 
			
		||||
                activityAmount = new BigDecimal(0);
 | 
			
		||||
            }
 | 
			
		||||
            orderItem.setSplitActivityAmount(activityAmount);
 | 
			
		||||
 | 
			
		||||
            //优惠卷金额
 | 
			
		||||
            BigDecimal couponAmount = couponInfoSplitAmount.get("coupon:" + orderItem.getSkuId());
 | 
			
		||||
            if (couponAmount == null) {
 | 
			
		||||
                couponAmount = new BigDecimal(0);
 | 
			
		||||
            }
 | 
			
		||||
            orderItem.setSplitCouponAmount(couponAmount);
 | 
			
		||||
 | 
			
		||||
            //总金额
 | 
			
		||||
            BigDecimal skuTotalAmount = orderItem.getSkuPrice().multiply(new BigDecimal(orderItem.getSkuNum()));
 | 
			
		||||
            //优惠之后金额
 | 
			
		||||
            BigDecimal splitTotalAmount = skuTotalAmount.subtract(activityAmount).subtract(couponAmount);
 | 
			
		||||
            orderItem.setSplitTotalAmount(splitTotalAmount);
 | 
			
		||||
            orderItemList.add(orderItem);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //封装订单OrderInfo数据
 | 
			
		||||
        OrderInfo orderInfo = new OrderInfo();
 | 
			
		||||
        orderInfo.setUserId(userId);//用户id
 | 
			
		||||
        orderInfo.setOrderNo(orderParamVo.getOrderNo()); //订单号 唯一标识
 | 
			
		||||
        orderInfo.setOrderStatus(OrderStatus.UNPAID); //订单状态,生成成功未支付
 | 
			
		||||
        orderInfo.setLeaderId(orderParamVo.getLeaderId());//团长id
 | 
			
		||||
        orderInfo.setLeaderName(leaderAddressVo.getLeaderName());//团长名称
 | 
			
		||||
 | 
			
		||||
        orderInfo.setLeaderPhone(leaderAddressVo.getLeaderPhone());
 | 
			
		||||
        orderInfo.setTakeName(leaderAddressVo.getTakeName());
 | 
			
		||||
        orderInfo.setReceiverName(orderParamVo.getReceiverName());
 | 
			
		||||
        orderInfo.setReceiverPhone(orderParamVo.getReceiverPhone());
 | 
			
		||||
        orderInfo.setReceiverProvince(leaderAddressVo.getProvince());
 | 
			
		||||
        orderInfo.setReceiverCity(leaderAddressVo.getCity());
 | 
			
		||||
        orderInfo.setReceiverDistrict(leaderAddressVo.getDistrict());
 | 
			
		||||
        orderInfo.setReceiverAddress(leaderAddressVo.getDetailAddress());
 | 
			
		||||
        orderInfo.setWareId(cartInfoList.get(0).getWareId());
 | 
			
		||||
        orderInfo.setProcessStatus(ProcessStatus.UNPAID);
 | 
			
		||||
 | 
			
		||||
        //计算订单金额
 | 
			
		||||
        BigDecimal originalTotalAmount = this.computeTotalAmount(cartInfoList);
 | 
			
		||||
        BigDecimal activityAmount = activitySplitAmount.get("activity:total");
 | 
			
		||||
 | 
			
		||||
        if (null == activityAmount) activityAmount = new BigDecimal(0);
 | 
			
		||||
        BigDecimal couponAmount = couponInfoSplitAmount.get("coupon:total");
 | 
			
		||||
 | 
			
		||||
        if (null == couponAmount) couponAmount = new BigDecimal(0);
 | 
			
		||||
        BigDecimal totalAmount = originalTotalAmount.subtract(activityAmount).subtract(couponAmount);
 | 
			
		||||
        //计算订单金额
 | 
			
		||||
        orderInfo.setOriginalTotalAmount(originalTotalAmount);
 | 
			
		||||
        orderInfo.setActivityAmount(activityAmount);
 | 
			
		||||
        orderInfo.setCouponAmount(couponAmount);
 | 
			
		||||
        orderInfo.setTotalAmount(totalAmount);
 | 
			
		||||
 | 
			
		||||
        //计算团长佣金
 | 
			
		||||
        BigDecimal profitRate = new BigDecimal(0);//orderSetService.getProfitRate();
 | 
			
		||||
        BigDecimal commissionAmount = orderInfo.getTotalAmount().multiply(profitRate);
 | 
			
		||||
        orderInfo.setCommissionAmount(commissionAmount);
 | 
			
		||||
 | 
			
		||||
        //添加数据到订单基本信息表
 | 
			
		||||
        baseMapper.insert(orderInfo);
 | 
			
		||||
 | 
			
		||||
        //添加订单里面订单项
 | 
			
		||||
        orderItemList.forEach(orderItem -> {
 | 
			
		||||
            orderItem.setOrderId(orderInfo.getId());
 | 
			
		||||
            orderItemService.save(orderItem);
 | 
			
		||||
        });
 | 
			
		||||
        //如果当前订单使用优惠卷,更新优惠卷状态
 | 
			
		||||
        if (orderInfo.getCouponId() != null) {
 | 
			
		||||
            activityFeignClient.updateCouponInfoUseStatus(orderInfo.getCouponId(), userId, orderInfo.getId());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //下单成功,记录用户购物商品数量,redis
 | 
			
		||||
        //hash类型   key(userId)  -  field(skuId)-value(skuNum)
 | 
			
		||||
        String orderSkuKey = RedisConst.ORDER_SKU_MAP + orderParamVo.getUserId();
 | 
			
		||||
        BoundHashOperations<String, String, Integer> hashOperations = redisTemplate.boundHashOps(orderSkuKey);
 | 
			
		||||
        cartInfoList.forEach(cartInfo -> {
 | 
			
		||||
            if (Boolean.TRUE.equals(hashOperations.hasKey(cartInfo.getSkuId().toString()))) {
 | 
			
		||||
                Integer orderSkuNum = hashOperations.get(cartInfo.getSkuId().toString()) + cartInfo.getSkuNum();
 | 
			
		||||
                hashOperations.put(cartInfo.getSkuId().toString(), orderSkuNum);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        redisTemplate.expire(orderSkuKey, DateUtil.getCurrentExpireTimes(), TimeUnit.SECONDS);
 | 
			
		||||
        //订单id
 | 
			
		||||
        return orderInfo.getId();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取订单详情
 | 
			
		||||
     *
 | 
			
		||||
     * @param orderId
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public OrderInfo getOrderInfoById(Long orderId) {
 | 
			
		||||
        //根据orderId查询订单基本信息
 | 
			
		||||
        OrderInfo orderInfo = baseMapper.selectById(orderId);
 | 
			
		||||
 | 
			
		||||
        //根据orderId查询订单所有订单项list列表
 | 
			
		||||
        List<OrderItem> orderItemList = orderItemMapper.selectList(new LambdaQueryWrapper<OrderItem>().eq(OrderItem::getOrderId, orderInfo.getId()));
 | 
			
		||||
 | 
			
		||||
        //查询所有订单项封装到每个订单对象里面
 | 
			
		||||
        orderInfo.setOrderItemList(orderItemList);
 | 
			
		||||
        return orderInfo;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 根据orderNo查询订单信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param orderNo
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public OrderInfo getOrderInfoByOrderNo(String orderNo) {
 | 
			
		||||
        return baseMapper.selectOne(new LambdaQueryWrapper<OrderInfo>().eq(OrderInfo::getOrderNo, orderNo));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 订单支付成功,更新订单状态,扣减库存
 | 
			
		||||
     *
 | 
			
		||||
     * @param orderNo
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void orderPay(String orderNo) {
 | 
			
		||||
        //查询订单状态是否已经修改完成了支付状态
 | 
			
		||||
        OrderInfo orderInfo = this.getOrderInfoByOrderNo(orderNo);
 | 
			
		||||
        if (orderInfo == null || orderInfo.getOrderStatus() != OrderStatus.UNPAID) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        //更新状态
 | 
			
		||||
        this.updateOrderStatus(orderInfo.getId());
 | 
			
		||||
 | 
			
		||||
        //扣减库存
 | 
			
		||||
        rabbitService.sendMessage(MqConst.EXCHANGE_ORDER_DIRECT, MqConst.ROUTING_MINUS_STOCK, orderNo);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 订单查询
 | 
			
		||||
     *
 | 
			
		||||
     * @param pageParam
 | 
			
		||||
     * @param orderUserQueryVo
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public IPage<OrderInfo> getOrderInfoByUserIdPage(Page<OrderInfo> pageParam, OrderUserQueryVo orderUserQueryVo) {
 | 
			
		||||
        IPage<OrderInfo> pageModel = baseMapper.selectPage(pageParam, new LambdaQueryWrapper<OrderInfo>()
 | 
			
		||||
                .eq(OrderInfo::getUserId, orderUserQueryVo.getUserId())
 | 
			
		||||
                .eq(OrderInfo::getOrderStatus, orderUserQueryVo.getOrderStatus()));
 | 
			
		||||
 | 
			
		||||
        //获取每个订单,把每个订单里面订单项查询封装
 | 
			
		||||
        List<OrderInfo> orderInfoList = pageModel.getRecords();
 | 
			
		||||
        for (OrderInfo orderInfo : orderInfoList) {
 | 
			
		||||
            //根据订单id查询里面所有订单项列表
 | 
			
		||||
            List<OrderItem> orderItemList = orderItemMapper.selectList(new LambdaQueryWrapper<OrderItem>()
 | 
			
		||||
                    .eq(OrderItem::getOrderId, orderInfo.getId()));
 | 
			
		||||
            //把订单项集合封装到每个订单里面
 | 
			
		||||
            orderInfo.setOrderItemList(orderItemList);
 | 
			
		||||
            //封装订单状态名称
 | 
			
		||||
            orderInfo.getParam().put("orderStatusName", orderInfo.getOrderStatus().getComment());
 | 
			
		||||
        }
 | 
			
		||||
        return pageModel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //更新状态
 | 
			
		||||
    private void updateOrderStatus(Long id) {
 | 
			
		||||
        OrderInfo orderInfo = baseMapper.selectById(id);
 | 
			
		||||
        orderInfo.setOrderStatus(OrderStatus.WAITING_DELEVER);
 | 
			
		||||
        orderInfo.setProcessStatus(ProcessStatus.WAITING_DELEVER);
 | 
			
		||||
        baseMapper.updateById(orderInfo);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //计算总金额
 | 
			
		||||
    private BigDecimal computeTotalAmount(List<CartInfo> cartInfoList) {
 | 
			
		||||
        BigDecimal total = new BigDecimal(0);
 | 
			
		||||
        for (CartInfo cartInfo : cartInfoList) {
 | 
			
		||||
            BigDecimal itemTotal = cartInfo.getCartPrice().multiply(new BigDecimal(cartInfo.getSkuNum()));
 | 
			
		||||
            total = total.add(itemTotal);
 | 
			
		||||
        }
 | 
			
		||||
        return total;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 计算购物项分摊的优惠减少金额
 | 
			
		||||
     * 打折:按折扣分担
 | 
			
		||||
     * 现金:按比例分摊
 | 
			
		||||
     *
 | 
			
		||||
     * @param cartInfoParamList
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    private Map<String, BigDecimal> computeActivitySplitAmount(List<CartInfo> cartInfoParamList) {
 | 
			
		||||
        Map<String, BigDecimal> activitySplitAmountMap = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
        //促销活动相关信息
 | 
			
		||||
        List<CartInfoVo> cartInfoVoList = activityFeignClient.findCartActivityList(cartInfoParamList);
 | 
			
		||||
 | 
			
		||||
        //活动总金额
 | 
			
		||||
        BigDecimal activityReduceAmount = new BigDecimal(0);
 | 
			
		||||
        if (!CollectionUtils.isEmpty(cartInfoVoList)) {
 | 
			
		||||
            for (CartInfoVo cartInfoVo : cartInfoVoList) {
 | 
			
		||||
                ActivityRule activityRule = cartInfoVo.getActivityRule();
 | 
			
		||||
                List<CartInfo> cartInfoList = cartInfoVo.getCartInfoList();
 | 
			
		||||
                if (null != activityRule) {
 | 
			
		||||
                    //优惠金额, 按比例分摊
 | 
			
		||||
                    BigDecimal reduceAmount = activityRule.getReduceAmount();
 | 
			
		||||
                    activityReduceAmount = activityReduceAmount.add(reduceAmount);
 | 
			
		||||
                    if (cartInfoList.size() == 1) {
 | 
			
		||||
                        activitySplitAmountMap.put("activity:" + cartInfoList.get(0).getSkuId(), reduceAmount);
 | 
			
		||||
                    } else {
 | 
			
		||||
                        //总金额
 | 
			
		||||
                        BigDecimal originalTotalAmount = new BigDecimal(0);
 | 
			
		||||
                        for (CartInfo cartInfo : cartInfoList) {
 | 
			
		||||
                            BigDecimal skuTotalAmount = cartInfo.getCartPrice().multiply(new BigDecimal(cartInfo.getSkuNum()));
 | 
			
		||||
                            originalTotalAmount = originalTotalAmount.add(skuTotalAmount);
 | 
			
		||||
                        }
 | 
			
		||||
                        //记录除最后一项是所有分摊金额, 最后一项=总的 - skuPartReduceAmount
 | 
			
		||||
                        BigDecimal skuPartReduceAmount = new BigDecimal(0);
 | 
			
		||||
                        if (activityRule.getActivityType() == ActivityType.FULL_REDUCTION) {
 | 
			
		||||
                            for (int i = 0, len = cartInfoList.size(); i < len; i++) {
 | 
			
		||||
                                CartInfo cartInfo = cartInfoList.get(i);
 | 
			
		||||
                                if (i < len - 1) {
 | 
			
		||||
                                    BigDecimal skuTotalAmount = cartInfo.getCartPrice().multiply(new BigDecimal(cartInfo.getSkuNum()));
 | 
			
		||||
                                    //sku分摊金额
 | 
			
		||||
                                    BigDecimal skuReduceAmount = skuTotalAmount.divide(originalTotalAmount, 2, RoundingMode.HALF_UP).multiply(reduceAmount);
 | 
			
		||||
                                    activitySplitAmountMap.put("activity:" + cartInfo.getSkuId(), skuReduceAmount);
 | 
			
		||||
 | 
			
		||||
                                    skuPartReduceAmount = skuPartReduceAmount.add(skuReduceAmount);
 | 
			
		||||
                                } else {
 | 
			
		||||
                                    BigDecimal skuReduceAmount = reduceAmount.subtract(skuPartReduceAmount);
 | 
			
		||||
                                    activitySplitAmountMap.put("activity:" + cartInfo.getSkuId(), skuReduceAmount);
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                        } else {
 | 
			
		||||
                            for (int i = 0, len = cartInfoList.size(); i < len; i++) {
 | 
			
		||||
                                CartInfo cartInfo = cartInfoList.get(i);
 | 
			
		||||
                                if (i < len - 1) {
 | 
			
		||||
                                    BigDecimal skuTotalAmount = cartInfo.getCartPrice().multiply(new BigDecimal(cartInfo.getSkuNum()));
 | 
			
		||||
 | 
			
		||||
                                    //sku分摊金额
 | 
			
		||||
                                    BigDecimal skuDiscountTotalAmount = skuTotalAmount.multiply(activityRule.getBenefitDiscount().divide(new BigDecimal("10")));
 | 
			
		||||
                                    BigDecimal skuReduceAmount = skuTotalAmount.subtract(skuDiscountTotalAmount);
 | 
			
		||||
                                    activitySplitAmountMap.put("activity:" + cartInfo.getSkuId(), skuReduceAmount);
 | 
			
		||||
 | 
			
		||||
                                    skuPartReduceAmount = skuPartReduceAmount.add(skuReduceAmount);
 | 
			
		||||
                                } else {
 | 
			
		||||
                                    BigDecimal skuReduceAmount = reduceAmount.subtract(skuPartReduceAmount);
 | 
			
		||||
                                    activitySplitAmountMap.put("activity:" + cartInfo.getSkuId(), skuReduceAmount);
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        activitySplitAmountMap.put("activity:total", activityReduceAmount);
 | 
			
		||||
        return activitySplitAmountMap;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //优惠卷优惠金额
 | 
			
		||||
    private Map<String, BigDecimal> computeCouponInfoSplitAmount(List<CartInfo> cartInfoList, Long couponId) {
 | 
			
		||||
        Map<String, BigDecimal> couponInfoSplitAmountMap = new HashMap<>();
 | 
			
		||||
 | 
			
		||||
        if (null == couponId) return couponInfoSplitAmountMap;
 | 
			
		||||
        CouponInfo couponInfo = activityFeignClient.findRangeSkuIdList(cartInfoList, couponId);
 | 
			
		||||
 | 
			
		||||
        if (null != couponInfo) {
 | 
			
		||||
            //sku对应的订单明细
 | 
			
		||||
            Map<Long, CartInfo> skuIdToCartInfoMap = new HashMap<>();
 | 
			
		||||
            for (CartInfo cartInfo : cartInfoList) {
 | 
			
		||||
                skuIdToCartInfoMap.put(cartInfo.getSkuId(), cartInfo);
 | 
			
		||||
            }
 | 
			
		||||
            //优惠券对应的skuId列表
 | 
			
		||||
            List<Long> skuIdList = couponInfo.getSkuIdList();
 | 
			
		||||
            if (CollectionUtils.isEmpty(skuIdList)) {
 | 
			
		||||
                return couponInfoSplitAmountMap;
 | 
			
		||||
            }
 | 
			
		||||
            //优惠券优化总金额
 | 
			
		||||
            BigDecimal reduceAmount = couponInfo.getAmount();
 | 
			
		||||
            if (skuIdList.size() == 1) {
 | 
			
		||||
                //sku的优化金额
 | 
			
		||||
                couponInfoSplitAmountMap.put("coupon:" + skuIdToCartInfoMap.get(skuIdList.get(0)).getSkuId(), reduceAmount);
 | 
			
		||||
            } else {
 | 
			
		||||
                //总金额
 | 
			
		||||
                BigDecimal originalTotalAmount = new BigDecimal(0);
 | 
			
		||||
                for (Long skuId : skuIdList) {
 | 
			
		||||
                    CartInfo cartInfo = skuIdToCartInfoMap.get(skuId);
 | 
			
		||||
                    BigDecimal skuTotalAmount = cartInfo.getCartPrice().multiply(new BigDecimal(cartInfo.getSkuNum()));
 | 
			
		||||
                    originalTotalAmount = originalTotalAmount.add(skuTotalAmount);
 | 
			
		||||
                }
 | 
			
		||||
                //记录除最后一项是所有分摊金额, 最后一项=总的 - skuPartReduceAmount
 | 
			
		||||
                BigDecimal skuPartReduceAmount = new BigDecimal(0);
 | 
			
		||||
                if (couponInfo.getCouponType() == CouponType.CASH || couponInfo.getCouponType() == CouponType.FULL_REDUCTION) {
 | 
			
		||||
                    for (int i = 0, len = skuIdList.size(); i < len; i++) {
 | 
			
		||||
                        CartInfo cartInfo = skuIdToCartInfoMap.get(skuIdList.get(i));
 | 
			
		||||
                        if (i < len - 1) {
 | 
			
		||||
                            BigDecimal skuTotalAmount = cartInfo.getCartPrice().multiply(new BigDecimal(cartInfo.getSkuNum()));
 | 
			
		||||
                            //sku分摊金额
 | 
			
		||||
                            BigDecimal skuReduceAmount = skuTotalAmount.divide(originalTotalAmount, 2, RoundingMode.HALF_UP).multiply(reduceAmount);
 | 
			
		||||
                            couponInfoSplitAmountMap.put("coupon:" + cartInfo.getSkuId(), skuReduceAmount);
 | 
			
		||||
 | 
			
		||||
                            skuPartReduceAmount = skuPartReduceAmount.add(skuReduceAmount);
 | 
			
		||||
                        } else {
 | 
			
		||||
                            BigDecimal skuReduceAmount = reduceAmount.subtract(skuPartReduceAmount);
 | 
			
		||||
                            couponInfoSplitAmountMap.put("coupon:" + cartInfo.getSkuId(), skuReduceAmount);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            couponInfoSplitAmountMap.put("coupon:total", couponInfo.getAmount());
 | 
			
		||||
        }
 | 
			
		||||
        return couponInfoSplitAmountMap;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,20 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.service.impl;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.OrderItem;
 | 
			
		||||
import com.yovinchen.xlcs.order.mapper.OrderItemMapper;
 | 
			
		||||
import com.yovinchen.xlcs.order.service.OrderItemService;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 订单项信息 服务实现类
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class OrderItemServiceImpl extends ServiceImpl<OrderItemMapper, OrderItem> implements OrderItemService {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,20 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.service.impl;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.OrderLog;
 | 
			
		||||
import com.yovinchen.xlcs.order.mapper.OrderLogMapper;
 | 
			
		||||
import com.yovinchen.xlcs.order.service.OrderLogService;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 订单操作日志记录 服务实现类
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class OrderLogServiceImpl extends ServiceImpl<OrderLogMapper, OrderLog> implements OrderLogService {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,20 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.service.impl;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.OrderReturnApply;
 | 
			
		||||
import com.yovinchen.xlcs.order.mapper.OrderReturnApplyMapper;
 | 
			
		||||
import com.yovinchen.xlcs.order.service.OrderReturnApplyService;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 订单退货申请 服务实现类
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class OrderReturnApplyServiceImpl extends ServiceImpl<OrderReturnApplyMapper, OrderReturnApply> implements OrderReturnApplyService {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,20 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.service.impl;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.OrderReturnReason;
 | 
			
		||||
import com.yovinchen.xlcs.order.mapper.OrderReturnReasonMapper;
 | 
			
		||||
import com.yovinchen.xlcs.order.service.OrderReturnReasonService;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 退货原因表 服务实现类
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class OrderReturnReasonServiceImpl extends ServiceImpl<OrderReturnReasonMapper, OrderReturnReason> implements OrderReturnReasonService {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,20 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.service.impl;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.OrderSet;
 | 
			
		||||
import com.yovinchen.xlcs.order.mapper.OrderSetMapper;
 | 
			
		||||
import com.yovinchen.xlcs.order.service.OrderSetService;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 订单设置表 服务实现类
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class OrderSetServiceImpl extends ServiceImpl<OrderSetMapper, OrderSet> implements OrderSetService {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,20 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.service.impl;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.PaymentInfo;
 | 
			
		||||
import com.yovinchen.xlcs.order.mapper.PaymentInfoMapper;
 | 
			
		||||
import com.yovinchen.xlcs.order.service.PaymentInfoService;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 支付信息表 服务实现类
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class PaymentInfoServiceImpl extends ServiceImpl<PaymentInfoMapper, PaymentInfo> implements PaymentInfoService {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,20 @@
 | 
			
		||||
package com.yovinchen.xlcs.order.service.impl;
 | 
			
		||||
 | 
			
		||||
import com.yovinchen.xlcs.model.order.RefundInfo;
 | 
			
		||||
import com.yovinchen.xlcs.order.mapper.RefundInfoMapper;
 | 
			
		||||
import com.yovinchen.xlcs.order.service.RefundInfoService;
 | 
			
		||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * <p>
 | 
			
		||||
 * 退款信息表 服务实现类
 | 
			
		||||
 * </p>
 | 
			
		||||
 *
 | 
			
		||||
 * @author yovinchen
 | 
			
		||||
 * @since 2023-10-12
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class RefundInfoServiceImpl extends ServiceImpl<RefundInfoMapper, RefundInfo> implements RefundInfoService {
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,11 @@
 | 
			
		||||
server:
 | 
			
		||||
  port: 8209
 | 
			
		||||
spring:
 | 
			
		||||
  application:
 | 
			
		||||
    name: service-order
 | 
			
		||||
  cloud:
 | 
			
		||||
    nacos:
 | 
			
		||||
      discovery:
 | 
			
		||||
        server-addr: 82.157.68.223:8848
 | 
			
		||||
        username: nacos
 | 
			
		||||
        password: nacos
 | 
			
		||||
@@ -0,0 +1,24 @@
 | 
			
		||||
spring:
 | 
			
		||||
  cloud:
 | 
			
		||||
    nacos:
 | 
			
		||||
      config:
 | 
			
		||||
        namespace: dd5265c5-8290-45bc-9d07-395c14c977d3
 | 
			
		||||
        server-addr: 82.157.68.223:8848
 | 
			
		||||
        group: service
 | 
			
		||||
        username: nacos
 | 
			
		||||
        password: nacos
 | 
			
		||||
        enabled: true
 | 
			
		||||
        file-extension: yml
 | 
			
		||||
        extension-configs:
 | 
			
		||||
          - data-id: common.yml
 | 
			
		||||
            group: common
 | 
			
		||||
            refresh: true
 | 
			
		||||
          - data-id: service-redis.yml
 | 
			
		||||
            group: common
 | 
			
		||||
            refresh: true
 | 
			
		||||
          - data-id: service-rabbitmq.yml
 | 
			
		||||
            group: common
 | 
			
		||||
            refresh: true
 | 
			
		||||
          - data-id: service-openfeign.yml
 | 
			
		||||
            group: common
 | 
			
		||||
            refresh: true
 | 
			
		||||
		Reference in New Issue
	
	Block a user