Selaa lähdekoodia

新增sku报价板

fgd 1 vuosi sitten
vanhempi
commit
684dfba5fc

+ 50 - 0
sd-business/src/main/java/com/sd/business/controller/board/SkuSpecQuotationBoard.java

@@ -0,0 +1,50 @@
+package com.sd.business.controller.board;
+
+import com.sd.business.entity.board.dto.SkuSpecQuotationDto;
+import com.sd.business.entity.board.vo.SkuSpecQuotationVo;
+import com.sd.business.service.sku.SkuSpecService;
+import com.sd.framework.util.excel.util.ExcelUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * <p>
+ * sku规格报价板 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2023-10-27
+ */
+@RestController
+@RequestMapping("/skuSpecQuotationBoard")
+public class SkuSpecQuotationBoard {
+
+    @Autowired
+    private SkuSpecService skuSpecService;
+
+    /**
+     * 获取sku报价数据列表
+     * @return
+     */
+    @PostMapping("/getSkuSpecQuotationList")
+    public List<SkuSpecQuotationVo> getSkuSpecQuotationList(@RequestBody SkuSpecQuotationDto dto) {
+        return skuSpecService.getSkuSpecQuotationList(dto);
+    }
+
+    /**
+     * 导出sku报价数据列表
+     * @return
+     */
+    @PostMapping("/exportExcel")
+    public void exportExcel(HttpServletResponse response, @RequestBody SkuSpecQuotationDto dto) {
+        List<SkuSpecQuotationVo> skuSpecQuotationList = skuSpecService.getSkuSpecQuotationList(dto);
+        ExcelUtil.export(response,"sku报价单", "sku报价单数据", skuSpecQuotationList, SkuSpecQuotationVo.class);
+    }
+
+}

+ 26 - 0
sd-business/src/main/java/com/sd/business/entity/board/dto/SkuSpecQuotationDto.java

@@ -0,0 +1,26 @@
+package com.sd.business.entity.board.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * sku规格报价板查询入参实体
+ *
+ * @author
+ * @since 2023-10-27
+ */
+@Getter
+@Setter
+public class SkuSpecQuotationDto {
+
+    /**
+     * sku品号
+     */
+    private String skuSpecCode;
+
+    /**
+     * sku品名
+     */
+    private String skuSpecName;
+
+}

+ 123 - 0
sd-business/src/main/java/com/sd/business/entity/board/vo/SkuSpecQuotationVo.java

@@ -0,0 +1,123 @@
+package com.sd.business.entity.board.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.HeadFontStyle;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * sku规格报价板查询返回值实体
+ *
+ * @author
+ * @since 2023-10-27
+ */
+@Getter
+@Setter
+@ExcelIgnoreUnannotated
+@HeadRowHeight(20)
+@HeadFontStyle(fontHeightInPoints = 12)
+public class SkuSpecQuotationVo {
+
+    /**
+     * 品牌
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "归属单位", index = 0)
+    private String brand;
+
+    /**
+     * sku品号
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "SKU品号", index = 1)
+    private String skuSpecCode;
+
+    /**
+     * sku品名
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = "SKU品名", index = 2)
+    private String skuSpecName;
+
+    /**
+     * sku 裸垫单价
+     */
+    @ColumnWidth(12)
+    @ExcelProperty(value = {"SKU单价(含税)", "裸垫"}, index = 3)
+    private BigDecimal skuSpecUnitPrice;
+
+    /**
+     * sku 激光logo单价
+     */
+    @ColumnWidth(12)
+    @ExcelProperty(value = {"SKU单价(含税)", "激光logo"}, index = 4)
+    private BigDecimal skuSpecUnitPriceLogo;
+
+    /**
+     * sku 激光体位线单价
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = {"SKU单价(含税)", "激光体位线"}, index = 5)
+    private BigDecimal skuSpecUnitPriceLine;
+
+    /**
+     * bom 主材单价
+     */
+    @ColumnWidth(12)
+    @ExcelProperty(value = {"价格组成", "主材"}, index = 6)
+    private BigDecimal bomSpecUnitPrice;
+
+    /**
+     * 包材费
+     */
+    @ColumnWidth(12)
+    @ExcelProperty(value = {"价格组成", "包材配件"}, index = 7)
+    private BigDecimal packagingMaterialCost;
+
+    /**
+     * 激光logo价格
+     */
+    @ColumnWidth(12)
+    @ExcelProperty(value = {"价格组成", "激光logo"}, index = 8)
+    private BigDecimal logoProcessingFee;
+
+    /**
+     * 激光体位线价格
+     */
+    @ColumnWidth(15)
+    @ExcelProperty(value = {"价格组成", "激光体位线"}, index = 9)
+    private BigDecimal lineProcessingFee;
+
+    /**
+     * 代发费
+     */
+    @ColumnWidth(12)
+    @ExcelProperty(value = {"价格组成", "代发"}, index = 10)
+    private BigDecimal issueFee;
+
+    /**
+     * 快递包材费
+     */
+    @ColumnWidth(12)
+    @ExcelProperty(value = {"价格组成", "快递包材"}, index = 11)
+    private BigDecimal deliveryMaterialsFee;
+
+    /**
+     * 包装人工费
+     */
+    @ColumnWidth(12)
+    @ExcelProperty(value = {"价格组成", "包装人工"}, index = 12)
+    private BigDecimal packingLabor;
+
+    /**
+     * 管理费
+     */
+    @ColumnWidth(12)
+    @ExcelProperty(value = {"价格组成", "管理"}, index = 13)
+    private BigDecimal managementFee;
+}

