Browse Source

裸垫价格计算功能

fgd 1 năm trước cách đây
mục cha
commit
c125136d06

+ 81 - 0
sd-business/src/main/java/com/sd/business/controller/bom/BomSpecPriceConfigController.java

@@ -0,0 +1,81 @@
+package com.sd.business.controller.bom;
+
+import com.ruoyi.common.core.domain.BaseIdPo;
+import com.sd.business.entity.bom.dto.BomSpecPriceQueryDto;
+import com.sd.business.entity.bom.po.BomSpecPriceConfig;
+import org.springframework.web.bind.annotation.*;
+import com.sd.business.entity.bom.vo.BomSpecPriceConfigVo;
+import com.sd.business.entity.bom.dto.BomSpecPriceConfigSelectDto;
+import com.sd.business.entity.bom.dto.BomSpecPriceConfigDto;
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import com.sd.business.service.bom.BomSpecPriceConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * bom规格价格配置 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-12-25
+ */
+@RestController
+@RequestMapping("/bomSpecPriceConfig")
+public class BomSpecPriceConfigController {
+
+    @Autowired
+    private BomSpecPriceConfigService bomSpecPriceConfigService;
+
+    /**
+     * bom规格价格配置列表
+     */
+    @PostMapping("/list")
+    public List<BomSpecPriceConfigVo> list(@RequestBody BomSpecPriceConfigSelectDto dto) {
+        return bomSpecPriceConfigService.getList(dto);
+    }
+
+    /**
+     * 获取所有bom规格价格配置数据
+     */
+    @PostMapping("/getAllConfigMap")
+    public Map<String, List<BomSpecPriceConfig>> getAllConfigMap() {
+        return bomSpecPriceConfigService.mapKGroup(BomSpecPriceConfig::getCode, q -> q.orderByDesc(BaseIdPo::getId));
+    }
+
+    /**
+     * bom规格价格配置新增
+     */
+    @PostMapping("/add")
+    public void add(@RequestBody BomSpecPriceConfigDto bomSpecPriceConfigDto) {
+        bomSpecPriceConfigService.add(bomSpecPriceConfigDto);
+    }
+
+    /**
+     * bom规格价格配置编辑
+     */
+    @PostMapping("/edit")
+    public void edit(@RequestBody BomSpecPriceConfigDto bomSpecPriceConfigDto) {
+        bomSpecPriceConfigService.edit(bomSpecPriceConfigDto);
+    }
+
+    /**
+     * bom规格价格配置删除
+     */
+    @PostMapping("/delete")
+    public void delete(@RequestBody BaseSelectDto dto) {
+        bomSpecPriceConfigService.delete(dto.getId());
+    }
+
+    /**
+     * 获取裸垫价格
+     */
+    @PostMapping("/getBomSpecPrice")
+    public BigDecimal getBomSpecPrice(@RequestBody BomSpecPriceQueryDto dto) {
+        return bomSpecPriceConfigService.getBomSpecPrice(dto);
+    }
+
+}

+ 17 - 0
sd-business/src/main/java/com/sd/business/entity/bom/dto/BomSpecPriceConfigDto.java

@@ -0,0 +1,17 @@
+package com.sd.business.entity.bom.dto;
+
+import com.sd.business.entity.bom.po.BomSpecPriceConfig;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * bom规格价格配置新增编辑入参实体
+ *
+ * @author 
+ * @since 2023-12-25
+ */
+@Getter
+@Setter
+public class BomSpecPriceConfigDto extends BomSpecPriceConfig {
+
+}

+ 21 - 0
sd-business/src/main/java/com/sd/business/entity/bom/dto/BomSpecPriceConfigSelectDto.java

@@ -0,0 +1,21 @@
+package com.sd.business.entity.bom.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * bom规格价格配置列表查询入参实体
+ *
+ * @author 
+ * @since 2023-12-25
+ */
+@Getter
+@Setter
+public class BomSpecPriceConfigSelectDto extends BaseSelectDto {
+
+    /**
+     * 编码
+     */
+    private String code;
+}

+ 56 - 0
sd-business/src/main/java/com/sd/business/entity/bom/dto/BomSpecPriceQueryDto.java

