Parcourir la source

xwh修改凌晨四点同步税率定时任务

xwh il y a 4 ans
Parent
commit
354ea642c7

+ 16 - 24
kmall-admin/src/main/java/com/kmall/admin/Test.java

@@ -15,6 +15,8 @@ package com.kmall.admin;
 import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpUtil;
 import com.alibaba.fastjson.JSON;
+import com.kmall.admin.entity.GoodsEntity;
+import com.kmall.admin.utils.CalculateTax;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
@@ -32,30 +34,20 @@ import java.util.Map;
  */
 public class Test {
     public static void main(String[] args) {
-        Map params = new HashMap();
-//        Map header = new HashMap();
-//        header.put("Content-Type", "application/json");
-        List<String> skuList = new ArrayList<String>();
-        skuList.add("ISGDKK175117");
-        skuList.add("ISTH01000185");
-        params.put("skuList",skuList);
-//
-//        String result = HttpUtil.URLPost("http://127.0.0.1:8080/oms-controller-mgt/pdProductRecord/hsCodeMapBySkuList",header, params, "UTF-8");
-//
-//        System.out.println(result);
-
-
-//        System.out.println();
-//        String result = HttpUtil.post("http://127.0.0.1:8080/oms-controller-mgt/pdProductRecord/hsCodeMapBySkuList", JSON.toJSONString(params));
-//        HttpRequest post = HttpUtil.createPost();
-        String result = HttpUtil.get("http://127.0.0.1:8080/oms-controller-mgt/taxBill/queryGoodsRate?thirdPartyMerchCode=ZDF01");
-        Map<String,String> map = JSON.parseObject(result, Map.class);
-        String goodsRate = map.get("1901101000");
-        String s = map.get(null);
-        System.out.println(s);
-        System.out.println(new BigDecimal(goodsRate));
-        System.out.println(result);
-
+        BigDecimal actualPaymentAmount = new BigDecimal("64.15"); //随便拿一个门店的当前时间的价格,如果有活动价会使用活动价
+        GoodsEntity goodsEntity = new GoodsEntity();
+        goodsEntity.setHsCode("3307900000");
+        goodsEntity.setHsCodeName("其他编号未列名的芳香料制品(包括化妆盥洗品)");
+        goodsEntity.setImpConsumTaxRate(new BigDecimal("0"));
+        goodsEntity.setValueAddedTaxRate(new BigDecimal("13"));
+        goodsEntity.setLegalUnit2Qty(new BigDecimal("0"));
+        goodsEntity.setLegalUnit1Qty(new BigDecimal("0.1"));
+        goodsEntity.setSku("ISZWCW47250");
+        goodsEntity.setCosmThresholdValue(null);
 
+        BigDecimal calculateTax = CalculateTax.calculateTax(goodsEntity, actualPaymentAmount);// 税费
+        BigDecimal goodsRate = calculateTax.divide(actualPaymentAmount,4,BigDecimal.ROUND_HALF_UP);
+        System.out.println(calculateTax);
+        System.out.println(goodsRate);
     }
 }

+ 1 - 0
kmall-admin/src/main/java/com/kmall/admin/dao/GoodsDao.java

@@ -70,4 +70,5 @@ public interface GoodsDao extends BaseDao<GoodsEntity> {
 
     List<GoodsEntity> queryNonSyncOmsGoodsRateSkuList();
 
+    List<GoodsEntity> queryAllList();
 }

+ 51 - 0
kmall-admin/src/main/java/com/kmall/admin/entity/GoodsEntity.java