+ 10 - 0
sd-business/src/main/java/com/sd/business/service/sku/SkuSpecService.java

@@ -2,6 +2,8 @@ package com.sd.business.service.sku;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.core.service.BaseService;
+import com.sd.business.entity.board.dto.SkuSpecQuotationDto;
+import com.sd.business.entity.board.vo.SkuSpecQuotationVo;
 import com.sd.business.entity.bom.bo.BomSpecBo;
 import com.sd.business.entity.sku.bo.SkuSpecBo;
 import com.sd.business.entity.sku.dto.SkuSpecDto;
@@ -11,6 +13,7 @@ import com.sd.business.entity.sku.vo.SkuSpecVo;
 
 import java.math.BigDecimal;
 import java.util.Collection;
+import java.util.List;
 import java.util.Map;
 
 
@@ -68,4 +71,11 @@ public interface SkuSpecService extends BaseService<SkuSpec> {
      * 根据sku规格id获取sku详情
      */
     Map<Long, SkuSpecBo> getSkuSpecBoByIdList(Collection<Long> skuSpecIdList);
+
+    /**
+     * 获取sku报价板数据
+     * @param dto
+     * @return
+     */
+    List<SkuSpecQuotationVo> getSkuSpecQuotationList(SkuSpecQuotationDto dto);
 }

+ 160 - 4
sd-business/src/main/java/com/sd/business/service/sku/impl/SkuSpecServiceImpl.java

@@ -2,30 +2,43 @@ package com.sd.business.service.sku.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.core.domain.BaseIdPo;
 import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.sd.business.entity.board.dto.SkuSpecQuotationDto;
+import com.sd.business.entity.board.vo.SkuSpecQuotationVo;
 import com.sd.business.entity.bom.bo.BomSpecBo;
+import com.sd.business.entity.department.po.Department;
 import com.sd.business.entity.inventory.po.Inventory;
+import com.sd.business.entity.price.po.PriceBillingStandard;
+import com.sd.business.entity.price.po.PriceBillingStandardDetail;
 import com.sd.business.entity.sku.bo.SkuSpecBo;
 import com.sd.business.entity.sku.dto.SkuSpecDto;
 import com.sd.business.entity.sku.dto.SkuSpecSelectDto;
+import com.sd.business.entity.sku.po.Sku;
 import com.sd.business.entity.sku.po.SkuSpec;
+import com.sd.business.entity.sku.po.SkuSpecLink;
 import com.sd.business.entity.sku.vo.SkuSpecVo;
 import com.sd.business.entity.warehouse.constant.WarehouseConstant;
 import com.sd.business.mapper.sku.SkuSpecMapper;
+import com.sd.business.service.department.DepartmentService;
 import com.sd.business.service.inventory.InventoryService;
+import com.sd.business.service.price.PriceBillingStandardDetailService;
+import com.sd.business.service.price.PriceBillingStandardService;
+import com.sd.business.service.sku.SkuService;
+import com.sd.business.service.sku.SkuSpecLinkService;
 import com.sd.business.service.sku.SkuSpecService;
