HsCodeService.java 9.99 KB
package com.erry.iclear.dateInterface.service;

import com.erry.iclear.dateInterface.enums.ErrorCodeEnum;
import com.erry.iclear.dateInterface.api.request.HsCodeParam;
import com.erry.iclear.dateInterface.api.response.ResultHsCode;
import com.erry.iclear.dateInterface.common.Constant;
import com.erry.iclear.dateInterface.entity.HsCode;
import com.erry.iclear.dateInterface.repository.DictionaryEntriesRepository;
import com.erry.iclear.dateInterface.repository.HsCodeRepository;
import com.erry.iclear.dateInterface.util.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * hscode service
 * mt
 * 2022年2月10日16:26:34
 */
@Service
@Slf4j
public class HsCodeService {

    @Autowired
    HsCodeRepository hsCodeRepository;
    @Autowired
    DictionaryEntriesRepository dicEntriesRepository;

    /**
     * 根据hscode编码查询对应的hscode
     * @param hscode
     * @return
     */
    public ResultHsCode findHsCodeListByCode(String hscode){
        ResultHsCode resultHsCode = new ResultHsCode(Boolean.FALSE,"","",null);
        try{
            if(hscode.length() > 2000){
                resultHsCode.setCode(ErrorCodeEnum.ERROR_30102.getCode());
                resultHsCode.setMsg(ErrorCodeEnum.ERROR_30102.getName());
                return resultHsCode;
            }
            String[] hscodeArrays = hscode.split(",");
            if(hscodeArrays.length > 100){
                resultHsCode.setCode(ErrorCodeEnum.ERROR_30100.getCode());
                resultHsCode.setMsg(ErrorCodeEnum.ERROR_30100.getName());
                return resultHsCode;
            }
            List<String> skuCodeList = Arrays.asList(hscodeArrays);
            List<HsCode> hsCodeList = this.hsCodeRepository.findHsCodeListByCode(skuCodeList);
            //如果未查找到对应的hscode则构造一条未找到数据返回
            skuCodeList.forEach(code ->{
                boolean exist = false;
                for (HsCode hsCode : hsCodeList) {
                    if(hsCode.getSkuCode().equals(code)){
                        exist = true;
                    }
                }
                //如果不存在则构造一条不存在数据
                if(!exist){
                    HsCode hsCode = new HsCode();
                    hsCode.setSkuCode(code);
                    hsCode.setRemark("未找到对应hscode数据");
                    hsCodeList.add(hsCode);
                }
            });
            //只能申报D类hscode监管条件hscode
            this.setHscodeSupervise(hsCodeList);
            resultHsCode.setSuccess(Boolean.TRUE);
            resultHsCode.setCode(ErrorCodeEnum.SUCCESS.getCode());
            resultHsCode.setMsg(ErrorCodeEnum.SUCCESS.getName());
            resultHsCode.setHsCodeResultList(hsCodeList);
        }catch(Exception ex){
            log.error(ex.getMessage(),ex);
            resultHsCode.setSuccess(Boolean.FALSE);
            resultHsCode.setCode(ErrorCodeEnum.ERROR_30101.getCode());
            resultHsCode.setMsg(ErrorCodeEnum.ERROR_30101.getName());
        }
        return resultHsCode;
    }

    /**
     * 根据hscode编码或者商品名称进行模糊查询
     * @param hscode
     * @return
     */
    public ResultHsCode fuzzyQueryHsCode(HsCodeParam hscode){
        ResultHsCode resultHsCode = new ResultHsCode(Boolean.FALSE,"","",null);
        try{
            //编码与品名都为空校验失败
            if(StringUtil.isEmpty(hscode.getSkuCode()) && StringUtil.isEmpty(hscode.getSkuName())){
                resultHsCode.setCode(ErrorCodeEnum.ERROR_30103.getCode());
                resultHsCode.setMsg(ErrorCodeEnum.ERROR_30103.getName());
                return resultHsCode;
            }
            //编码长度大于50校验失败
            if(!StringUtil.isEmpty(hscode.getSkuCode()) && hscode.getSkuCode().length() > 50){
                resultHsCode.setCode(ErrorCodeEnum.ERROR_30104.getCode());
                resultHsCode.setMsg(ErrorCodeEnum.ERROR_30104.getName());
                return resultHsCode;
            }
            //品名长度大于1000校验失败
            if(!StringUtil.isEmpty(hscode.getSkuName()) && hscode.getSkuName().length() > 1000){
                resultHsCode.setCode(ErrorCodeEnum.ERROR_30104.getCode());
                resultHsCode.setMsg(ErrorCodeEnum.ERROR_30104.getName());
                return resultHsCode;
            }
            //编码长度小于4位字符校验失败
            if(!StringUtil.isEmpty(hscode.getSkuCode()) && hscode.getSkuCode().length() < 4){
                resultHsCode.setCode(ErrorCodeEnum.ERROR_30105.getCode());
                resultHsCode.setMsg(ErrorCodeEnum.ERROR_30105.getName());
                return resultHsCode;
            }
            //品名长度小于2位字符校验失败
            if(!StringUtil.isEmpty(hscode.getSkuName()) && hscode.getSkuName().length() < 2){
                resultHsCode.setCode(ErrorCodeEnum.ERROR_30105.getCode());
                resultHsCode.setMsg(ErrorCodeEnum.ERROR_30105.getName());
                return resultHsCode;
            }
            String skuCode = "%"+hscode.getSkuCode()+"%";
            String skuName = "%"+hscode.getSkuName()+"%";
            //模糊查询hscode信息
            List<HsCode> hsCodeList = this.hsCodeRepository.fuzzyQueryHsCode(skuCode,skuName);
            //对查询数据进行处理,标志数据是否C类限制品名
            //只能申报D类hscode监管条件hscode
            this.setHscodeSupervise(hsCodeList);
            resultHsCode.setSuccess(Boolean.TRUE);
            resultHsCode.setCode(ErrorCodeEnum.SUCCESS.getCode());
            resultHsCode.setMsg(ErrorCodeEnum.SUCCESS.getName());
            resultHsCode.setHsCodeResultList(hsCodeList);
        }catch(Exception ex){
            log.error(ex.getMessage(),ex);
            resultHsCode.setSuccess(Boolean.FALSE);
            resultHsCode.setCode(ErrorCodeEnum.ERROR_30101.getCode());
            resultHsCode.setMsg(ErrorCodeEnum.ERROR_30101.getName());
        }
        return resultHsCode;
    }

