refactor:项目结构调整

This commit is contained in:
haoxr 2021-03-15 01:07:23 +08:00
parent f6f25a94cf
commit 29fde8f974
28 changed files with 272 additions and 578 deletions

View File

@ -19,5 +19,5 @@ public class OrderPayForm implements Serializable {
private Integer payType;
@NotBlank(message = "订单ID不能为空")
private String orderId;
private Long orderId;
}

View File

@ -1,127 +0,0 @@
package com.youlai.mall.oms.controller.admin;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.youlai.common.enums.BusinessTypeEnum;
import com.youlai.common.enums.QueryModeEnum;
import com.youlai.common.redis.component.BusinessNoGenerator;
import com.youlai.common.result.Result;
import com.youlai.common.result.ResultCode;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
@Api(tags = "【系统管理】订单服务")
@RestController("AdminOrderController")
@RequestMapping("/api.admin/v1/orders")
@Slf4j
@AllArgsConstructor
public class OrderController {
private IOmsOrderService iOmsOrderService;
@ApiOperation(value = "列表分页", httpMethod = "GET")
@ApiImplicitParams({
@ApiImplicitParam(name = "queryMode", value = "查询模式", paramType = "query", dataType = "QueryModeEnum"),
@ApiImplicitParam(name = "page", value = "页码", paramType = "query", dataType = "Long"),
@ApiImplicitParam(name = "limit", value = "每页数量", paramType = "query", dataType = "Long"),
@ApiImplicitParam(name = "orderSn", value = "订单编号", paramType = "query", dataType = "String"),
@ApiImplicitParam(name = "status", value = "订单状态", paramType = "query", dataType = "Integer"),
@ApiImplicitParam(name = "startDate", value = "开始日期", paramType = "query", dataType = "String"),
@ApiImplicitParam(name = "endDate", value = "结束日期", paramType = "query", dataType = "String"),
})
@GetMapping
public Result list(
String queryMode,
Integer page,
Integer limit,
String orderSn,
Integer status,
String startDate,
String endDate
) {
QueryModeEnum queryModeEnum = QueryModeEnum.getValue(queryMode);
switch (queryModeEnum) {
case PAGE:
LambdaQueryWrapper<OmsOrder1> queryWrapper = new LambdaQueryWrapper<OmsOrder1>()
.like(StrUtil.isNotBlank(orderSn), OmsOrder1::getOrderSn, orderSn)
.eq(status != null, OmsOrder1::getStatus, status)
.apply(StrUtil.isNotBlank(startDate),
"date_format (gmt_crate,'%Y-%m-%d') >= date_format('" + startDate + "','%Y-%m-%d')")
.apply(StrUtil.isNotBlank(endDate),
"date_format (gmt_crate,'%Y-%m-%d') <= date_format('" + endDate + "','%Y-%m-%d')")
.orderByDesc(OmsOrder1::getGmtModified)
.orderByDesc(OmsOrder1::getGmtCreate);
Page<OmsOrder1> result = iOmsOrderService.page(new Page<>(page, limit), queryWrapper);
return Result.success(result.getRecords(), result.getTotal());
default:
return Result.failed(ResultCode.QUERY_MODE_IS_NULL);
}
}
@ApiOperation(value = "订单详情", httpMethod = "GET")
@ApiImplicitParam(name = "id", value = "订单ID", required = true, paramType = "path", dataType = "Long")
@GetMapping("/{id}")
public Result detail(@PathVariable Long id) {
OrderBO order = iOmsOrderService.getByOrderId(id);
return Result.success(order);
}
@ApiOperation(value = "订单提交", httpMethod = "POST")
@ApiImplicitParam(name = "orderBO", value = "实体JSON对象", required = true, paramType = "body", dataType = "OrderBO")
@PostMapping
public Result add(@RequestBody OrderBO orderBO) {
boolean status = iOmsOrderService.save(orderBO);
return Result.judge(status);
}
@ApiOperation(value = "修改订单", httpMethod = "PUT")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "订单ID", required = true, paramType = "path", dataType = "Long"),
@ApiImplicitParam(name = "order", value = "实体JSON对象", required = true, paramType = "body", dataType = "OmsOrder")
})
@PutMapping(value = "/{id}")
public Result update(
@PathVariable Long id,
@RequestBody OmsOrder1 order) {
boolean status = iOmsOrderService.updateById(order);
return Result.judge(status);
}
@ApiOperation(value = "局部更新", httpMethod = "PATCH")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "订单ID", required = true, paramType = "path", dataType = "Long"),
@ApiImplicitParam(name = "status", value = "订单状态", paramType = "query", dataType = "Integer")
})
@PatchMapping(value = "/{id}")
public Result patch(@PathVariable Long id,
@RequestParam Integer status) {
LambdaUpdateWrapper<OmsOrder1> updateWrapper = new LambdaUpdateWrapper<OmsOrder1>().eq(OmsOrder1::getId, id);
updateWrapper.set(status != null, OmsOrder1::getStatus, status);
boolean result = iOmsOrderService.update(updateWrapper);
return Result.judge(result);
}
@ApiOperation(value = "订单详情", httpMethod = "GET")
@ApiImplicitParam(name = "id", value = "订单ID", required = true, paramType = "path", dataType = "Long")
@GetMapping("/{id}/detail")
public Result orderDetail(@PathVariable Long id) {
OmsOrder1 order = iOmsOrderService.getById(id);
return Result.success(order);
}
private BusinessNoGenerator businessNoGenerator;
@PostMapping("/order_sn")
public Result generateOrderSn() {
String orderSn = businessNoGenerator.generate(BusinessTypeEnum.ORDER);
log.info("订单编号:{}", orderSn);
return Result.success(orderSn);
}
}

View File

