diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/SkuViewDTO.java b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/SkuViewDTO.java index 95eff74..4466ead 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/SkuViewDTO.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/pojo/vo/SkuViewDTO.java @@ -15,16 +15,18 @@ import java.math.BigDecimal; @Data @ApiModel(value = "sku渲染详情") public class SkuViewDTO { - private Long productId; - private Long skuId; - @ApiModelProperty(value = "商品名称") - private String productName; - @ApiModelProperty(value = "销售属性") - private String spData; - @ApiModelProperty(value = "购买数量") - private Integer quantity; - @ApiModelProperty(value = "主图") - private String pic; - @ApiModelProperty(value = "售价") - private BigDecimal price; + private Long productId; + private Long skuId; + @ApiModelProperty(value = "商品名称") + private String productName; + @ApiModelProperty(value = "销售属性") + private String spData; + @ApiModelProperty(value = "购买数量") + private Integer quantity; + @ApiModelProperty(value = "主图") + private String pic; + @ApiModelProperty(value = "售价") + private BigDecimal price; + @ApiModelProperty(value = "库存数") + private Integer stock; } \ No newline at end of file diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5OrderService.java b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5OrderService.java index aba9635..9d10052 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5OrderService.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5OrderService.java @@ -62,6 +62,7 @@ import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -159,6 +160,9 @@ public class H5OrderService { if (Constants.PublishStatus.UNDERCARRIAGE.equals(product.getPublishStatus())){ throw new RuntimeException("商品" + product.getName() + "已下架"); } + if (sku.getStock() < skuQuantityMap.get(sku.getId())) { + throw new RuntimeException("库存不足"); + } productTotalAmount = productTotalAmount.add(sku.getPrice().multiply(BigDecimal.valueOf(skuQuantityMap.get(sku.getId())))); orderTotalAmount = orderTotalAmount.add(sku.getPrice().multiply(BigDecimal.valueOf(skuQuantityMap.get(sku.getId())))); dto.setSku(sku); @@ -206,6 +210,10 @@ public class H5OrderService { } // 保存orderItem orderItemService.saveOrderItem(member, optTime, orderId, skuList); + skuList.forEach(item -> { + //减少sku的库存 + skuMapper.updateStockById(item.getSkuId(),LocalDateTime.now(),item.getQuantity()); + }); // 保存订单操作记录 OrderOperateHistory orderOperateHistory = new OrderOperateHistory(); orderOperateHistory.setOrderId(orderId); @@ -262,6 +270,9 @@ public class H5OrderService { if (Constants.PublishStatus.UNDERCARRIAGE.equals(product.getPublishStatus())){ throw new RuntimeException("商品" + product.getName() + "已下架"); } + if (sku.getStock() < quantityMap.get(sku.getId())) { + throw new RuntimeException("库存不足"); + } BigDecimal addAmount = sku.getPrice().multiply(BigDecimal.valueOf(dto.getQuantity())); //由于目前没有运费等数据,暂时订单总金额=商品总金额了 productTotalAmount = productTotalAmount.add(addAmount); @@ -415,6 +426,13 @@ public class H5OrderService { if (orderList.size() < request.getIdList().size()){ throw new RuntimeException("未查询到订单信息"); } + //查orderItem + QueryWrapper qw = new QueryWrapper<>(); + qw.in("order_id", request.getIdList()); + List orderItem = orderItemMapper.selectList(qw); + if (CollectionUtil.isEmpty(orderItem)) { + throw new RuntimeException("未查询到订单信息"); + } long count = orderList.stream().filter(it -> !Constants.H5OrderStatus.UN_PAY.equals(it.getStatus())).count(); if (count > 0){ throw new RuntimeException("订单状态已更新,请刷新页面"); @@ -434,12 +452,19 @@ public class H5OrderService { history.setUpdateBy(userId); history.setUpdateTime(optDate); addHistoryList.add(history); + }); //取消订单 int rows = orderMapper.cancelBatch(orderList); if (rows < 1){ throw new RuntimeException("更改订单状态失败"); } + orderItem.stream().collect(Collectors.groupingBy(it->it.getSkuId())).forEach((k,v)->{ + AtomicReference totalCount = new AtomicReference<>(0); + v.forEach(it-> totalCount.updateAndGet(v1 -> v1 + it.getQuantity())); + skuMapper.updateStockById(k, optDate, -1 * totalCount.get()); + }); + //创建订单操作记录 boolean flag = orderOperateHistoryService.saveBatch(addHistoryList); if (!flag){ diff --git a/ruoyi-mall/src/main/java/com/cyl/manager/oms/service/AftersaleService.java b/ruoyi-mall/src/main/java/com/cyl/manager/oms/service/AftersaleService.java index 3486a54..ee8b223 100644 --- a/ruoyi-mall/src/main/java/com/cyl/manager/oms/service/AftersaleService.java +++ b/ruoyi-mall/src/main/java/com/cyl/manager/oms/service/AftersaleService.java @@ -19,6 +19,7 @@ import com.cyl.manager.oms.mapper.OrderOperateHistoryMapper; import com.cyl.manager.oms.pojo.request.DealWithAftersaleRequest; import com.cyl.manager.oms.pojo.request.ManagerAftersaleOrderRequest; import com.cyl.manager.oms.pojo.vo.*; +import com.cyl.manager.pms.mapper.SkuMapper; import com.cyl.manager.ums.domain.Member; import com.cyl.manager.ums.mapper.MemberMapper; import com.github.pagehelper.PageHelper; @@ -58,6 +59,8 @@ public class AftersaleService { @Autowired private OrderOperateHistoryConvert historyConvert; + @Autowired + private SkuMapper skuMapper; /** * 查询订单售后 @@ -274,8 +277,17 @@ public class AftersaleService { orderWrapper.set("aftersale_status", OrderRefundStatus.NO_REFUND.getType()); optHistory.setOrderStatus(14); }else if (ifAgree){ - aftersaleWrapper.set("status", AftersaleStatus.WAIT.getType()); - orderWrapper.set("aftersale_status", OrderRefundStatus.WAIT.getType()); + //如果是未发货的情况下,直接增加库存 + if (order.getStatus() == 1) { + OrderItem orderItem = orderItemMapper.selectOne(new QueryWrapper().eq("order_id", order.getId())); + skuMapper.updateStockById(orderItem.getSkuId(),LocalDateTime.now(),-1*orderItem.getQuantity()); + //todo 微信直接退款 + aftersaleWrapper.set("status", AftersaleStatus.SUCCESS.getType()); + orderWrapper.set("aftersale_status", OrderRefundStatus.SUCCESS.getType()); + } else { + aftersaleWrapper.set("status", AftersaleStatus.WAIT.getType()); + orderWrapper.set("aftersale_status", OrderRefundStatus.WAIT.getType()); + } optHistory.setOrderStatus(12); } int rows = aftersaleMapper.update(null, aftersaleWrapper); diff --git a/ruoyi-mall/src/main/java/com/cyl/manager/pms/domain/Sku.java b/ruoyi-mall/src/main/java/com/cyl/manager/pms/domain/Sku.java index 0047865..0c552d5 100644 --- a/ruoyi-mall/src/main/java/com/cyl/manager/pms/domain/Sku.java +++ b/ruoyi-mall/src/main/java/com/cyl/manager/pms/domain/Sku.java @@ -41,4 +41,8 @@ public class Sku extends BaseAudit { @Excel(name = "商品销售属性,json格式") private String spData; + @ApiModelProperty("库存数") + @Excel(name = "库存数") + private Integer stock; + } diff --git a/ruoyi-mall/src/main/java/com/cyl/manager/pms/mapper/SkuMapper.java b/ruoyi-mall/src/main/java/com/cyl/manager/pms/mapper/SkuMapper.java index 66a5702..e2cd36c 100644 --- a/ruoyi-mall/src/main/java/com/cyl/manager/pms/mapper/SkuMapper.java +++ b/ruoyi-mall/src/main/java/com/cyl/manager/pms/mapper/SkuMapper.java @@ -1,8 +1,10 @@ package com.cyl.manager.pms.mapper; +import java.time.LocalDateTime; import java.util.List; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.cyl.manager.pms.domain.Sku; +import org.apache.ibatis.annotations.Param; /** * sku信息Mapper接口 @@ -17,4 +19,6 @@ public interface SkuMapper extends BaseMapper { * @return sku信息集合 */ List selectByEntity(Sku sku); + + int updateStockById(@Param("skuId")Long skuId, @Param("optDate")LocalDateTime optDate, @Param("quantity")Integer quantity); } diff --git a/ruoyi-mall/src/main/java/com/cyl/manager/pms/pojo/vo/SkuVO.java b/ruoyi-mall/src/main/java/com/cyl/manager/pms/pojo/vo/SkuVO.java index 30ff119..86d8a75 100644 --- a/ruoyi-mall/src/main/java/com/cyl/manager/pms/pojo/vo/SkuVO.java +++ b/ruoyi-mall/src/main/java/com/cyl/manager/pms/pojo/vo/SkuVO.java @@ -28,4 +28,6 @@ public class SkuVO extends BaseAudit { /** 商品销售属性,json格式 */ @Excel(name = "商品销售属性,json格式") private String spData; + @Excel(name = "库存数") + private Integer stock; } diff --git a/ruoyi-mall/src/main/java/com/cyl/manager/pms/service/ProductService.java b/ruoyi-mall/src/main/java/com/cyl/manager/pms/service/ProductService.java index b47ba19..e2e3743 100644 --- a/ruoyi-mall/src/main/java/com/cyl/manager/pms/service/ProductService.java +++ b/ruoyi-mall/src/main/java/com/cyl/manager/pms/service/ProductService.java @@ -2,7 +2,10 @@ package com.cyl.manager.pms.service; import java.util.*; import java.time.LocalDateTime; +import java.util.stream.Collectors; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.cyl.h5.pojo.vo.ProductDetail; @@ -12,6 +15,8 @@ import com.cyl.manager.pms.mapper.BrandMapper; import com.cyl.manager.pms.mapper.SkuMapper; import com.cyl.manager.pms.pojo.vo.ProductVO; import com.github.pagehelper.PageHelper; +import com.ruoyi.common.utils.SecurityUtils; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; import org.apache.commons.lang3.StringUtils; @@ -28,6 +33,7 @@ import org.springframework.transaction.annotation.Transactional; * @author zcc */ @Service +@Slf4j public class ProductService { @Autowired private ProductMapper productMapper; @@ -123,19 +129,53 @@ public class ProductService { */ @Transactional public int update(ProductVO productVO) { + Product dbProduct = productMapper.selectById(productVO.getId()); + List idList = productVO.getSkuList().stream().filter(it -> it.getId() != null).map(it -> it.getId()).collect(Collectors.toList()); + if (dbProduct == null) { + return 0; + } + Long userId = SecurityUtils.getUserId(); Product product = convert.vo2do(productVO); List skuList = productVO.getSkuList(); + product.setUpdateBy(userId); + product.setUpdateTime(LocalDateTime.now()); productMapper.updateById(product); + //查找库中所有的sku Map map = new HashMap<>(); map.put("product_id", product.getId()); - skuMapper.deleteByMap(map); - if(skuList!=null){ - skuList.forEach(sku -> { + Map skuMap = skuMapper.selectByMap(map).stream().collect(Collectors.toMap(it -> it.getId(), it -> it)); + //针对已有的进行编辑 + List updateList = productVO.getSkuList().stream().filter(it -> it.getId() != null).collect(Collectors.toList()); + if (!CollectionUtil.isEmpty(updateList)) { + log.info("共有{}个sku需要修改,{},productId:{}",updateList.size(), JSONUtil.toJsonStr(updateList),productVO.getId()); + updateList.forEach(it->{ + Sku sku = skuMap.get(it.getId()); + sku.setUpdateBy(SecurityUtils.getUserId()); + sku.setUpdateTime(LocalDateTime.now()); + sku.setPrice(it.getPrice()); + sku.setSpData(it.getSpData()); + sku.setPic(it.getPic()); + sku.setOutSkuId(it.getOutSkuId()); + sku.setStock(it.getStock()); + skuMapper.updateById(sku); + }); + } + //针对没有的进行新增 + List addList = productVO.getSkuList().stream().filter(it -> it.getId() == null).collect(Collectors.toList()); + if (!CollectionUtil.isEmpty(addList)) { + log.info("共有{}个sku需要新增,{},productId:{}",addList.size(), JSONUtil.toJsonStr(addList),productVO.getId()); + addList.forEach(sku -> { sku.setProductId(product.getId()); sku.setCreateTime(LocalDateTime.now()); skuMapper.insert(sku); }); } + //删除 + List deleteIds = skuMap.keySet().stream().filter(it -> !idList.contains(it)).collect(Collectors.toList()); + if (!CollectionUtil.isEmpty(deleteIds)) { + log.info("共有{}个sku需要删除,{},productId:{}",deleteIds.size(), JSONUtil.toJsonStr(deleteIds),productVO.getId()); + skuMapper.deleteBatchIds(deleteIds); + } return 1; } diff --git a/ruoyi-mall/src/main/resources/mapper/pms/SkuMapper.xml b/ruoyi-mall/src/main/resources/mapper/pms/SkuMapper.xml index ca6dc10..902c5f9 100644 --- a/ruoyi-mall/src/main/resources/mapper/pms/SkuMapper.xml +++ b/ruoyi-mall/src/main/resources/mapper/pms/SkuMapper.xml @@ -24,6 +24,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select id, product_id, out_sku_id, price, pic, sp_data, create_by, create_time, update_by, update_time from pms_sku + + update + pms_sku + set + stock = stock - #{quantity}, + update_time = #{optDate} + where id = #{skuId} +