@@ -236,6 +236,57 @@ public class GoodsEntity implements Serializable {
 
     private String isSyncGoodsRate;
 
+    private BigDecimal impConsumTaxRate;
+
+    private BigDecimal valueAddedTaxRate;
+
+    private BigDecimal cosmThresholdValue;
+
+
+    private BigDecimal legalUnit1Qty;
+
+    private BigDecimal legalUnit2Qty;
+
+    public BigDecimal getCosmThresholdValue() {
+        return cosmThresholdValue;
+    }
+
+    public void setCosmThresholdValue(BigDecimal cosmThresholdValue) {
+        this.cosmThresholdValue = cosmThresholdValue;
+    }
+
+    public BigDecimal getLegalUnit1Qty() {
+        return legalUnit1Qty;
+    }
+
+    public void setLegalUnit1Qty(BigDecimal legalUnit1Qty) {
+        this.legalUnit1Qty = legalUnit1Qty;
+    }
+
+    public BigDecimal getLegalUnit2Qty() {
+        return legalUnit2Qty;
+    }
+
+    public void setLegalUnit2Qty(BigDecimal legalUnit2Qty) {
+        this.legalUnit2Qty = legalUnit2Qty;
+    }
+
+    public BigDecimal getImpConsumTaxRate() {
+        return impConsumTaxRate;
+    }
+
+    public void setImpConsumTaxRate(BigDecimal impConsumTaxRate) {
+        this.impConsumTaxRate = impConsumTaxRate;
+    }
+
+    public BigDecimal getValueAddedTaxRate() {
+        return valueAddedTaxRate;
+    }
+
+    public void setValueAddedTaxRate(BigDecimal valueAddedTaxRate) {
+        this.valueAddedTaxRate = valueAddedTaxRate;
+    }
+
     public String getIsSyncGoodsRate() {
         return isSyncGoodsRate;
     }

+ 2 - 0
kmall-admin/src/main/java/com/kmall/admin/service/GoodsService.java

@@ -196,4 +196,6 @@ public interface GoodsService {
 
     void syncOmsGoodsRate();
 
+    void syncGoodsRate();
+
 }

+ 32 - 1
kmall-admin/src/main/java/com/kmall/admin/service/impl/GoodsServiceImpl.java

@@ -15,6 +15,7 @@ import com.kmall.admin.service.*;
 import com.kmall.admin.service.mk.MkActivitiesService;
 import com.kmall.admin.service.mk.MkActivityFormService;
 import com.kmall.admin.service.GoodsService;
+import com.kmall.admin.utils.CalculateTax;
 import com.kmall.admin.utils.GoodsUtils;
 import com.kmall.admin.utils.ShiroUtils;
 import com.kmall.api.entity.exportpdf.PDFGoodsDto;
@@ -1815,13 +1816,23 @@ public class GoodsServiceImpl implements GoodsService {
                 if (Objects.nonNull(skuInfoMap)){
                     String hsCodeName = skuInfoMap.get("cusGoodsName");
                     String hsCode = skuInfoMap.get("cusGoodsCode");
-                    if (StringUtils.isNotEmpty(hsCodeName) && StringUtils.isNotEmpty(hsCode)){
+                    String impConsumTaxRate = skuInfoMap.get("impConsumTaxRate");
+                    String valueAddedTaxRate = skuInfoMap.get("valueAddedTaxRate");
+                    String legalUnit1Qty = skuInfoMap.get("legalUnit1Qty");
+                    String legalUnit2Qty = skuInfoMap.get("legalUnit2Qty");
+                    String cosmThresholdValue = skuInfoMap.get("cosmThresholdValue");
+                    if (StringUtils.isNotEmpty(hsCodeName) && StringUtils.isNotEmpty(hsCode) && StringUtils.isNotEmpty(impConsumTaxRate) && StringUtils.isNotEmpty(valueAddedTaxRate)){
                         List<GoodsEntity> goodsEntityList = goodsDao.queryListBySku(sku);
                         if (Objects.nonNull(goodsEntityList) && goodsEntityList.size()>0){
                             for (GoodsEntity goodsEntity : goodsEntityList) {
                                 goodsEntity.setHsCode(hsCode);
                                 goodsEntity.setHsCodeName(hsCodeName);
+                                goodsEntity.setImpConsumTaxRate(new BigDecimal(impConsumTaxRate));
+                                goodsEntity.setValueAddedTaxRate(new BigDecimal(valueAddedTaxRate));
                                 goodsEntity.setIsSyncHsCode("1");
+                                goodsEntity.setLegalUnit1Qty(new BigDecimal(legalUnit1Qty));
+                                goodsEntity.setLegalUnit2Qty(new BigDecimal(legalUnit2Qty));
+                                goodsEntity.setCosmThresholdValue(new BigDecimal(cosmThresholdValue));
                                 goodsDao.update(goodsEntity);
                             }
                         }
@@ -1851,6 +1862,26 @@ public class GoodsServiceImpl implements GoodsService {
         }
     }
 
+    @Override
+    @Transactional
+    public void syncGoodsRate() {
+        String storeId = "163"; // 市场部说所有门店价格一致,并且活动一致,可直接取其中一个门店价格进行计算税率
+        // 查询出所有商品
+        List<GoodsEntity> allGoodsList = goodsDao.queryAllList();
+        for (GoodsEntity goodsEntity : allGoodsList) {
+            // 同步过海关商品编码才可以算税率
+            if ("1".equals(goodsEntity.getIsSyncHsCode())) {
+                Map<String, Object> goodsDetailMap = calculateGoodsDetail(goodsEntity.getProdBarcode(), storeId);
+                GoodsDetailsDto goods = (GoodsDetailsDto) goodsDetailMap.get("goods");
+                // 顾客给的钱 就是税后价
+                BigDecimal actualPaymentAmount = goods.getActualPaymentAmount(); //随便拿一个门店的当前时间的价格,如果有活动价会使用活动价
+                BigDecimal calculateTax = CalculateTax.calculateTax(goodsEntity, actualPaymentAmount);// 税费
+                BigDecimal goodsRate = calculateTax.divide(actualPaymentAmount,4,BigDecimal.ROUND_HALF_UP);
+                goodsEntity.setGoodsRate(goodsRate);
+                goodsDao.update(goodsEntity);
+            }
+        }
+    }
 
 
 }

+ 19 - 1
kmall-admin/src/main/java/com/kmall/admin/task/SyncOmsTask.java

@@ -48,7 +48,7 @@ public class SyncOmsTask {
      * 同步oms海关备案编码对应税率
      * 每天凌晨四点执行一次
      */
-    @Scheduled(cron = "0 0 4 * * ?")
+//    @Scheduled(cron = "0 0 4 * * ?")
     public void syncOmsGoodsRate() {
         logger.info("同步所有商品表海关备案编码对应税率数据开始-----------------");
         try {
@@ -61,4 +61,22 @@ public class SyncOmsTask {
 
     }
 
+
+    /**
+     * 每日同步税率
+     * 每天凌晨四点执行一次
+     */
+    @Scheduled(cron = "0 0 4 * * ?")
+    public void syncGoodsRate() {
+        logger.info("同步所有商品表当前售价海关备案编码对应税率数据开始-----------------");
+        try {
+            goodsService.syncGoodsRate();
+        } catch (Exception e) {
+            e.printStackTrace();
+            logger.info("同步所有商品表当前售价海关备案编码对应税率数据异常-----------------原因:" + e.getMessage());
+        }
+        logger.info("同步所有商品表当前售价海关备案编码数据对应税率结束-----------");
+
+    }
+
 }

+ 154 - 0
kmall-admin/src/main/java/com/kmall/admin/utils/CalculateTax.java

@@ -0,0 +1,154 @@
+package com.kmall.admin.utils;
+
+
+import com.kmall.admin.entity.GoodsEntity;
+import com.kmall.manager.manager.express.sf.ServiceException;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.math.BigDecimal;
+
+/**
+ * xwh
+ * 2020年12月7日14:57:04
+ */
+public class CalculateTax {
+    private static final Logger logger = LoggerFactory.getLogger(CalculateTax.class);
+
+    /**
+     * 计算税费,包括消费税和增值税。公式如下:
+     * 订单该商品总税费 = (商品消费税 + 商品增值税)* 0.7
+     *
+     * @param
+     * @return
+     */
+    public static final BigDecimal calculateTax(GoodsEntity goodsEntity, BigDecimal actualPaymentAmount) {
+        // 该商品消费税
+        BigDecimal grandConsumerTax = BigDecimal.ZERO;
+        // 该商品增值税
+        BigDecimal grandValueAddTax = BigDecimal.ZERO;
+
+
+        String hsCode = goodsEntity.getHsCode();// 海关商品编码
+        String hsCodeName = goodsEntity.getHsCodeName();// 海关商品编码名称
+
+        // 消费税税率
+        final BigDecimal impConsumTaxRate = goodsEntity.getImpConsumTaxRate();
+        // 增值税税率
+        final BigDecimal valueAddedTaxRate = goodsEntity.getValueAddedTaxRate();
+
+        try {
+            // 计算某类产品的消费税
+            final BigDecimal subConsumerTax = calculateConsumerTax(actualPaymentAmount, impConsumTaxRate, hsCodeName, goodsEntity, actualPaymentAmount);
+            // 计算某类产品的增值税
+            final BigDecimal subValueAddTax = calculateValueAddTax(actualPaymentAmount, valueAddedTaxRate, subConsumerTax);
+
+            // 计算总的消费税
+            grandConsumerTax = grandConsumerTax.add(subConsumerTax);
+            // 计算总的增值税
+            grandValueAddTax = grandValueAddTax.add(subValueAddTax);
+        } catch (final RuntimeException e) {
+            if (logger.isErrorEnabled()) logger.error("计算税费出错!请检查产品的分类数据,以及产品类别的税率数据!", e);
+            throw new IllegalStateException("计算税费出错!请检查产品的分类数据,以及产品类别的税率数据!", e);
+        }
+
+
+        // 按照公式,打7折
+        final BigDecimal tax = grandConsumerTax.add(grandValueAddTax).multiply(new BigDecimal("0.7")).setScale(2, BigDecimal.ROUND_HALF_UP);
+        return tax;
+    }
+
+    /**
+     * 计算消费税,公式如下:
+     * 消费税 = (明细商品总价 / (1-消费税税率)) * 消费税税率
+     *
+     * @param productSubTotal  订单中的某类商品总价(单价 * 数量)
+     * @param impConsumTaxRate 进口从价消费税率,百分数
+     * @param goodsEntity    商品备案信息
+     * @param productUnitPrice 产品销售单价
+     * @return 消费税
+     */
+    private static final BigDecimal calculateConsumerTax(final BigDecimal productSubTotal, final BigDecimal impConsumTaxRate, final String cusGoodsName, GoodsEntity goodsEntity, final BigDecimal productUnitPrice) {
+        // 消费税税率为0,不做计算
+        if (impConsumTaxRate.compareTo(BigDecimal.ZERO) == 0) {
+            return BigDecimal.ZERO;
+        }
+
+        BigDecimal taxRate = null;
+
+        //计算化妆品, 需要计算单价
+        BigDecimal unit1Price = null;
+        BigDecimal unit2Price = null;
+        BigDecimal qty1 = goodsEntity.getLegalUnit1Qty();
+        BigDecimal qty2 = goodsEntity.getLegalUnit2Qty();
+
+
+        if (StringUtils.isNotBlank(cusGoodsName) && (cusGoodsName.contains("“片”") || cusGoodsName.contains("“张”") || cusGoodsName.contains("\"片\"") || cusGoodsName.contains("\"张\""))) {
+            //片、张的单价
+            if (qty2 != null) {
+                unit2Price = productUnitPrice.divide(qty2, 5, BigDecimal.ROUND_HALF_UP);
+            }
+        } else {
+            //毫升、克的单价
+            if (qty1 != null) {
+                BigDecimal gramOrMl = qty1.multiply(new BigDecimal(1000));
+                unit1Price = productUnitPrice.divide(gramOrMl, 5, BigDecimal.ROUND_HALF_UP);
+            }
+        }
+
+
+        // 每单位价格
+        // 如果有片、张的单价,按片、张;如果没有则按毫升、克
+        BigDecimal gramOrMlUnitPrice = (unit2Price != null) ? unit2Price : unit1Price;
+
+
+        //获取化妆品阀值
+        BigDecimal cosmThresholdValue = goodsEntity.getCosmThresholdValue();
+        if (cosmThresholdValue != null && cosmThresholdValue.compareTo(BigDecimal.ZERO) > 0) {
+            if (gramOrMlUnitPrice != null) {
+                //完税法定单位单价大于阈值采用第一档消费税率,否则消费税率为0
+                if (gramOrMlUnitPrice.compareTo(cosmThresholdValue) >= 0) {
+                    taxRate = impConsumTaxRate.divide(new BigDecimal("100"), 10, BigDecimal.ROUND_HALF_UP);
+                } else {
+                    taxRate = BigDecimal.ZERO;
+                }
+            } else {
+                String message = "【" + goodsEntity.getSku() + "】缺少法定单价";
+                logger.error(message);
+                throw new ServiceException(message);
+            }
+        }
+
+        // 每单位价格小于化妆品阀值,不做计算
+        if (taxRate.compareTo(BigDecimal.ZERO) == 0) {
+            return BigDecimal.ZERO;
+        }
+
+        final BigDecimal tax = productSubTotal.divide(BigDecimal.ONE.subtract(taxRate), 10, BigDecimal.ROUND_HALF_UP).multiply(taxRate);
+        return tax;
+    }
+
+
+    /**
+     * 计算增值税,公式如下:
+     * 增值税 = (明细商品总价 + 消费税) * 增值税税率
+     *
+     * @param productSubTotal   订单中的某类商品总价(单价 * 数量)
+     * @param valueAddedTaxRate 增值税率,百分数
+     * @param consumerTax       订单中的某类商品总的消费税
+     * @return 增值税
+     */
+    private static final BigDecimal calculateValueAddTax(final BigDecimal productSubTotal, final BigDecimal valueAddedTaxRate, final BigDecimal consumerTax) {
+        final BigDecimal taxRate = valueAddedTaxRate.divide(new BigDecimal("100"), 10, BigDecimal.ROUND_HALF_UP);
+
+        // 免税,不做计算
+        if (taxRate.compareTo(BigDecimal.ZERO) == 0) {
+            return BigDecimal.ZERO;
+        }
+
+        final BigDecimal tax = productSubTotal.add(consumerTax).multiply(taxRate);
+        return tax;
+    }
+
+}

+ 24 - 1
kmall-admin/src/main/resources/mybatis/mapper/GoodsDao.xml

@@ -76,6 +76,11 @@
         <result column="hs_code_name" property="hsCodeName"/>
         <result column="is_sync_hs_code" property="isSyncHsCode"/>
         <result column="is_sync_goods_rate" property="isSyncGoodsRate"/>
+        <result column="imp_consum_tax_rate" property="impConsumTaxRate"/>
+        <result column="value_added_tax_rate" property="valueAddedTaxRate"/>
+        <result column="legal_unit1_qty" property="legalUnit1Qty"/>
+        <result column="legal_unit2_qty" property="legalUnit2Qty"/>
+        <result column="cosm_threshold_value" property="cosmThresholdValue"/>
     </resultMap>
 
     <select id="queryObject" resultType="com.kmall.admin.entity.GoodsEntity">
@@ -508,6 +513,11 @@
 			`hs_code_name`,
 			`is_sync_hs_code`,
 			`is_sync_goods_rate`,
+			`imp_consum_tax_rate`,
+			`value_added_tax_rate`,
+			`legal_unit1_qty`,
+			`legal_unit2_qty`,
+			`cosm_threshold_value`,
 			`tstm`)
 		values(
 			#{merchSn},
@@ -565,6 +575,11 @@
 			#{hsCodeName},
 			'0',
 			'0',
+			#{impConsumTaxRate},
+			#{valueAddedTaxRate},
+			#{legalUnit1Qty},
+			#{legalUnit2Qty},
+			#{cosmThresholdValue},
 			#{tstm})
     </insert>
 
@@ -627,7 +642,12 @@
             <if test="hsCode != null">`hs_code` = #{hsCode},</if>
             <if test="hsCodeName != null">`hs_code_name` = #{hsCodeName},</if>
             <if test="isSyncHsCode != null">`is_sync_hs_code` = #{isSyncHsCode},</if>
-            <if test="isSyncGoodsRate != null">`is_sync_goods_rate` = #{isSyncGoodsRate}</if>
+            <if test="isSyncGoodsRate != null">`is_sync_goods_rate` = #{isSyncGoodsRate},</if>
+            <if test="impConsumTaxRate != null">`imp_consum_tax_rate` = #{impConsumTaxRate},</if>
+            <if test="valueAddedTaxRate != null">`value_added_tax_rate` = #{valueAddedTaxRate},</if>
+            <if test="legalUnit1Qty != null">`legal_unit1_qty` = #{legalUnit1Qty},</if>
+            <if test="legalUnit2Qty != null">`legal_unit2_qty` = #{legalUnit2Qty},</if>
+            <if test="cosmThresholdValue != null">`cosm_threshold_value` = #{cosmThresholdValue}</if>
         </set>
         where id = #{id}
     </update>
@@ -785,6 +805,9 @@
         from mall_goods
         where is_sync_goods_rate = '0'
     </select>
+    <select id="queryAllList" resultType="com.kmall.admin.entity.GoodsEntity">
+        select * from mall_goods
+    </select>
 
 
 </mapper>