PricingRuleService.java 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package com.oms.service;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.oms.entity.PricingRule;
  4. import com.oms.mapper.PricingRuleMapper;
  5. import com.oms.dto.PricingRuleDTO;
  6. import com.oms.enums.GenericStatus;
  7. import lombok.RequiredArgsConstructor;
  8. import org.springframework.stereotype.Service;
  9. import java.math.BigDecimal;
  10. import java.math.RoundingMode;
  11. import java.time.LocalDateTime;
  12. import java.util.List;
  13. @Service
  14. @RequiredArgsConstructor
  15. public class PricingRuleService {
  16. private final PricingRuleMapper mapper;
  17. public List<PricingRule> listRules(String ruleType, String status) {
  18. LambdaQueryWrapper<PricingRule> wrapper = new LambdaQueryWrapper<>();
  19. if (ruleType != null) wrapper.eq(PricingRule::getRuleType, ruleType);
  20. if (status != null) wrapper.eq(PricingRule::getStatus, status);
  21. wrapper.orderByDesc(PricingRule::getCreatedAt);
  22. return mapper.selectList(wrapper);
  23. }
  24. public PricingRule getRule(Long id) {
  25. return mapper.selectById(id);
  26. }
  27. public PricingRule createRule(PricingRuleDTO dto) {
  28. PricingRule rule = new PricingRule();
  29. rule.setRuleNo("PR" + System.currentTimeMillis());
  30. rule.setRuleName(dto.getRuleName());
  31. rule.setRuleType(dto.getRuleType());
  32. rule.setProductSkuId(dto.getProductSkuId());
  33. rule.setChannelId(dto.getChannelId());
  34. rule.setBasePrice(dto.getBasePrice());
  35. rule.setDiscountRate(dto.getDiscountRate());
  36. rule.setFixedPrice(dto.getFixedPrice());
  37. rule.setPriority(dto.getPriority());
  38. rule.setStatus(GenericStatus.ACTIVE.getCode());
  39. rule.setStartDate(dto.getStartDate());
  40. rule.setEndDate(dto.getEndDate());
  41. rule.setCreatedAt(LocalDateTime.now());
  42. mapper.insert(rule);
  43. return rule;
  44. }
  45. public PricingRule updateRule(Long id, PricingRuleDTO dto) {
  46. PricingRule rule = mapper.selectById(id);
  47. if (rule == null) return null;
  48. rule.setRuleName(dto.getRuleName());
  49. rule.setRuleType(dto.getRuleType());
  50. rule.setProductSkuId(dto.getProductSkuId());
  51. rule.setChannelId(dto.getChannelId());
  52. rule.setBasePrice(dto.getBasePrice());
  53. rule.setDiscountRate(dto.getDiscountRate());
  54. rule.setFixedPrice(dto.getFixedPrice());
  55. rule.setPriority(dto.getPriority());
  56. rule.setStartDate(dto.getStartDate());
  57. rule.setEndDate(dto.getEndDate());
  58. rule.setUpdatedAt(LocalDateTime.now());
  59. mapper.updateById(rule);
  60. return rule;
  61. }
  62. public void deleteRule(Long id) {
  63. mapper.deleteById(id);
  64. }
  65. public BigDecimal calculatePrice(Long skuId, String channelId, BigDecimal basePrice) {
  66. LambdaQueryWrapper<PricingRule> wrapper = new LambdaQueryWrapper<>();
  67. wrapper.eq(PricingRule::getProductSkuId, skuId.toString())
  68. .eq(PricingRule::getChannelId, channelId)
  69. .eq(PricingRule::getStatus, GenericStatus.ACTIVE.getCode());
  70. PricingRule rule = mapper.selectOne(wrapper);
  71. if (rule == null) return basePrice;
  72. // 校验规则有效期
  73. LocalDateTime now = LocalDateTime.now();
  74. if (rule.getStartDate() != null && now.isBefore(rule.getStartDate())) return basePrice;
  75. if (rule.getEndDate() != null && now.isAfter(rule.getEndDate())) return basePrice;
  76. if (rule.getFixedPrice() != null) {
  77. return rule.getFixedPrice();
  78. }
  79. if (rule.getDiscountRate() != null) {
  80. return basePrice.multiply(rule.getDiscountRate()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
  81. }
  82. return basePrice;
  83. }
  84. }