@@ -0,0 +1,56 @@
+package com.sd.business.entity.bom.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+@Getter
+@Setter
+public class BomSpecPriceQueryDto {
+
+    /**
+     * 裸垫分类 1瑜伽垫 2-跳绳垫
+     */
+    private Integer bomClassify;
+
+    /**
+     * 级别配置id
+     */
+    private Long levelConfigId;
+
+    /**
+     * 品类配置id
+     */
+    private Long categoryConfigId;
+
+    /**
+     * 特性配置id,多个按“,”隔开
+     */
+    private String characterConfigIds;
+
+    /**
+     * 颜色配置id,多个按“,”隔开
+     */
+    private String colourConfigIds;
+
+    /**
+     * 压纹类型
+     */
+    private String embossing;
+
+    /**
+     * 长 cm
+     */
+    private BigDecimal length;
+
+    /**
+     * 宽 cm
+     */
+    private BigDecimal width;
+
+    /**
+     * 高 mm
+     */
+    private BigDecimal height;
+}

+ 49 - 0
sd-business/src/main/java/com/sd/business/entity/bom/enums/BomSpecPriceConfigCodeEnum.java

@@ -0,0 +1,49 @@
+package com.sd.business.entity.bom.enums;
+
+import com.ruoyi.common.exception.ServiceException;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * bom规格价格配置编码
+ */
+@Getter
+@AllArgsConstructor
+public enum BomSpecPriceConfigCodeEnum {
+    COLOUR_PRICE("colour_price", "颜色价格"),
+    BASE_MATERIAL_PRICE("base_material_price", "基材价格"),
+    CATEGORY_PRICE("category_price", "品类价格"),
+    CHARACTER_PRICE("character_price", "特性价格"),
+    CROP_CONFIG("crop_config", "裁切配置"),
+    EMBOSSING_CONFIG("embossing_config", "压纹配置"),
+    YOGA_MAT_DEPLETION_CONFIG("yoga_mat_depletion_config", "瑜伽垫损耗配置"),
+    SKIP_MAT_DEPLETION_CONFIG("skip_mat_depletion_config", "跳绳垫损耗配置"),
+    PROCESSING_FEE_CONFIG("processing_fee_config", "加工费配置"),
+    FREIGHT_CONFIG("freight_config", "运费配置");
+
+    private static final Map<String, BomSpecPriceConfigCodeEnum> map = new HashMap<>();
+
+    static {
+        for (BomSpecPriceConfigCodeEnum bomSpecPriceConfigCodeEnum : values()) {
+            map.put(bomSpecPriceConfigCodeEnum.getKey(), bomSpecPriceConfigCodeEnum);
+        }
+    }
+
+    private final String key;
+    private final String value;
+
+    /**
+     * 通过key获取名称
+     */
+    public static BomSpecPriceConfigCodeEnum getEnum(String key) {
+        BomSpecPriceConfigCodeEnum bomSpecPriceConfigCodeEnum = map.get(key);
+        if (bomSpecPriceConfigCodeEnum == null) {
+            throw new ServiceException("未知bom规格价格配置编码:" + key);
+        }
+        return bomSpecPriceConfigCodeEnum;
+    }
+
+}

+ 73 - 0
sd-business/src/main/java/com/sd/business/entity/bom/po/BomSpecPriceConfig.java

