package com.amg.mall.service.impl;
import com.amg.mall.common.*;
import com.amg.mall.controller.vo.*;
import com.amg.mall.dao.I_MallGoodsDao;
import com.amg.mall.dao.I_MallOrderDao;
import com.amg.mall.dao.I_MallOrderItemDao;
import com.amg.mall.dao.I_MallShoppingCartDao;
import com.amg.mall.domain.MallGoods;
import com.amg.mall.domain.MallOrder;
import com.amg.mall.domain.MallOrderItem;
import com.amg.mall.domain.MallStockNumDTO;
import com.amg.mall.service.I_MallOrderService;
import com.amg.mall.util.BeanUtil;
import com.amg.mall.util.NumberUtil;
import com.amg.mall.util.PageQueryUtil;
import com.amg.mall.util.PageResult;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.text.ParseException;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import static java.util.stream.Collectors.groupingBy;
/**
* 订单业务层实现类
*/
@Service
@Transactional
public class MallOrderServiceImpl implements I_MallOrderService {
@Resource
private I_MallOrderDao mallOrderDao;
@Resource
private I_MallOrderItemDao mallOrderItemDao;
@Resource
private I_MallShoppingCartDao mallShoppingCartDao;
@Resource
private I_MallGoodsDao mallGoodsDao;
/**
* 我的订单
*
* @param pageQueryUtil
* @return
*/
@Override
public PageResult getMyOrders(PageQueryUtil pageQueryUtil) throws ParseException {
/**
* 在这里应该就是获取所有的参数
*/
//获取的总记录数是指在当前用户的情况下的所有订单数
int total = mallOrderDao.getTotalMallOrders(pageQueryUtil);
System.out.println("total = " + total);
//获取订单的属性,记住pageQueryUtil其实是个Map集合,按照创建时间降序排列
List<MallOrder> mallOrders = mallOrderDao.findMallOrderList(pageQueryUtil);
System.out.println("mallOrders = " + mallOrders);
List<MallOrderListVO> orderListVOS = new ArrayList<>();
if (total > 0) {
//数据转换,将实体类转换成vo
orderListVOS = BeanUtil.copyList(mallOrders ,MallOrderListVO.class);
System.out.println("orderListVOS = " + orderListVOS);
//设置订单状态中文显示值
for (MallOrderListVO orderListVO : orderListVOS) {
//接收一个字符串,惯例做法是将状态封装在枚举类中,用的时候取出来
orderListVO.setOrderStatusString(MallOrderStatusEnum.getMallOrderStatusEnumStatus(orderListVO.getOrder_status()).getName());
//获取对应用户的所有的订单主键id值 stream是流概念 这里的map是A->B的意思,最终使用collect收集起来
List<Integer> orderIds = mallOrders.stream().map(MallOrder::getOrder_id).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(orderIds)) {
//传入的参数是一个List集合
List<MallOrderItem> orderItems = mallOrderItemDao.findOrderByIds(orderIds);
System.out.println("orderItems = " + orderItems);
System.out.println(orderItems);
Map<Integer, List<MallOrderItem>> itemByOrderIdMap = orderItems.stream().collect(groupingBy(MallOrderItem::getOrderId));
for (MallOrderListVO mallOrderListVO : orderListVOS) {
System.out.println("mallOrderListVO = " + mallOrderListVO.getOrder_id());
//封装每个订单列表对象的订单项数据
if (itemByOrderIdMap.containsKey(mallOrderListVO.getOrder_id())) {
List<MallOrderItem> orderItemListTemp = itemByOrderIdMap.get(mallOrderListVO.getOrder_id());
//将
List<MallOrderItemVO> mallOrderItemVOS = BeanUtil.copyList(orderItemListTemp ,MallOrderItemVO.class);
mallOrderListVO.setMallOrderItemVOS(mallOrderItemVOS);
System.out.println(mallOrderListVO.getMallOrderItemVOS().toString());
}
}
}
}
}
System.out.println("orderListVOS = " + orderListVOS);
PageResult pageResult = new PageResult(total ,
pageQueryUtil.getCurrent_page() ,
pageQueryUtil.getLimit() ,orderListVOS);
return pageResult;
}
@Override
public String saveOrder(MallUserVO user ,List<MallShoppingCartItemVO> chooseShoppingCartItem) throws Exception {
//获取所有的购物车主键,返回的是一个List集合
List<Long> shopCartItemIds = chooseShoppingCartItem.stream().map(MallShoppingCartItemVO::getCartItemId).collect(Collectors.toList());
//获取所有的商品主键,返回的是一个List集合
List<Long> goodsIds = chooseShoppingCartItem.stream().map(MallShoppingCartItemVO::getGoodsId).collect(Collectors.toList());
//根据商品主键获取所有的商品信息
List<MallGoods> mallGoodsList = mallGoodsDao.findGoodsByPrimaryKeys(goodsIds);
//todo 测试理解这一段的用法
/**
* Function是一个接口,Java 8 之后允许接口中存在具体方法,分别是default和static方法
* identity就是一个静态方法,它的作用是返回一个输出跟输入一样的lambda表达式对象
* (entire1,entire2) -> entire1的作用是如果发生冲突,保留现有条目,也就是entire1
*
* 下面例子mallGoodsMap中存放的key就是商品MallGoods中的主键id
*/
Map<Long, MallGoods> mallGoodsMap = mallGoodsList.stream().collect(Collectors.toMap(MallGoods::getGoodsId ,
Function.identity() ,
(entire1 ,entite2) -> entire1));
for (Long aLong : mallGoodsMap.keySet()) {
System.out.println("map中键为: " + aLong + " / 值为:" + mallGoodsMap.get(aLong));
}
//遍历List,对每一个MallShoppingCartItemVO对象进行具体的操作
for (MallShoppingCartItemVO mallShoppingCartItemVO : chooseShoppingCartItem) {
//这个mallShoppingCartItemVO对象就是提交订单中每一项商品,需要做点健壮性检验
//如果在map中找不到对应mallShoppingCartItemVO对象里面的商品id值,则返回购物车错误信息
if (!mallGoodsMap.containsKey(mallShoppingCartItemVO.getGoodsId())) {
MallException.fail(ServiceResultEnum.SHOPPING_ITEM_ERROR.getResult());
}
//如果购买的数量大于库存,当然也是行不通的
if (mallShoppingCartItemVO.getGoodsCount() > mallGoodsMap.get(mallShoppingCartItemVO.getGoodsId()).getStockNum()) {
MallException.fail(ServiceResultEnum.SHOPPING_ITEM_COUNT_ERROR.getResult());
}
}
//删除购物车选中的商品项,逻辑就是当订单提交了之后,购物车中对应的商品需要被移出购物车,做法是将is_deleted属性标记改一下
if (!CollectionUtils.isEmpty(shopCartItemIds) && !CollectionUtils.isEmpty(goodsIds) && !CollectionUtils.isEmpty(mallGoodsList)) {
if (mallShoppingCartDao.deleteShopCartItemByPrimaryKeys(shopCartItemIds) > 0) {
//还需要处理一下库存数量,
List<MallStockNumDTO> stockNumDTOS = BeanUtil.copyList(chooseShoppingCartItem ,MallStockNumDTO.class);
System.out.println("stockNumDTOS = " + stockNumDTOS);
int updateResult = mallGoodsDao.updateStockNum(stockNumDTOS);
if (updateResult < 1) {
MallException.fail(ServiceResultEnum.SHOPPING_ITEM_ERROR.getResult());
}
//生成订单号
String orderNo = NumberUtil.genOrderNo();
MallOrder mallOrder = new MallOrder();
int totalPrice = 0;
//保存订单
//订单编号
mallOrder.setOrder_number(orderNo);
//用户id
mallOrder.setUser_id(user.getUser_id());
//用户地址
mallOrder.setUser_address(user.getAddress());
//计算总共应付价钱
for (MallShoppingCartItemVO shoppingCartItemVO : chooseShoppingCartItem) {
totalPrice += shoppingCartItemVO.getSellingPrice() * shoppingCartItemVO.getGoodsCount();
}
if (totalPrice < 1) {
MallException.fail(Servi
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
Java商城毕业设计源码(涵数据库表设计) (2978个子文件)
00173a6c686349992b97e562101c537156a69b 1KB
008d74a80d579e7f72a754533a530e4fd36da4 295B
00d50ccb552068764f5cb310b8c8a1365e11fe 1KB
00e7a0c839d40bb6af9730c1b3b3d7f19eecda 680B
01125838913e971cf92fad0f494b1715153916 2KB
013af231a73cf981e7bc9dec00b5e239f5b3ac 3KB
018a161b82c5c193fe08c6034b28d3d2e8cd65 320B
01e89f2fbabce06bb4c61204b192f8267b8f7b 42KB
02b083d28be4e900c4dee6899caec0e3b73f1e 1KB
02f88a895a41a634e3c1ea4d6943d483f35f71 11KB
037c4893d35c3fc54a2112eb125f8efe1055c9 6KB
039d7bba42ee2bd668783edef8e9ce46b5701b 425B
03d6b42de2942690234f0fc0e7d07729dbbbf5 5KB
03dd45adcef9ed4e862d9d33bf33f996bb6715 2KB
03efb059b1ff3cd980a44c279ce0735958d794 258B
0455268994bd9463b23a1526931183f300c025 7KB
04f572dca7e98a514cfd81360cdb049f6b600c 21KB
055a9b2a935504f218e7561f4e1f2a339bf854 7KB
05ef2cec7ad35969f9c19c5a1699ccdc0a0124 29KB
061333d95065982559b772d5e7e75e6aeb5b75 15KB
0637c8ff662e363f82738b7cda21f94492655a 4KB
065761f2e91f90f5e8e76bdd8d71d4a83e3eeced 266B
07b8ef2346f365bac8aa93ff0c898181bfdde1 269B
07c23ec9b83a0c17e11db41740e8c4ea1982fe 19KB
07d72992f314fdb524d19edf43954141240291 20KB
07d9251399df896b6c1050a51e07e776eeb576 12KB
07eb338e418c08e3a348de023ef86c343fa0e2 6KB
080f5c11b87a83ed8b51bb0896bdbb1476809b 3KB
08411368db839767789579683be94064263b2f 8KB
084f05f824dba849c08abf76555e6173aed4dd 75KB
091f40048b9f4c9c1cfcccdd488ed035536fbe 5KB
092fe55f7abea47edd9f96e764d47777526337 1KB
093f05b5676c59ed70fd6e1495a55605cc2f7e 403B
09d310e54f4c0d00ce65cc32397e47944ee337 12KB
0a6e43d64c39fc0f9ab72965bffa1642068c06 2KB
0a8889bfb4c03f53109db18961a1cfb90795b3 258B
0aca1ae8369507eca21db7d79e1b69e9df8b36 32KB
0aea031f41751dbb9a508b5ccfbd6a30912632 337B
0b16c5cec6735032394c8a1511a0b3e6f3b6e9 68KB
0b4c70d0ab6ecf7252fb309ff9d9de42066848 75KB
0bd689e313eeb5fffebf42a2d474a6ccf096b7 4KB
0c3e7102bdd8651f7f252e9c3d74546e930b2e 9KB
0c409a8844e19935fd575bd40bcdac974c0680 9KB
0c5aa375e3c87c0aa314cd15ae293b17b815b3 47KB
0cace41e75ee2bfa38f2ebb9c2ab5b7ec13fa9 2KB
0cc367b1df62f36347b3f6a753b010aed92300 29KB
0d2a19505653f58532f1fbd3d12f5d14414565 2KB
0d960690a7d0a88558214e80f8147229e789c6 4KB
0e47cf285673f5772b1890dd3ad43625646caa 16KB
0e9698f9b2cef0f25ea107239dc3d12943b407 28KB
0edd48f8e494f84ca01f881a4e67b6e7696afd 268B
0f1ccbb249188db32e319c0f462acb6a666238 27KB
0f1ceb1c04780c313dce884d1a362b1c7a0b78 96KB
0f5d1a1a7a07dc72dc05276d0a992852590e05 101KB
0f9267a95ddf7c90a5ab49e730dd66fec6ea8c 2KB
0f9ca0f07c0820007466ba8d2a27ee481737b9 15KB
1025398d2346bb32aa484e3117cee0952efeb3 97KB
106f09e987bb893d2e342eebae724f622e0cd9 72KB
10b6c582fda1207fc0556b744feb6ac4f572b1 349KB
10d0367a6ef35acabcb6a5b833f2300405bc77 109KB
10d04b1f277ce1d0ab0fdd434f59a3574f3ca3 45KB
11a2dff8d80142077fc0a7bfaaf0ed14ac473d 162B
11ca34b960375cda728590825d3e8910ffe0a5 3KB
125da8c561e139982dc26b85cb6ecd46633728 199B
12d680d8650d2079e1757b3407328622f9dba9 95KB
13a106394ac375bffa6dc4c69751e03cfbc8d4 723KB
13de27867f4238034721ae3f575ae69ff9340d 2KB
141b8c4405d83fd2066c7beb55400e58d8ab5a 2KB
1442a0f61ccfca26d5f4d65eab4041abe4af8e 16KB
14795a9766b93ec762ba834aeb653a3d6e1974 50KB
1497ac35a0d6637ac523ee8a64a97c0df51090df 1KB
14e6ee9dc5fbd3f192376667bf4cc56910daae 156KB
158697093f6ca822101398420851700f37993f 36KB
1589db149fd902330321554bf3371db81d2dbb 35KB
15de859096a8b1b67e831b27ca849a9e66e12e 63KB
15f84ea16c99ab94ed40ed2b8749912889d9ea 231B
1639b61e0f113c9db292a150c12d0ed24a557b 5KB
164ea37282348b9e991a31967cef2ba7aa7caf 13KB
168e78d8d4a8ac171b0d343808d31acbd3f398 29KB
175d923b5aca7aae885ad8c50c1ddba9062c9a 577B
17818fc55c53504ae2bbe335fe010c2f39d677 272B
179a7512f32acfa0fdbb0cf8352cb0848ce612 470B
17d3ca11ac29757966938d3a609ce176cf28c1d6 627B
17dc21caa8e3caac04a2f79ba9e641c6aa5677 41KB
17e2942e4fe93b0bb6821ef109d1f3d1a95c7a 11KB
1810fadee38017cdae8096b1b0e9c205e81d1b 38KB
185842b2dcc33584aae9d9f1ec61fe70f7b2fd 746B
186bec08744746e15173f613dee8a40ee7b5c9 3KB
187891fca74c20a8a5dc1a397b2510b7ab2102 1.28MB
190aab543d3cb6846f0299d3bbb361af42dc69 30KB
194b441ad4fbdaf277599b80cb8c92461d5553 1KB
199376ae2b2f0621df5c28d48a0e8c67b75526 45KB
1aa7bd1aa9f4d4a15e8f90f1a90116b75b7a19 3KB
1b6fcd39395a35885a1e7836f90cf7a61b978e 134KB
1b963ca63c0b6e1c1d6b8d9a7bf19b7a9f52b1 45KB
1bb0f303518793a5e4471ce3565acd48a21040 4KB
1bb8fe53c29b1109df008061caa49ac092b710 37KB
1bdb3f9590075e20a8747c7c2825cc653d31e1 3KB
1c5fd5f1303a39a9ad143a2719ed6c4014e152 32KB
1cafe7366da684dc6f9d4f6c61321011f9ecc8 758B
共 2978 条
- 1
- 2
- 3
- 4
- 5
- 6
- 30
资源评论
码农Amg
- 粉丝: 8
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功