ChmConsignmentDetailService.java 17.6 KB
package com.erry.iclear.dateInterface.service;

import com.erry.iclear.dateInterface.api.request.FedexMawbDetail;
import com.erry.iclear.dateInterface.api.request.MawbDetail;
import com.erry.iclear.dateInterface.common.Constant;
import com.erry.iclear.dateInterface.entity.*;
import com.erry.iclear.dateInterface.repository.ChmConsignmentDetailRepository;
import com.erry.iclear.dateInterface.repository.HsCodeRepository;
import com.erry.iclear.dateInterface.util.NumberUtils;
import com.erry.iclear.dateInterface.util.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * @author Administrator
 */
@Service
@Slf4j
public class ChmConsignmentDetailService {

    @Autowired
    private ChmConsignmentDetailRepository chmConsignmentDetailRepository;
    @Autowired
    private HsCodeRepository hsCodeRepository;

    /**
     * 转换运单明细
     * @param mawbDetail
     * @return
     */
    public ChmConsignmentDetail convertToChmConsignmentDetail(MawbDetail mawbDetail,ChmConsignment chmConsignment,boolean isCheck){
        ChmConsignmentDetail result = new ChmConsignmentDetail();
        try{
            result.setChmConsignment(chmConsignment);

            //归类标志

            //商品编号
            result.setSkuCode(mawbDetail.getCodeTS());
            //申报单价
            result.setOriRegion(mawbDetail.getDeclPrice());
            //申报总价
            result.setAmount(mawbDetail.getDeclTotal());
            //征免方式
            DictionaryEntries levyTypeDictionaryEntries = Constant.dictionaryEntriesCache.get(Constant.LEVY_TYPE+mawbDetail.getDutyMode());
            if(!Objects.equals(levyTypeDictionaryEntries,null)){
                result.setLevyTypeDic(levyTypeDictionaryEntries);
                result.setLevyType(levyTypeDictionaryEntries.getChineseName());
            }
            //货号
            //版本号
            //第一计量单位(法定单位)
            DictionaryEntries firstUnitDictionaryEntries = Constant.dictionaryEntriesCache.get(Constant.TRANSACTION_UNIT+ mawbDetail.getFirstUnit());
            if(!Objects.equals(firstUnitDictionaryEntries,null)){
                result.setUnitLegalFirstId(firstUnitDictionaryEntries);
                result.setUnitLegalFirst(firstUnitDictionaryEntries.getChineseName());
            }
            //第一法定数量
            result.setQtyLegalFirst(BigDecimal.valueOf(mawbDetail.getFirstQty().doubleValue()));
            //成交计量单位
            //2021年7月8日 成交单位有修改,原取值第一法定计量单位,先取值成交单位。xjq
            DictionaryEntries knockdownUnitEntries = Constant.dictionaryEntriesCache.get(Constant.TRANSACTION_UNIT+ mawbDetail.getGunit());
            if(!Objects.equals(knockdownUnitEntries,null)){
                result.setKnockdownUnitDic(knockdownUnitEntries);
                result.setKnockdownUnit(knockdownUnitEntries.getChineseName());
            }
            //如果为数据校验,则不进行数据转换
            if(isCheck){
                result.setModel(mawbDetail.getGmodel());
            }else{
                //商品规格、型号
                String model = this.modelConvert(mawbDetail.getCodeTS(),mawbDetail.getGname(),mawbDetail.getGmodel());
                result.setModel(model);
            }

            //商品名称
            result.setSkuName(mawbDetail.getGname());
            //商品序号
            //成交数量
            result.setKnockdownNumber(BigDecimal.valueOf(mawbDetail.getGqty().doubleValue()));
            //原产国
            DictionaryEntries habitatDictonaryEntries = Constant.dictionaryEntriesCache.get(Constant.COUNTRY+ mawbDetail.getOriginCountry());
            if(!Objects.equals(habitatDictonaryEntries,null)){
                result.setHabitatDic(habitatDictonaryEntries);
                result.setHabitat(habitatDictonaryEntries.getChineseName());
            }
            //第二计量单位
            DictionaryEntries secondUnitDictionaryEntries = Constant.dictionaryEntriesCache.get(Constant.TRANSACTION_UNIT+ mawbDetail.getSecondUnit());
            if(!Objects.equals(secondUnitDictionaryEntries,null)){
                result.setUnitLegalSecondId(secondUnitDictionaryEntries);
                result.setUnitLegalSecond(secondUnitDictionaryEntries.getChineseName());
            }
            //第二法定数量
            result.setQtyLegalSecond(BigDecimal.valueOf(mawbDetail.getSecondQty().doubleValue()));
            //成交币制
            DictionaryEntries currencyDictionaryEntries = Constant.dictionaryEntriesCache.get(Constant.CURRENCY_SYSTEM+ mawbDetail.getTradeCurr());
            if(!Objects.equals(currencyDictionaryEntries,null)){
                result.setCurrencyDic(currencyDictionaryEntries);
                result.setCurrency(currencyDictionaryEntries.getChineseName());
            }

            //用途/生产厂家
            //工缴费
            //最终目的国
            DictionaryEntries destinationCountryDictionaryEntries = Constant.dictionaryEntriesCache.get(Constant.COUNTRY+ mawbDetail.getDestinationCountry());
            if(!Objects.equals(destinationCountryDictionaryEntries,null)){
                result.setDestinationCountryDic(destinationCountryDictionaryEntries);
                result.setDestinationCountry(destinationCountryDictionaryEntries.getChineseName());
            }

            //检验检疫编码
            //申报货物英文名称
            result.setContentDescription(mawbDetail.getDeclGoodsEname());
            //目的地代码
            if(StringUtils.isNotBlank(mawbDetail.getDestCode())){
                OrigplacecodeMapping origplacecodeMapping = Constant.origplacecodeMappingCache.get(mawbDetail.getDestCode());
                result.setOrigplacecodeMapping(origplacecodeMapping);
                result.setOrigplacecode(Objects.equals(origplacecodeMapping,null)?"":origplacecodeMapping.getOrigplaceName());
            }

            //境内目的地/境内货源地
            DomesticDestinationMapping domesticDestinationDictionaryEntries = Constant.domesticDestinationMappingCache.get(mawbDetail.getDistrictCode());
            if(!Objects.equals(domesticDestinationDictionaryEntries,null)){
                result.setDomesticDestinationMapping(domesticDestinationDictionaryEntries);
                result.setDomesticDestination(Objects.equals(destinationCountryDictionaryEntries,null)?"":destinationCountryDictionaryEntries.getChineseName());
            }
            result.setDetailId(mawbDetail.getDetailId());
            //录入品名
            result.setInputItem(StringUtil.isEmptyWithTrim(mawbDetail.getGname()) == true ? "" : mawbDetail.getGname());
        }catch (Exception e){
            log.error("convertToChmConsignmentDetail() error:"+e.getMessage());
        }
        return result;
    }

