package com.jf3q.sup.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jf3q.sup.domain.*;
import com.jf3q.sup.dto.SalesOrderDetailsDto;
import com.jf3q.sup.dto.SalesOrdersDto;
import com.jf3q.sup.mapper.*;
import com.jf3q.sup.service.OutboundShipmentsService;
import com.jf3q.sup.service.SalesOrdersService;
import com.jf3q.sup.utils.Constant;
import com.jf3q.sup.vo.SaleShowIndexVo;
import com.jf3q.sup.vo.SalesOrderDetailsVo;
import com.jf3q.sup.vo.SalesOrdersVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
*
*/
@Service
@Transactional
public class SalesOrdersServiceImpl extends ServiceImpl<SalesOrdersMapper, SalesOrders>
implements SalesOrdersService {
@Autowired
private OutboundShipmentsMapper outboundShipmentsMapper;
@Autowired
private OutboundShipmentDetailsMapper outboundShipmentDetailsMapper;
@Autowired
private ProductsMapper productsMapper;
@Autowired
private SalesOrderDetailsMapper salesOrderDetailsMapper;
@Override
public IPage<SalesOrdersVo> pages(SalesOrdersDto salesOrdersDto, Integer pageNum) {
IPage<SalesOrdersVo> page = Page.of(pageNum, Constant.PAGE_SIZE);
page = baseMapper.selectPages(new Page<>(page.getCurrent(), page.getSize()), salesOrdersDto);
return page;
}
@Override
public void addOrUpdate(SalesOrdersDto salesOrdersDto) {
boolean flag = salesOrdersDto.getId() == null || salesOrdersDto.getId() == 0 ? true : false;
try {
//销售订单类
SalesOrders salesOrders = new SalesOrders();
BeanUtils.copyProperties(salesOrdersDto, salesOrders);
//计算商品的价格
BigDecimal sum = BigDecimal.valueOf(0.00);
for (SalesOrderDetailsDto salesOrderDetailsDto : salesOrdersDto.getSalesOrderDetailsDto()) {
//查询商品信息
Products products = productsMapper.selectById(salesOrderDetailsDto.getProductId());
//判断商品库存是否足够
if (!isStockQuantity(products,salesOrders.getId(),salesOrderDetailsDto.getQuantity())){
throw new RuntimeException(products.getName()+"的库存不足");
}else {
//扣减库存
products.setStockQuantity(products.getStockQuantity()-salesOrderDetailsDto.getQuantity());
productsMapper.updateById(products);
}
//当前商品的总价
BigDecimal sumPrice = products.getPrice().multiply(BigDecimal.valueOf(salesOrderDetailsDto.getQuantity()));
//累加所有商品的价格
sum = sum.add(sumPrice);
}
//计算总金额
salesOrders.setTotalAmount(sum);
//出库表类
OutboundShipments shipments=new OutboundShipments()
.setCarrierId(salesOrdersDto.getCarrierId())
.setStatus(1)
.setShipmentDate(new Date());
if (flag) {
//// 新增销售订单
// salesOrders.setState(1);
baseMapper.insert(salesOrders);
// 新增出库信息
outboundShipmentsMapper.insert(shipments);
} else {
//修改销售订单
baseMapper.updateById(salesOrders);
}
if (!flag){
//根据销售订单id删除销售订单明细
salesOrderDetailsMapper.delete(
new LambdaQueryWrapper<SalesOrderDetails>()
.eq(SalesOrderDetails::getOrderId,salesOrders.getId()));
}
for (SalesOrderDetailsDto salesOrderDetailsDto : salesOrdersDto.getSalesOrderDetailsDto()) {
//查询商品信息
Products products = productsMapper.selectById(salesOrderDetailsDto.getProductId());
//订单详情类
SalesOrderDetails salesOrderDetails = new SalesOrderDetails()
.setOrderId(salesOrders.getId())
.setProductId(salesOrderDetailsDto.getProductId())
.setQuantity(salesOrderDetailsDto.getQuantity())
.setPrice(products.getPrice());
// 出库类
OutboundShipmentDetails shipmentDetails=new OutboundShipmentDetails()
.setOutboundShipmentId(shipments.getId())
.setProductId(products.getId())
.setQuantity(salesOrderDetailsDto.getQuantity());
if (flag) {
//新增销售订单明细
salesOrderDetailsMapper.insert(salesOrderDetails);
//新增出库详情订单
outboundShipmentDetailsMapper.insert(shipmentDetails);
} else {
//修改销售订单明细
salesOrderDetailsMapper.insert(salesOrderDetails);
}
}
} catch (BeansException e) {
System.out.println(e);
throw new RuntimeException("添加失败!");
}
}
@Override
public void del(Integer[] ids) {
for (int i = 0; i < ids.length; i++) {
//删除销售订单明细
salesOrderDetailsMapper.delete(
new LambdaQueryWrapper<SalesOrderDetails>().eq(SalesOrderDetails::getOrderId, ids[i])
);
//删除销售订单
baseMapper.deleteById(ids[i]);
}
}
@Override
public SalesOrdersVo getOrders(Integer id) {
return baseMapper.selectOrders(id);
}
@Override
public List<SaleShowIndexVo> getSaleShow(String time) {
return salesOrderDetailsMapper.getSaleShowList(time);
}
//判断库存
public boolean isStockQuantity(Products products,Integer ordersId,Integer quantity){
if (ordersId!=null){
//通过,ordersId获取销售订单详情
List<SalesOrderDetails> salesOrderDetails = salesOrderDetailsMapper.selectList(
new LambdaQueryWrapper<SalesOrderDetails>()
.eq(SalesOrderDetails::getOrderId, ordersId));
if (salesOrderDetails!=null){
for (SalesOrderDetails salesOrderDetail : salesOrderDetails) {
if (products.getId()!=salesOrderDetail.getProductId()){
continue;
}
//库存不足
if ((products.getStockQuantity()+salesOrderDetail.getQuantity())<quantity){
return false;
}
//库存充足归还数量重新扣减库存
products.setStockQuantity(products.getStockQuantity()+salesOrderDetail.getQuantity());
productsMapper.updateById(products);
return true;
}
}
}
//库存不足
if (products.getStockQuantity()<quantity){
return false;
}
return true;
}
}

