demo
大约 6 分钟
OrderInfoService
package com.javaclimb.xshopping.service;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RandomUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.javaclimb.xshopping.common.Common;
import com.javaclimb.xshopping.common.ResultCode;
import com.javaclimb.xshopping.entity.GoodsInfo;
import com.javaclimb.xshopping.entity.OrderGoodsRel;
import com.javaclimb.xshopping.entity.OrderInfo;
import com.javaclimb.xshopping.entity.UserInfo;
import com.javaclimb.xshopping.exception.CustomException;
import com.javaclimb.xshopping.mapper.OrderGoodsRelMapper;
import com.javaclimb.xshopping.mapper.OrderInfoMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Service
public class OrderInfoService {
@Resource
private UserInfoService userInfoService;
@Resource
private OrderInfoMapper orderInfoMapper;
@Resource
private GoodsInfoService goodsInfoService;
@Resource
private CartInfoSevice cartInfoSevice;
@Resource
private OrderGoodsRelMapper orderGoodsRelMapper;
/**
* 下单
*
* 前端把订单商品列表返回后台orderInfo
* orderInfo 存在用户id 后台获取用户信息
* 修饰订单id 保存
*/
//spring管理sql事务 出错回滚数据
@Transactional
public OrderInfo add(OrderInfo orderInfo){
//1 生成订单信息 用户信息 放到orderOInfo
Long userId=orderInfo.getUserid();
//d订单id 用户id+当前时间+流水号
String orderId=userId+ DateUtil.format(new Date(),"yyyyMMddHHmm")+ RandomUtil.randomNumbers(4);
orderInfo.setOrderid(orderId);
//用户相关
// 用户查到的数据放到订单信息表
UserInfo userInfo=userInfoService.findById(userId);
//地址
orderInfo.setLinkaddress(userInfo.getAddress());
//昵称
orderInfo.setLinkman(userInfo.getNickname());
//电话
orderInfo.setLinkphone(userInfo.getPhone());
//2 保存订单表//订单创建时间
orderInfo.setCreatetime(DateUtil.formatDateTime(new Date()));
//保存
orderInfoMapper.insertSelective(orderInfo);
//
List<OrderInfo> orderInfoList=orderInfoMapper.findByOrderId(orderId);
/**
* //3 查询订单商品列表 便利
* goodsList
* 从orderInfo获取商品列表
* 获取各个商品id 在后台查询商品数量 商品库存 修改
* 查询销量 修改销量 sale+count
* 修改关联表
*/
List<GoodsInfo> goodsList=orderInfo.getGoodsList();
for (GoodsInfo orderGoodsVO : goodsList){
Long goodsId=orderGoodsVO.getId();
//goodsDetail goodsInfoService 数据库
GoodsInfo goodsDetail=goodsInfoService.findById(goodsId);
if (goodsDetail == null){
continue;
}
//order 购买
Integer orderCount=orderGoodsVO.getCount() == null ? 0 : orderGoodsVO.getCount();
// 库存
Integer goodsCount=goodsDetail.getCount() == null ? 0 :goodsDetail.getCount();
//4 修改库存
if (orderCount>goodsCount){
throw new CustomException(ResultCode.ORDER_PAY_ERROR);
}
goodsDetail.setCount(goodsCount - orderCount);
//5 增加销量
int sales=goodsDetail.getSales() == null ? 0 :goodsDetail.getSales();
goodsDetail.setSales(sales+orderCount);
goodsInfoService.update(goodsDetail);
//6 商品订单关联表 将增加关系
OrderGoodsRel orderGoodsRel=new OrderGoodsRel();
orderGoodsRel.setOrderid(orderInfoList.get(0).getId());
orderGoodsRel.setGoodsid(goodsId);
orderGoodsRel.setCount(orderCount);
orderGoodsRelMapper.insert(orderGoodsRel);
}
//7 清除购物车
cartInfoSevice.empty(userId);
return orderInfo;
}
/**
* 根据终端用户获取 订单 状态
*
*/
public PageInfo<OrderInfo> findFrontPages(Long userId,String state,Integer pageNum,Integer pageSize){
PageHelper.startPage(pageNum,pageSize);
List<OrderInfo> orderInfos;
//
if (userId ==null){
orderInfos=new ArrayList<>();
}else {
orderInfos=orderInfoMapper.findByEndUserId(userId,state);
}
for (OrderInfo orderInfo:orderInfos){
packOrder(orderInfo);
}
return PageInfo.of(orderInfos);
}
/**
*包装订单的用户和商品信息
* order
* userid --> userinfo
* id -----> order_goods_rel : orderid(order.id) goodsid count
* goodsid --> goodsinfo
* count
*
* 包装 把 用户信息user info 商品信息 goods info 查询到并放入orderinfo
*
*/
private void packOrder(OrderInfo orderInfo){
//用户信息 userinfo orderInfo.getUserid()不会空 在添加购物车已判断是否空
orderInfo.setUserInfo(userInfoService.findById(orderInfo.getUserid())) ;
//商品信息
Long orderId=orderInfo.getId();
//rel id goodsid count 用户买的什么商品id 买了多少件
List<OrderGoodsRel> rels= orderGoodsRelMapper.findByOrderid(orderId);
List<GoodsInfo> goodsInfoList=new ArrayList<>();
for (OrderGoodsRel rel: rels){
//获取 用户购买 商品的信息
GoodsInfo goodsInfo=goodsInfoService.findById(rel.getGoodsid());
if (goodsInfo != null){
//rel.getCount() 用户买的什么商品id 买了多少件
goodsInfo.setCount(rel.getCount());
goodsInfoList.add(goodsInfo);
}
}
orderInfo.setGoodsList(goodsInfoList);
//orderInfo userInfo + goodsList
}
/**
* 改变订单状态
* @param id
* @param state
*/
public void changeState(Long id,String state){
OrderInfo order=orderInfoMapper.finById(id);
Long userId=order.getUserid();
UserInfo user=userInfoService.findById(userId);
if (state.equals("待发货")){
//校验余额
Double account=user.getAccount();
Double totalPrice=order.getTotalprice();
if ((account < totalPrice)){
throw new CustomException("-1","账户余额不足");
}
user.setAccount(user.getAccount() - order.getTotalprice());
//修改用户余额
userInfoService.update(user);
}
if (state.equals("已退货")){
//校验余额
Double account=user.getAccount();
Double totalPrice=order.getTotalprice();
user.setAccount(user.getAccount() + order.getTotalprice());
//修改用户余额
userInfoService.update(user);
}
//更新订单的状态
orderInfoMapper.updateState(id,state);
}
/**
*后台 查看订单列表
* @param userId
* @param pageNum
* @param pageSize
* @param request
* @return
*/
public PageInfo<OrderInfo> findPage(Long userId, Integer pageNum, Integer pageSize, HttpServletRequest request){
//
UserInfo user=(UserInfo) request.getSession().getAttribute(Common.USER_INFO);
if (user == null){
throw new CustomException("1001","session已失效,请重新登录");
}
//
Integer level=user.getLevel();
PageHelper.startPage(pageNum,pageSize);
List<OrderInfo> orderInfos;
//
if (1 == level){
orderInfos=orderInfoMapper.selectAll();
}else if(userId!=null){
orderInfos=orderInfoMapper.findByEndUserId(userId,null);
}else {
orderInfos=new ArrayList<>();
}
for (OrderInfo orderInfo: orderInfos){
packOrder(orderInfo);
}
return PageInfo.of(orderInfos);
}
/**
* 删除订单
* @param id
* Transactional
*/
@Transactional
public void delete(Long id) {
orderInfoMapper.deleteById(id);
orderGoodsRelMapper.deleteByOrderId(id);
}
/**
* 根据id查询订单信息
*
*/
public OrderInfo findById(Long id) {
OrderInfo orderInfo= orderInfoMapper.selectByPrimaryKey(id);
packOrder(orderInfo);
return orderInfo;
}
/**
*总交易额
*/
public Double count(){
return orderInfoMapper.count();
}
/**
* 总销量
*/
public Integer totalShopping(){
return orderGoodsRelMapper.totalShopping();
}
/**
* 分类总销售
*/
public List<Map<String,Object>> getTypePrice(){
return orderInfoMapper.getTypePrice();
}
/**
* 分类总销售
*/
public List<Map<String,Object>> getTypeCount(){
return orderInfoMapper.getTypeCount();
}
}
OrderInfoController
package com.javaclimb.xshopping.controller;
import com.github.pagehelper.PageInfo;
import com.javaclimb.xshopping.common.Result;
import com.javaclimb.xshopping.common.ResultCode;
import com.javaclimb.xshopping.entity.GoodsInfo;
import com.javaclimb.xshopping.entity.OrderInfo;
import com.javaclimb.xshopping.exception.CustomException;
import com.javaclimb.xshopping.service.OrderInfoService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
* 订单控制器
*/
@RestController
@RequestMapping(value = "/orderInfo")
public class OrderInfoController {
@Resource
OrderInfoService orderInfoService;
/**
* 下单
*/
@PostMapping
public Result<OrderInfo> add(@RequestBody OrderInfo orderInfo){
Long userId=orderInfo.getUserid();
List<GoodsInfo> goodsList=orderInfo.getGoodsList();
if (userId == null || goodsList == null || goodsList.size() == 0){
throw new CustomException(ResultCode.PARAM_ERROR);
}
orderInfo.setState("待付款");
return Result.success(orderInfoService.add(orderInfo));
}
/**
* 查询所有信息 分页
* required = false 不是必须传值
*/
@GetMapping("/page")
public Result<PageInfo<OrderInfo>> findPage(@RequestParam(required = false) Long userId,
@RequestParam(required = false,defaultValue = "1") Integer pageNum,
@RequestParam(required = false,defaultValue = "10") Integer pageSize,
HttpServletRequest request){
return Result.success(orderInfoService.findPage(userId,pageNum,pageSize,request));
}
/**
* 查询所有信息 分页
* required = false 不是必须传值
*/
@GetMapping("/page/front")
public Result<PageInfo<OrderInfo>> findFrontPage(@RequestParam(required = false) Long userId,
@RequestParam(required = false) String state,
@RequestParam(required = false,defaultValue = "1") Integer pageNum,
@RequestParam(required = false,defaultValue = "10") Integer pageSize){
return Result.success(orderInfoService.findFrontPages(userId,state,pageNum,pageSize));
}
/**
*改变订单状态
*/
@PostMapping("/state/{id}/{state}")
public Result state(@PathVariable Long id,@PathVariable String state){
orderInfoService.changeState(id,state);
return Result.success();
}
/**
*删除订单
*/
@DeleteMapping("/{id}")
public Result delete(@PathVariable Long id){
orderInfoService.delete(id);
return Result.success();
}
/**
* 根据id查询订单信息
*
*/
@GetMapping("/order/{id}")
public Result<OrderInfo> findById(@PathVariable Long id){
OrderInfo orderInfo= orderInfoService.findById(id);
return Result.success(orderInfo);
}
}
CartInfoSevice
package com.javaclimb.xshopping.service;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.javaclimb.xshopping.common.Common;
import com.javaclimb.xshopping.entity.CartInfo;
import com.javaclimb.xshopping.entity.GoodsInfo;
import com.javaclimb.xshopping.entity.UserInfo;
import com.javaclimb.xshopping.exception.CustomException;
import com.javaclimb.xshopping.mapper.CartInfoMapper;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 购物车 方法1
*/
@Service
public class CartInfoSevice {
@Resource
private CartInfoMapper cartInfoMapper;
@Resource
private GoodsInfoService goodsInfoService;
/**
* add
*/
public CartInfo add(CartInfo detailInfo){
Long userid=detailInfo.getUserid();
Long goodsid=detailInfo.getGoodsid();
//查询购物车有没有数据 有更新 没有添加
//查询流
//select * from cart_info where( ( userId = userId and goodsId = goodsId ) )
Example example=new Example(CartInfo.class);
example.createCriteria()
.andEqualTo("userid",userid)
.andEqualTo("goodsid",goodsid);
List<CartInfo> infos=cartInfoMapper.selectByExample(example);
//CollectionUtil 封装的工具类
if (CollectionUtil.isEmpty(infos)){
//没有添加
detailInfo.setCreatetime(DateUtil.formatDateTime(new Date()));
cartInfoMapper.insertSelective(detailInfo);
}else {
//有更新
CartInfo cartInfo=infos.get(0);
cartInfo.setCount(cartInfo.getCount()+detailInfo.getCount());
cartInfoMapper.updateByPrimaryKeySelective(cartInfo);
}
return detailInfo;
}
/**
* 根据用户id 获取购物车列表 获得购物车商品的数量
* @param userId
* @return
*/
public List<GoodsInfo> findAll(Long userId){
List<CartInfo> cartInfoList=cartInfoMapper.findCartByUserId(userId);
List<GoodsInfo> goodsList=new ArrayList<>();
for (CartInfo cartInfo:cartInfoList){
long goodsId=cartInfo.getGoodsid();
GoodsInfo goodsInfo=goodsInfoService.findById(goodsId);
if (goodsInfo !=null){
//注意 这里是用户加入购物车的数量
goodsInfo.setCount(cartInfo.getCount());
//这里的id是购物车的商品id
goodsInfo.setId(cartInfo.getGoodsid());
goodsList.add(goodsInfo);
}
}
return goodsList;
}
/**
* 删除 购物车对应商品
* @param userId
* @param goodsId
*/
public void deleteGoods(Long userId,Long goodsId){
cartInfoMapper.deleteGoods(userId,goodsId);
}
/**
*
* @param userId
*/
public void empty(Long userId){
cartInfoMapper.deleteByUserId(userId);
}
/**
*
*翻页查询购物车列表
*/
public PageInfo<CartInfo> findPageDetails(Integer pageNum, Integer pageSize, HttpServletRequest request){
UserInfo user=(UserInfo) request.getSession().getAttribute(Common.USER_INFO);
if (user == null){
throw new CustomException("1001","session已失效请重新登录");
}
Integer level=user.getLevel();
PageHelper.startPage(pageNum,pageSize);
List<CartInfo> list;
if (level == 1){
list=cartInfoMapper.findAll();
}else {
list=cartInfoMapper.findCartByUserId(user.getId());
}
return PageInfo.of(list);
}
/**
* 根据id删除购物车
* @param id
* @return
*/
public void delete(Long id) {
cartInfoMapper.deleteByPrimaryKey(id);
}
}
CartInfoController
package com.javaclimb.xshopping.controller;
import com.github.pagehelper.PageInfo;
import com.javaclimb.xshopping.common.Result;
import com.javaclimb.xshopping.entity.CartInfo;
import com.javaclimb.xshopping.entity.GoodsInfo;
import com.javaclimb.xshopping.service.CartInfoSevice;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
* 购物车控制
*/
@RestController
@RequestMapping(value = "/cartInfo")
public class CartInfoController {
@Resource
CartInfoSevice cartInfoSevice;
/**
* 添加购物车
*/
@PostMapping
public Result<CartInfo> add(@RequestBody CartInfo cartInfo){
return Result.success(cartInfoSevice.add(cartInfo));
}
/**
* 查询某用户购物车(不分页)
*/
@GetMapping
public Result<List<GoodsInfo>> findAll(@RequestParam Long userId){
return Result.success(cartInfoSevice.findAll(userId));
}
/**
*
* @param userId
* @param goodsId
* @return
*/
@DeleteMapping("/goods/{userId}/{goodsId}")
public Result deleteGoods(@PathVariable Long userId,@PathVariable Long goodsId){
cartInfoSevice.deleteGoods(userId,goodsId);
return Result.success();
}
/**
* 查询购物车 分页
* required = false 不是必须传值
*/
@GetMapping("/page")
public Result<PageInfo<CartInfo>> findPage(@RequestParam(required = false,defaultValue = "1") Integer pageNum,
@RequestParam(required = false,defaultValue = "10") Integer pageSize,
HttpServletRequest request){
return Result.success(cartInfoSevice.findPageDetails(pageNum,pageSize,request));
}
/**
* 根据id删除购物车
* @param id
* @return
*/
@DeleteMapping("/{id}")
public Result delete(@PathVariable Long id){
cartInfoSevice.delete(id);
return Result.success();
}
}
购物车添加 订单关系 下单等
Loading...