+import com.sd.framework.util.Assert;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -44,6 +57,21 @@ public class SkuSpecServiceImpl extends ServiceImpl<SkuSpecMapper, SkuSpec> impl
     @Autowired
     private InventoryService inventoryService;
 
+    @Autowired
+    private DepartmentService departmentService;
+
+    @Autowired
+    private SkuService skuService;
+
+    @Autowired
+    private SkuSpecLinkService skuSpecLinkService;
+
+    @Autowired
+    private PriceBillingStandardService priceBillingStandardService;
+
+    @Autowired
+    private PriceBillingStandardDetailService priceBillingStandardDetailService;
+
     @Override
     public Page<SkuSpecVo> getPage(SkuSpecSelectDto dto) {
         IWrapper<SkuSpec> wrapper = getWrapper();
@@ -145,4 +173,132 @@ public class SkuSpecServiceImpl extends ServiceImpl<SkuSpecMapper, SkuSpec> impl
 
     }
 
+    @Override
+    public List<SkuSpecQuotationVo> getSkuSpecQuotationList(SkuSpecQuotationDto dto) {
+        Long deptId = SecurityUtils.getDeptId();
+        Department department = departmentService.getById(deptId);
+        Assert.notNull(department, "未知事业部");
+        String priceBillingStandardIdStr = department.getPriceBillingStandardId();
+        Assert.notBlank(priceBillingStandardIdStr, "事业部未绑定加工计费标准");
+
+        // 查询事业部绑定的品牌
+        List<String> brandList = Arrays.asList(department.getWlnBrand().split(","));
+        if (ObjectUtil.isEmpty(brandList)) {
+            return Collections.emptyList();
+        }
+
+        Map<Long, Sku> skuMap = skuService.mapKEntity(BaseIdPo::getId, q -> q.in(Sku::getBrand, brandList));
+        List<SkuSpec> skuSpecList = this.list(q -> q
+                .in(SkuSpec::getSkuId, skuMap.keySet())
+                .isNotNull(SkuSpec::getBomSpecId)
+                .like(StrUtil.isNotBlank(dto.getSkuSpecCode()), SkuSpec::getCode, dto.getSkuSpecCode())
+                .like(StrUtil.isNotBlank(dto.getSkuSpecName()), SkuSpec::getName, dto.getSkuSpecName()));
+
+        if (skuSpecList.isEmpty()) {
+            return Collections.emptyList();
+        }
+
+        // 查询加工计费标准数据
+        List<String> priceBillingStandardIdList = Arrays.stream(priceBillingStandardIdStr.split(",")).collect(Collectors.toList());
+        List<PriceBillingStandard> priceBillingStandardList = priceBillingStandardService.listByIds(priceBillingStandardIdList);
+        List<Long> priceBillingStandardIds = priceBillingStandardList.stream().map(BaseIdPo::getId).collect(Collectors.toList());
+
+        Map<Long, List<PriceBillingStandardDetail>> priceDetailMap = priceBillingStandardDetailService.mapKGroup(
+                PriceBillingStandardDetail::getPriceBillingStandardId,
+                q -> q.in(PriceBillingStandardDetail::getPriceBillingStandardId, priceBillingStandardIds));
+
+        // 获取sku关联的所有bom数据
+        List<Long> skuSpecIds = skuSpecList.stream().map(BaseIdPo::getId).collect(Collectors.toList());
+        Map<Long, List<SkuSpecLink>> linkMap = skuSpecLinkService.mapKGroup(SkuSpecLink::getSkuSpecId,
+                q -> q.in(SkuSpecLink::getSkuSpecId, skuSpecIds)
+                        .eq(SkuSpecLink::getDepartmentId, deptId)
+                        .eq(SkuSpecLink::getType, 1));
+        Set<Long> bomSpecIds = skuSpecList.stream().map(SkuSpec::getBomSpecId).collect(Collectors.toSet());
+        bomSpecIds.addAll(linkMap.values().stream().flatMap(item -> item.stream().map(SkuSpecLink::getBomSpecId)).collect(Collectors.toList()));
+        Map<Long, BomSpecBo> bomSpecBoMap = this.getBomSpecBoByIdList(bomSpecIds);
+
+        List<SkuSpecQuotationVo> list = new ArrayList<>();
+
+        for (SkuSpec skuSpec : skuSpecList) {
+            Sku sku = skuMap.get(skuSpec.getSkuId());
+            BomSpecBo bomSpecBo = bomSpecBoMap.get(skuSpec.getBomSpecId());
+
+            // 赋值
+            SkuSpecQuotationVo vo = new SkuSpecQuotationVo();
+            vo.setBrand(sku.getBrand());
+            vo.setSkuSpecCode(skuSpec.getCode());
+            vo.setSkuSpecName(skuSpec.getName());
+            vo.setBomSpecUnitPrice(bomSpecBo.getInternalSellingPrice());
+            vo.setPackagingMaterialCost(BigDecimal.ZERO);
+            vo.setLineProcessingFee(BigDecimal.ZERO);
+            vo.setLogoProcessingFee(BigDecimal.ZERO);
+            vo.setIssueFee(BigDecimal.ZERO);
+            vo.setDeliveryMaterialsFee(BigDecimal.ZERO);
+            vo.setPackingLabor(BigDecimal.ZERO);
+            vo.setManagementFee(BigDecimal.ZERO);
+
+            // 获取包材费
+            List<SkuSpecLink> skuSpecLinkList = linkMap.get(skuSpec.getId());
+            if (ObjectUtil.isNotEmpty(skuSpecLinkList)) {
+                BigDecimal packagingMaterialCost = skuSpecLinkList.stream().map(item -> {
+                    BomSpecBo skuSpecLinkBomSpec = bomSpecBoMap.get(item.getBomSpecId());
+                    if (skuSpecLinkBomSpec == null) {
+                        return BigDecimal.ZERO;
+                    }
+                    return skuSpecLinkBomSpec.getInternalSellingPrice().multiply(item.getQuantity());
+                }).reduce(BigDecimal.ZERO, BigDecimal::add);
+                vo.setPackagingMaterialCost(packagingMaterialCost);
+            }
+
+            // 获取加工计费标准
+            List<PriceBillingStandardDetail> priceBillingStandardDetailList = new ArrayList<>();
+            if (StrUtil.isNotBlank(bomSpecBo.getBomSpecies())) {
+                priceBillingStandardList.stream()
+                        .filter(item -> Objects.equals(item.getSpecies(), bomSpecBo.getBomSpecies()))
+                        .findAny()
+                        .ifPresent(item -> priceBillingStandardDetailList.addAll(priceDetailMap.getOrDefault(item.getId(), Collections.emptyList())));
+            }
+
+            for (PriceBillingStandardDetail priceBillingStandardDetail : priceBillingStandardDetailList) {
+                String chargeItem = priceBillingStandardDetail.getChargeItem();
+                BigDecimal chargePrice = ObjectUtil.defaultIfNull(priceBillingStandardDetail.getChargePrice(), BigDecimal.ZERO);
+                switch (chargeItem) {
+                    case "10":
+                        vo.setLineProcessingFee(chargePrice);
+                        break;
+                    case "20":
+                        vo.setLogoProcessingFee(chargePrice);
+                        break;
+                    case "40":
+                        vo.setPackingLabor(chargePrice);
+                        break;
+                    case "50":
+                        vo.setIssueFee(chargePrice);
+                        break;
+                    case "60":
+                        vo.setDeliveryMaterialsFee(chargePrice);
+                        break;
+                    case "70":
+                        vo.setManagementFee(chargePrice);
+                        break;
+                }
+            }
+
+            // 计算Sku单价
+            vo.setSkuSpecUnitPrice(
+                    vo.getBomSpecUnitPrice()
+                            .add(vo.getPackagingMaterialCost())
+                            .add(vo.getIssueFee())
+                            .add(vo.getPackingLabor())
+                            .add(vo.getDeliveryMaterialsFee())
+                            .add(vo.getManagementFee()));
+            vo.setSkuSpecUnitPriceLogo(vo.getSkuSpecUnitPrice().add(vo.getLogoProcessingFee()));
+            vo.setSkuSpecUnitPriceLine(vo.getSkuSpecUnitPrice().add(vo.getLineProcessingFee()));
+
+            list.add(vo);
+        }
+
+        return list;
+    }
+
 }