969 lines
39 KiB
Java
969 lines
39 KiB
Java
package com.peanut.modules.book.controller;
|
||
|
||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||
import com.peanut.common.utils.PageUtils;
|
||
import com.peanut.common.utils.R;
|
||
import com.peanut.config.Constants;
|
||
import com.peanut.config.DelayQueueConfig;
|
||
import com.peanut.modules.book.entity.*;
|
||
import com.peanut.modules.book.service.*;
|
||
import com.peanut.modules.book.to.UserOrderDto;
|
||
import com.peanut.modules.book.vo.UserAddressVo;
|
||
import com.peanut.modules.book.vo.request.BuyOrderListRequestVo;
|
||
import com.peanut.modules.book.vo.request.ModifyOrderAddressRequestVo;
|
||
import com.peanut.modules.book.vo.request.ProductRequestVo;
|
||
import com.peanut.modules.book.vo.request.ProductTransportVo;
|
||
import com.peanut.modules.book.vo.response.BuyOrderResponseVo;
|
||
import com.peanut.modules.book.vo.response.ExpressQueryResponseVo;
|
||
import com.peanut.modules.book.vo.response.OrderAddressResponseVo;
|
||
import com.peanut.modules.pay.weChatPay.dto.WechatPaymentInfo;
|
||
import com.peanut.modules.pay.weChatPay.service.WxpayService;
|
||
import com.peanut.modules.sys.entity.SysConfigEntity;
|
||
import com.peanut.modules.sys.service.SysConfigService;
|
||
import lombok.extern.slf4j.Slf4j;
|
||
import org.springframework.amqp.core.MessagePostProcessor;
|
||
import org.springframework.amqp.rabbit.core.RabbitTemplate;
|
||
import org.springframework.beans.factory.annotation.Autowired;
|
||
import org.springframework.transaction.annotation.Transactional;
|
||
import org.springframework.web.bind.annotation.*;
|
||
|
||
import java.io.IOException;
|
||
import java.math.BigDecimal;
|
||
import java.math.MathContext;
|
||
import java.math.RoundingMode;
|
||
import java.util.*;
|
||
import java.util.stream.Collectors;
|
||
|
||
|
||
/**
|
||
* 订单表
|
||
*
|
||
* @author yl
|
||
* @email yl328572838@163.com
|
||
* @date 2022-08-29 15:27:44
|
||
*/
|
||
@Slf4j
|
||
@RestController
|
||
@RequestMapping("book/buyOrder")
|
||
public class BuyOrderController {
|
||
@Autowired
|
||
private BuyOrderService buyOrderService;
|
||
@Autowired
|
||
private ShopProductService shopProductService;
|
||
@Autowired
|
||
private BuyOrderDetailService buyOrderDetailService;
|
||
@Autowired
|
||
private CouponService couponService;
|
||
@Autowired
|
||
private CouponHistoryService couponHistoryService;
|
||
@Autowired
|
||
private OrderCartService orderCartService;
|
||
@Autowired
|
||
private MyUserService myUserService;
|
||
@Autowired
|
||
private TransactionDetailsService transactionDetailsService;
|
||
@Autowired
|
||
private UserEbookBuyService userEbookBuyService;
|
||
@Autowired
|
||
private WxpayService wxpayService;
|
||
@Autowired
|
||
private RabbitTemplate rabbitTemplate;
|
||
@Autowired
|
||
private ShopProductBookService shopProductBookService;
|
||
@Autowired
|
||
private ExpressOrderService expressOrderService;
|
||
@Autowired
|
||
private UserAddressService userAddressService;
|
||
@Autowired
|
||
private ExpressFeeService expressFeeService;
|
||
@Autowired
|
||
private SysConfigService sysConfigService;
|
||
@Autowired
|
||
private BuyOrderProductService buyOrderProductService;
|
||
@Autowired
|
||
private ProvinceService provinceService;
|
||
@Autowired
|
||
private CityService cityService;
|
||
@Autowired
|
||
private CountyService countyService;
|
||
|
||
@RequestMapping(value = "/decomposeShipment", method = RequestMethod.POST)
|
||
public R decomposeShipment(@RequestBody BuyOrderListRequestVo requestVo) {
|
||
Map<String, Object> result = buyOrderService.decomposeShipment(requestVo);
|
||
return R.ok().put("result", result);
|
||
}
|
||
|
||
|
||
// TODO 新版本上线后废弃
|
||
@RequestMapping("/list")
|
||
public R list(@RequestParam Map<String, Object> params) throws Exception {
|
||
PageUtils page = buyOrderService.list(params);
|
||
return R.ok().put("page", page);
|
||
}
|
||
|
||
/**
|
||
* 订单列表
|
||
*
|
||
* @param requestVo request value object
|
||
* @return R
|
||
*/
|
||
@RequestMapping(path = "/orderList", method = RequestMethod.POST)
|
||
public R orderList(@RequestBody BuyOrderListRequestVo requestVo) {
|
||
Map<String, Object> result = buyOrderService.orderList(requestVo);
|
||
return R.ok().put("result", result);
|
||
}
|
||
|
||
/**
|
||
* 获取用户订单列表
|
||
* @param userOrderDto
|
||
* @return
|
||
*/
|
||
@RequestMapping("/getUserOrderList")
|
||
public R getUserOrderList(@RequestBody UserOrderDto userOrderDto){
|
||
Page<BuyOrder> userOrderList = buyOrderService.getUserOrderList(userOrderDto);
|
||
return R.ok().put("page",userOrderList);
|
||
}
|
||
|
||
/**
|
||
* 获取用户订单各个状态的数量
|
||
* @param map
|
||
* @return
|
||
*/
|
||
@RequestMapping("/getUserOrderStatusNum")
|
||
public R getUserOrderStatusNum(@RequestBody Map<String,Object> map){
|
||
Integer userId = Integer.valueOf(map.get("userId").toString());
|
||
List<BuyOrder> userOrderStatusNum = buyOrderService.getUserOrderStatusNum(userId);
|
||
Map<String, Integer> m = new HashMap<>();
|
||
for (BuyOrder b : userOrderStatusNum){
|
||
m.put(b.getOrderStatus().toString(),b.getStatusNum());
|
||
}
|
||
return R.ok().put("map",m);
|
||
}
|
||
|
||
/**
|
||
* 订单详情
|
||
*
|
||
* @param orderSn 订单号
|
||
* @return R
|
||
*/
|
||
@RequestMapping(path = "/orderDetail", method = RequestMethod.GET)
|
||
public R orderDetail(@RequestParam("orderSn") String orderSn) {
|
||
BuyOrderResponseVo buyOrderResponseVo = buyOrderService.orderDetail(orderSn);
|
||
return R.ok().put("result", buyOrderResponseVo);
|
||
}
|
||
|
||
/**
|
||
* 下单
|
||
* TODO 原下单接口,新版本上线后废弃
|
||
*
|
||
* @param buyOrder 订单
|
||
* @return R
|
||
*/
|
||
@RequestMapping("/buySave")
|
||
@Transactional
|
||
public R buySave(@RequestBody BuyOrder buyOrder) throws IOException {
|
||
|
||
return R.error("app版本太低请升级后再购买!!");
|
||
// 获取订单详情
|
||
// List<BuyOrderDetail> buyOrderDetails = buyOrder.getProducts();
|
||
// // 订单总金额
|
||
// BigDecimal totalPrice = new BigDecimal(0);
|
||
// // 遍历商品总价计算
|
||
// for (BuyOrderDetail buyOrderDetail : buyOrderDetails) {
|
||
// Integer productId = buyOrderDetail.getProductId();
|
||
// int quantity = buyOrderDetail.getQuantity();
|
||
// ShopProduct product = shopProductService.getById(productId);
|
||
// BigDecimal price = getRealPrice(product);
|
||
// if (!handleStock(buyOrderDetail, product)) {
|
||
// return R.error(500, "库存不足");
|
||
// }
|
||
// totalPrice = totalPrice.add(price.multiply(BigDecimal.valueOf(quantity)));
|
||
// buyOrderDetail.setProductName(product.getProductName());
|
||
// buyOrderDetail.setProductPrice(product.getPrice());
|
||
// int originWeight = product.getWeight();
|
||
// int originWeightIntValue = originWeight / 100;
|
||
// int originWeightDecimalValue = originWeightIntValue % 100;
|
||
// buyOrderDetail.setWeight(BigDecimal.valueOf(originWeightIntValue).add(BigDecimal.valueOf(originWeightDecimalValue).divide(new BigDecimal(100),
|
||
// MathContext.DECIMAL64)));
|
||
// buyOrderDetail.setProductUrl(product.getProductImages());
|
||
// buyOrderDetail.setOrderStatus(Constants.ORDER_STATUS_TO_BE_PAID);
|
||
// }
|
||
//
|
||
// totalPrice = totalPrice.subtract(useCouponAmount(buyOrder));
|
||
// totalPrice = totalPrice.add(getShoppingAmount(buyOrder));
|
||
// String orderSn = IdWorker.getTimeId().substring(0, 32);
|
||
// buyOrder.setOrderSn(orderSn);
|
||
// buyOrder.setPaymentDate(new Date());
|
||
// QueryWrapper<UserAddress> queryWrapper = new QueryWrapper<>();
|
||
// queryWrapper.eq("id", buyOrder.getAddressId());
|
||
// UserAddress userAddress = userAddressService.getOne(queryWrapper);
|
||
// UserAddressVo vo = new UserAddressVo();
|
||
// vo = userAddressService.getAddressName(vo, userAddress.getRegionCode());
|
||
// buyOrder.setProvince(vo.getProvince());
|
||
// buyOrder.setCity(vo.getCity());
|
||
// buyOrder.setDistrict(vo.getCounty());
|
||
// buyOrder.setAddress(vo.getDetailAddress());
|
||
// buyOrderService.save(buyOrder);
|
||
//
|
||
// for (BuyOrderDetail buyOrderDetail : buyOrderDetails) {
|
||
// buyOrderDetail.setOrderId(buyOrder.getOrderId());
|
||
// buyOrderDetail.setUserId(buyOrder.getUserId());
|
||
// if (Constants.BUY_TYPE_CART.equals(buyOrder.getBuyType())) {
|
||
// handleBuyCart(buyOrder, buyOrderDetail);
|
||
// }
|
||
// }
|
||
// buyOrderDetailService.saveBatch(buyOrderDetails);
|
||
// // 1. 虚拟币支付
|
||
// if (Constants.PAYMENT_METHOD_VIRTUAL.equals(buyOrder.getPaymentMethod())) {
|
||
// buyOrder.setOrderStatus(Constants.ORDER_STATUS_TO_BE_SHIPPED);
|
||
// MyUserEntity user = this.myUserService.getById(buyOrder.getUserId());
|
||
// if (usePeanutCoin(user, totalPrice)) {
|
||
// // 更新订单状态
|
||
// buyOrderService.updateOrderStatus(user.getId(), buyOrder.getOrderSn(), "0");
|
||
// recordTransaction(buyOrder, user, totalPrice);
|
||
// addEbookToUser(buyOrderDetails, buyOrder);
|
||
// } else {
|
||
// return R.error(500, "花生币余额不足!");
|
||
// }
|
||
// }
|
||
// // 2. 微信支付
|
||
// if (Constants.PAYMENT_METHOD_WECHAT_PAY.equals(buyOrder.getPaymentMethod())) {
|
||
// rabbitTemplate.convertAndSend(
|
||
// DelayQueueConfig.ORDER_TO_BE_PAY_EXCHANGE,
|
||
// DelayQueueConfig.ORDER_TO_BE_PAY_ROUTING_KEY,
|
||
// buyOrder.getOrderId(),
|
||
// messagePostProcessor()
|
||
// );
|
||
// WechatPaymentInfo paymentInfo = new WechatPaymentInfo();
|
||
// paymentInfo.setOrderSn(orderSn);
|
||
// paymentInfo.setBuyOrderId(buyOrder.getOrderId());
|
||
// paymentInfo.setTotalAmount(totalPrice);
|
||
// wxpayService.prepay(paymentInfo);
|
||
// }
|
||
// Map<String, Object> result = new HashMap<>();
|
||
// result.put("orderSn", buyOrder.getOrderSn());
|
||
// result.put("money", totalPrice);
|
||
// return R.ok(result);
|
||
}
|
||
|
||
/**
|
||
* 下单
|
||
*
|
||
* @param buyOrder
|
||
* @return
|
||
* @throws IOException
|
||
*/
|
||
@RequestMapping(value = "/placeOrder", method = RequestMethod.POST)
|
||
@Transactional
|
||
public R placeOrder(@RequestBody BuyOrder buyOrder) throws IOException {
|
||
List<BuyOrderProduct> buyOrderProductList = buyOrder.getProductList();
|
||
// 订单总金额
|
||
BigDecimal totalPrice = new BigDecimal(0);
|
||
//是否存在手摸或脚模
|
||
List<Integer> sjc =Arrays.asList(128,129,130,131);
|
||
boolean sj_check = false;
|
||
|
||
// 遍历商品总价计算
|
||
for (BuyOrderProduct buyOrderProduct : buyOrderProductList) {
|
||
if(sjc.contains(buyOrderProduct.getProductId())){
|
||
sj_check = true;
|
||
}
|
||
|
||
Integer productId = buyOrderProduct.getProductId();
|
||
int quantity = buyOrderProduct.getQuantity();
|
||
ShopProduct product = shopProductService.getById(productId);
|
||
BigDecimal price = getRealPrice(product);
|
||
if (!handleStock(buyOrderProduct, product)) {
|
||
return R.error(500, "库存不足");
|
||
}
|
||
totalPrice = totalPrice.add(price.multiply(BigDecimal.valueOf(quantity)));
|
||
}
|
||
|
||
totalPrice = totalPrice.subtract(useCouponAmount(buyOrder));
|
||
totalPrice = totalPrice.add(getShoppingAmount(buyOrder));
|
||
String orderSn = IdWorker.getTimeId().substring(0, 32);
|
||
buyOrder.setOrderSn(orderSn);
|
||
QueryWrapper<UserAddress> queryWrapper = new QueryWrapper<>();
|
||
queryWrapper.eq("id", buyOrder.getAddressId());
|
||
UserAddress userAddress = userAddressService.getOne(queryWrapper);
|
||
UserAddressVo vo = new UserAddressVo();
|
||
vo = userAddressService.getAddressName(vo, userAddress.getRegionCode());
|
||
buyOrder.setProvince(vo.getProvince());
|
||
buyOrder.setCity(vo.getCity());
|
||
buyOrder.setDistrict(vo.getCounty());
|
||
buyOrder.setAddress(userAddress.getDetailAddress());
|
||
buyOrderService.save(buyOrder);
|
||
|
||
//解决购物车相关问题
|
||
for (BuyOrderProduct buyOrderProduct : buyOrderProductList) {
|
||
buyOrderProduct.setOrderId(buyOrder.getOrderId());
|
||
if (Constants.BUY_TYPE_CART.equals(buyOrder.getBuyType())) {
|
||
handleBuyCart(buyOrder, buyOrderProduct);
|
||
}
|
||
}
|
||
buyOrderProductService.saveBatch(buyOrderProductList);
|
||
// 1. 虚拟币支付
|
||
if (Constants.PAYMENT_METHOD_VIRTUAL.equals(buyOrder.getPaymentMethod())) {
|
||
buyOrder.setOrderStatus(Constants.ORDER_STATUS_TO_BE_SHIPPED);
|
||
MyUserEntity user = this.myUserService.getById(buyOrder.getUserId());
|
||
if (usePeanutCoin(user, totalPrice,sj_check)) {
|
||
// 更新订单状态
|
||
buyOrderService.updateOrderStatus(user.getId(), buyOrder.getOrderSn(), "0");
|
||
recordTransaction(buyOrder, user, totalPrice);
|
||
addEbookToUser(buyOrderProductList, buyOrder, 0);
|
||
} else {
|
||
return R.error(500, "花生币余额不足!");
|
||
}
|
||
}
|
||
// 2. 微信支付,需要预支付
|
||
if (Constants.PAYMENT_METHOD_WECHAT_PAY.equals(buyOrder.getPaymentMethod())) {
|
||
rabbitTemplate.convertAndSend(
|
||
DelayQueueConfig.ORDER_TO_BE_PAY_EXCHANGE,
|
||
DelayQueueConfig.ORDER_TO_BE_PAY_ROUTING_KEY,
|
||
buyOrder.getOrderId(),
|
||
messagePostProcessor()
|
||
);
|
||
WechatPaymentInfo paymentInfo = new WechatPaymentInfo();
|
||
paymentInfo.setOrderSn(orderSn);
|
||
paymentInfo.setBuyOrderId(buyOrder.getOrderId());
|
||
paymentInfo.setTotalAmount(totalPrice);
|
||
wxpayService.prepay(paymentInfo);
|
||
}
|
||
Map<String, Object> result = new HashMap<>();
|
||
result.put("orderSn", buyOrder.getOrderSn());
|
||
result.put("money", totalPrice);
|
||
return R.ok(result);
|
||
}
|
||
|
||
@RequestMapping("/llll")
|
||
public R ls(){
|
||
|
||
LambdaQueryWrapper<BuyOrder> wrapper = new LambdaQueryWrapper<>();
|
||
ArrayList<Integer> integers = new ArrayList<>();
|
||
integers.add(1);
|
||
integers.add(2);
|
||
integers.add(3);
|
||
wrapper.in(BuyOrder::getOrderStatus,integers);
|
||
wrapper.eq(BuyOrder::getOrderType,"order");
|
||
List<BuyOrder> list = buyOrderService.list(wrapper);
|
||
for (BuyOrder b : list){
|
||
List<Integer> orderBookId = shopProductBookService.getOrderBookId(b.getOrderSn());
|
||
System.out.println(orderBookId);
|
||
userEbookBuyService.addBookForUser(b.getUserId(),orderBookId);
|
||
}
|
||
|
||
return R.ok();
|
||
}
|
||
|
||
@RequestMapping("/llll1")
|
||
public R ls1(){
|
||
Integer[] is = {128,129,130};
|
||
List<Integer> collect = buyOrderProductService.getBaseMapper().selectList(new LambdaQueryWrapper<BuyOrderProduct>().in(BuyOrderProduct::getProductId, is)).stream().map(BuyOrderProduct::getOrderId).collect(Collectors.toList());
|
||
|
||
LambdaQueryWrapper<BuyOrder> wrapper = new LambdaQueryWrapper<>();
|
||
ArrayList<Integer> integers = new ArrayList<>();
|
||
integers.add(1);
|
||
integers.add(2);
|
||
integers.add(3);
|
||
wrapper.in(BuyOrder::getOrderStatus,integers);
|
||
wrapper.in(BuyOrder::getOrderId,collect);
|
||
wrapper.eq(BuyOrder::getOrderType,"order");
|
||
List<BuyOrder> list = buyOrderService.list(wrapper);
|
||
for (BuyOrder b : list){
|
||
MyUserEntity byId = myUserService.getById(b.getUserId());
|
||
byId.setPointPower(1);
|
||
myUserService.updateById(byId);
|
||
}
|
||
|
||
return R.ok();
|
||
}
|
||
|
||
/**
|
||
* 计算运费
|
||
*
|
||
* @param vo
|
||
* @return
|
||
*/
|
||
@RequestMapping(path = "/calculateTransportPrice", method = RequestMethod.POST)
|
||
public R getTransportPrice(@RequestBody ProductTransportVo vo) {
|
||
//商品列表和收货区域编码
|
||
String regionCode = vo.getRegionCode();
|
||
List<ProductRequestVo> products = vo.getProducts();
|
||
//查询默认快递公司代码 defaultExpress.getParamValue()
|
||
QueryWrapper<SysConfigEntity> configQueryWrapper = new QueryWrapper<>();
|
||
configQueryWrapper.eq("param_key", "DEFAULT_EXPRESS");
|
||
SysConfigEntity defaultExpress = sysConfigService.getOne(configQueryWrapper);
|
||
if (defaultExpress == null) {
|
||
return R.error("未设置默认快递");
|
||
}
|
||
//总运费
|
||
BigDecimal totalExpressFee = new BigDecimal(0);
|
||
BigDecimal totalWeight01 = new BigDecimal(0);
|
||
BigDecimal totalWeight02 = new BigDecimal(0);
|
||
BigDecimal totalWeight04 = new BigDecimal(0);
|
||
for (ProductRequestVo product : products) {
|
||
ShopProduct p = shopProductService.getById(product.getProductId());
|
||
if (p != null) {
|
||
//包邮
|
||
if(p.getIsFreeMail()==0){
|
||
continue;
|
||
}else {
|
||
BigDecimal weight = BigDecimal.valueOf(Double.valueOf(p.getWeight()) / 1000.0);
|
||
BigDecimal totalWeight = weight.multiply(new BigDecimal(product.getQuantity()));
|
||
if ("01".equals(p.getGoodsType())){
|
||
totalWeight01 = totalWeight01.add(totalWeight);
|
||
}
|
||
if ("02".equals(p.getGoodsType())){
|
||
totalWeight02 = totalWeight02.add(totalWeight);
|
||
}
|
||
//预售书单独计算
|
||
if ("03".equals(p.getGoodsType())){
|
||
totalExpressFee = totalExpressFee.add(
|
||
expressFeeService.calculateExpressFee(defaultExpress.getParamValue(), totalWeight.setScale(0, RoundingMode.UP), regionCode));
|
||
}
|
||
if ("04".equals(p.getGoodsType())){
|
||
totalWeight04 = totalWeight04.add(totalWeight);
|
||
}
|
||
}
|
||
}else {
|
||
return R.error("未查询到商品");
|
||
}
|
||
}
|
||
if(totalWeight01.compareTo(BigDecimal.ZERO)!=0){
|
||
totalExpressFee = totalExpressFee.add(
|
||
expressFeeService.calculateExpressFee(defaultExpress.getParamValue(), totalWeight01.setScale(0, RoundingMode.UP), regionCode));
|
||
}
|
||
if(totalWeight02.compareTo(BigDecimal.ZERO)!=0){
|
||
totalExpressFee = totalExpressFee.add(
|
||
expressFeeService.calculateExpressFee(defaultExpress.getParamValue(), totalWeight02.setScale(0, RoundingMode.UP), regionCode));
|
||
}
|
||
if(totalWeight04.compareTo(BigDecimal.ZERO)!=0){
|
||
totalExpressFee = totalExpressFee.add(
|
||
expressFeeService.calculateExpressFee(defaultExpress.getParamValue(), totalWeight04.setScale(0, RoundingMode.UP), regionCode));
|
||
}
|
||
return R.ok().put("result", totalExpressFee);
|
||
}
|
||
|
||
/**
|
||
* 列表
|
||
*/
|
||
@RequestMapping("/getMyOrderList")
|
||
public R getMyOrderList(@RequestParam Map<String, Object> params) {
|
||
PageUtils page = buyOrderService.getMyOrderList(params);
|
||
return R.ok().put("page", page);
|
||
}
|
||
|
||
|
||
/**
|
||
* @param orderSn 订单号
|
||
* @return R
|
||
*/
|
||
@RequestMapping(value = "/cancelOrder", method = RequestMethod.GET)
|
||
@Transactional
|
||
public R appDelete(@RequestParam("orderSn") String orderSn) {
|
||
QueryWrapper<BuyOrder> queryWrapper = new QueryWrapper<>();
|
||
queryWrapper.eq("order_sn", orderSn);
|
||
BuyOrder buyOrder = buyOrderService.getOne(queryWrapper);
|
||
|
||
if (buyOrder == null) {
|
||
return R.error("订单不存在");
|
||
}
|
||
if (buyOrder.getCouponId() != null) {
|
||
Integer couponId = buyOrder.getCouponId();
|
||
CouponHistoryEntity couponHistory = couponHistoryService.getById(couponId);
|
||
couponHistory.setUseStatus(0);
|
||
couponHistoryService.updateById(couponHistory);
|
||
}
|
||
// 库存回滚
|
||
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 = shopProductService.getById(productId);
|
||
product.setProductStock(product.getProductStock() + buyOrderProduct.getQuantity());
|
||
shopProductService.updateById(product);
|
||
}
|
||
buyOrderService.removeById(buyOrder.getOrderId());
|
||
return R.ok();
|
||
}
|
||
|
||
/**
|
||
* 修改
|
||
*/
|
||
@RequestMapping("/update")
|
||
public R update(@RequestBody BuyOrder buyOrder) {
|
||
buyOrderService.updateById(buyOrder);
|
||
return R.ok();
|
||
}
|
||
|
||
/**
|
||
* 删除
|
||
*/
|
||
@RequestMapping("/delete")
|
||
public R delete(@RequestBody List<String> orderSnList) {
|
||
QueryWrapper<BuyOrder> queryWrapper = new QueryWrapper<>();
|
||
queryWrapper.in("order_sn", orderSnList);
|
||
buyOrderService.remove(queryWrapper);
|
||
return R.ok();
|
||
}
|
||
|
||
|
||
/**
|
||
* app 端 取消订单
|
||
* TODO 新版本上线后此方法删除
|
||
*/
|
||
@RequestMapping("/appDelete")
|
||
@Transactional
|
||
public R appDelete(@RequestParam("orderId") Integer orderId) {
|
||
|
||
//1. 判断订单状态
|
||
BuyOrder byId = buyOrderService.getById(orderId);
|
||
if (byId != null) {
|
||
//2. 判断当前订单是否存在优惠券 进行 回显
|
||
Integer couponId = byId.getCouponId();
|
||
if (couponId != null) {
|
||
|
||
CouponHistoryEntity byId1 = couponHistoryService.getById(couponId);
|
||
byId1.setUseStatus(0);
|
||
couponHistoryService.updateById(byId1);
|
||
}
|
||
// 库存回滚
|
||
List<BuyOrderDetail> buyOrderDetailEntities = buyOrderDetailService.getBaseMapper().selectList(new QueryWrapper<BuyOrderDetail>()
|
||
.eq("order_id", byId.getOrderId()));
|
||
for (BuyOrderDetail buyOrderDetailEntity : buyOrderDetailEntities) {
|
||
Integer productId = buyOrderDetailEntity.getProductId();
|
||
ShopProduct product = shopProductService.getById(productId);
|
||
product.setProductStock(product.getProductStock() + buyOrderDetailEntity.getQuantity());
|
||
shopProductService.updateById(product);
|
||
}
|
||
buyOrderService.removeById(orderId);
|
||
}
|
||
return R.ok();
|
||
}
|
||
|
||
|
||
/**
|
||
* 充值专用订单生成接口
|
||
*/
|
||
@RequestMapping("/rechargeSave")
|
||
@Transactional
|
||
public R rechargeSave(@RequestBody BuyOrder buyOrder) throws IOException {
|
||
String timeId = IdWorker.getTimeId().substring(0, 32);
|
||
buyOrder.setOrderSn(timeId);
|
||
buyOrderService.save(buyOrder);
|
||
//下单微信支付预付款订单
|
||
BuyOrder buyOrderEntity = buyOrderService.getBaseMapper().selectOne(new LambdaQueryWrapper<BuyOrder>().eq(BuyOrder::getOrderSn, timeId));
|
||
WechatPaymentInfo paymentInfo = new WechatPaymentInfo();
|
||
paymentInfo.setOrderSn(buyOrderEntity.getOrderSn());
|
||
paymentInfo.setBuyOrderId(Integer.valueOf(buyOrderEntity.getProductId()));
|
||
paymentInfo.setTotalAmount(buyOrderEntity.getRealMoney());
|
||
wxpayService.prepay(paymentInfo);
|
||
rabbitTemplate.convertAndSend(
|
||
DelayQueueConfig.ORDER_TO_BE_PAY_EXCHANGE,
|
||
DelayQueueConfig.ORDER_TO_BE_PAY_ROUTING_KEY,
|
||
buyOrder.getOrderId(),
|
||
messagePostProcessor()
|
||
);
|
||
return R.ok().put("orderSn", timeId);
|
||
}
|
||
|
||
/**
|
||
* 获取订单详情
|
||
* TODO 新版本上线后删除
|
||
*
|
||
* @param orderId
|
||
* @return
|
||
*/
|
||
@RequestMapping("/getOrderDetail")
|
||
public R getOrderDetail(@RequestParam Integer orderId) {
|
||
LambdaQueryWrapper<BuyOrder> wrapper = new LambdaQueryWrapper<>();
|
||
wrapper.eq(BuyOrder::getOrderId, orderId);
|
||
BuyOrder one = buyOrderService.getOne(wrapper);
|
||
if (one.equals(null)) {
|
||
return R.error("order error:order is null");
|
||
}
|
||
//添加用户信息
|
||
one.setUser(myUserService.getById(one.getUserId()));
|
||
//添加商品信息
|
||
LambdaQueryWrapper<BuyOrderDetail> wrapper1 = new LambdaQueryWrapper<>();
|
||
wrapper1.eq(BuyOrderDetail::getOrderId, orderId);
|
||
List<BuyOrderDetail> buyOrderDetailEntities = buyOrderDetailService.getBaseMapper().selectList(wrapper1);
|
||
one.setProducts(buyOrderDetailEntities);
|
||
|
||
return R.ok().put("detail", one);
|
||
}
|
||
|
||
/**
|
||
* 获取订单详情
|
||
*
|
||
* @param orderId 订单 ID
|
||
* @return R
|
||
* TODO 新版本上线后 该方法删除
|
||
*/
|
||
@RequestMapping(value = "/getOrderInfo", method = RequestMethod.GET)
|
||
public R appGetOrderInfo(@RequestParam("orderId") Integer orderId) {
|
||
BuyOrder buyOrder = buyOrderService.getById(orderId);
|
||
QueryWrapper<BuyOrderDetail> queryWrapper = new QueryWrapper<>();
|
||
queryWrapper.eq("order_id", orderId);
|
||
List<BuyOrderDetail> buyOrderDetailList = buyOrderDetailService.list(queryWrapper);
|
||
|
||
for (BuyOrderDetail buyOrderDetail : buyOrderDetailList) {
|
||
ShopProduct prod = shopProductService.getById(buyOrderDetail.getProductId());
|
||
if (prod != null) {
|
||
buyOrderDetail.setImage(prod.getProductImages());
|
||
}
|
||
}
|
||
return R.ok().put("result", buyOrder);
|
||
}
|
||
|
||
/**
|
||
* 修改订单地址
|
||
*
|
||
* @param addressRequestVo 地址请求 value object
|
||
* @return R
|
||
*/
|
||
@RequestMapping(value = "/modifyConsigneeAddress", method = RequestMethod.POST)
|
||
public R modifyOrderAddress(@RequestBody ModifyOrderAddressRequestVo addressRequestVo) {
|
||
QueryWrapper<BuyOrder> buyOrderQueryWrapper = new QueryWrapper<>();
|
||
buyOrderQueryWrapper.eq("order_sn", addressRequestVo.getOrderSn());
|
||
BuyOrder buyOrder = buyOrderService.getOne(buyOrderQueryWrapper);
|
||
String provinceCode = addressRequestVo.getProvinceCode();
|
||
QueryWrapper<Province> provinceQueryWrapper = new QueryWrapper<>();
|
||
provinceQueryWrapper.eq("region_code", provinceCode);
|
||
Province province = provinceService.getOne(provinceQueryWrapper);
|
||
buyOrder.setProvince(province.getProvName());
|
||
String cityCode = addressRequestVo.getCityCode();
|
||
QueryWrapper<City> cityQueryWrapper = new QueryWrapper<>();
|
||
cityQueryWrapper.eq("region_code", cityCode);
|
||
City city = cityService.getOne(cityQueryWrapper);
|
||
buyOrder.setCity(city.getCityName());
|
||
String countyCode = addressRequestVo.getCountyCode();
|
||
QueryWrapper<County> countyQueryWrapper = new QueryWrapper<>();
|
||
countyQueryWrapper.eq("region_code", countyCode);
|
||
County county = countyService.getOne(countyQueryWrapper);
|
||
buyOrder.setDistrict(county.getCountyName());
|
||
buyOrder.setShippingUser(addressRequestVo.getConsigneeName());
|
||
buyOrder.setUserPhone(addressRequestVo.getConsigneeMobile());
|
||
buyOrder.setAddress(addressRequestVo.getAddress());
|
||
buyOrderService.updateById(buyOrder);
|
||
return R.ok();
|
||
}
|
||
|
||
/**
|
||
* 获取订单地址
|
||
*
|
||
* @param orderSn 订单号
|
||
* @return R
|
||
*/
|
||
@RequestMapping(value = "/getConsigneeAddress", method = RequestMethod.GET)
|
||
public R getOrderAddress(@RequestParam("orderSn") String orderSn) {
|
||
QueryWrapper<BuyOrder> queryWrapper = new QueryWrapper<>();
|
||
queryWrapper.eq("order_sn", orderSn);
|
||
BuyOrder buyOrder = buyOrderService.getOne(queryWrapper);
|
||
OrderAddressResponseVo responseVo = new OrderAddressResponseVo();
|
||
responseVo.setConsigneeMobile(buyOrder.getUserPhone());
|
||
responseVo.setConsigneeName(buyOrder.getShippingUser());
|
||
responseVo.setDetailAddress(buyOrder.getAddress());
|
||
String provinceName = buyOrder.getProvince();
|
||
String cityName = buyOrder.getCity();
|
||
String countyName = buyOrder.getDistrict();
|
||
|
||
QueryWrapper<Province> provinceQueryWrapper = new QueryWrapper<>();
|
||
provinceQueryWrapper.eq("prov_name", provinceName);
|
||
Province province = provinceService.getOne(provinceQueryWrapper);
|
||
responseVo.setProvinceCode(province.getRegionCode());
|
||
|
||
QueryWrapper<City> cityQueryWrapper = new QueryWrapper<>();
|
||
cityQueryWrapper.eq("city_name", cityName);
|
||
City city = cityService.getOne(cityQueryWrapper);
|
||
responseVo.setCityCode(city.getRegionCode());
|
||
|
||
QueryWrapper<County> countyQueryWrapper = new QueryWrapper<>();
|
||
countyQueryWrapper.eq("county_name", countyName);
|
||
County county = countyService.getOne(countyQueryWrapper);
|
||
responseVo.setCountyCode(county.getRegionCode());
|
||
|
||
return R.ok().put("result", responseVo);
|
||
}
|
||
|
||
|
||
/**
|
||
* 查询订单快递
|
||
*
|
||
* @param expressOrderSn 运单号
|
||
* @return R
|
||
*/
|
||
// @RequestMapping(value = "/queryExpress", method = RequestMethod.GET)
|
||
// public R queryExpress(@RequestParam("expressOrderSn") String expressOrderSn,
|
||
// @RequestParam("expressCompanyCode") String expressCompanyCode,
|
||
// @RequestParam("customerName") String customerName) {
|
||
//
|
||
// ExpressQueryResponseVo vo = new ExpressQueryResponseVo();
|
||
// ExpressQueryResponse expressQueryResponse = expressOrderService.queryExpressOrder(expressCompanyCode, expressOrderSn, customerName);
|
||
// vo.setLogisticCode(expressQueryResponse.getLogisticCode());
|
||
// vo.setTraces(expressQueryResponse.getTraces());
|
||
// return R.ok().put("result", vo);
|
||
// }
|
||
|
||
/**
|
||
* 查询快递订单轨迹
|
||
* @param expressOrderSn
|
||
* @return
|
||
*/
|
||
@RequestMapping("/searchExpress")
|
||
public R searchExpress(@RequestParam String expressOrderSn){
|
||
LambdaQueryWrapper<ExpressOrder> wrapper = new LambdaQueryWrapper<>();
|
||
wrapper.eq(ExpressOrder::getExpressOrderSn,expressOrderSn);
|
||
ExpressOrder expressOrder = expressOrderService.getBaseMapper().selectOne(wrapper);
|
||
if(expressOrder==null){
|
||
return R.error("查询失败");
|
||
}
|
||
String tel = expressOrder.getConsigneeMobile().substring(expressOrder.getConsigneeMobile().length()-4);
|
||
ExpressQueryResponse expressQueryResponse = expressOrderService.queryExpressOrder(expressOrder.getExpressCompanyCode(), expressOrderSn, tel);
|
||
return R.ok().put("express",expressQueryResponse);
|
||
}
|
||
|
||
|
||
|
||
|
||
/**
|
||
* 检查可合并的订单信息
|
||
*
|
||
* @return
|
||
*/
|
||
@RequestMapping("/checkOrder")
|
||
public R checkOrder(@RequestParam Map<String, Object> params) {
|
||
Page page = buyOrderService.checkOrder(params);
|
||
return R.ok().put("page", page);
|
||
}
|
||
|
||
/**
|
||
* 检查传来的orderId 是否有可合并的其他订单信息
|
||
*
|
||
* @param orderIds
|
||
* @return
|
||
*/
|
||
@RequestMapping("/checkMerge")
|
||
public R checkMerge(@RequestBody Integer[] orderIds) {
|
||
List list = buyOrderService.checkOrder(orderIds);
|
||
return R.ok().put("list", list);
|
||
}
|
||
|
||
/**
|
||
* 分包发货
|
||
*
|
||
* @param expressCompanyCode 快递公司编码
|
||
* @param buyOrderProductId 订单商品
|
||
* @return R
|
||
*/
|
||
@RequestMapping(value = "/delivery", method = RequestMethod.POST)
|
||
public R delivery(@RequestParam("expressCompanyCode") String expressCompanyCode,
|
||
@RequestBody List<Integer> buyOrderProductId) throws Exception {
|
||
buyOrderService.delivery(expressCompanyCode, buyOrderProductId);
|
||
return R.ok();
|
||
|
||
}
|
||
|
||
@RequestMapping("/mytest")
|
||
public R mytest() throws IOException {
|
||
String mytest = buyOrderService.mytest();
|
||
return R.ok().put("url",mytest);
|
||
}
|
||
|
||
/**
|
||
* 获取商品实际价格
|
||
*
|
||
* @param product 商品信息
|
||
* @return 商品实际价格
|
||
*/
|
||
private BigDecimal getRealPrice(ShopProduct product) {
|
||
BigDecimal activityPrice = product.getActivityPrice();
|
||
return (activityPrice == null || activityPrice.equals(BigDecimal.ZERO)) ? product.getPrice() : activityPrice;
|
||
}
|
||
|
||
/**
|
||
* 处理商品库存
|
||
* TODO 新版本上线后删除此方法
|
||
*
|
||
* @param buyOrderDetail
|
||
* @param product
|
||
* @return
|
||
*/
|
||
private boolean handleStock(BuyOrderDetail buyOrderDetail, ShopProduct product) {
|
||
int quantity = buyOrderDetail.getQuantity();
|
||
if (product.getProductStock() - quantity < 0) {
|
||
return false;
|
||
}
|
||
product.setProductStock(product.getProductStock() - quantity);
|
||
product.setSumSales(product.getSumSales() + quantity);
|
||
shopProductService.updateById(product);
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* 处理商品库存
|
||
*
|
||
* @param buyOrderProduct 订单商品信息
|
||
* @param product 商品
|
||
* @return boolean
|
||
*/
|
||
private boolean handleStock(BuyOrderProduct buyOrderProduct, ShopProduct product) {
|
||
int quantity = buyOrderProduct.getQuantity();
|
||
if (product.getProductStock() - quantity < 0) {
|
||
return false;
|
||
}
|
||
product.setProductStock(product.getProductStock() - quantity);
|
||
product.setSumSales(product.getSumSales() + quantity);
|
||
shopProductService.updateById(product);
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* 使用优惠券
|
||
*
|
||
* @param buyOrder
|
||
* @return
|
||
*/
|
||
private BigDecimal useCouponAmount(BuyOrder buyOrder) {
|
||
Integer couponId = buyOrder.getCouponId();
|
||
if (couponId != null) {
|
||
CouponHistoryEntity couponHistory = couponHistoryService.getById(couponId);
|
||
couponHistory.setUseStatus(1);
|
||
couponHistory.setUseTime(new Date());
|
||
couponHistory.setOrderId(Long.valueOf(buyOrder.getOrderId()));
|
||
couponHistory.setOrderSn(buyOrder.getOrderSn());
|
||
CouponEntity coupon = couponService.getById(couponHistory.getCouponId());
|
||
|
||
return coupon.getCouponAmount();
|
||
}
|
||
return BigDecimal.ZERO;
|
||
}
|
||
|
||
|
||
/**
|
||
* 计算运费
|
||
*
|
||
* @param buyOrder
|
||
* @return
|
||
*/
|
||
private BigDecimal getShoppingAmount(BuyOrder buyOrder) {
|
||
return buyOrder.getOrderMoney() == null ? BigDecimal.ZERO : buyOrder.getShippingMoney();
|
||
}
|
||
|
||
/**
|
||
* 使用虚拟币支付
|
||
*
|
||
* @param user
|
||
* @param totalPrice
|
||
* @return
|
||
*/
|
||
private boolean usePeanutCoin(MyUserEntity user, BigDecimal totalPrice,boolean sj_check) {
|
||
if (user.getPeanutCoin().compareTo(totalPrice) >= 0) {
|
||
user.setPeanutCoin(user.getPeanutCoin().subtract(totalPrice));
|
||
if (sj_check){
|
||
user.setPointPower(1);
|
||
}
|
||
this.myUserService.updateById(user);
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* 交易记录
|
||
*
|
||
* @param buyOrder
|
||
* @param user
|
||
* @param totalPrice
|
||
*/
|
||
private void recordTransaction(BuyOrder buyOrder, MyUserEntity user, BigDecimal totalPrice) {
|
||
TransactionDetailsEntity transactionDetailsEntity = new TransactionDetailsEntity();
|
||
transactionDetailsEntity.setRemark("订单编号为 - " + buyOrder.getOrderSn());
|
||
transactionDetailsEntity.setUserId(user.getId());
|
||
transactionDetailsEntity.setUserName(user.getNickname());
|
||
transactionDetailsEntity.setChangeAmount(totalPrice.negate());
|
||
transactionDetailsEntity.setUserBalance(user.getPeanutCoin());
|
||
transactionDetailsEntity.setTel(user.getTel());
|
||
transactionDetailsEntity.setOrderType("购买商品");
|
||
transactionDetailsService.save(transactionDetailsEntity);
|
||
}
|
||
|
||
/**
|
||
* 给用户添加电子书
|
||
* TODO 新版本上线删除此接口
|
||
* @param products
|
||
*
|
||
* @param buyOrder
|
||
*/
|
||
private void addEbookToUser(List<BuyOrderDetail> products, BuyOrder buyOrder) {
|
||
List<Integer> productIds = products.stream().map(BuyOrderDetail::getProductId).collect(Collectors.toList());
|
||
for (Integer productId : productIds) {
|
||
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);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 给用户添加电子书
|
||
* TODO 这里的参数 0 没用 新版本上线后删除
|
||
*
|
||
* @param products
|
||
* @param buyOrder
|
||
*/
|
||
private void addEbookToUser(List<BuyOrderProduct> products, BuyOrder buyOrder, Integer x) {
|
||
List<Integer> productIds = products.stream().map(BuyOrderProduct::getProductId).collect(Collectors.toList());
|
||
for (Integer productId : productIds) {
|
||
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);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 购物车
|
||
* TODO 新版本上线后删除此方法
|
||
*
|
||
* @param buyOrder
|
||
* @param buyOrderDetail
|
||
*/
|
||
private void handleBuyCart(BuyOrder buyOrder, BuyOrderDetail buyOrderDetail) {
|
||
List<OrderCartEntity> orderCartList = orderCartService.getBaseMapper().selectList(new QueryWrapper<OrderCartEntity>()
|
||
.eq("user_id", buyOrder.getUserId()).eq("product_id", buyOrderDetail.getProductId()));
|
||
if (orderCartList.size() > 0) {
|
||
List<Integer> collect = orderCartList.stream().map(OrderCartEntity::getCartId).collect(Collectors.toList());
|
||
orderCartService.removeByIds(collect);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 购物车
|
||
*
|
||
* @param buyOrder 订单
|
||
* @param buyOrderProduct
|
||
*/
|
||
private void handleBuyCart(BuyOrder buyOrder, BuyOrderProduct buyOrderProduct) {
|
||
List<OrderCartEntity> orderCartList = orderCartService.getBaseMapper().selectList(new QueryWrapper<OrderCartEntity>()
|
||
.eq("user_id", buyOrder.getUserId()).eq("product_id", buyOrderProduct.getProductId()));
|
||
if (orderCartList.size() > 0) {
|
||
List<Integer> collect = orderCartList.stream().map(OrderCartEntity::getCartId).collect(Collectors.toList());
|
||
orderCartService.removeByIds(collect);
|
||
}
|
||
}
|
||
|
||
private MessagePostProcessor messagePostProcessor() {
|
||
return message -> {
|
||
//设置有效期30分钟
|
||
message.getMessageProperties().setExpiration(String.valueOf(30 * 60 * 1000));
|
||
return message;
|
||
};
|
||
}
|
||
|
||
}
|