| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- 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);
- }
- }
|