package com.example.service;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RandomUtil;
import com.example.common.ResultCode;
import com.example.dao.OrderGoodsRelDao;
import com.example.dao.OrderInfoDao;
import com.example.entity.*;
import com.example.exception.CustomException;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
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;
import java.util.stream.Collectors;
@Service
public class OrderInfoService {
@Resource
private OrderInfoDao orderInfoDao;
@Resource
private GoodsInfoService goodsInfoService;
@Resource
private AdminInfoService adminInfoService;
@Resource
private BusinessInfoService businessInfoService;
@Resource
private UserInfoService userInfoService;
@Resource
private OrderGoodsRelDao orderGoodsRelDao;
@Resource
private CartInfoService cartInfoService;
/**
* 根据id查询订单信息
*/
public OrderInfo findById(Long id) {
OrderInfo orderInfo = orderInfoDao.selectByPrimaryKey(id);
packOrder(orderInfo);
return orderInfo;
}
public List<OrderInfo> findAll(Long userId, Integer level) {
List<OrderInfo> orderInfos = orderInfoDao.findByUserId(userId, level);
for (OrderInfo orderInfo : orderInfos) {
packOrder(orderInfo);
}
return orderInfos;
}
/**
* 包装订单的用户和商品信息
*/
private void packOrder(OrderInfo orderInfo) {
Long orderId = orderInfo.getId();
List<OrderGoodsRel> rels = orderGoodsRelDao.findByOrderId(orderId);
orderInfo.setUserInfo(getUserInfo(orderInfo.getUserId(), orderInfo.getLevel()));
List<GoodsInfo> goodsList = CollUtil.newArrayList();
orderInfo.setGoodsList(goodsList);
for (OrderGoodsRel rel : rels) {
GoodsInfo goodsDetailInfo = goodsInfoService.findById(rel.getGoodsId());
if (goodsDetailInfo != null) {
// 注意这里返回的count是用户加入商品的数量,而不是商品的库存
goodsDetailInfo.setCount(rel.getCount());
goodsList.add(goodsDetailInfo);
}
}
}
/**
* 分页查询订单信息
*/
public PageInfo<OrderInfo> findEndPages(Integer pageNum, Integer pageSize, HttpServletRequest request) {
Account user = (Account) request.getSession().getAttribute("user");
if (user == null) {
throw new CustomException("1001", "session已失效,请重新登录");
}
Integer level = user.getLevel();
Long userId = user.getId();
PageHelper.startPage(pageNum, pageSize);
List<OrderInfo> orderInfos;
if (1 == level) {
orderInfos = orderInfoDao.selectAll();
} else if (userId != null){
orderInfos = orderInfoDao.findByEndUserId(userId, null, level);
} else {
orderInfos = new ArrayList<>();
}
for (OrderInfo orderInfo : orderInfos) {
packOrder(orderInfo);
}
return PageInfo.of(orderInfos);
}
public PageInfo<OrderInfo> findFrontPages(Long userId, Integer level, Integer pageNum, Integer pageSize) {
PageHelper.startPage(pageNum, pageSize);
List<OrderInfo> orderInfos;
if (userId != null){
orderInfos = orderInfoDao.findByUserId(userId, level);
} else {
orderInfos = new ArrayList<>();
}
for (OrderInfo orderInfo : orderInfos) {
packOrder(orderInfo);
}
return PageInfo.of(orderInfos);
}
/**
* 分页查询订单信息
*/
public PageInfo<OrderInfo> findPages(Long userId, Integer level, Integer pageNum, Integer pageSize) {
PageHelper.startPage(pageNum, pageSize);
List<OrderInfo> orderInfos;
if (userId != null) {
orderInfos = orderInfoDao.findByUserId(userId, level);
} else {
orderInfos = orderInfoDao.selectAll();
}
for (OrderInfo orderInfo : orderInfos) {
packOrder(orderInfo);
}
return PageInfo.of(orderInfos);
}
/**
* 下单
*/
@Transactional
public OrderInfo add(OrderInfo info) {
Long userId = info.getUserId();
Integer level = info.getLevel();
Account userInfo = getUserInfo(userId, level);
List<GoodsInfo> goodsList = info.getGoodsList();
// 将商品分分类,根据上传用户id_用户level来确定唯一的key
Map<String, List<GoodsInfo>> collectMap = goodsList.stream()
.collect(Collectors.groupingBy(x -> x.getUserId() + "_" + x.getLevel()));
for (String key : collectMap.keySet()) {
List<GoodsInfo> list = collectMap.get(key);
// 这里面创建一个订单
OrderInfo orderInfo = new OrderInfo();
orderInfo.setUserId(userId);
orderInfo.setLevel(level);
orderInfo.setStatus("待付款");
orderInfo.setLinkAddress(userInfo.getAddress());
orderInfo.setLinkMan(userInfo.getNickName());
orderInfo.setLinkPhone(userInfo.getPhone());
orderInfo.setCreateTime(DateUtil.formatDateTime(new Date()));
// 订单id:用户id + 当前年月日时分 + 4位流水号
String orderId = userId + DateUtil.format(new Date(), "yyyyMMddHHmm") + RandomUtil.randomNumbers(4);
orderInfo.setOrderId(orderId);
// 生成订单
orderInfoDao.insertSelective(orderInfo);
double totalPrice = 0;
for (GoodsInfo orderGoodsVO : list) {
Long goodsId = orderGoodsVO.getId();
// 查询商品信息
GoodsInfo goodsDetail = goodsInfoService.findById(goodsId);
if (goodsDetail != null) {
Integer orderCount = orderGoodsVO.getCount() == null ? 0 : orderGoodsVO.getCount();
Integer goodsCount = goodsDetail.getCount() == null ? 0 : goodsDetail.getCount();
// 扣库存
if (orderCount <= goodsCount) {
goodsDetail.setCount(goodsCount - orderCount);
// 销量 +count
int sales = goodsDetail.getSales() == null ? 0 : goodsDetail.getSales();
goodsDetail.setSales(sales + orderCount);
goodsInfoService.update(goodsDetail);
// 建立关系
OrderGoodsRel orderGoodsRel = new OrderGoodsRel();
orderGoodsRel.setGoodsId(goodsId);
orderGoodsRel.setOrderId(orderInfo.getId());
orderGoodsRel.setCount(orderCount);
orderGoodsRelDao.insertSelective(orderGoodsRel);
totalPrice += goodsDetail.getPrice() * goodsDetail.getDiscount() * orderCount;
}
}
}
orderInfo.setTotalPrice(totalPrice);
// 更新订单信息
orderInfoDao.updateByPrimaryKeySelective(orderInfo);
// 下单 清空购物车
cartInfoService.empty(userId, level);
}
return info;
}
@Transactional(rollbackFor = Exception.class)
public void add(Long userId, Integer level, List<GoodsInfo> goodsList) {
Account userInfo =
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于Java的网上药店管理信息管理系统毕业设计(源码+数据库).rar 【项目技术】 开发语言:Java 架构:B/S 数据库:mysql 【实现功能】 网上药店管理信息管理系统的主要使用者分为游客、会员用户、管理员。游客只能浏览以及详细信息,会员用户能进行注册,登录,查看和修改帐户信息的操作,管理员则能进行登录、用户管理,管理和订单管理操作。药店管理系统分为前端药店药品商城和后台管理,前端商城主要实现普通商城功能,也包括个人信息设置;后台管理端包括:登录管理、新闻管理、药品管理、订单管理、出入库管理、销售统计等功能.。
资源推荐
资源详情
资源评论
收起资源包目录
基于Java的网上药店管理信息管理系统毕业设计(源码+数据库).rar (455个子文件)
$PRODUCT_WORKSPACE_FILE$ 489B
OrderInfoService.class 14KB
AccountController.class 12KB
BusinessInfoController.class 9KB
AdminInfoController.class 8KB
UserInfoController.class 8KB
NxSystemFileController.class 8KB
AdvertiserInfoController.class 8KB
GoodsInfoService.class 7KB
TypeInfoController.class 7KB
EchartsController.class 7KB
CartInfoService.class 7KB
CommentInfoService.class 6KB
GoodsInfoController.class 6KB
OrderInfoController.class 6KB
MenuController.class 5KB
GoodsInfo.class 5KB
CartInfoController.class 4KB
CommentInfoController.class 4KB
BusinessInfoService.class 4KB
AdminInfoService.class 4KB
UserInfoService.class 4KB
OrderInfo.class 4KB
AdminInfo.class 4KB
MessageInfoService.class 4KB
BusinessInfo.class 4KB
UserInfo.class 4KB
MessageInfoController.class 3KB
AdvertiserInfoService.class 3KB
Account.class 3KB
NxSystemFileInfoService.class 3KB
CommentInfo.class 2KB
TypeInfoService.class 2KB
CartInfo.class 2KB
Result.class 2KB
OrderInfoDao.class 2KB
EchartsData.class 2KB
ResultCode.class 2KB
MyInterceptor.class 2KB
GoodsInfoDao.class 2KB
GlobalExceptionHandler.class 2KB
MessageInfo.class 2KB
EchartsData$Data.class 2KB
WebMvcConfig.class 2KB
OrderGoodsRel.class 2KB
AdvertiserInfo.class 2KB
EchartsData$Series.class 1KB
AuthorityInfo.class 1KB
MyInterceptorConfig.class 1KB
NxSystemFileInfo.class 1KB
CommentInfoDao.class 1KB
TypeInfo.class 1KB
CartInfoDao.class 1KB
AuthorityInfo$Model.class 1KB
CustomException.class 1KB
BusinessInfoDao.class 935B
AdminInfoDao.class 920B
UserInfoDao.class 915B
MessageInfoVo.class 831B
OrderGoodsRelDao.class 804B
MessageInfoDao.class 798B
Application.class 793B
NxSystemFileInfoDao.class 773B
AdvertiserInfoDao.class 649B
TypeInfoDao.class 541B
AdvertiserInfoVo.class 320B
BusinessInfoVo.class 312B
AdminInfoVo.class 300B
UserInfoVo.class 296B
index.css 227KB
index.css 227KB
bootstrap.min.css 119KB
bootstrap.min.css 119KB
bootstrap.min.css 107KB
bootstrap.min.css 107KB
font-awesome.css 26KB
font-awesome.css 26KB
quill.snow.css 24KB
quill.snow.css 24KB
font-awesome.min.css 20KB
font-awesome.min.css 20KB
swiper.min.css 13KB
swiper.min.css 13KB
templatemo_main.css 6KB
templatemo_main.css 6KB
my.css 2KB
my.css 2KB
nav.css 838B
nav.css 838B
index.css 480B
index.css 480B
notice.css 475B
notice.css 475B
fontawesome-webfont.eot 71KB
fontawesome-webfont.eot 71KB
fontawesome-webfont.eot 55KB
fontawesome-webfont.eot 55KB
glyphicons-halflings-regular.eot 20KB
glyphicons-halflings-regular.eot 20KB
glyphicons-halflings-regular.eot 20KB
共 455 条
- 1
- 2
- 3
- 4
- 5
资源评论
职场程序猿
- 粉丝: 6451
- 资源: 3706
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 一个用于声波场时域仿真的MATLAB工具箱.zip
- 一个用于求解广义二次姿态估计问题和相关不确定性描述的CMATLAB库.zip
- 一种基于MATLAB的编程语言,适合编写高尔夫球代码.zip
- 一些用于图像分割的活动轮廓模型的matlab代码.zip
- 一套支持基于MATLABSimulink的四轴飞行器动态建模与仿真控制系统设计的文档和软件.zip
- 一组MATLAB实用程序的多视图几何提供与Hartley Zissermans多视图几何在计算机视觉第二版2004获得.zip
- 遗传算法免疫算法退火算法粒子群算法鱼群算法蚁群算法和神经网络算法等常用智能算法的MATLAB实现.zip
- 一组用于MatlabOctave的数字林业工具.zip
- 用Astar算法实现飞行路径的三维规划matlab CODE.zip
- 用COMSOLMATLAB脚本计算二维光子晶体的带隙.zip
- 用HPatches数据集计算局部特征描述符的Python Matlab代码.zip
- 用matlab编写了一套用于ASR和说话人识别的语音特征提取函数.zip
- 用MATLAB编写的开放源代码圈速模拟器.zip
- 用MATLAB、Python和Julia语言编写的CHAOS挑战评估代码.zip
- MATLAB代码:基于阶梯碳的含 P2G-CCS 耦合和燃气惨氢的电厂优化调度 关键词:阶梯碳 电厂 燃气掺氢 优化调度 仿真平台: matlab+gurobi+yalmip,90%复现 主要内容:代
- 外转子开关磁阻电机,额定功率3.5KW,额定转速5000rpm,额定电压200V,槽满率63.87%,效率81.15%,额定输出转矩6.6N.m,转矩脉动0.72,包含RMxprt路算并转为Maxwe
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功