    /**
     * 转换运单明细
     * @param mawbDetail
     * @return
     */
    public ChmConsignmentDetail convertToChmConsignmentDetailFedex(FedexMawbDetail mawbDetail, ChmConsignment chmConsignment,boolean isCheck){
        ChmConsignmentDetail result = new ChmConsignmentDetail();
        try{
            result.setChmConsignment(chmConsignment);
            //商品编号
            result.setSkuCode(mawbDetail.getCodeTS());
            //申报总价
            result.setAmount(bigDecimalFormat(mawbDetail.getDeclTotal()));
            //第一计量单位(法定单位)
            DictionaryEntries firstUnitDictionaryEntries = Constant.dictionaryEntriesCache.get(Constant.TRANSACTION_UNIT+ mawbDetail.getFirstUnit());
            if(!Objects.equals(firstUnitDictionaryEntries,null)){
                result.setUnitLegalFirstId(firstUnitDictionaryEntries);
                result.setUnitLegalFirst(firstUnitDictionaryEntries.getChineseName());
            }
            //第一法定数量
            result.setQtyLegalFirst(bigDecimalFormat(BigDecimal.valueOf(mawbDetail.getFirstQty().doubleValue())));
            //成交计量单位
            //2021年7月8日 成交单位有修改,原取值第一法定计量单位,先取值成交单位。xjq
            DictionaryEntries knockdownUnitEntries = Constant.dictionaryEntriesCache.get(Constant.TRANSACTION_UNIT+ mawbDetail.getGunit());
            if(!Objects.equals(knockdownUnitEntries,null)){
                result.setKnockdownUnitDic(knockdownUnitEntries);
                result.setKnockdownUnit(knockdownUnitEntries.getChineseName());
            }
            //如果为校验,则不进行转换
            if(isCheck){
                //商品规格、型号
                result.setModel(mawbDetail.getGmodel());
            }else{
                //商品规格、型号
                String model = this.modelConvert(mawbDetail.getCodeTS(),mawbDetail.getGname(),mawbDetail.getGmodel());
                result.setModel(model);
            }

            //商品名称
            result.setSkuName(mawbDetail.getGname());
            //成交数量
            result.setKnockdownNumber(bigDecimalFormat(BigDecimal.valueOf(mawbDetail.getGqty().doubleValue())));
            //第二法定数量
            result.setQtyLegalSecond(bigDecimalFormat(mawbDetail.getSecondQty()));
            //第二计量单位
            DictionaryEntries secondUnitDictionaryEntries = Constant.dictionaryEntriesCache.get(Constant.TRANSACTION_UNIT+ mawbDetail.getSecondUnit());
            if(!Objects.equals(secondUnitDictionaryEntries,null)){
                result.setUnitLegalSecondId(secondUnitDictionaryEntries);
                result.setUnitLegalSecond(secondUnitDictionaryEntries.getChineseName());
            }

            //成交币制
            DictionaryEntries currencyDictionaryEntries = Constant.dictionaryEntriesCache.get(Constant.CURRENCY_SYSTEM+ mawbDetail.getTradeCurr());
            if(!Objects.equals(currencyDictionaryEntries,null)){
                result.setCurrencyDic(currencyDictionaryEntries);
                result.setCurrency(currencyDictionaryEntries.getChineseName());
            }
            result.setDeclaredWeight(bigDecimalFormat(mawbDetail.getDeclaredWeight()));
            result.setDetailId(mawbDetail.getDetailId());
        }catch (Exception e){
            log.error("convertToChmConsignmentDetailFedex() error:"+e.getMessage());
        }
        return result;
    }

