232 lines
9.3 KiB
Java
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);
|
|
}
|
|
}
|