Files
quote_price/src/main/java/lingtao/net/Factory/MetalTargetStrategy.java
T
2025-04-13 01:36:45 +08:00

232 lines
9.3 KiB
Java

package lingtao.net.Factory;
import lingtao.net.bean.Product;
import lingtao.net.util.PriceUtils;
import lingtao.net.vo.PricingListVo;
import lingtao.net.vo.ProductVo;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
public class MetalTargetStrategy implements PricingStrategy {
@Override
public PricingListVo calculatePrice(Product dto, String role) {
String plantName = dto.getPlantName();
double width = dto.getWidth();
double length = dto.getLength();
int count = dto.getCount();
int number = dto.getNumber();
List<ProductVo> resultList = new ArrayList<>();
// 定义纸张尺寸(单位:毫米)
double paperLength = 295; // 纸张长度
double paperWidth = 195; // 纸张宽度
double basePrice = 0; // 基础价格
double minPrice = 0; // 起步价
double price = 0; // 最终价格
double colorPrice = 0; // 颜色附加费
double moreColorPrice = 0; // 多颜色附加费
int requiredSheets = 0;
BigDecimal weight = BigDecimal.ZERO;
// 转换尺寸为毫米并增加边距
length = convertToMillimetersWithMargin(length);
width = convertToMillimetersWithMargin(width);
if ("金大".equals(plantName) || "鑫灿".equals(plantName)) {
// 检查是否超出纸张尺寸限制
if (!isWithinPaperSize(length, width, paperLength, paperWidth)) {
return new PricingListVo(100, "出纸张尺寸限制"); // 返回空列表表示不适用
}
// 计算一张纸能容纳的最大金属标数量
double maxItemsPerSheet = calculateMaxItemsPerSheet(length, width, paperLength, paperWidth);
// 计算所需纸张数量
requiredSheets = calculateRequiredSheets(count, number, maxItemsPerSheet);
// 计算颜色附加费
if (!"金色".equals(dto.getTcolor()) && !"银色".equals(dto.getTcolor()) && !"玫瑰金色".equals(dto.getTcolor())) {
colorPrice = 1;
}
if ("金大".equals(plantName)) {
// 设置起步价
minPrice = 45;
if ("双色".equals(dto.getCraftMo())) {
minPrice = 70;
moreColorPrice = 10;
}
if ("彩色(三色)".equals(dto.getCraftMo())) {
minPrice = 105;
moreColorPrice = 20;
}
colorPrice += moreColorPrice;
// 根据数量计算基础价格
if (requiredSheets <= 2) {
price = minPrice + colorPrice;
} else if (requiredSheets <= 9) {
price = minPrice + (requiredSheets - 2) * (12 + colorPrice);
} else if (requiredSheets <= 19) {
price = Math.ceil((13 + colorPrice) * requiredSheets);
} else if (requiredSheets <= 29) {
price = Math.ceil((12 + colorPrice) * requiredSheets);
} else if (requiredSheets <= 39) {
price = Math.ceil((11 + colorPrice) * requiredSheets);
} else if (requiredSheets <= 49) {
price = Math.ceil((10 + colorPrice) * requiredSheets);
} else {
price = Math.ceil((9 + colorPrice) * requiredSheets);
}
}
if ("鑫灿".equals(plantName)) {
// 设置起步价
minPrice = 45;
if ("双色".equals(dto.getCraftMo())) {
minPrice = 55;
moreColorPrice = 10;
}
if ("彩色(三色)".equals(dto.getCraftMo())) {
minPrice = 105;
moreColorPrice = 20;
}
colorPrice += moreColorPrice;
// 根据数量计算基础价格
if (requiredSheets <= 2) {
price = minPrice + colorPrice;
} else if (requiredSheets <= 9) {
price = minPrice + (requiredSheets - 2) * (10 + colorPrice);
} else if (requiredSheets <= 19) {
price = Math.ceil((13 + colorPrice) * requiredSheets);
} else if (requiredSheets <= 29) {
price = Math.ceil((12 + colorPrice) * requiredSheets);
} else if (requiredSheets <= 39) {
price = Math.ceil((11 + colorPrice) * requiredSheets);
} else if (requiredSheets <= 49) {
price = Math.ceil((10 + colorPrice) * requiredSheets);
} else if (requiredSheets <= 100) {
price = Math.ceil((9 + colorPrice) * requiredSheets);
} else {
price = Math.ceil((8 + colorPrice) * requiredSheets);
}
}
}
if ("紫瑶".equals(plantName)) {
paperLength = 170;
paperWidth = 300;
// 检查是否超出纸张尺寸限制
if (!isWithinPaperSize(length, width, paperLength, paperWidth)) {
return new PricingListVo(100, "出纸张尺寸限制"); // 返回空列表表示不适用
}
// 计算一张纸能容纳的最大金属标数量
double maxItemsPerSheet = calculateMaxItemsPerSheet(length, width, paperLength, paperWidth);
// 计算所需纸张数量
requiredSheets = calculateRequiredSheets(count, number, maxItemsPerSheet);
// 计算颜色附加费
if (!"银色".equals(dto.getTcolor())) {
colorPrice = 1;
}
// 设置起步价
minPrice = 40;
if ("单色".equals(dto.getCraftMo())) {
if (requiredSheets == 1) {
price = colorPrice == 1 ? 45 : 40;
} else if (requiredSheets == 2) {
price = colorPrice == 1 ? 55 : 50;
} else if (requiredSheets == 3) {
price = colorPrice == 1 ? 65 : 55;
} else if (requiredSheets == 4) {
price = colorPrice == 1 ? 70 : 60;
} else if (requiredSheets == 5) {
price = colorPrice == 1 ? 75 : 65;
} else if (requiredSheets == 6) {
price = colorPrice == 1 ? 80 : 70;
} else {
price = colorPrice == 1 ? 80 + (requiredSheets - 6) * 9 : 70 + (requiredSheets - 6) * 8;
}
}
if ("双色".equals(dto.getCraftMo())) {
minPrice = 60;
moreColorPrice = 30;
}
if ("彩色(三色)".equals(dto.getCraftMo())) {
minPrice = 70;
moreColorPrice = 40;
}
if (price == 0) {
price = Math.ceil(minPrice + moreColorPrice * (requiredSheets - 1));
}
}
// 创建产品对象并添加到结果列表
ProductVo pro = new ProductVo();
pro.setPrice(price);
pro.setCount(count);
pro.setWeight(BigDecimal.valueOf(requiredSheets / 30).setScale(2, BigDecimal.ROUND_HALF_UP).toString());
resultList.add(pro);
return new PricingListVo(resultList);
}
/**
* 将给定的尺寸转换为毫米,并在每边增加3毫米的边距
*
* @param size 需要转换的原始尺寸
* @return 转换后的尺寸,单位为毫米,包括边距
*/
private double convertToMillimetersWithMargin(double size) {
return size * 10 + 2 * 1.5; // 换成毫米,每边+3
}
/**
* 检查给定的长度和宽度是否在纸张尺寸范围内
*
* @param length 需要检查的长度
* @param width 需要检查的宽度
* @param paperLength 纸张的长度
* @param paperWidth 纸张的宽度
* @return 如果给定尺寸在纸张尺寸范围内,则返回true;否则返回false
*/
private boolean isWithinPaperSize(double length, double width, double paperLength, double paperWidth) {
return (length <= paperLength && width <= paperWidth) || (length <= paperWidth && width <= paperLength);
}
/**
* 计算每张纸最多可以容纳的物品数量
*
* @param length 物品的长度
* @param width 物品的宽度
* @param paperLength 纸张的长度
* @param paperWidth 纸张的宽度
* @return 每张纸最多可以容纳的物品数量
*/
private double calculateMaxItemsPerSheet(double length, double width, double paperLength, double paperWidth) {
return Math.max(
Math.floor(paperLength / length) * Math.floor(paperWidth / width),
Math.floor(paperLength / width) * Math.floor(paperWidth / length)
);
}
/**
* 计算完成指定数量的物品所需的纸张数量
*
* @param count 物品的总数量
* @param number 每个物品需要的数量
* @param maxItemsPerSheet 每张纸最多可以容纳的物品数量
* @return 完成指定数量的物品所需的纸张数量
*/
private int calculateRequiredSheets(int count, int number, double maxItemsPerSheet) {
return (int) Math.ceil((count * number) / maxItemsPerSheet);
}
}