    /**
     * 转换运单明细
     * @param detail
     * @param gno
     * @return
     */
    public MawbDetail convertToChmConsignmentDetail(ChmConsignmentDetail detail,String gno){
        MawbDetail result = new MawbDetail();
        try{
            //明细ID
            result.setDetailId(detail.getId().toString());
            //归类标志
            result.setClassMark("");
            //商品编号  必须是十位,不足的后补 00
            result.setCodeTS(detail.getSkuCode());
            //申报单价  小数点保留4位
            result.setDeclPrice(NumberUtils.bigDecimalFormat(detail.getOriRegion(),4));
            //申报总价  小数点保留2位
            result.setDeclTotal(bigDecimalFormatD(NumberUtils.bigDecimalFormat(detail.getAmount(),2)));
            //征免方式  数字一字码,0~9
            if(!Objects.equals(detail.getLevyTypeDic(),null)){
                result.setDutyMode(detail.getLevyTypeDic().getExt2());
            }
            //货号    有值传值,无值填空值
            result.setExgNo("");
            //版本号   有值传值,无值填空值
            result.setExgVersion("");
            //第一计量单位(法定单位)  数字三字码
            if(!Objects.equals(detail.getUnitLegalFirstId(),null)){
                result.setFirstUnit(detail.getUnitLegalFirstId().getExt2());
            }
            //第一法定数量
            result.setFirstQty(NumberUtils.bigDecimalToIntger(bigDecimalFormatD(detail.getQtyLegalFirst())));
            //成交计量单位    数字三字码
            if(!Objects.equals(detail.getKnockdownUnitDic(),null)){
                result.setGunit(detail.getKnockdownUnitDic().getExt2());
            }
            //商品规格、型号
            result.setGmodel(detail.getModel());
            //商品名称  品名必填且必须包含中文字符
            result.setGname(detail.getSkuName());
            //商品序号
            result.setGno(gno);
            //成交数量
            result.setGqty(bigDecimalFormatD(detail.getKnockdownNumber()));
            //原产国   英文三字码
            if(!Objects.equals(detail.getHabitatDic(),null)){
                result.setOriginCountry(detail.getHabitatDic().getExt3());
            }
            //第二计量单位    数字三字码
            if(!Objects.equals(detail.getUnitLegalSecondId(),null)){
                result.setSecondUnit(detail.getUnitLegalSecondId().getExt2());
            }
            //第二法定数量
            result.setSecondQty(NumberUtils.bigDecimalToIntger(bigDecimalFormatD(detail.getQtyLegalSecond())));
            //成交币制  英文三字码
            if(!Objects.equals(detail.getCurrencyDic(),null)){
                result.setTradeCurr(detail.getCurrencyDic().getExt2());
            }
            //用途/生产厂家
            result.setUseTo("");
            //工缴费
            result.setWorkUsd(new BigDecimal(0));
            //最终目的国 英文三字码
            if(!Objects.equals(detail.getDestinationCountryDic(),null)){
                result.setDestinationCountry(detail.getDestinationCountryDic().getExt3());
            }
            //检验检疫编码
            result.setCiqCode("");
            //申报货物英文名称
            result.setDeclGoodsEname(detail.getContentDescription());
            //目的地代码 有值传值,无值填空值
            if(!Objects.equals(detail.getOrigplacecodeMapping(),null)){
                result.setDestCode(detail.getOrigplacecodeMapping().getOrigplaceCode());
            }else{
                result.setDestCode("");
            }
            //境内目的地/境内货源地
            if(!Objects.equals(detail.getDomesticDestinationMapping(),null)){
                result.setDistrictCode(detail.getDomesticDestinationMapping().getDistrictCode());
            }
            result.setDetailId(detail.getDetailId());
        }catch (Exception e){
            log.error("convertToChmConsignmentDetail() error:"+e.getMessage());
        }

        return result;
    }

