From 8ef1894a472f2239de60337ea55f3cb5d723a66d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=AD=E5=87=AF=E5=87=AF?= Date: Sat, 26 Oct 2024 17:29:20 +0800 Subject: [PATCH] =?UTF-8?q?Pad=E7=82=B9=E9=A4=90=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/TbPadProductCategoryServiceImpl.java | 118 +++++++++++++++--- .../ysk/cashier/pojo/product/TbProduct.java | 21 +++- 2 files changed, 114 insertions(+), 25 deletions(-) diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/impl/TbPadProductCategoryServiceImpl.java b/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/impl/TbPadProductCategoryServiceImpl.java index bd0deb64..85aa89cd 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/impl/TbPadProductCategoryServiceImpl.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/mybatis/service/impl/TbPadProductCategoryServiceImpl.java @@ -4,18 +4,17 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.map.MapProxy; +import cn.hutool.core.util.StrUtil; import cn.ysk.cashier.dto.product.PadProductCategoryDTO; import cn.ysk.cashier.exception.BadRequestException; -import cn.ysk.cashier.mybatis.mapper.TbPadLayoutMapper; -import cn.ysk.cashier.mybatis.mapper.TbPadProductCategoryDetailMapper; -import cn.ysk.cashier.mybatis.mapper.TbPadProductCategoryMapper; -import cn.ysk.cashier.mybatis.mapper.TbProductMapper; +import cn.ysk.cashier.mybatis.mapper.*; import cn.ysk.cashier.mybatis.service.TbPadProductCategoryService; -import cn.ysk.cashier.pojo.product.TbPadLayout; -import cn.ysk.cashier.pojo.product.TbPadProductCategory; -import cn.ysk.cashier.pojo.product.TbPadProductCategoryDetail; -import cn.ysk.cashier.pojo.product.TbProduct; +import cn.ysk.cashier.pojo.product.*; +import cn.ysk.cashier.repository.product.TbProductSkuResultRepository; import cn.ysk.cashier.utils.PageUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -24,10 +23,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -46,6 +42,10 @@ public class TbPadProductCategoryServiceImpl extends ServiceImpl findPage(Map params) { @@ -69,29 +69,107 @@ public class TbPadProductCategoryServiceImpl extends ServiceImpl params = new HashMap<>(2); + Map params = new HashMap<>(2); params.put("id", id); params.put("shopId", entity.getShopId()); List list = baseMapper.findList(params); PadProductCategoryDTO dto = list.get(0); - if(entity.getProductCategoryId().longValue() == 0L){ + if (entity.getProductCategoryId().longValue() == 0L) { dto.setProductCategoryName("推荐菜"); } List subList = tbPadProductCategoryDetailMapper.selectList(Wrappers.lambdaQuery().eq(TbPadProductCategoryDetail::getPadProductCategoryId, entity.getId())); - if(CollUtil.isNotEmpty(subList)){ + if (CollUtil.isNotEmpty(subList)) { List productIdList = subList.stream().map(TbPadProductCategoryDetail::getProductId).collect(Collectors.toList()); dto.setProductIdList(productIdList); List> splitIdList = CollUtil.split(productIdList, 10); List productList = dto.getProductList(); for (List ids : splitIdList) { List splitList = tbProductMapper.selectList(Wrappers.lambdaQuery().in(TbProduct::getId, ids)); - productList.addAll(splitList); + for (TbProduct item : splitList) { + TbProductSkuResult skuResult = productSkuResultRepository.findById(item.getId()).orElse(null); + item.setSkuResult(skuResult); + List> maps = buildSpecList(skuResult, item); + item.setSpecList(maps); + productList.add(item); + } } dto.setProductList(productList); } return dto; } + private List> buildSpecList(TbProductSkuResult skuResult, TbProduct item) { + List> specList = new ArrayList<>(); + List tbProductSkus = producSkutMapper.selectList(new LambdaQueryWrapper().eq(TbProductSku::getIsDel, 0) + .eq(TbProductSku::getIsPauseSale, 0) + .eq(TbProductSku::getProductId, item.getId()) + .eq(TbProductSku::getIsGrounding, 1) + .select(TbProductSku::getId, TbProductSku::getSpecSnap, TbProductSku::getStockNumber, TbProductSku::getSalePrice, TbProductSku::getSuit)); + + String tagSnap = null; + if (skuResult != null) { + tagSnap = skuResult.getTagSnap(); + } + List result = new ArrayList<>(); + + if (StrUtil.isNotBlank(tagSnap)) { + JSONArray tagSnaps = JSONObject.parseArray(tagSnap); + List> valuesList = new ArrayList<>(); + + // 提取所有 value 的列表 + for (int i = 0; i < tagSnaps.size(); i++) { + JSONObject jsonObject = tagSnaps.getJSONObject(i); + String[] values = jsonObject.getString("value").split(","); + valuesList.add(Arrays.asList(values)); + } + // 生成所有可能的排列组合 + generateCombinations(valuesList, 0, new ArrayList<>(), result); + + } + + tbProductSkus.forEach(item2 -> { + Map itemMap = BeanUtil.beanToMap(item2, false, true); + + itemMap.put("stockNumber", item.getStockNumber()); + + specList.add(itemMap); + }); + + ArrayList> otherVal = new ArrayList<>(); + for (String res : result) { + boolean found = false; + for (Map spec : specList) { + if (spec.get("specSnap") != null && res.equals(spec.get("specSnap").toString())) { + spec.put("isGrounding", true); + found = true; + break; + } + } + if (!found) { + HashMap itemMap = new HashMap<>(); + itemMap.put("specSnap", res); + itemMap.put("skuId", null); + itemMap.put("isGrounding", false); + otherVal.add(itemMap); + } + } + specList.addAll(otherVal); + return specList; + } + + private static void generateCombinations(List> valuesList, int index, List current, List result) { + if (index == valuesList.size()) { + result.add(String.join(",", current)); + return; + } + + for (String value : valuesList.get(index)) { + current.add(value); + generateCombinations(valuesList, index + 1, current, result); + current.remove(current.size() - 1); // 回溯 + } + } + @Override @Transactional(rollbackFor = Exception.class) public void save(PadProductCategoryDTO dto) { @@ -122,7 +200,7 @@ public class TbPadProductCategoryServiceImpl extends ServiceImpl sortList) { - if(CollUtil.isEmpty(sortList)) { + if (CollUtil.isEmpty(sortList)) { throw new BadRequestException("排序列表不能为空"); } for (PadProductCategoryDTO dto : sortList) { diff --git a/eladmin-system/src/main/java/cn/ysk/cashier/pojo/product/TbProduct.java b/eladmin-system/src/main/java/cn/ysk/cashier/pojo/product/TbProduct.java index 391b1c5e..9a7adb1e 100644 --- a/eladmin-system/src/main/java/cn/ysk/cashier/pojo/product/TbProduct.java +++ b/eladmin-system/src/main/java/cn/ysk/cashier/pojo/product/TbProduct.java @@ -15,18 +15,21 @@ */ package cn.ysk.cashier.pojo.product; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import cn.hutool.core.bean.BeanUtil; import io.swagger.annotations.ApiModelProperty; -import cn.hutool.core.bean.copier.CopyOptions; +import lombok.Data; import javax.persistence.*; -import javax.validation.constraints.*; -import java.math.BigDecimal; +import javax.validation.constraints.NotNull; import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; +import java.util.Map; /** * @website https://eladmin.vip @@ -329,6 +332,14 @@ public class TbProduct implements Serializable { @ApiModelProperty("库存警戒线") private Integer warnLine = 0; + @Transient + @TableField(exist = false) + private TbProductSkuResult skuResult; + + @Transient + @TableField(exist = false) + private List> specList; + public void copy(TbProduct source){ BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));