diff --git a/ZJ-java/ZJ-common/src/main/java/com/wyh/common/entity/GoodsOrder.java b/ZJ-java/ZJ-common/src/main/java/com/wyh/common/entity/GoodsOrder.java new file mode 100644 index 0000000..251c0d0 --- /dev/null +++ b/ZJ-java/ZJ-common/src/main/java/com/wyh/common/entity/GoodsOrder.java @@ -0,0 +1,34 @@ +package com.wyh.common.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel("订单商品实体") +public class GoodsOrder implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + @ApiModelProperty(value = "") + private Integer id; + + @ApiModelProperty(value = "商品id") + private Integer goodsId; + + @ApiModelProperty(value = "订单id") + private String orderSn; + + @ApiModelProperty(value = "商品数量") + private Integer num; + + @ApiModelProperty(value = "商品金额") + private BigDecimal price; + +} \ No newline at end of file diff --git a/ZJ-java/ZJ-common/src/main/java/com/wyh/common/entity/Order.java b/ZJ-java/ZJ-common/src/main/java/com/wyh/common/entity/Order.java index fc524fa..034d648 100644 --- a/ZJ-java/ZJ-common/src/main/java/com/wyh/common/entity/Order.java +++ b/ZJ-java/ZJ-common/src/main/java/com/wyh/common/entity/Order.java @@ -49,4 +49,8 @@ public class Order implements Serializable { @ApiModelProperty(value = "外部订单号") private String outSn; + + @ApiModelProperty(value = "来源:1:商品,2:购物车") + private Integer source; + } \ No newline at end of file diff --git a/ZJ-java/ZJ-common/src/main/java/com/wyh/common/mapper/GoodsOrderMapper.java b/ZJ-java/ZJ-common/src/main/java/com/wyh/common/mapper/GoodsOrderMapper.java new file mode 100644 index 0000000..82f2623 --- /dev/null +++ b/ZJ-java/ZJ-common/src/main/java/com/wyh/common/mapper/GoodsOrderMapper.java @@ -0,0 +1,13 @@ +package com.wyh.common.mapper; + +import com.wyh.common.core.basics.IBaseMapper; +import com.wyh.common.entity.GoodsOrder; +import org.apache.ibatis.annotations.Mapper; + +/** + * 订单商品Mapper + * @author LikeAdmin + */ +@Mapper +public interface GoodsOrderMapper extends IBaseMapper { +} diff --git a/ZJ-java/ZJ-common/src/main/java/com/wyh/common/validator/OrderSearchValidate.java b/ZJ-java/ZJ-common/src/main/java/com/wyh/common/validator/OrderSearchValidate.java index a57ba38..f864eb2 100644 --- a/ZJ-java/ZJ-common/src/main/java/com/wyh/common/validator/OrderSearchValidate.java +++ b/ZJ-java/ZJ-common/src/main/java/com/wyh/common/validator/OrderSearchValidate.java @@ -17,6 +17,8 @@ public class OrderSearchValidate implements Serializable { @ApiModelProperty(value = "地址信息id") private Integer adId; + @ApiModelProperty(value = "订单id") + private Integer id; @ApiModelProperty(value = "订单状态:1:待审核,2:待收货,3:租用中,4:已返还") private Integer status; diff --git a/ZJ-java/ZJ-common/src/main/java/com/wyh/common/vo/OrderDetailResponseVo.java b/ZJ-java/ZJ-common/src/main/java/com/wyh/common/vo/OrderDetailResponseVo.java new file mode 100644 index 0000000..27d6f89 --- /dev/null +++ b/ZJ-java/ZJ-common/src/main/java/com/wyh/common/vo/OrderDetailResponseVo.java @@ -0,0 +1,35 @@ +package com.wyh.common.vo; + + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@Data +@ApiModel(value = "订单详情响应对象") +public class OrderDetailResponseVo { + @ApiModelProperty(value = "订单id") + private Integer id; + @ApiModelProperty(value = "订单编号") + private String sn; + @ApiModelProperty(value = "收货地址") + private String address; + @ApiModelProperty(value = "创建时间") + private String createTime; + @ApiModelProperty(value = "用户id") + private Integer userId; + @ApiModelProperty(value = "用户名") + private String nickName; + @ApiModelProperty(value = "手机号") + private String mobile; + @ApiModelProperty(value = "订单状态 0-待付款 1-待发货 2-待收货 3-已完成 4-已取消") + private Integer status; + @ApiModelProperty(value = "订单总金额") + private BigDecimal totalPrice; + @ApiModelProperty(value = "订单商品列表") + private List orderItem; + +} diff --git a/ZJ-java/ZJ-common/src/main/java/com/wyh/common/vo/OrderItemResponseVo.java b/ZJ-java/ZJ-common/src/main/java/com/wyh/common/vo/OrderItemResponseVo.java new file mode 100644 index 0000000..9ec1a9c --- /dev/null +++ b/ZJ-java/ZJ-common/src/main/java/com/wyh/common/vo/OrderItemResponseVo.java @@ -0,0 +1,24 @@ +package com.wyh.common.vo; + +import com.wyh.common.entity.goods.Goods; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@ApiModel(value = "订单-商品列表对象") +public class OrderItemResponseVo { + + @ApiModelProperty(value = "商品信息") + private Goods goods; + + @ApiModelProperty(value = "商品数量") + private Integer num; + + @ApiModelProperty(value = "商品价格") + private BigDecimal price; + + +} diff --git a/ZJ-java/ZJ-common/src/main/java/com/wyh/common/vo/OrderResponseVo.java b/ZJ-java/ZJ-common/src/main/java/com/wyh/common/vo/OrderResponseVo.java new file mode 100644 index 0000000..cb7d366 --- /dev/null +++ b/ZJ-java/ZJ-common/src/main/java/com/wyh/common/vo/OrderResponseVo.java @@ -0,0 +1,29 @@ +package com.wyh.common.vo; + + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@Data +@ApiModel(value = "订单响应对象") +public class OrderResponseVo { + @ApiModelProperty(value = "订单id") + private Integer id; + @ApiModelProperty(value = "订单编号") + private String sn; + @ApiModelProperty(value = "创建时间") + private String createTime; + @ApiModelProperty(value = "用户id") + private Integer userId; + @ApiModelProperty(value = "订单状态 0-待付款 1-待发货 2-待收货 3-已完成 4-已取消") + private Integer status; + @ApiModelProperty(value = "订单总金额") + private BigDecimal totalPrice; + @ApiModelProperty(value = "订单商品列表") + private List orderItem; + +} diff --git a/ZJ-java/ZJ-front/src/main/java/com/wyh/front/controller/CartController.java b/ZJ-java/ZJ-front/src/main/java/com/wyh/front/controller/CartController.java index b4be83d..294f460 100644 --- a/ZJ-java/ZJ-front/src/main/java/com/wyh/front/controller/CartController.java +++ b/ZJ-java/ZJ-front/src/main/java/com/wyh/front/controller/CartController.java @@ -45,4 +45,13 @@ public class CartController { CartVo cartVo = cartService.updateCheck(userId, type); return AjaxResult.success(cartVo); } + + @PostMapping("remove") + @ApiOperation(value = "删除购物车中商品") + public AjaxResult remove(@RequestParam(name = "ids") @ApiParam(value = "商品id数组") List ids) { + cartService.remove(ids); + return AjaxResult.success(); + } + + } diff --git a/ZJ-java/ZJ-front/src/main/java/com/wyh/front/controller/OrderController.java b/ZJ-java/ZJ-front/src/main/java/com/wyh/front/controller/OrderController.java index 7f430c0..60364b1 100644 --- a/ZJ-java/ZJ-front/src/main/java/com/wyh/front/controller/OrderController.java +++ b/ZJ-java/ZJ-front/src/main/java/com/wyh/front/controller/OrderController.java @@ -1,11 +1,16 @@ package com.wyh.front.controller; +import com.wyh.common.core.AjaxResult; +import com.wyh.common.validator.OrderSearchValidate; +import com.wyh.front.service.OrderService; +import com.wyh.front.validate.OrderCreateDto; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; @RestController @RequestMapping("front/order") @@ -13,13 +18,29 @@ import org.springframework.web.bind.annotation.RestController; public class OrderController { + @Resource + private OrderService orderService; @PostMapping("add") @ApiOperation("添加订单") - public void add(){ - + public AjaxResult add(@Validated @RequestBody OrderCreateDto orderCreateDto){ + orderService.add(orderCreateDto); + return AjaxResult.success(); } + @GetMapping("get") + @ApiOperation("获取订单") + public AjaxResult get(@Validated OrderSearchValidate validate){ + return AjaxResult.success(orderService.get(validate)); + } + + + @GetMapping("getDetail") + @ApiOperation("订单详情") + public AjaxResult getDetail(@Validated OrderSearchValidate validate){ + return AjaxResult.success(orderService.getDetail(validate)); + } + } diff --git a/ZJ-java/ZJ-front/src/main/java/com/wyh/front/service/CartService.java b/ZJ-java/ZJ-front/src/main/java/com/wyh/front/service/CartService.java index f28437b..2d8100d 100644 --- a/ZJ-java/ZJ-front/src/main/java/com/wyh/front/service/CartService.java +++ b/ZJ-java/ZJ-front/src/main/java/com/wyh/front/service/CartService.java @@ -11,4 +11,8 @@ public interface CartService { CartVo getCart(); CartVo updateCheck(Integer userId,Integer type); + + void remove(Integer[] ids); + + void remove(List ids); } diff --git a/ZJ-java/ZJ-front/src/main/java/com/wyh/front/service/OrderService.java b/ZJ-java/ZJ-front/src/main/java/com/wyh/front/service/OrderService.java new file mode 100644 index 0000000..2a2a8bd --- /dev/null +++ b/ZJ-java/ZJ-front/src/main/java/com/wyh/front/service/OrderService.java @@ -0,0 +1,16 @@ +package com.wyh.front.service; + +import com.wyh.common.validator.OrderSearchValidate; +import com.wyh.common.vo.OrderDetailResponseVo; +import com.wyh.common.vo.OrderResponseVo; +import com.wyh.front.validate.OrderCreateDto; + +import java.util.List; + +public interface OrderService { + void add(OrderCreateDto orderCreateDto); + + List get(OrderSearchValidate validate); + + OrderDetailResponseVo getDetail(OrderSearchValidate validate); +} diff --git a/ZJ-java/ZJ-front/src/main/java/com/wyh/front/service/impl/CartServiceImpl.java b/ZJ-java/ZJ-front/src/main/java/com/wyh/front/service/impl/CartServiceImpl.java index bee1656..3f1263c 100644 --- a/ZJ-java/ZJ-front/src/main/java/com/wyh/front/service/impl/CartServiceImpl.java +++ b/ZJ-java/ZJ-front/src/main/java/com/wyh/front/service/impl/CartServiceImpl.java @@ -16,6 +16,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @@ -117,6 +118,16 @@ public class CartServiceImpl implements CartService { return cart; } + @Override + public void remove(Integer[] ids) { + userGoodsMapper.deleteBatchIds(Arrays.asList(ids)); + } + + @Override + public void remove(List ids) { + userGoodsMapper.deleteBatchIds(ids); + } + private void updateCheckDown(Integer userId) { userGoodsMapper.update(null, Wrappers.lambdaUpdate() .set(UserGoods::getIsCheck, 0) diff --git a/ZJ-java/ZJ-front/src/main/java/com/wyh/front/service/impl/OrderServiceImpl.java b/ZJ-java/ZJ-front/src/main/java/com/wyh/front/service/impl/OrderServiceImpl.java new file mode 100644 index 0000000..021839f --- /dev/null +++ b/ZJ-java/ZJ-front/src/main/java/com/wyh/front/service/impl/OrderServiceImpl.java @@ -0,0 +1,175 @@ +package com.wyh.front.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.wyh.common.entity.GoodsOrder; +import com.wyh.common.entity.Order; +import com.wyh.common.entity.goods.Goods; +import com.wyh.common.entity.user.User; +import com.wyh.common.entity.user.UserAddress; +import com.wyh.common.mapper.GoodsOrderMapper; +import com.wyh.common.mapper.OrderMapper; +import com.wyh.common.mapper.goods.GoodsMapper; +import com.wyh.common.mapper.user.UserAddressMapper; +import com.wyh.common.mapper.user.UserMapper; +import com.wyh.common.util.TimeUtils; +import com.wyh.common.util.ToolUtils; +import com.wyh.common.validator.OrderSearchValidate; +import com.wyh.common.vo.OrderDetailResponseVo; +import com.wyh.common.vo.OrderItemResponseVo; +import com.wyh.common.vo.OrderResponseVo; +import com.wyh.front.ZJFrontThreadLocal; +import com.wyh.front.service.OrderService; +import com.wyh.front.validate.OrderCreateDto; +import com.wyh.front.validate.OrderGoodsDto; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + + +@Service +public class OrderServiceImpl implements OrderService { + + @Resource + private OrderMapper orderMapper; + + @Resource + private GoodsMapper goodsMapper; + + @Resource + UserAddressMapper addressMapper; + + @Resource + private UserMapper userMapper; + @Resource + private GoodsOrderMapper goodsOrderMapper; + + @Override + public void add(OrderCreateDto orderCreateDto) { + Integer userId = ZJFrontThreadLocal.getUserId(); + Integer source = orderCreateDto.getSource(); + String sn = "order" + ToolUtils.randomString(16); + BigDecimal totalPrice = new BigDecimal(0); + + if (CollectionUtils.isEmpty(orderCreateDto.getGoodsDtos())) { + throw new RuntimeException("请选择商品"); + } + + List goodsList = orderCreateDto.getGoodsDtos(); + List goods = goodsMapper.selectList(Wrappers.lambdaQuery().in(Goods::getId, goodsList.stream().map(OrderGoodsDto::getGoodsId).collect(Collectors.toList()))); + + Map quantityMap = goodsList.stream() + .collect(Collectors.toMap(OrderGoodsDto::getGoodsId, OrderGoodsDto::getNum)); + + for (Goods good : goods) { + Integer quantity = quantityMap.getOrDefault(good.getId(), 0); + BigDecimal orderPrice = good.getPrice().multiply(new BigDecimal(quantity)); + + totalPrice = totalPrice.add(orderPrice); + + GoodsOrder goodsOrder = new GoodsOrder(); + goodsOrder.setOrderSn(sn); + goodsOrder.setGoodsId(good.getId()); + goodsOrder.setNum(quantity); + goodsOrder.setPrice(orderPrice); + goodsOrderMapper.insert(goodsOrder); + } + User user = userMapper.selectById(userId); + Assert.isTrue(user != null, "用户不存在"); + Assert.isTrue(user.getMoney().compareTo(totalPrice) >= 0, "余额不足"); + Order order = new Order(); + order.setSn(sn); + order.setUserId(userId); + order.setStatus(1); + order.setCreateTime(System.currentTimeMillis() / 1000); + order.setUpdateTime(System.currentTimeMillis() / 1000); + order.setSource(source); + order.setTotalPrice(totalPrice); + order.setAdId(orderCreateDto.getAdId()); + + orderMapper.insert(order); + + } + + @Override + public List get(OrderSearchValidate validate) { + LambdaQueryWrapper orderLambdaQueryWrapper = new LambdaQueryWrapper<>(); + if (validate.getStatus() != null && validate.getStatus() != 0) { + orderLambdaQueryWrapper.eq(Order::getStatus, validate.getStatus()); + } + Integer userId = ZJFrontThreadLocal.getUserId(); + orderLambdaQueryWrapper.eq(Order::getUserId, userId); + List orders = orderMapper.selectList(orderLambdaQueryWrapper); + List orderResponseVos = new ArrayList<>(); + if (CollectionUtils.isEmpty(orders)) { + return orderResponseVos; + } + List orderSns = orders.stream().map(Order::getSn).collect(Collectors.toList()); + List goodsOrders = goodsOrderMapper.selectList(Wrappers.lambdaQuery().in(GoodsOrder::getOrderSn, orderSns)); + for (Order order : orders) { + OrderResponseVo orderResponseVo = new OrderResponseVo(); + BeanUtils.copyProperties(order, orderResponseVo); + orderResponseVo.setCreateTime(TimeUtils.timestampToDate(order.getCreateTime())); + List orderItemResponseVos = new ArrayList<>(); + for (GoodsOrder goodsOrder : goodsOrders) { + if (goodsOrder.getOrderSn().equals(order.getSn())) { + OrderItemResponseVo orderItemResponseVo = new OrderItemResponseVo(); + Goods goods = goodsMapper.selectById(goodsOrder.getGoodsId()); + orderItemResponseVo.setGoods(goods); + orderItemResponseVo.setNum(goodsOrder.getNum()); + orderItemResponseVo.setPrice(goodsOrder.getPrice()); + orderItemResponseVos.add(orderItemResponseVo); + System.out.println(goods); + + orderResponseVo.setOrderItem(orderItemResponseVos); + } + } + orderResponseVos.add(orderResponseVo) ; + } + return orderResponseVos; + } + + @Override + public OrderDetailResponseVo getDetail(OrderSearchValidate validate) { + + Integer userId = ZJFrontThreadLocal.getUserId(); + String sn = validate.getSn(); + Order order = orderMapper.selectOne(Wrappers.lambdaQuery().eq(Order::getSn, sn)); + Assert.notNull(order, "订单不存在"); + UserAddress userAddresses = addressMapper.selectOne(Wrappers.lambdaQuery().eq(UserAddress::getUserId, userId).eq(UserAddress::getId, order.getAdId())); + User user = userMapper.selectById(order.getUserId()); + Assert.notNull(user, "用户不存在"); + OrderDetailResponseVo orderDetailResponseVo = new OrderDetailResponseVo(); + orderDetailResponseVo.setId(order.getId()); + orderDetailResponseVo.setSn(order.getSn()); + orderDetailResponseVo.setTotalPrice(order.getTotalPrice()); + orderDetailResponseVo.setStatus(order.getStatus()); + orderDetailResponseVo.setUserId(order.getUserId()); + orderDetailResponseVo.setCreateTime(TimeUtils.timestampToDate(order.getCreateTime())); + orderDetailResponseVo.setAddress(userAddresses.getAddress()); + orderDetailResponseVo.setMobile(user.getMobile()); + orderDetailResponseVo.setNickName(user.getNickname()); + + List goodsOrders = goodsOrderMapper.selectList(Wrappers.lambdaQuery().eq(GoodsOrder::getOrderSn, order.getSn())); + + List orderItemResponseVos = new ArrayList<>(); + for (GoodsOrder goodsOrder : goodsOrders) { + OrderItemResponseVo orderItemResponseVo = new OrderItemResponseVo(); + Goods goods = goodsMapper.selectById(goodsOrder.getGoodsId()); + orderItemResponseVo.setGoods(goods); + orderItemResponseVo.setNum(goodsOrder.getNum()); + orderItemResponseVo.setPrice(goodsOrder.getPrice()); + orderItemResponseVos.add(orderItemResponseVo); + } + orderDetailResponseVo.setOrderItem(orderItemResponseVos); + return orderDetailResponseVo; + } +} diff --git a/ZJ-java/ZJ-front/src/main/java/com/wyh/front/validate/OrderCreateDto.java b/ZJ-java/ZJ-front/src/main/java/com/wyh/front/validate/OrderCreateDto.java new file mode 100644 index 0000000..4388053 --- /dev/null +++ b/ZJ-java/ZJ-front/src/main/java/com/wyh/front/validate/OrderCreateDto.java @@ -0,0 +1,25 @@ +package com.wyh.front.validate; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +@ApiModel(value = "订单创建对象") +public class OrderCreateDto { + + + @ApiModelProperty(value = "商品id") + private List goodsDtos; + + + @ApiModelProperty(value = "地址信息id") + private Integer adId; + + @ApiModelProperty(value = "来源:1:商品,2:购物车") + private Integer source; + + +} diff --git a/ZJ-java/ZJ-front/src/main/java/com/wyh/front/validate/OrderGoodsDto.java b/ZJ-java/ZJ-front/src/main/java/com/wyh/front/validate/OrderGoodsDto.java new file mode 100644 index 0000000..9cb8aff --- /dev/null +++ b/ZJ-java/ZJ-front/src/main/java/com/wyh/front/validate/OrderGoodsDto.java @@ -0,0 +1,18 @@ +package com.wyh.front.validate; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value="OrderGoodsDto对象", description="订单商品信息") +public class OrderGoodsDto { + + @ApiModelProperty(value="商品") + private Integer goodsId; + + @ApiModelProperty(value="数量") + private Integer num; + + +}