@ -2,7 +2,7 @@ package com.youlai.mall.oms.controller.app;
import com.youlai.common.result.Result;
import com.youlai.mall.oms.pojo.vo.CartVO;
import com.youlai.mall.oms.service.CartService;
import com.youlai.mall.oms.service.ICartService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
@ -25,12 +25,12 @@ import org.springframework.web.bind.annotation.*;
@AllArgsConstructor
public class CartController {
private CartService cartService;
private ICartService ICartService;
@ApiOperation(value = "查询购物车", httpMethod = "GET")
@GetMapping
public Result getCart() {
CartVO cart = cartService.getCart();
CartVO cart = ICartService.getCart();
return Result.success(cart);
}
@ -38,7 +38,7 @@ public class CartController {
@ApiImplicitParam(name = "skuId", value = "SKU ID", required = true, paramType = "param", dataType = "Long")
@PostMapping
public Result addCartItem(@RequestParam Long skuId) {
cartService.addCartItem(skuId);
ICartService.addCartItem(skuId);
return Result.success();
}
@ -49,7 +49,7 @@ public class CartController {
Integer num,
Boolean checked
) {
cartService.updateCartItem(skuId, num, checked);
ICartService.updateCartItem(skuId, num, checked);
return Result.success();
}
@ -57,7 +57,7 @@ public class CartController {
@ApiImplicitParam(name = "checked", value = "全选/全不选", required = true, paramType = "param", dataType = "Boolean")
@PatchMapping("/batch")
public Result checkAll(Boolean checked) {
cartService.checkAll(checked);
ICartService.checkAll(checked);
return Result.success();
}
@ -65,14 +65,14 @@ public class CartController {
@ApiImplicitParam(name = "skuId", value = "SKU ID集合", required = true, paramType = "param", dataType = "Long")
@DeleteMapping("/skuId/{skuId}")
public Result deleteCartItem(@PathVariable Long skuId) {
cartService.deleteCartItem(skuId);
ICartService.deleteCartItem(skuId);
return Result.success();
}
@ApiOperation(value = "清空购物车", httpMethod = "DELETE")
@DeleteMapping
public Result deleteCart() {
cartService.deleteCart();
ICartService.deleteCart();
return Result.success();
}
}

View File

@ -5,7 +5,7 @@ import com.youlai.common.result.Result;
import com.youlai.mall.oms.enums.PayTypeEnum;
import com.youlai.mall.oms.pojo.form.OrderPayForm;
import com.youlai.mall.oms.pojo.vo.PayInfoVO;
import com.youlai.mall.oms.service.OrderPayService;
import com.youlai.mall.oms.service.IOrderPayService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
@ -28,7 +28,7 @@ import org.springframework.web.bind.annotation.*;
@Slf4j
public class OrderPayController {
@Autowired
private OrderPayService orderPayService;
private IOrderPayService orderPayService;
/**
* 订单支付
@ -42,7 +42,7 @@ public class OrderPayController {
@ApiOperation("订单支付")
@PostMapping
public Result doPay(@Validated @RequestBody OrderPayForm orderPayForm) {
PayTypeEnum payTypeEnum =PayTypeEnum.getValue(orderPayForm.getPayType());
PayTypeEnum payTypeEnum = PayTypeEnum.getValue(orderPayForm.getPayType());
if (payTypeEnum == null) {
return Result.failed("请选择正确的支付方式");
}
@ -55,7 +55,9 @@ public class OrderPayController {
@ApiOperation(value = "获取订单支付详情")
@GetMapping("/info")
public Result<PayInfoVO> info(@ApiParam(name = "orderId", value = "订单ID", required = true, defaultValue = "1") @RequestParam("orderId") String orderId) {
public Result<PayInfoVO> info(
@ApiParam(name = "orderId", value = "订单ID", required = true, defaultValue = "1")
@RequestParam("orderId") Long orderId) {
return Result.success(orderPayService.info(orderId));
}

View File

@ -1,6 +1,6 @@
package com.youlai.mall.oms.dao;
import com.youlai.mall.oms.pojo.entity.OrderLogsEntity;
import com.youlai.mall.oms.pojo.domain.OmsOrderLog;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@ -12,6 +12,6 @@ import org.apache.ibatis.annotations.Mapper;
* @date 2020-12-30 22:31:10
*/
@Mapper
public interface OrderLogDao extends BaseMapper<OrderLogsEntity> {
public interface OrderLogDao extends BaseMapper<OmsOrderLog> {
}

View File

@ -1,9 +0,0 @@
package com.youlai.mall.oms.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface OmsOrderItemMapper extends BaseMapper<OmsOrderItem1> {
}

View File

@ -1,9 +0,0 @@
package com.youlai.mall.oms.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface OmsOrderMapper extends BaseMapper<OmsOrder1> {
}

View File

@ -5,7 +5,7 @@ import com.youlai.mall.oms.pojo.vo.CartVO;
/**
* 购物车业务接口
*/
public interface CartService {
public interface ICartService {
/**
* 添加商品到购物车
@ -41,7 +41,7 @@ public interface CartService {
/**
* 清空购物车中已选择商品
*/
void cleanSelected();
void deleteSelectedItem();
}

View File

@ -11,6 +11,6 @@ import com.youlai.mall.oms.pojo.domain.OmsOrderDelivery;
* @email huawei_code@163.com
* @date 2020-12-30 22:31:10
*/
public interface OrderDeliveryService extends IService<OmsOrderDelivery> {
public interface IOrderDeliveryService extends IService<OmsOrderDelivery> {
}

View File

@ -13,7 +13,7 @@ import java.util.Map;
* @email huawei_code@163.com
* @date 2020-12-30 22:31:10
*/
public interface OrderGoodsService extends IService<OmsOrderItem> {
public interface IOrderItemService extends IService<OmsOrderItem> {
List<OmsOrderItem> getByOrderId(Long orderId);

View File

@ -11,7 +11,7 @@ import com.youlai.mall.oms.pojo.domain.OmsOrderLog;
* @email huawei_code@163.com
* @date 2020-12-30 22:31:10
*/
public interface OrderLogsService extends IService<OmsOrderLog> {
public interface IOrderLogService extends IService<OmsOrderLog> {
/**
* 添加订单操作日志记录

View File

@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.youlai.mall.oms.pojo.domain.OmsOrderPay;
import com.youlai.mall.oms.pojo.vo.PayInfoVO;
import org.springframework.stereotype.Service;
/**
* 支付信息表
@ -12,18 +13,19 @@ import com.youlai.mall.oms.pojo.vo.PayInfoVO;
* @email huawei_code@163.com
* @date 2020-12-30 22:31:10
*/
public interface OrderPayService extends IService<OmsOrderPay> {
public interface IOrderPayService extends IService<OmsOrderPay> {
/**
* 获取订单支付详情
* @param orderId 订单ID
* @return
*/
PayInfoVO info(String orderId);
PayInfoVO info(Long orderId);
/**
* 订单支付
* @param orderId 订单ID
*/
void balancePay(String orderId);
void balancePay(Long orderId);
}

View File

@ -49,7 +49,7 @@ public interface IOrderService extends IService<OmsOrder> {
* @param id 订单ID
* @return 是否取消成功
*/
boolean cancelOrder(String id);
boolean cancelOrder(Long id);
/**
* 删除订单
@ -57,7 +57,7 @@ public interface IOrderService extends IService<OmsOrder> {
* @param id 订单ID
* @return 是否删除成功
*/
boolean deleteOrder(String id);
boolean deleteOrder(Long id);
/**
* 订单列表查询
@ -73,6 +73,6 @@ public interface IOrderService extends IService<OmsOrder> {
* @param id 订单ID
* @return 订单信息
*/
OmsOrder getByOrderId(String id);
OmsOrder getByOrderId(Long id);
}

View File

@ -11,6 +11,6 @@ import com.youlai.mall.oms.pojo.domain.OmsOrderSetting;
* @email huawei_code@163.com
* @date 2020-12-30 22:31:10
*/
public interface OrderSettingService extends IService<OmsOrderSetting> {
public interface IOrderSettingService extends IService<OmsOrderSetting> {
}

View File

@ -6,7 +6,7 @@ import com.youlai.mall.pms.api.app.InventoryFeignService;
import com.youlai.mall.pms.pojo.dto.SkuDTO;
import com.youlai.mall.oms.pojo.vo.CartItemVO;
import com.youlai.mall.oms.pojo.vo.CartVO;
import com.youlai.mall.oms.service.CartService;
import com.youlai.mall.oms.service.ICartService;
import lombok.AllArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
@ -39,7 +39,7 @@ import static com.youlai.mall.oms.common.RedisConstants.CART_KEY;
@Service
@Slf4j
@AllArgsConstructor
public class CartServiceImpl implements CartService {
public class CartServiceImpl implements ICartService {
private RedisTemplate redisTemplate;
@ -129,7 +129,7 @@ public class CartServiceImpl implements CartService {
}
@Override
public void cleanSelected() {
public void deleteSelectedItem() {
log.info("清空购物车中已选择商品");
BoundHashOperations cartHashOpts = getCartHashOpts();
for (Object value : cartHashOpts.values()) {

View File

@ -1,10 +0,0 @@
package com.youlai.mall.oms.service.impl;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.mall.oms.mapper.OmsOrderItemMapper;
import org.springframework.stereotype.Service;
@Service
public class OmsOrderItemServiceImpl extends ServiceImpl<OmsOrderItemMapper, OmsOrderItem1> implements IService<OmsOrderItem1> {
}

View File

@ -1,76 +0,0 @@
package com.youlai.mall.oms.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.common.result.Result;
import com.youlai.common.web.exception.BizException;
import com.youlai.mall.oms.mapper.OmsOrderMapper;
import com.youlai.mall.ums.api.app.MemberFeignService;
import com.youlai.mall.ums.pojo.dto.MemberDTO;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
@Service
@AllArgsConstructor
@Slf4j
public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder1> implements IOmsOrderService {
private IOmsOrderItemService iOmsOrderItemService;
private MemberFeignService memberFeignService;
/**
* 提交订单
*
* @param orderBO
* @return
*/
@Override
public boolean save(OrderBO orderBO) {
// 订单
OmsOrder1 order = orderBO.getOrder();
String orderSn = IdUtil.createSnowflake(1, 1).nextIdStr();
order.setOrderSn(orderSn);
this.save(order);
// 订单明细
List<OmsOrderItem1> orderItems = orderBO.getOrderItems();
if (CollectionUtil.isEmpty(orderItems)) {
throw new BizException("订单明细不能为空");
}
orderItems.forEach(item -> {
item.setOrderId(order.getId());
});
iOmsOrderItemService.saveBatch(orderItems);
return true;
}
@Override
public OrderBO getByOrderId(Long orderId) {
OrderBO orderBO = new OrderBO();
// 订单
OmsOrder1 order = this.getById(orderId);
if (order == null) {
throw new BizException("订单不存在");
}
// 订单明细
List<OmsOrderItem1> orderItems = iOmsOrderItemService.list(
new LambdaQueryWrapper<OmsOrderItem1>().eq(OmsOrderItem1::getOrderId, orderId)
);
orderItems = Optional.ofNullable(orderItems).orElse(new ArrayList<>());
// 会员明细
Result<MemberDTO> result = memberFeignService.getUserById(order.getUserId());
MemberDTO member = result.getData();
orderBO.setOrder(order).setOrderItems(orderItems).setMember(member);
return orderBO;
}
}

View File

@ -3,10 +3,10 @@ package com.youlai.mall.oms.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;;
import com.youlai.mall.oms.dao.OrderDeliveryDao;
import com.youlai.mall.oms.pojo.domain.OmsOrderDelivery;
import com.youlai.mall.oms.service.OrderDeliveryService;
import com.youlai.mall.oms.service.IOrderDeliveryService;
import org.springframework.stereotype.Service;
@Service("orderDeliveryService")
public class OrderDeliveryServiceImpl extends ServiceImpl<OrderDeliveryDao, OmsOrderDelivery> implements OrderDeliveryService {
public class OrderDeliveryServiceImpl extends ServiceImpl<OrderDeliveryDao, OmsOrderDelivery> implements IOrderDeliveryService {
}

View File

@ -1,11 +1,10 @@
package com.youlai.mall.oms.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.mall.oms.dao.OrderItemDao;
import com.youlai.mall.oms.pojo.domain.OmsOrderItem;
import com.youlai.mall.oms.service.OrderGoodsService;
import com.youlai.mall.oms.service.IOrderItemService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@ -15,24 +14,25 @@ import java.util.Map;
import java.util.stream.Collectors;
@Service("orderGoodsService")
@Slf4j
public class OrderGoodsServiceImpl extends ServiceImpl<OrderItemDao, OmsOrderItem> implements OrderGoodsService {
@Service
public class OrderItemServiceImpl extends ServiceImpl<OrderItemDao, OmsOrderItem> implements IOrderItemService {
@Override
public List<OmsOrderItem> getByOrderId(Long orderId) {
log.info("根据订单ID查询订单商品列表orderId={}", orderId);
QueryWrapper<OmsOrderItem> queryWrapper = new QueryWrapper<>();
queryWrapper.ge("order_id", orderId);
return baseMapper.selectList(queryWrapper);
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<OmsOrderItem>().eq(OmsOrderItem::getOrderId, orderId);
return this.list(queryWrapper);
}
@Override
public Map<Long, List<OmsOrderItem>> getByOrderIds(List<Long> orderIds) {
QueryWrapper<OmsOrderItem> orderGoodsQuery = new QueryWrapper<>();
orderGoodsQuery.in("order_id", orderIds).orderByDesc("order_id", "id");
List<OmsOrderItem> orderGoods = this.list(orderGoodsQuery);
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<OmsOrderItem>().in(OmsOrderItem::getOrderId, orderIds)
.orderByDesc(OmsOrderItem::getOrderId)
.orderByDesc(OmsOrderItem::getId);
List<OmsOrderItem> orderGoods = this.list(queryWrapper);
if (orderGoods == null || orderGoods.size() == 0) {
log.info("根据订单ID列表查询商品为空orderIds={}", orderIds);
return new HashMap<>(8);

View File

@ -0,0 +1,31 @@
package com.youlai.mall.oms.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.common.web.util.RequestUtils;
import com.youlai.mall.oms.dao.OrderLogDao;
import com.youlai.mall.oms.pojo.domain.OmsOrderLog;
import com.youlai.mall.oms.service.IOrderLogService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class OrderLogServiceImpl extends ServiceImpl<OrderLogDao, OmsOrderLog> implements IOrderLogService {
@Override
public void addOrderLogs(Long orderId, Integer orderStatus, String user, String detail) {
log.info("添加订单操作日志orderId={}detail={}", orderId, detail);
OmsOrderLog orderLog = new OmsOrderLog();
orderLog.setDetail(detail);
orderLog.setOrderId(orderId);
orderLog.setOrderStatus(orderStatus);
orderLog.setUser(user);
this.save(orderLog);
}
@Override
public void addOrderLogs(Long orderId, Integer orderStatus, String detail) {
Long userId = RequestUtils.getUserId();
addOrderLogs(orderId, orderStatus, userId.toString(), detail);
}
}

View File

@ -1,35 +0,0 @@
package com.youlai.mall.oms.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.common.web.util.RequestUtils;
import com.youlai.mall.oms.dao.OrderLogDao;
import com.youlai.mall.oms.pojo.domain.OmsOrderLog;
import com.youlai.mall.oms.service.OrderLogsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@Service("orderLogsService")
@Slf4j
public class OrderLogsServiceImpl extends ServiceImpl<OrderLogDao, OmsOrderLog> implements OrderLogsService {
@Override
public void addOrderLogs(Long orderId, Integer orderStatus, String user, String detail) {
try {
log.info("添加订单操作日志orderId={}detail={}", orderId, detail);
OmsOrderLog orderLogs = new OmsOrderLog();
orderLogs.setDetail(detail);
orderLogs.setOrderId(orderId);
orderLogs.setOrderStatus(orderStatus);
orderLogs.setUser(user);
baseMapper.insert(orderLogs);
} catch (Exception e) {
log.error("添加订单操作日志失败orderId={}", orderId, e.getMessage());
}
}
@Override
public void addOrderLogs(Long orderId, Integer orderStatus, String detail) {
Long userId = RequestUtils.getUserId();
addOrderLogs(orderId, orderStatus, userId.toString(), detail);
}
}

View File

@ -13,8 +13,8 @@ import com.youlai.mall.oms.enums.OrderStatusEnum;
import com.youlai.mall.oms.pojo.domain.OmsOrder;
import com.youlai.mall.oms.pojo.domain.OmsOrderPay;
import com.youlai.mall.oms.pojo.vo.PayInfoVO;
import com.youlai.mall.oms.service.OrderLogsService;
import com.youlai.mall.oms.service.OrderPayService;
import com.youlai.mall.oms.service.IOrderLogService;
import com.youlai.mall.oms.service.IOrderPayService;
import com.youlai.mall.oms.service.IOrderService;
import com.youlai.mall.ums.api.app.MemberFeignService;
import com.youlai.mall.ums.pojo.dto.MemberDTO;
@ -27,22 +27,22 @@ import java.util.Date;
@Slf4j
@Service
@AllArgsConstructor
@Service("orderPayService")
public class OrderPayServiceImpl extends ServiceImpl<OrderPayDao, OmsOrderPay> implements OrderPayService {
public class OrderPayServiceImpl extends ServiceImpl<OrderPayDao, OmsOrderPay> implements IOrderPayService {
private IOrderService IOrderService;
private IOrderService orderService;
private OrderLogsService orderLogsService;
private IOrderLogService orderLogService;
private MemberFeignService memberFeignService;
@Override
public PayInfoVO info(String orderId) {
public PayInfoVO info(Long orderId) {
Long userId = RequestUtils.getUserId();
PayInfoVO payInfoVO = new PayInfoVO();
// 1获取订单应支付金额
OmsOrder omsOrder = IOrderService.getByOrderId(orderId);
OmsOrder omsOrder = orderService.getByOrderId(orderId);
payInfoVO.setPayPrice(omsOrder.getPayAmount());
// 2获取会员余额
@ -65,10 +65,10 @@ public class OrderPayServiceImpl extends ServiceImpl<OrderPayDao, OmsOrderPay> i
@Override
@GlobalTransactional(rollbackFor = Exception.class)
public void balancePay(String orderId) {
public void balancePay(Long orderId) {
// 1查询订单详情判断订单状态是否是待支付状态
log.info("订单进入支付流程orderId{}", orderId);
OmsOrder order = IOrderService.getByOrderId(orderId);
OmsOrder order = orderService.getByOrderId(orderId);
OrderStatusEnum orderStatusEnum = OrderStatusEnum.getValue(order.getStatus()) ;
if (orderStatusEnum != OrderStatusEnum.NEED_PAY) {
log.error("订单状态异常无法支付orderStatus={}", orderStatusEnum.getText());
@ -95,9 +95,9 @@ public class OrderPayServiceImpl extends ServiceImpl<OrderPayDao, OmsOrderPay> i
order.setStatus(OrderStatusEnum.IS_PAY.getCode());
order.setPayTime(new Date());
order.setPayType(PayTypeEnum.BALANCE.getCode());
IOrderService.updateById(order);
orderService.updateById(order);
this.save(createOrderPay(order, PayTypeEnum.BALANCE.getCode()));
orderLogsService.addOrderLogs(order.getId(), OrderStatusEnum.IS_PAY.getCode(), userId.toString(), "支付订单");
orderLogService.addOrderLogs(order.getId(), OrderStatusEnum.IS_PAY.getCode(), userId.toString(), "支付订单");
}
private OmsOrderPay createOrderPay(OmsOrder order, Integer payType) {

View File

@ -10,7 +10,7 @@ import com.youlai.mall.oms.config.rabbitmq.OmsRabbitConstants;
import com.youlai.mall.oms.enums.OrderStatusEnum;
import com.youlai.mall.oms.pojo.domain.OmsOrder;
import com.youlai.mall.oms.pojo.domain.OmsOrderItem;
import com.youlai.mall.oms.service.OrderGoodsService;
import com.youlai.mall.oms.service.IOrderItemService;
import com.youlai.mall.oms.service.OrderRabbitService;
import com.youlai.mall.oms.service.IOrderService;
import com.youlai.mall.pms.api.app.InventoryFeignService;
@ -32,9 +32,9 @@ import java.util.stream.Collectors;
@Slf4j
public class OrderRabbitServiceImpl implements OrderRabbitService {
private IOrderService IOrderService;
private IOrderService orderService;
private OrderGoodsService orderGoodsService;
private IOrderItemService orderItemService;
private InventoryFeignService inventoryFeignService;
@ -54,9 +54,9 @@ public class OrderRabbitServiceImpl implements OrderRabbitService {
log.info("获取到消息msgTag={}message={}body={}", msgTag, message.toString(), orderSn);
try {
OmsOrder order = IOrderService.getOne(new LambdaQueryWrapper<OmsOrder>().eq(OmsOrder::getOrderSn,orderSn));
OmsOrder order = orderService.getOne(new LambdaQueryWrapper<OmsOrder>().eq(OmsOrder::getOrderSn, orderSn));
if (order.getStatus().equals(OrderStatusEnum.NEED_PAY.getCode())) {
if (IOrderService.closeOrderBySystem(orderSn)){
if (orderService.closeOrderBySystem(orderSn)) {
unlockInventory(order.getId());
}
}
@ -68,13 +68,8 @@ public class OrderRabbitServiceImpl implements OrderRabbitService {
}
private void unlockInventory(Long orderId) {
List<OmsOrderItem> orderGoods = orderGoodsService.getByOrderId(orderId);
List<InventoryDTO> items = orderGoods.stream().map(good -> {
InventoryDTO item = new InventoryDTO();
item.setInventoryId(good.getSkuId());
item.setNum(good.getSkuQuantity());
return item;
}).collect(Collectors.toList());
List<OmsOrderItem> orderItems = orderItemService.getByOrderId(orderId);
List<InventoryDTO> items = orderItems.stream().map(item -> InventoryDTO.builder().skuId(item.getSkuId()).num(item.getSkuQuantity()).build()).collect(Collectors.toList());
Result result = inventoryFeignService.unlockInventory(items);
if (result == null || !StrUtil.equals(result.getCode(), ResultCode.SUCCESS.getCode())) {
log.error("释放库存异常,商品列表={}", items);

View File

@ -17,8 +17,6 @@ import com.youlai.common.web.util.BeanMapperUtils;
import com.youlai.common.web.util.RequestUtils;
import com.youlai.mall.oms.config.rabbitmq.OmsRabbitConstants;
import com.youlai.mall.oms.dao.OrderDao;
import com.youlai.mall.oms.dao.OrderDeliveryDao;
import com.youlai.mall.oms.dao.OrderItemDao;
import com.youlai.mall.oms.enums.OrderStatusEnum;
import com.youlai.mall.oms.enums.OrderTypeEnum;
import com.youlai.mall.oms.pojo.bo.app.OrderBO;
@ -27,10 +25,7 @@ import com.youlai.mall.oms.pojo.domain.OmsOrder;
import com.youlai.mall.oms.pojo.domain.OmsOrderItem;
import com.youlai.mall.oms.pojo.dto.OrderSubmitInfoDTO;
import com.youlai.mall.oms.pojo.vo.*;
import com.youlai.mall.oms.service.CartService;
import com.youlai.mall.oms.service.OrderGoodsService;
import com.youlai.mall.oms.service.OrderLogsService;
import com.youlai.mall.oms.service.IOrderService;
import com.youlai.mall.oms.service.*;
import com.youlai.mall.pms.api.app.InventoryFeignService;
import com.youlai.mall.pms.pojo.dto.SkuDTO;
import com.youlai.mall.pms.pojo.dto.InventoryDTO;
@ -42,6 +37,7 @@ import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.core.task.AsyncTaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
@ -52,11 +48,12 @@ import java.util.stream.Collectors;
@AllArgsConstructor
@Slf4j
@Service
public class OrderServiceImpl extends ServiceImpl<OrderDao, OmsOrder> implements IOrderService {
private static final ThreadLocal<OrderSubmitInfoDTO> threadLocal = new ThreadLocal<>();
private CartService cartService;
private ICartService cartService;
private InventoryFeignService inventoryFeignService;
@ -64,13 +61,11 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, OmsOrder> implements
private AsyncTaskExecutor executor;
private OrderItemDao orderItemDao;
private IOrderItemService orderItemService;
private OrderDeliveryDao orderDeliveryDao;
private IOrderDeliveryService orderDeliveryService;
private OrderLogsService orderLogsService;
private OrderGoodsService orderGoodsService;
private IOrderLogService orderLogService;
private RabbitTemplate rabbitTemplate;
@ -105,129 +100,184 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, OmsOrder> implements
public OrderSubmitResultVO submit(OrderSubmitInfoDTO submitInfoDTO) {
log.info("开始创建订单:{}", submitInfoDTO);
threadLocal.set(submitInfoDTO);
RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
OrderBO orderBO = new OrderBO();
CompletableFuture<Void> orderFuture;
CompletableFuture<Void> orderItemFuture;
CompletableFuture<Void> orderDeliveryFuture;
// 创建订单
CompletableFuture<Void> orderFuture = CompletableFuture.runAsync(() -> {
RequestContextHolder.setRequestAttributes(attributes);
threadLocal.set(submitInfoDTO);
// 创建订单任务
{
orderFuture = CompletableFuture.runAsync(() -> {
RequestContextHolder.setRequestAttributes(attributes);
threadLocal.set(submitInfoDTO);
OrderSubmitInfoDTO submitInfo = threadLocal.get();
log.info("创建订单实体类submit:{}", submitInfo);
OmsOrder order = new OmsOrder();
order.setOrderSn(IdWorker.getTimeId())
.setRemark(submitInfo.getRemark())
.setStatus(OrderStatusEnum.NEED_PAY.getCode())
.setSourceType(OrderTypeEnum.APP.getCode())
.setMemberId(RequestUtils.getUserId());
orderBO.setOrder(order);
OrderSubmitInfoDTO submitInfo = threadLocal.get();
log.info("创建订单实体类submit:{}", submitInfo);
OmsOrder order = new OmsOrder();
order.setOrderSn(IdWorker.getTimeId())
.setRemark(submitInfo.getRemark())
.setStatus(OrderStatusEnum.NEED_PAY.getCode())
.setSourceType(OrderTypeEnum.APP.getCode())
.setMemberId(RequestUtils.getUserId());
orderBO.setOrder(order);
}, executor);
}, executor);
}
// 创建订单商品
CompletableFuture<Void> orderItemFuture = CompletableFuture.runAsync(() -> {
RequestContextHolder.setRequestAttributes(attributes);
threadLocal.set(submitInfoDTO);
// 创建订单商品任务
{
orderItemFuture = CompletableFuture.runAsync(() -> {
RequestContextHolder.setRequestAttributes(attributes);
threadLocal.set(submitInfoDTO);
OrderSubmitInfoDTO submitInfo = threadLocal.get();
log.info("创建订单商品submitInfo:{}", submitInfo);
OrderSubmitInfoDTO submitInfo = threadLocal.get();
log.info("创建订单商品submitInfo:{}", submitInfo);
List<OmsOrderItem> orderItems;
if (submitInfoDTO.getSkuId() != null) { // 直接下单
orderItems = new ArrayList<>();
orderItems.add(OmsOrderItem.builder().skuId(submitInfo.getSkuId()).skuQuantity(submitInfo.getSkuNumber()).build());
} else { // 购物车下单
CartVO cart = cartService.getCart();
orderItems = cart.getItems().stream().map(cartItem -> OmsOrderItem.builder().skuId(cartItem.getSkuId())
.skuQuantity(cartItem.getNum())
.build()
).collect(Collectors.toList());
}
List<OmsOrderItem> orderItems;
if (submitInfoDTO.getSkuId() != null) { // 直接下单
orderItems = new ArrayList<>();
orderItems.add(OmsOrderItem.builder().skuId(submitInfo.getSkuId()).skuQuantity(submitInfo.getSkuNumber()).build());
} else { // 购物车下单
CartVO cart = cartService.getCart();
orderItems = cart.getItems().stream().map(cartItem -> OmsOrderItem.builder().skuId(cartItem.getSkuId())
.skuQuantity(cartItem.getNum())
.build()
).collect(Collectors.toList());
}
List<Long> skuIds = orderItems.stream().map(item -> item.getSkuId())
.collect(Collectors.toList());
List<Long> skuIds = orderItems.stream().map(item -> item.getSkuId())
.collect(Collectors.toList());
List<SkuDTO> skus = inventoryFeignService.listBySkuIds(skuIds).getData();
if (CollectionUtil.isEmpty(skus)) {
throw new BizException("订单商品库存为空");
}
for (OmsOrderItem orderItem : orderItems) {
skus.stream().filter(sku -> sku.getId().equals(orderItem.getSkuId())).findFirst()
.ifPresent(skuItem -> {
BeanUtil.copyProperties(skuItem, orderItem);
orderItem.setSkuTotalPrice(orderItem.getSkuPrice() * orderItem.getSkuQuantity());
});
}
orderBO.setOrderItems(orderItems);
}, executor);
List<SkuDTO> skus = inventoryFeignService.listBySkuIds(skuIds).getData();
if (CollectionUtil.isEmpty(skus)) {
throw new BizException("订单商品库存为空");
}
for (OmsOrderItem orderItem : orderItems) {
skus.stream().filter(sku -> sku.getId().equals(orderItem.getSkuId())).findFirst()
.ifPresent(skuItem -> {
BeanUtil.copyProperties(skuItem, orderItem);
orderItem.setSkuTotalPrice(orderItem.getSkuPrice() * orderItem.getSkuQuantity());
});
}
orderBO.setOrderItems(orderItems);
}, executor);
}
// 生成发货信息
CompletableFuture<Void> orderDeliveryFuture = CompletableFuture.runAsync(() -> {
RequestContextHolder.setRequestAttributes(attributes);
threadLocal.set(submitInfoDTO);
// 创建发货信息任务
{
orderDeliveryFuture = CompletableFuture.runAsync(() -> {
RequestContextHolder.setRequestAttributes(attributes);
threadLocal.set(submitInfoDTO);
String addressId = threadLocal.get().getAddressId();
log.info("获取订单地址信息addressId{}", addressId);
UmsAddressDTO userAddress = memberFeignService.getAddressById(addressId).getData();
if (userAddress == null) {
throw new BizException("提交订单失败,无法获取用户地址信息");
}
OmsOrderDelivery orderDelivery = OmsOrderDelivery.builder()
.receiverName(userAddress.getName())
.receiverPhone(userAddress.getMobile())
.receiverPostCode(userAddress.getZipCode())
.receiverProvince(userAddress.getProvince())
.receiverCity(userAddress.getCity())
.receiverRegion(userAddress.getArea())
.receiverDetailAddress(userAddress.getAddress())
.build();
String addressId = threadLocal.get().getAddressId();
log.info("获取订单地址信息addressId{}", addressId);
UmsAddressDTO userAddress = memberFeignService.getAddressById(addressId).getData();
if (userAddress == null) {
throw new BizException("提交订单失败,无法获取用户地址信息");
}
OmsOrderDelivery orderDelivery = OmsOrderDelivery.builder()
.receiverName(userAddress.getName())
.receiverPhone(userAddress.getMobile())
.receiverPostCode(userAddress.getZipCode())
.receiverProvince(userAddress.getProvince())
.receiverCity(userAddress.getCity())
.receiverRegion(userAddress.getArea())
.receiverDetailAddress(userAddress.getAddress())
.build();
orderBO.setOrderDelivery(orderDelivery);
}, executor);
orderBO.setOrderDelivery(orderDelivery);
}, executor);
}
CompletableFuture<Void> future = CompletableFuture.allOf(orderFuture, orderItemFuture, orderDeliveryFuture);
future.get();
// 订单验价
computePrice(orderBO.getOmsOrder(), orderBO.getOrderGoods());
{
OmsOrder order = orderBO.getOrder();
List<OmsOrderItem> orderItems = orderBO.getOrderItems();
// 扣减库存
lockStock(orderBO.getOrderGoods());
log.info("计算订单价格order:{}orderItems:{}", order, orderItems);
// 保存订单
this.baseMapper.insert(orderBO.getOmsOrder());
Long orderId = orderBO.getOmsOrder().getId();
if (order == null || CollectionUtil.isEmpty(orderItems)) {
throw new BizException("订单或订单商品列表为空,订单创建失败");
}
// 保存订单商品
for (OmsOrderItem orderGood : orderBO.getOrderGoods()) {
orderGood.setOrderId(orderId);
orderItemDao.insert(orderGood);
Long totalAmount = orderItems.stream().mapToLong(OmsOrderItem::getSkuTotalPrice).sum();
int totalQuantity = orderItems.stream().mapToInt(OmsOrderItem::getSkuQuantity).sum();
Long payAmount = totalAmount;
if (order.getCouponAmount() != null) {
payAmount -= order.getCouponAmount();
}
if (order.getFreightAmount() != null) {
payAmount -= order.getFreightAmount();
}
OrderSubmitInfoDTO orderSubmitInfo = threadLocal.get();
int compare = Long.compare(orderSubmitInfo.getPayAmount().longValue(), payAmount.longValue());
if (compare != 0) {
throw new BizException("订单价格变化,请重新提交");
}
order.setTotalAmount(totalAmount);
order.setTotalQuantity(totalQuantity);
order.setPayAmount(payAmount);
}
// 保存订单发货信息
orderBO.getOmsOrderDelivery().setOrderId(orderId);
orderDeliveryDao.insert(orderBO.getOmsOrderDelivery());
// 锁定库存
{
List<OmsOrderItem> orderItems = orderBO.getOrderItems();
List<InventoryDTO> items = orderItems.stream().map(orderItem -> InventoryDTO.builder()
.skuId(orderItem.getSkuId())
.num(orderItem.getSkuQuantity())
.build())
.collect(Collectors.toList());
// 保存订单日志
// 清空购物车
if (ObjectUtil.isNull(submit.getSkuId())) {
cartService.cleanSelected();
Result result = inventoryFeignService.lockInventory(items);
if (result == null || !StrUtil.equals(result.getCode(), ResultCode.SUCCESS.getCode())) {
throw new BizException("下单失败,锁定库存错误");
}
}
// 保存订单
OmsOrder order = orderBO.getOrder();
this.save(order);
Long orderId = order.getId();
// 保存订单商品
List<OmsOrderItem> orderItems = orderBO.getOrderItems();
orderItems.forEach(item -> item.setOrderId(orderId));
orderItemService.saveBatch(orderItems);
// 保存发货信息
OmsOrderDelivery orderDelivery = orderBO.getOrderDelivery();
orderDelivery.setOrderId(orderId);
orderDeliveryService.save(orderDelivery);
// 删除购物车中已购买的商品
if (ObjectUtil.isNull(submitInfoDTO.getSkuId())) {
cartService.deleteSelectedItem();
}
// 将订单放入定时队列中超时未支付系统自动关单释放库存
rabbitTemplate.convertAndSend(OmsRabbitConstants.ORDER_EVENT_EXCHANGE,
OmsRabbitConstants.ORDER_CREATE_ORDER_KEY, orderBO.getOmsOrder().getOrderSn());
OmsRabbitConstants.ORDER_CREATE_ORDER_KEY,
orderBO.getOrder().getOrderSn()
);
orderLogsService.addOrderLogs(orderBO.getOmsOrder().getId(), orderBO.getOmsOrder().getStatus(), RequestUtils.getUserId().toString(), "创建订单");
// 保存日志
orderLogService.addOrderLogs(orderId,
orderBO.getOrder().getStatus(),
RequestUtils.getUserId().toString(),
"创建订单"
);
OrderSubmitResultVO result = new OrderSubmitResultVO();
result.setId(orderId);
result.setOrderSn(orderBO.getOmsOrder().getOrderSn());
result.setOrderSn(order.getOrderSn());
return result;
}
@ -243,14 +293,14 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, OmsOrder> implements
order.setStatus(OrderStatusEnum.SYS_CANCEL.getCode());
baseMapper.updateById(order);
// 添加订单操作日志
orderLogsService.addOrderLogs(order.getId(), order.getStatus(),
orderLogService.addOrderLogs(order.getId(), order.getStatus(),
"系统操作", OrderStatusEnum.SYS_CANCEL.getText());
return true;
}
@Override
public boolean cancelOrder(String id) {
public boolean cancelOrder(Long id) {
log.info("会员取消订单orderId={}", id);
OmsOrder order = getByOrderId(id);
if (!order.getStatus().equals(OrderStatusEnum.NEED_PAY.getCode())) {
@ -260,22 +310,21 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, OmsOrder> implements
order.setStatus(OrderStatusEnum.USER_CANCEL.getCode());
baseMapper.updateById(order);
// 添加订单操作日志
orderLogsService.addOrderLogs(order.getId(), order.getStatus(), OrderStatusEnum.USER_CANCEL.getText());
orderLogService.addOrderLogs(order.getId(), order.getStatus(), OrderStatusEnum.USER_CANCEL.getText());
return true;
}
@Override
@Transactional(rollbackFor = Exception.class)
public boolean deleteOrder(String id) {
public boolean deleteOrder(Long id) {
// 查询订单校验订单状态
OmsOrder order = this.getByOrderId(id);
if (!order.getStatus().equals(OrderStatusEnum.SYS_CANCEL.getCode()) &&
order.getStatus().equals(OrderStatusEnum.USER_CANCEL.getCode())) {
throw new BizException(StrUtil.format("订单无法删除,订单状态【{}】", Objects.requireNonNull(OrderStatusEnum.getValue(order.getStatus())).getText()));
}
this.removeById(id);
orderLogsService.addOrderLogs(order.getId(), order.getStatus(), "会员删除订单");
orderLogService.addOrderLogs(order.getId(), order.getStatus(), "会员删除订单");
return true;
}
@ -294,7 +343,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, OmsOrder> implements
}
List<Long> orderIds = orderList.stream().map(orderEntity -> orderEntity.getId()).collect(Collectors.toList());
Map<Long, List<OmsOrderItem>> orderGoodsMap = orderGoodsService.getByOrderIds(orderIds);
Map<Long, List<OmsOrderItem>> orderGoodsMap = orderItemService.getByOrderIds(orderIds);
List<OrderListVO> result = orderList.stream().map(orderEntity -> {
OrderListVO orderListVO = BeanMapperUtils.map(orderEntity, OrderListVO.class);
orderListVO.setStatusDesc(OrderStatusEnum.getValue(orderListVO.getStatus()).getText());
@ -309,63 +358,19 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, OmsOrder> implements
}
@Override
public OmsOrder getByOrderId(String id) {
public OmsOrder getByOrderId(Long id) {
Long userId = RequestUtils.getUserId();
QueryWrapper<OmsOrder> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("member_id", userId).eq("id", id);
OmsOrder omsOrder = this.getOne(queryWrapper);
if (omsOrder == null) {
OmsOrder order = this.getOne(new LambdaQueryWrapper<OmsOrder>()
.eq(OmsOrder::getId, id)
.eq(OmsOrder::getMemberId, userId));
if (order == null) {
throw new BizException("订单不存在订单ID非法");
}
return omsOrder;
return order;
}
private void lockStock(List<OmsOrderItem> orderGoods) {
List<InventoryDTO> items = orderGoods.stream().map(good -> {
InventoryDTO item = new InventoryDTO();
item.setInventoryId(good.getSkuId());
item.setNum(good.getSkuQuantity());
return item;
}).collect(Collectors.toList());
Result result = inventoryFeignService.lockInventory(items);
if (result == null || !StrUtil.equals(result.getCode(), ResultCode.SUCCESS.getCode())) {
log.error("锁定库存异常,商品列表={}", items);
throw new BizException("下单失败,锁定库存错误");
}
}
/**
* 计算订单商品价格
*
* @param order
* @param orderGoods
* @return
*/
private Long computePrice(OmsOrder order, List<OmsOrderItem> orderGoods) {
log.info("计算订单价格order:{},orderGoods:{}", order, orderGoods);
if (order == null || CollectionUtil.isEmpty(orderGoods)) {
throw new BizException("订单或订单商品列表为空,订单创建失败");
}
Long totalAmount = orderGoods.stream().mapToLong(OmsOrderItem::getSkuTotalPrice).sum();
int totalQuantity = orderGoods.stream().mapToInt(OmsOrderItem::getSkuQuantity).sum();
Long payAmount = totalAmount;
if (order.getCouponAmount() != null) {
payAmount -= order.getCouponAmount();
}
if (order.getFreightAmount() != null) {
payAmount -= order.getFreightAmount();
}
order.setTotalAmount(totalAmount);
order.setTotalQuantity(totalQuantity);
order.setPayAmount(payAmount);
OrderSubmitInfoDTO submit = threadLocal.get();
if (!StrUtil.equals(submit.getPayAmount().toString(), payAmount.toString())) {
throw new BizException("订单价格变化,请重新提交");
}
return payAmount;
}
/**
* 获取订单商品 1. 直接购买 2. 购物车结算

View File

@ -3,11 +3,11 @@ package com.youlai.mall.oms.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.mall.oms.dao.OrderSettingDao;
import com.youlai.mall.oms.pojo.domain.OmsOrderSetting;
import com.youlai.mall.oms.service.OrderSettingService;
import com.youlai.mall.oms.service.IOrderSettingService;
import org.springframework.stereotype.Service;
@Service("orderSettingService")
public class OrderSettingServiceImpl extends ServiceImpl<OrderSettingDao, OmsOrderSetting> implements OrderSettingService {
@Service
public class OrderSettingServiceImpl extends ServiceImpl<OrderSettingDao, OmsOrderSetting> implements IOrderSettingService {
}

View File

@ -1,76 +0,0 @@
package com.youlai.mall.oms.controller;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.youlai.common.result.ResultCode;
import com.youlai.mall.oms.controller.admin.OrderController;
import com.youlai.mall.pms.api.app.InventoryFeignService;
import com.youlai.mall.ums.api.app.MemberFeignService;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.HttpMethod;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
@AutoConfigureMockMvc
@SpringBootTest
@Slf4j
public class OrderControllerTest {
@Autowired
public MockMvc mockMvc;
@Autowired
public OrderController orderController;
/**
* 提交订单
*
* @throws Exception
*/
@Test
public void saveOrder() throws Exception {
String goods = "{\"order\":{\"userId\":0,\"status\":10,\"source\":0,\"consignee\":\"str\",\"mobile\":\"str\",\"postcode\":\"str\",\"address\":\"str\",\"couponId\":0,\"skuPrice\":0,\"freightPrice\":0,\"couponPrice\":0,\"orderPrice\":0,\"integrationPrice\":0,\"payPrice\":0,\"payId\":\"str\",\"payType\":0,\"payTime\":1606379283562,\"shipSn\":\"str\",\"shipChannel\":\"str\"},\n" +
" \"orderItems\":[{\"spuId\":0,\"spuName\":\"str\",\"skuId\":\"0\",\"skuBarCode\":\"str\",\"skuSpecifications\":\"str\",\"skuPrice\":0,\"skuQuantity\":0,\"pic\":\"str\"}]}";
MvcResult result = mockMvc.perform(MockMvcRequestBuilders.request(HttpMethod.POST, "/orders")
.contentType("application/json")
.content(goods))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.jsonPath("$.code").value(ResultCode.SUCCESS.getCode()))
.andDo(print())
.andReturn();
log.info(result.getResponse().getContentAsString());
}
@Autowired
private InventoryFeignService inventoryFeignService;
@Autowired
private MemberFeignService memberFeignService;
@Autowired
private IOmsOrderService iOmsOrderService;
@Test
@GlobalTransactional(rollbackFor = Exception.class)
public void submitOrder() {
// 扣减库存
// skuFeignService.lockStock(151l, -1);
// 增加积分
memberFeignService.updatePoint(1l, 10);
// 修改订单状态
iOmsOrderService.update(new LambdaUpdateWrapper<OmsOrder1>().eq(OmsOrder1::getId, 1l).set(OmsOrder1::getStatus, 901));
}
}

View File

@ -2,6 +2,7 @@ package com.youlai.mall.pms.pojo.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;
/**
@ -10,11 +11,11 @@ import lombok.Data;
* @createTime 2021-03-07 15:14
*/
@Data
@ApiModel
@Builder
public class InventoryDTO {
@ApiModelProperty("库存ID")
private Long inventoryId;
private Long skuId;
@ApiModelProperty("数量")
private Integer num;

View File

@ -34,12 +34,12 @@ public class PmsSkuServiceImpl extends ServiceImpl<PmsSkuMapper, PmsSku> impleme
inventories.forEach(item -> {
boolean result = this.update(new LambdaUpdateWrapper<PmsSku>()
.eq(PmsSku::getId, item.getInventoryId())
.eq(PmsSku::getId, item.getSkuId())
.apply("inventory >= locked_inventory + {0}", item.getNum())
.setSql("locked_inventory = locked_inventory + " + item.getNum())
);
if (!result) {
throw new BizException("锁定库存失败库存ID:" + item.getInventoryId() + ",数量:" + item.getNum());
throw new BizException("锁定库存失败库存ID:" + item.getSkuId() + ",数量:" + item.getNum());
}
});
@ -52,11 +52,11 @@ public class PmsSkuServiceImpl extends ServiceImpl<PmsSkuMapper, PmsSku> impleme
inventories.forEach(item -> {
boolean result = this.update(new LambdaUpdateWrapper<PmsSku>()
.eq(PmsSku::getId, item.getInventoryId())
.eq(PmsSku::getId, item.getSkuId())
.setSql("locked_inventory = locked_inventory - " + item.getNum())
);
if (!result) {
throw new BizException("解锁库存失败库存ID:" + item.getInventoryId() + ",数量:" + item.getNum());
throw new BizException("解锁库存失败库存ID:" + item.getSkuId() + ",数量:" + item.getNum());
}
});
return true;