    public  BigDecimal bigDecimalFormat(BigDecimal num){
        BigDecimal bdForMat = null;
        if(num !=null){
            if(num.compareTo(BigDecimal.ZERO) == 0){
                bdForMat = new BigDecimal(0);
            }else if(num.compareTo(new BigDecimal("0.01"))< 1) {
                bdForMat = new BigDecimal(0.01).setScale(2,BigDecimal.ROUND_HALF_UP);
            }else{
                bdForMat = num.setScale(2, BigDecimal.ROUND_HALF_UP);
            }
        }
        return  bdForMat;
    }

    /**
     * D类运单小数处理
     * @param num
     * @return
     */
    public  BigDecimal bigDecimalFormatD(BigDecimal num){
        BigDecimal bdForMat = null;
        if(num !=null){
            bdForMat = num.setScale(5, BigDecimal.ROUND_HALF_UP);
            /*if(bdForMat.compareTo(BigDecimal.ZERO) == 0){
                bdForMat = new BigDecimal(0.00001).setScale(5,BigDecimal.ROUND_HALF_UP);
            }*/
        }
        return  bdForMat;
    }

    /**
     * 将API传的model格式转换为iclear格式类型
     * 0|0|表面活性剂|否是|低聚-D-吡喃葡萄糖-C10-16-烷基苷 10-20%,乙氧基化-C16-18、C18-不饱和醇 10-20%,甘油 30-40%,水 10-20%|无品牌|无型号||||
     * 转换成
     * 品名:鸦片|品牌类型:0|出口享惠情况:0|制作或保存方法[液汁、浸膏、粉末]:嗷嗷|GTIN:|CAS:|其他[非必报要素,请根据实际情况填报]:|
     * @param skuCode
     * @param skuName
     * @param model
     * @return
     */
    private String modelConvert(String skuCode,String skuName,String model){
        String resultModel = model;
        try{
            HsCode hsCode = hsCodeRepository.findHsCodeByCode(skuCode);
            if (hsCode != null) {
                String[] modelSplit = model.split("\\|");
                String[] modelSplits = new String[20];
                Class<? extends HsCode> hsCodeClass = hsCode.getClass();
                for (int j = 0; j < 20; j++) {
                    int element = j + 1;
                    String invoke = (String) hsCodeClass.getMethod("getElement" + element).invoke(hsCode);
                    if (j == 0) {
                        modelSplits[j] = invoke + ":" + skuName;
                        continue;
                    }
                    if (!StringUtil.isEmptyWithTrim(invoke)) {
                        if (modelSplit.length <= j - 1) {
                            modelSplits[j] = invoke + ":";
                        } else {
                            modelSplits[j] = invoke + ":" + modelSplit[j - 1];
                        }
                    }
                }
                StringBuffer modelSb = new StringBuffer();
                for (String split : modelSplits) {
                    if(split == null){
                        split = "";
                    }
                    modelSb.append(split).append("|");
                }
                if(modelSb.length() > 0){
                    resultModel = modelSb.toString();
                }
            }
        }catch(Exception ex){
            log.error("modelConvert() error:"+ex.getMessage());
        }
        return resultModel;
    }
}