|
@@ -0,0 +1,164 @@
|
|
|
+package com.caimei365.commodity.service.impl;
|
|
|
+
|
|
|
+import com.caimei365.commodity.mapper.PriceMapper;
|
|
|
+import com.caimei365.commodity.mapper.ShopMapper;
|
|
|
+import com.caimei365.commodity.mapper.ShopOrderMapper;
|
|
|
+import com.caimei365.commodity.model.ResponseJson;
|
|
|
+import com.caimei365.commodity.model.dto.Sku;
|
|
|
+import com.caimei365.commodity.model.po.ProductImagePo;
|
|
|
+import com.caimei365.commodity.model.vo.*;
|
|
|
+import com.caimei365.commodity.service.ShopOrderService;
|
|
|
+import com.caimei365.commodity.utils.ImageUtils;
|
|
|
+import com.caimei365.commodity.utils.MathUtil;
|
|
|
+import com.github.pagehelper.PageHelper;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.lang.StringUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.IntStream;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Description
|
|
|
+ *
|
|
|
+ * @author : Charles
|
|
|
+ * @date : 2023/9/28
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+public class ShopOrderServiceImpl implements ShopOrderService {
|
|
|
+ @Value("${caimei.imageDomain}")
|
|
|
+ private String domain;
|
|
|
+
|
|
|
+ @Resource private ShopOrderMapper shopOrderMapper;
|
|
|
+
|
|
|
+ @Resource private ShopMapper shopMapper;
|
|
|
+
|
|
|
+ @Resource private PriceMapper priceMapper;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 供应商商品数据
|
|
|
+ * @param shopId
|
|
|
+ * @param name
|
|
|
+ * @param pageNum
|
|
|
+ * @param pageSize
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ResponseJson<PaginationVo<ProductShoplVo>> getShopProductList(Integer shopId, String name, Integer pageNum, Integer pageSize) {
|
|
|
+ PageHelper.startPage(pageNum, pageSize);
|
|
|
+ List<ProductShoplVo> shopProductList = shopOrderMapper.getShopProductList(shopId, name);
|
|
|
+ // 处理上架商城, 版本只显示联合丽格的sku
|
|
|
+ List<String> organizeIdList = new ArrayList<>();
|
|
|
+ organizeIdList.add("4");
|
|
|
+ shopProductList.forEach( product -> {
|
|
|
+ // 主图
|
|
|
+ product.setMainImage(ImageUtils.getImageURL("product", product.getMainImage(), 0, domain));
|
|
|
+ // 商品图片
|
|
|
+ List<ProductImagePo> imageList = shopMapper.getProductImages(product.getProductId());
|
|
|
+ for (ProductImagePo image : imageList) {
|
|
|
+ String imageURL = ImageUtils.getImageURL("product", image.getImage(), 0, domain);
|
|
|
+ image.setImage(imageURL);
|
|
|
+ }
|
|
|
+ product.setImageList(imageList);
|
|
|
+ // 获取商品sku
|
|
|
+ List<Sku> skuList = shopOrderMapper.getSkuList(product.getProductId(), organizeIdList);
|
|
|
+ product.setSkus(skuList);
|
|
|
+ Sku sku = skuList.get(0);
|
|
|
+ product.setSkuId(sku.getSkuId());
|
|
|
+ product.setUnit(sku.getUnit());
|
|
|
+ product.setPrice(BigDecimal.valueOf(sku.getPrice()));
|
|
|
+ product.setOriginalPrice(BigDecimal.valueOf(sku.getOriginalPrice()));
|
|
|
+ product.setMinBuyNumber(sku.getMinBuyNumber());
|
|
|
+
|
|
|
+ skuList.forEach( s -> {
|
|
|
+ if (1 == s.getLadderPriceFlag()) {
|
|
|
+ // sku的阶梯价
|
|
|
+ LadderPriceVo lowerBuyNum = priceMapper.findOrganizeMaxLadderPrice(s.getSkuId(), 4);
|
|
|
+ s.setMinBuyNumber(lowerBuyNum.getBuyNum());
|
|
|
+ s.setPrice(lowerBuyNum.getBuyPrice());
|
|
|
+ s.setStock(lowerBuyNum.getStock());
|
|
|
+ s.setUnit(lowerBuyNum.getUnit());
|
|
|
+ List<LadderPriceVo> ladderPrices = priceMapper.getLadderPricesOrganizeByProductId(s.getSkuId(), 4);
|
|
|
+ TaxVo tax = priceMapper.getTaxByProductId(product.getProductId());
|
|
|
+ if (!CollectionUtils.isEmpty(ladderPrices)) {
|
|
|
+ setLadderPriceList(ladderPrices, tax);
|
|
|
+ }
|
|
|
+ s.setLadderPriceList(ladderPrices);
|
|
|
+ product.setLadderPriceFlag(1);
|
|
|
+ if (1 == skuList.size()) {
|
|
|
+ //1.对于只有一个SKU的商品,各个商品列表直接显示机构价即可:若是阶梯价,则显示第一级阶梯的价格:
|
|
|
+ product.setSkuId(ladderPrices.get(0).getSkuId());
|
|
|
+ product.setPrice(BigDecimal.valueOf(ladderPrices.get(0).getBuyPrice()));
|
|
|
+ product.setMinBuyNumber(ladderPrices.get(0).getBuyNum());
|
|
|
+ product.setStock(ladderPrices.get(0).getStock());
|
|
|
+ product.setUnit(ladderPrices.get(0).getUnit());
|
|
|
+ } else {
|
|
|
+ //2.对于有多个SKU的商品,各个商品列表显示所有SKU中最低的价格:
|
|
|
+ // 若SKU中,全部都是阶梯价,则显示所有SKU中第一级阶梯的价格中的最低价,
|
|
|
+ // 若SKU中,使用阶梯价和不使用阶梯价(只是用机构价》并存,则用机构价和第一级阶梯价比大小,展示最小的价格
|
|
|
+ // skuid分组取第一阶梯中最便宜的
|
|
|
+ ProductItemVo lowLadderPrice = priceMapper.findLowPriceOfOrganizeAll(product.getProductId(), 4);
|
|
|
+ ProductItemVo lowAllPrice = priceMapper.findLowPriceOfOrganizePrice(product.getProductId(), 4);
|
|
|
+ if (null != lowLadderPrice) {
|
|
|
+ ProductItemVo productItemVo = lowLadderPrice.getPrice() > lowAllPrice.getPrice() ? lowAllPrice : lowLadderPrice;
|
|
|
+ product.setPrice(BigDecimal.valueOf(productItemVo.getPrice()));
|
|
|
+ product.setSkuId(productItemVo.getSkuId());
|
|
|
+ product.setMinBuyNumber(productItemVo.getMinBuyNumber());
|
|
|
+ product.setUnit(productItemVo.getUnit());
|
|
|
+ product.setStock(productItemVo.getStock());
|
|
|
+ } else {
|
|
|
+ product.setPrice(BigDecimal.valueOf(lowAllPrice.getPrice()));
|
|
|
+ product.setSkuId(lowAllPrice.getSkuId());
|
|
|
+ product.setMinBuyNumber(lowAllPrice.getMinBuyNumber());
|
|
|
+ product.setUnit(lowAllPrice.getUnit());
|
|
|
+ product.setStock(lowAllPrice.getStock());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ // 税费标志
|
|
|
+ boolean taxFlag = "0".equals(product.getIncludedTax()) && ("1".equals(product.getInvoiceType()) || "2".equals(product.getInvoiceType()));
|
|
|
+ if (taxFlag) {
|
|
|
+ BigDecimal thisTaxFee = MathUtil.div(MathUtil.mul(sku.getPrice(), product.getTaxRate()), 100, 2);
|
|
|
+ product.setPrice(MathUtil.add(product.getPrice(), thisTaxFee));
|
|
|
+ BigDecimal originalTaxFee = MathUtil.div(MathUtil.mul(sku.getOriginalPrice(), product.getTaxRate()), 100, 2);
|
|
|
+ product.setOriginalPrice(MathUtil.add(product.getOriginalPrice(), originalTaxFee));
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ PaginationVo<ProductShoplVo> page = new PaginationVo<>(shopProductList);
|
|
|
+ return ResponseJson.success(page);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 设置阶梯价展示数据
|
|
|
+ *
|
|
|
+ * @param ladderPrices List<LadderPriceVo>
|
|
|
+ * @param tax TaxVo
|
|
|
+ */
|
|
|
+ public void setLadderPriceList(List<LadderPriceVo> ladderPrices, TaxVo tax) {
|
|
|
+ IntStream.range(0, ladderPrices.size()).forEach(i -> {
|
|
|
+ //税费标志
|
|
|
+ boolean taxFlag = 0 == tax.getIncludedTax() && 1 == tax.getInvoiceType() || 2 == tax.getInvoiceType();
|
|
|
+ //添加税费
|
|
|
+ if (taxFlag) {
|
|
|
+ BigDecimal taxFee = MathUtil.div(MathUtil.mul(ladderPrices.get(i).getBuyPrice(), tax.getTaxPoint()), 100, 2);
|
|
|
+ ladderPrices.get(i).setBuyPrice(MathUtil.add(ladderPrices.get(i).getBuyPrice(), taxFee).doubleValue());
|
|
|
+ }
|
|
|
+ if (i == ladderPrices.size() - 1) {
|
|
|
+ ladderPrices.get(i).setMaxNum(0);
|
|
|
+ ladderPrices.get(i).setNumRange("≥" + ladderPrices.get(i).getBuyNum());
|
|
|
+ } else {
|
|
|
+ ladderPrices.get(i).setMaxNum(ladderPrices.get(i + 1).getBuyNum());
|
|
|
+ String buyNumRangeShow = ladderPrices.get(i).getBuyNum() + "~" + (ladderPrices.get(i + 1).getBuyNum() - 1);
|
|
|
+ ladderPrices.get(i).setNumRange(buyNumRangeShow);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+}
|