csbysj2020
- 粉丝: 3236
- 资源: 6258
最新资源
- 基于easyx库的C++五子棋游戏设计源码
- 双卡尔曼滤波算法DEKF联合估计锂离子电池SOC与SOH:鲁棒性强、估计精度高,附参考资料,双卡尔曼滤波算法DEKF在锂离子电池SOC与SOH联合估计中的应用:高鲁棒性与精度,基于双卡尔曼滤波算法DE
- 基于Matlab GUI界面的热红外图像温度检测技术研究:高斯噪声与椒盐噪声下的均值滤波与中值滤波优化应用,基于Matlab GUI界面的热红外图像温度检测技术研究:高斯噪声与椒盐噪声下的均值滤波与中
- 基于Matlab GUI界面的蚁群算法路径规划系统设计与实现,MATLAB图形界面实现的蚁群算法路径规划系统设计及应用,- 标题: matlab基于蚁群算法的路径规划系统 - 关键词:matlab G
- 基于混沌系统与DCT变换的图像压缩加密解密系统:符号加密提升安全性与传输效率的新方法,MATLAB驱动的混沌系统与DCT离散余弦变换相结合的高效图像压缩加密解密系统:融合符号加密,保障安全与效率双重提
- MATLAB在光学仿真与透镜传递函数研究中的应用:4f系统数值模拟与菲涅尔衍射函数的转化计算,MATLAB光学仿真:4f系统数值模拟与菲涅尔衍射函数深度解析-透镜传递函数与衍射数值计算的研究,MAT
- (源码)基于Python的软件故障预测框架.zip
- QT软件产品:高效数据导入导出,轻松对接Excel与PDF打印功能,Qt数据管理与打印工具:轻松实现数据导入导出至Excel与PDF,支持一键打印的强大软件功能,qt 数据导入导出,导出excel
- (源码)基于CC++的物联网基础开发项目.zip
- 基于S7-200+PLC与组态王技术的Z35摇臂钻床控制系统设计与实现,基于S7-200+PLC与组态王软件的Z35摇臂钻床控制系统设计与实现,98#基于S7-200+PLC和组态王组态Z35摇臂钻床
- 工业机器人自动抛光螺旋桨实践与仿真研究报告合集:编程实验、数据与图表全收录,工业机器人自动抛光螺旋桨实践与仿真:实验报告书、数据图表及视频分享,Robot studio仿真,工业机器人自动抛光螺旋桨
- 基于MATLAB的电力系统故障分析技术研究与报告,基于Matlab的电力系统故障分析与报告:理论与实践深度探讨,基于matlab电力系统故障分析,带报告 ,基于Matlab; 电力系统故障分析; 报告
- COMSOL Multiphysics模型:非损伤性压裂水平井的长期抽采及达西流-裂隙流联合效应分析:一数值模型及其实例验证的视频案例,COMSOL Multiphysics模型:压裂水平井抽采案例解
- 电力系统中故障运行的深入潮流分析与策略探讨,电力系统故障情境下的运行潮流深度分析与策略优化,电力系统故障运行潮流分析 ,电力系统故障; 运行潮流分析; 故障诊断; 潮流计算; 风险评估 ,电力系统故障
- 首创信捷万能通用程序模板:融合进位数据与S状态,助力电气非标项目快速开发 大型系统与小型系统互通之精髓,集成C语言功能块提升编程效率 跨品牌PLC应用的通用模板,实现快速设计与调试 高效通用的十
- MATLAB电力系统故障分析与仿真报告:深入解析故障影响及应对策略,MATLAB电力系统故障分析与仿真报告:深度探究故障原因及应对策略,MATLAB电力系统故障分析,仿真加报告 ,MATLAB; 电力
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