@@ -0,0 +1,73 @@
+package com.sd.business.entity.bom.po;
+
+import com.ruoyi.common.core.domain.BasePo;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * <p>
+ * bom规格价格配置
+ * </p>
+ *
+ * @author 
+ * @since 2023-12-25
+ */
+@Getter
+@Setter
+@TableName("bom_spec_price_config")
+public class BomSpecPriceConfig extends BasePo {
+
+    /**
+     * 编码 {@link com.sd.business.entity.bom.enums.BomSpecPriceConfigCodeEnum}
+     */
+    private String code;
+
+    /**
+     * 类型 0正常配置 1附加配置
+     */
+    private Integer type;
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 描述
+     */
+    private String description;
+
+    /**
+     * 价格
+     */
+    private BigDecimal price;
+
+    /**
+     * 长 cm
+     */
+    private BigDecimal length;
+
+    /**
+     * 宽 cm
+     */
+    private BigDecimal width;
+
+    /**
+     * 高 mm
+     */
+    private BigDecimal height;
+
+    /**
+     * 损耗
+     */
+    private BigDecimal depletion;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 17 - 0
sd-business/src/main/java/com/sd/business/entity/bom/vo/BomSpecPriceConfigVo.java

@@ -0,0 +1,17 @@
+package com.sd.business.entity.bom.vo;
+
+import com.sd.business.entity.bom.po.BomSpecPriceConfig;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * bom规格价格配置列表查询返回值实体
+ *
+ * @author 
+ * @since 2023-12-25
+ */
+@Getter
+@Setter
+public class BomSpecPriceConfigVo extends BomSpecPriceConfig {
+
+}

+ 26 - 0
sd-business/src/main/java/com/sd/business/mapper/bom/BomSpecPriceConfigMapper.java

@@ -0,0 +1,26 @@
+package com.sd.business.mapper.bom;
+
+import com.sd.business.entity.bom.po.BomSpecPriceConfig;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sd.business.entity.bom.vo.BomSpecPriceConfigVo;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * bom规格价格配置 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-12-25
+ */
+public interface BomSpecPriceConfigMapper extends BaseMapper<BomSpecPriceConfig> {
+
+    /**
+     * bom规格价格配置列表
+     */
+    List<BomSpecPriceConfigVo> getList(@Param("ew") IWrapper<BomSpecPriceConfig> wrapper);
+
+}

+ 49 - 0
sd-business/src/main/java/com/sd/business/service/bom/BomSpecPriceConfigService.java

@@ -0,0 +1,49 @@
+package com.sd.business.service.bom;
+
+import com.sd.business.entity.bom.dto.BomSpecPriceQueryDto;
+import com.sd.business.entity.bom.po.BomSpecPriceConfig;
+import com.ruoyi.common.core.service.BaseService;
+import com.sd.business.entity.bom.vo.BomSpecPriceConfigVo;
+import com.sd.business.entity.bom.dto.BomSpecPriceConfigSelectDto;
+import com.sd.business.entity.bom.dto.BomSpecPriceConfigDto;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * <p>
+ * bom规格价格配置 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-12-25
+ */
+public interface BomSpecPriceConfigService extends BaseService<BomSpecPriceConfig> {
+
+    /**
+     * bom规格价格配置列表
+     */
+    List<BomSpecPriceConfigVo> getList(BomSpecPriceConfigSelectDto dto);
+
+    /**
+     * bom规格价格配置新增
+     */
+    void add(BomSpecPriceConfigDto bomSpecPriceConfigDto);
+
+    /**
+     * bom规格价格配置编辑
+     */
+    void edit(BomSpecPriceConfigDto bomSpecPriceConfigDto);
+
+    /**
+     * bom规格价格配置删除
+     */
+    void delete(Long id);
+
+    /**
+     * 获取裸垫价格
+     * @param dto
+     */
+    BigDecimal getBomSpecPrice(BomSpecPriceQueryDto dto);
+
+}

+ 197 - 0
sd-business/src/main/java/com/sd/business/service/bom/impl/BomSpecPriceConfigServiceImpl.java

@@ -0,0 +1,197 @@
+package com.sd.business.service.bom.impl;
+
+import cn.hutool.core.util.ReUtil;
+import cn.hutool.core.util.StrUtil;
+import com.ruoyi.common.constant.StatusConstant;
+import com.ruoyi.common.core.domain.BaseIdPo;
+import com.sd.business.entity.bom.dto.BomSpecPriceQueryDto;
+import com.sd.business.entity.bom.enums.BomSpecPriceConfigCodeEnum;
+import com.sd.business.entity.bom.po.BomSpecPriceConfig;
+import com.sd.business.mapper.bom.BomSpecPriceConfigMapper;
+import com.sd.business.service.bom.BomSpecPriceConfigService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import com.sd.business.entity.bom.vo.BomSpecPriceConfigVo;
+import com.sd.business.entity.bom.dto.BomSpecPriceConfigSelectDto;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.sd.business.entity.bom.dto.BomSpecPriceConfigDto;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * bom规格价格配置 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-12-25
+ */
+@Service
+public class BomSpecPriceConfigServiceImpl extends ServiceImpl<BomSpecPriceConfigMapper, BomSpecPriceConfig> implements BomSpecPriceConfigService {
+
+    @Override
+    public List<BomSpecPriceConfigVo> getList(BomSpecPriceConfigSelectDto dto) {
+        IWrapper<BomSpecPriceConfig> wrapper = getWrapper();
+        wrapper.orderByDesc("bspc", BomSpecPriceConfig::getId);
+        wrapper.eq("bspc", BomSpecPriceConfig::getCode, dto.getCode());
+        List<BomSpecPriceConfigVo> list = this.baseMapper.getList(wrapper);
+        return list;
+    }
+
+    @Override
+    public void add(BomSpecPriceConfigDto bomSpecPriceConfigDto) {
+        this.save(bomSpecPriceConfigDto);
+    }
+
+    @Override
+    public void edit(BomSpecPriceConfigDto bomSpecPriceConfigDto) {
+        this.updateById(bomSpecPriceConfigDto);
+    }
+
+    @Override
+    public void delete(Long id) {
+        this.removeById(id);
+    }
+
+    @Override
+    public BigDecimal getBomSpecPrice(BomSpecPriceQueryDto dto) {
+        // 计算公式=(基材价格+品类+特性+颜色价格)*[(长+裁切配置)*(宽+裁切配置)/10000]*(厚度+压纹配置)*(1+损耗)+加工费+运费
+        List<BomSpecPriceConfig> list = this.list();
+        Map<Long, BomSpecPriceConfig> configDetailMap = list.stream().collect(Collectors.toMap(BaseIdPo::getId, Function.identity()));
+        Map<String, List<BomSpecPriceConfig>> configCodeMap = list.stream().collect(Collectors.groupingBy(BomSpecPriceConfig::getCode));
+
+        // 计算bom每平方价格
+        BigDecimal price = BigDecimal.ZERO;
+        // 等级
+        BomSpecPriceConfig levelDetail = configDetailMap.get(dto.getLevelConfigId());
+        price = price.add(levelDetail.getPrice());
+
+        // 品类
+        BomSpecPriceConfig categoryDetail = configDetailMap.get(dto.getCategoryConfigId());
+        price = price.add(categoryDetail.getPrice());
+
+        // 特性
+        if (StrUtil.isNotBlank(dto.getCharacterConfigIds())) {
+            String[] characterConfigIdArr = dto.getCharacterConfigIds().split(",");
+            for (String configId : characterConfigIdArr) {
+                BomSpecPriceConfig embossingDetail = configDetailMap.get(Long.parseLong(configId));
+                price = price.add(embossingDetail.getPrice());
+            }
+        }
+
+        // 颜色
+        String colourConfigIds = dto.getColourConfigIds();
+        List<String> colourConfigIdList = Arrays.asList(colourConfigIds.split(","));
+        for (String configId : colourConfigIdList) {
+            BomSpecPriceConfig colourDetail = configDetailMap.get(Long.parseLong(configId));
+            BigDecimal colourPrice = colourDetail.getPrice();
+            if (colourConfigIdList.size() > 1) {
+                colourPrice = colourPrice.divide(BigDecimal.valueOf(2), 2, RoundingMode.HALF_UP);
+            }
+            price = price.add(colourPrice);
+        }
+
+        // 获取裁切配置
+        List<BomSpecPriceConfig> bomSpecCropConfigList = configCodeMap.getOrDefault(BomSpecPriceConfigCodeEnum.CROP_CONFIG.getKey(), Collections.emptyList());
+        BomSpecPriceConfig cropConfig = bomSpecCropConfigList.stream()
+                .filter(item -> item.getName().contains(categoryDetail.getName()))
+                .findAny().orElse(null);
+        if (cropConfig != null) {
+            dto.setLength(dto.getLength().add(cropConfig.getLength()));
+            dto.setWidth(dto.getWidth().add(cropConfig.getWidth()));
+        }
+
+        // 获取压纹配置
+        List<BomSpecPriceConfig> bomSpecEmbossingConfigList = configCodeMap.getOrDefault(BomSpecPriceConfigCodeEnum.EMBOSSING_CONFIG.getKey(), Collections.emptyList());
+        BomSpecPriceConfig embossingConfig = bomSpecEmbossingConfigList.stream()
+                .filter(item -> item.getName().contains(dto.getEmbossing()))
+                .findAny().orElse(null);
+        if (embossingConfig != null) {
+            dto.setHeight(dto.getHeight().add(embossingConfig.getHeight()));
+        }
+
+        // 获取损耗配置
+        BigDecimal depletion = BigDecimal.ZERO;
+        String depletionCode;
+        if (Objects.equals(dto.getBomClassify(), StatusConstant.YES)) {
+            depletionCode = BomSpecPriceConfigCodeEnum.YOGA_MAT_DEPLETION_CONFIG.getKey();
+        } else {
+            depletionCode = BomSpecPriceConfigCodeEnum.SKIP_MAT_DEPLETION_CONFIG.getKey();
+        }
+        List<BomSpecPriceConfig> bomSpecDepletionConfigList = configCodeMap.getOrDefault(depletionCode, Collections.emptyList());
+        BomSpecPriceConfig depletionConfig = bomSpecDepletionConfigList.stream()
+                .filter(item -> item.getName().contains(categoryDetail.getName()))
+                .findAny().orElse(null);
+        if (depletionConfig != null) {
+            depletion = depletionConfig.getDepletion();
+        }
+        // 获取附加配置
+        List<BomSpecPriceConfig> additionalConfigList = bomSpecDepletionConfigList.stream()
+                .filter(item -> Objects.equals(item.getType(), StatusConstant.YES)).collect(Collectors.toList());
+
+        // 瑜伽垫对比宽度,跳绳垫对比级别
+        BomSpecPriceConfig additionalConfig;
+        if (Objects.equals(dto.getBomClassify(), StatusConstant.YES)) {
+            additionalConfig = additionalConfigList.stream()
+                    .filter(item -> this.operatorCompareTo(item.getName(), dto.getWidth()))
+                    .findAny().orElse(null);
+        } else {
+            additionalConfig = additionalConfigList.stream()
+                    .filter(item -> item.getName().contains(levelDetail.getName()))
+                    .findAny().orElse(null);
+        }
+
+        // 附加配置匹配成功,增加损耗
+        if (additionalConfig != null) {
+            depletion = depletion.add(additionalConfig.getDepletion());
+        }
+
+        // 获取加工费配置
+        List<BomSpecPriceConfig> bomSpecProcessingFeeConfigList = configCodeMap.getOrDefault(BomSpecPriceConfigCodeEnum.PROCESSING_FEE_CONFIG.getKey(), Collections.emptyList());
+        BigDecimal processingFee = bomSpecProcessingFeeConfigList.stream()
+                .map(BomSpecPriceConfig::getPrice)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        // 获取运费配置
+        List<BomSpecPriceConfig> bomSpecFreightConfigList = configCodeMap.getOrDefault(BomSpecPriceConfigCodeEnum.FREIGHT_CONFIG.getKey(), Collections.emptyList());
+        BigDecimal freightFee = BigDecimal.ZERO;
+        BomSpecPriceConfig freightConfig = bomSpecFreightConfigList.stream()
+                .filter(item -> this.operatorCompareTo(item.getName(), dto.getWidth())).findAny().orElse(null);
+        if (freightConfig != null) {
+            freightFee = freightConfig.getPrice();
+        }
+
+        return price.multiply(dto.getLength().multiply(dto.getWidth()).divide(BigDecimal.valueOf(10000), 2, RoundingMode.HALF_UP))
+                .multiply(dto.getHeight())
+                .multiply(BigDecimal.ONE.add(depletion.multiply(BigDecimal.valueOf(0.01))))
+                .add(processingFee)
+                .add(freightFee)
+                .setScale(2, RoundingMode.HALF_UP);
+    }
+
+    /**
+     * 对比
+     * @param rule 规则
+     * @param value
+     * @return
+     */
+    private boolean operatorCompareTo(String rule, BigDecimal value) {
+        Integer number = ReUtil.getFirstNumber(rule);
+        if (rule.startsWith(">=") || rule.startsWith("≥")) {
+            return value.compareTo(BigDecimal.valueOf(number)) >= 0;
+        } else if (rule.startsWith(">")) {
+            return value.compareTo(BigDecimal.valueOf(number)) > 0;
+        } else if (rule.startsWith("<=") || rule.startsWith("≤")) {
+            return value.compareTo(BigDecimal.valueOf(number)) <= 0;
+        } else if (rule.startsWith("<")) {
+            return value.compareTo(BigDecimal.valueOf(number)) < 0;
+        } else {
+            return value.compareTo(BigDecimal.valueOf(number)) == 0;
+        }
+    }
+
+}

+ 25 - 0
sd-business/src/main/resources/mapper/bom/BomSpecPriceConfigMapper.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sd.business.mapper.bom.BomSpecPriceConfigMapper">
+    <select id="getList" resultType="com.sd.business.entity.bom.vo.BomSpecPriceConfigVo">
+        select
+            bspc.id,
+            bspc.code,
+            bspc.type,
+            bspc.name,
+            bspc.description,
+            bspc.price,
+            bspc.length,
+            bspc.width,
+            bspc.height,
+            bspc.depletion,
+            bspc.remark,
+            bspc.create_user,
+            bspc.create_time,
+            bspc.update_user,
+            bspc.update_time
+        from bom_spec_price_config bspc
+            ${ew.customSqlSegment}
+    </select>
+
+</mapper>