package lingtao.net.Factory; import lingtao.net.bean.Product; import lingtao.net.vo.PricingListVo; import lingtao.net.vo.ProductVo; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Optional; /** * 提供了一种特定的定价策略。 * 该策略专门用于处理挂布产品的定价计算,根据产品信息和用户角色来确定最终价格。 */ public class DossalPricingStrategy implements PricingStrategy { /** * 根据产品信息和用户角色计算价格。 * 此方法旨在根据不同类型的用户(如普通用户、会员等)对Dossal产品提供定制化的定价。 * * @param dto 产品信息对象,包含了需要计算价格的产品的所有必要信息。 * @param role 用户角色,用于确定用户类型,进而影响最终的定价结果。 * @return 返回计算后的价格列表视图对象,若不适用或未实现则返回null。 */ @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(); double price = 0.0; double basePrice = 0.0; List resultList = new ArrayList<>(); List craft_list = Optional.ofNullable(dto) .map(Product::getCraft) // 假设 dto 是 Dto 类型 .map(Arrays::asList) .orElseGet(ArrayList::new); // 确保 craftList 是可变的 craft_list = new ArrayList<>(craft_list); if ("领鸿".equals(plantName)) { if ("半透纱幔".equals(dto.getKindValue())) { basePrice = 15.0; double area = Math.max(count * number * width * length / 10000, 0.3); price = new BigDecimal(basePrice * area).setScale(2, RoundingMode.HALF_UP).doubleValue(); } } ProductVo pro = new ProductVo(); pro.setCount(count); pro.setPrice(price); pro.setNumber(number); pro.setWeight(BigDecimal.valueOf(width / 100 * length / 100 * count * 0.07).setScale(2, BigDecimal.ROUND_HALF_UP).toString()); resultList.add(pro); return new PricingListVo(resultList); } }