    /**
     * 查询所有有效hscode
     * @return
     */
    public ResultHsCode findAllHsCodeList(){
        ResultHsCode resultHsCode = new ResultHsCode(Boolean.FALSE,"","",null);
        try{
            List<HsCode> hsCodeList = this.hsCodeRepository.findAllHsCodeList();
            resultHsCode.setSuccess(Boolean.TRUE);
            resultHsCode.setCode(ErrorCodeEnum.SUCCESS.getCode());
            resultHsCode.setMsg(ErrorCodeEnum.SUCCESS.getName());
            resultHsCode.setHsCodeResultList(hsCodeList);
        }catch(Exception ex){
            log.error(ex.getMessage(),ex);
            resultHsCode.setSuccess(Boolean.FALSE);
            resultHsCode.setCode(ErrorCodeEnum.ERROR_30101.getCode());
            resultHsCode.setMsg(ErrorCodeEnum.ERROR_30101.getName());
        }
        return resultHsCode;
    }

    /**
     * 只能申报D类hscode监管条件hscode
     * 设置hscode
     * mt
     * 2023年2月24日17:29:49
     */
    public void setHscodeSupervise(List<HsCode> hsCodeList){
        List<Long> hsCodeIds = new ArrayList<>();
        Map<String,Object> hscodeMap = this.getHscodeSupervise();
        StringBuffer shsql = new StringBuffer("'");
        if (hscodeMap !=null && hscodeMap.size()>0){
            for (Map.Entry hscodeEntry :hscodeMap.entrySet()){
                HsCode hsCode = (HsCode) hscodeEntry.getValue();
                hsCodeIds.add(hsCode.getId());
            }
        }
        hsCodeList.forEach(hsCode->{
            //判断该hscode是否只能申报D类
            if(hsCodeIds.contains(hsCode.getId())){
                //d类
                hsCode.setRestrictedC(1);
            }else{
                //C类
                hsCode.setRestrictedC(0);
            }
            //如果ID为空,则设置为空
            if(hsCode.getId() == null){
                hsCode.setRestrictedC(null);
            }
        });
    }

    /**
     * 根据监管条件获取数据,只能申报D类hscode信息
     * mt
     * 2023年2月24日16:43:46
     * @return
     */
    private Map<String,Object> getHscodeSupervise(){
        try {
            Map<String,Object> returnMap = new HashMap<>();
            List<String> dictionaryEntriesList = dicEntriesRepository.findDicEntByCodeList(Constant.supervise_condition,1);
            if (dictionaryEntriesList !=null && dictionaryEntriesList.size()>0){
                String chinsesName = "%[";
                for (int i= 0;i<dictionaryEntriesList.size();i++){
                    if (dictionaryEntriesList.size() -1 == i){
                        chinsesName += dictionaryEntriesList.get(i)+"]%";
                    }else{
                        chinsesName += dictionaryEntriesList.get(i)+"|";
                    }
                }
                //查询监管条件数据
                List<HsCode> hsCodeList = this.hsCodeRepository.findMonitorCondition(chinsesName);
                hsCodeList.forEach(hsCode->{
                    String newCode = getSubHscode(hsCode.getSkuCode());
                    returnMap.put(newCode,hsCode);
                });
            }
            return returnMap;
        }catch (Exception e){
            log.error(e.getMessage(),e);
        }
        return null;
    }

    /**
     * 对商品编码进行处理
     * @param code
     * @return
     */
    private String getSubHscode(String code){
        try {
            if (!StringUtil.isEmptyWithTrim(code) && code.length()>6) {
                if (code.length() == 7) {
                    code = "0" + code + "00";
                } else if (code.length() == 8) {
                    code = code + "00";
                } else if (code.length() == 9) {
                    code = "0" + code;
                } else if (code.length() > 10) {
                    code = code.substring(0, 10);
                }
                return code;
            }
        }catch (Exception e){
            log.error(e.getMessage(),e);
        }
        return null;
    }
}