CalculateTax.java 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. package com.kmall.admin.utils;
  2. import com.kmall.admin.entity.GoodsEntity;
  3. import com.kmall.manager.manager.express.sf.ServiceException;
  4. import org.apache.commons.lang3.StringUtils;
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. import java.math.BigDecimal;
  8. /**
  9. * xwh
  10. * 2020年12月7日14:57:04
  11. */
  12. public class CalculateTax {
  13. private static final Logger logger = LoggerFactory.getLogger(CalculateTax.class);
  14. /**
  15. * 计算税费,包括消费税和增值税。公式如下:
  16. * 订单该商品总税费 = (商品消费税 + 商品增值税)* 0.7
  17. *
  18. * @param
  19. * @return
  20. */
  21. public static final BigDecimal calculateTax(GoodsEntity goodsEntity, BigDecimal actualPaymentAmount) {
  22. // 该商品消费税
  23. BigDecimal grandConsumerTax = BigDecimal.ZERO;
  24. // 该商品增值税
  25. BigDecimal grandValueAddTax = BigDecimal.ZERO;
  26. String hsCode = goodsEntity.getHsCode();// 海关商品编码
  27. String hsCodeName = goodsEntity.getHsCodeName();// 海关商品编码名称
  28. // 消费税税率
  29. final BigDecimal impConsumTaxRate = goodsEntity.getImpConsumTaxRate();
  30. // 增值税税率
  31. final BigDecimal valueAddedTaxRate = goodsEntity.getValueAddedTaxRate();
  32. try {
  33. // 计算某类产品的消费税
  34. final BigDecimal subConsumerTax = calculateConsumerTax(actualPaymentAmount, impConsumTaxRate, hsCodeName, goodsEntity, actualPaymentAmount);
  35. // 计算某类产品的增值税
  36. final BigDecimal subValueAddTax = calculateValueAddTax(actualPaymentAmount, valueAddedTaxRate, subConsumerTax);
  37. // 计算总的消费税
  38. grandConsumerTax = grandConsumerTax.add(subConsumerTax);
  39. // 计算总的增值税
  40. grandValueAddTax = grandValueAddTax.add(subValueAddTax);
  41. } catch (final RuntimeException e) {
  42. if (logger.isErrorEnabled()) logger.error("计算税费出错!请检查产品的分类数据,以及产品类别的税率数据!", e);
  43. throw new IllegalStateException("计算税费出错!请检查产品的分类数据,以及产品类别的税率数据!", e);
  44. }
  45. // 按照公式,打7折
  46. final BigDecimal tax = grandConsumerTax.add(grandValueAddTax).multiply(new BigDecimal("0.7")).setScale(2, BigDecimal.ROUND_HALF_UP);
  47. return tax;
  48. }
  49. /**
  50. * 计算消费税,公式如下:
  51. * 消费税 = (明细商品总价 / (1-消费税税率)) * 消费税税率
  52. *
  53. * @param productSubTotal 订单中的某类商品总价(单价 * 数量)
  54. * @param impConsumTaxRate 进口从价消费税率,百分数
  55. * @param goodsEntity 商品备案信息
  56. * @param productUnitPrice 产品销售单价
  57. * @return 消费税
  58. */
  59. private static final BigDecimal calculateConsumerTax(final BigDecimal productSubTotal, final BigDecimal impConsumTaxRate, final String cusGoodsName, GoodsEntity goodsEntity, final BigDecimal productUnitPrice) {
  60. // 消费税税率为0,不做计算
  61. if (impConsumTaxRate.compareTo(BigDecimal.ZERO) == 0) {
  62. return BigDecimal.ZERO;
  63. }
  64. BigDecimal taxRate = null;
  65. //计算化妆品, 需要计算单价
  66. BigDecimal unit1Price = null;
  67. BigDecimal unit2Price = null;
  68. BigDecimal qty1 = goodsEntity.getLegalUnit1Qty();
  69. BigDecimal qty2 = goodsEntity.getLegalUnit2Qty();
  70. if (StringUtils.isNotBlank(cusGoodsName) && (cusGoodsName.contains("“片”") || cusGoodsName.contains("“张”") || cusGoodsName.contains("\"片\"") || cusGoodsName.contains("\"张\""))) {
  71. //片、张的单价
  72. if (qty2 != null) {
  73. unit2Price = productUnitPrice.divide(qty2, 5, BigDecimal.ROUND_HALF_UP);
  74. }
  75. } else {
  76. //毫升、克的单价
  77. if (qty1 != null) {
  78. BigDecimal gramOrMl = qty1.multiply(new BigDecimal(1000));
  79. unit1Price = productUnitPrice.divide(gramOrMl, 5, BigDecimal.ROUND_HALF_UP);
  80. }
  81. }
  82. // 每单位价格
  83. // 如果有片、张的单价,按片、张;如果没有则按毫升、克
  84. BigDecimal gramOrMlUnitPrice = (unit2Price != null) ? unit2Price : unit1Price;
  85. //获取化妆品阀值
  86. BigDecimal cosmThresholdValue = goodsEntity.getCosmThresholdValue();
  87. if (cosmThresholdValue != null && cosmThresholdValue.compareTo(BigDecimal.ZERO) > 0) {
  88. if (gramOrMlUnitPrice != null) {
  89. //完税法定单位单价大于阈值采用第一档消费税率,否则消费税率为0
  90. if (gramOrMlUnitPrice.compareTo(cosmThresholdValue) >= 0) {
  91. taxRate = impConsumTaxRate.divide(new BigDecimal("100"), 10, BigDecimal.ROUND_HALF_UP);
  92. } else {
  93. taxRate = BigDecimal.ZERO;
  94. }
  95. } else {
  96. String message = "【" + goodsEntity.getSku() + "】缺少法定单价";
  97. logger.error(message);
  98. throw new ServiceException(message);
  99. }
  100. }
  101. // 每单位价格小于化妆品阀值,不做计算
  102. if (taxRate.compareTo(BigDecimal.ZERO) == 0) {
  103. return BigDecimal.ZERO;
  104. }
  105. final BigDecimal tax = productSubTotal.divide(BigDecimal.ONE.subtract(taxRate), 10, BigDecimal.ROUND_HALF_UP).multiply(taxRate);
  106. return tax;
  107. }
  108. /**
  109. * 计算增值税,公式如下:
  110. * 增值税 = (明细商品总价 + 消费税) * 增值税税率
  111. *
  112. * @param productSubTotal 订单中的某类商品总价(单价 * 数量)
  113. * @param valueAddedTaxRate 增值税率,百分数
  114. * @param consumerTax 订单中的某类商品总的消费税
  115. * @return 增值税
  116. */
  117. private static final BigDecimal calculateValueAddTax(final BigDecimal productSubTotal, final BigDecimal valueAddedTaxRate, final BigDecimal consumerTax) {
  118. final BigDecimal taxRate = valueAddedTaxRate.divide(new BigDecimal("100"), 10, BigDecimal.ROUND_HALF_UP);
  119. // 免税,不做计算
  120. if (taxRate.compareTo(BigDecimal.ZERO) == 0) {
  121. return BigDecimal.ZERO;
  122. }
  123. final BigDecimal tax = productSubTotal.add(consumerTax).multiply(taxRate);
  124. return tax;
  125. }
  126. /**
  127. * 计算税率
  128. *
  129. * @param
  130. * @return
  131. */
  132. public static final BigDecimal calculateGoodsRate(GoodsEntity goodsEntity) {
  133. // 消费税税率
  134. final BigDecimal impConsumTaxRate = goodsEntity.getImpConsumTaxRate();
  135. // 增值税税率
  136. final BigDecimal valueAddedTaxRate = goodsEntity.getValueAddedTaxRate();
  137. // 如果增值税为0,免税
  138. if (BigDecimal.ZERO.compareTo(valueAddedTaxRate)==0){
  139. return valueAddedTaxRate;
  140. }
  141. // 如果有消费税 23.06%=(0.13+0.15)/(1-0.15)*0.7
  142. if (BigDecimal.ZERO.compareTo(impConsumTaxRate)!=0){
  143. return valueAddedTaxRate.add(impConsumTaxRate).
  144. divide(new BigDecimal(100).subtract(impConsumTaxRate),10, BigDecimal.ROUND_HALF_UP)
  145. .multiply(new BigDecimal("0.7")).setScale(4, BigDecimal.ROUND_HALF_UP);
  146. }else {
  147. // 如果没有消费税 9.1%=0.13*0.7
  148. return valueAddedTaxRate.multiply(new BigDecimal("0.7")).divide(new BigDecimal("100"),4,BigDecimal.ROUND_HALF_UP);
  149. }
  150. }
  151. }