BasfService.java 6.94 KB
package com.erry.iclear.dateInterface.service;

import com.arronlong.httpclientutil.HttpClientUtil;
import com.arronlong.httpclientutil.common.HttpConfig;
import com.arronlong.httpclientutil.common.HttpHeader;
import com.erry.iclear.dateInterface.api.request.*;
import com.erry.iclear.dateInterface.api.response.IClearCheckResponseResult;
import com.erry.iclear.dateInterface.api.response.ResultRS;
import com.erry.iclear.dateInterface.entity.ChmConsignment;
import com.erry.iclear.dateInterface.entity.ChmConsignmentDetail;
import com.erry.iclear.dateInterface.repository.BasfMawbRepository;
import com.erry.iclear.dateInterface.repository.MawbRepository;
import com.erry.iclear.dateInterface.util.JsonToJava;
import com.erry.iclear.dateInterface.util.NumberUtils;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.Header;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

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

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

    private Gson gson = new Gson();

    @Value("${api.address.iclear-check-url-c}")
    String iclearCheckUrl;

    @Autowired
    private ChmConsignmentService consignmentService;

    @Autowired
    private ChmConsignmentDetailService consignmentDetailService;

    @Autowired
    private BasfMawbRepository basfMawbRepository;

    /**
     * 保存主单Request --basfc
     * @param basfc
     */
    public BasfMawb saveMawbBasf(Basfc basfc){
        BasfMawb result=null;
        try{
            log.info("saveMawb start>>>>>>>>>>>");
            //运单头部信息
            BasfMawb basfMawb = new BasfMawb();
            basfMawb.setAppId(basfc.getAppId());
            basfMawb.setMsgId(basfc.getMsgId());
            basfMawb.setConsignmentCodeId(basfc.getConsignmentId());
            basfMawb.setType(basfc.getConsType());
            //TODO 记录时为同一张表,用 '-->' 记录具体存放字段(方便查看,以免误解)
            //运单号-->提单号
            basfMawb.setBillNo(basfc.getConsignmentCode());
            //经营单位 --> 消费使用/生产销售单位名称
            basfMawb.setOwnerName(basfc.getOperateUnitName());
            //经营单位海关编码 --> 消费使用/生产销售单位代码
            basfMawb.setOwnerCode(basfc.getOperateUnitCode());
            //经营单位社会信用证代码 --> 消费使用/生产销售单位单位统一编码
            basfMawb.setOwnerCodeScc(basfc.getOperateSCC());
            //发件人 --> 境内收发货人名称
            basfMawb.setTradeName(basfc.getSender());
            //发件人海关编码 --> 境内收发货人编号
            basfMawb.setTradeCode(basfc.getShipperCustomsCode());
            //发件人社会信用证代码 --> 生产核销单位统一信用代码---报关形式类型
            basfMawb.setTradeCodeScc(basfc.getShipperSCC());

            basfMawb.setEANNo(basfc.getEANNo());
            //明细
            List<BasfMawbDetail> mawbDetailList = new ArrayList<>();
            if (basfc.getConsignmentList().size()>0){
                for (BasfcDetail basfcDetail : basfc.getConsignmentList()){
                    BasfMawbDetail mawbDetail = new BasfMawbDetail();
                    mawbDetail.setDetailId(String.valueOf(basfcDetail.getConsignmentDetailId()));
                    mawbDetail.setGmodel(basfcDetail.getModel());
                    mawbDetail.setCodeTS(basfcDetail.getSkuCode());
                    mawbDetail.setGname(basfcDetail.getSkuName());
                    mawbDetail.setGqty(basfcDetail.getKnockdownNumber());
                    mawbDetail.setGunit(basfcDetail.getKnockdownUnit());
                    mawbDetail.setFirstUnit(basfcDetail.getUnitLegalFirst());
                    mawbDetail.setFirstQty(NumberUtils.bigDecimalToIntger(basfcDetail.getQtyLegalFirst()));
                    mawbDetail.setSecondQty(NumberUtils.bigDecimalToIntger(basfcDetail.getQtyLegalSecond()));
                    mawbDetail.setSecondUnit(basfcDetail.getUnitLegalSecond());
                    mawbDetail.setDeclTotal(basfcDetail.getDeclaredAmount());
                    mawbDetail.setTradeCurr(basfcDetail.getCurrency());
                    mawbDetail.setDeclaredWeight(basfcDetail.getDeclaredWeight());
                    mawbDetailList.add(mawbDetail);
                }
            }
            basfMawb.setMawbDetailList(mawbDetailList);
            result = basfMawbRepository.save(basfMawb);
            log.info("saveMawb end>>>>>>>>>>>");
        }catch (Exception e){
            log.error("saveMawb() error:"+e.getMessage());
        }
        return result;
    }

    /**
     * 校验主单
     * @param basfMawb
     * @return
     */
    public ResultRS checkBasfMawb(BasfMawb basfMawb){
        ResultRS result = new ResultRS(Boolean.FALSE,null,null);
        try{
            log.info("checkMawb start>>>>>>>>>>  mawb:"+gson.toJson(basfMawb));

            //1、将请求转换为运单
            ChmConsignment chmConsignment=consignmentService.convertToChmConsignmentBasf(basfMawb,null,"IDE-ICLEAR-API");
            if(Objects.equals(chmConsignment,null)){
                result.setCode("30001");
                result.setMsg("数据格式不正确");
                return result;
            }
            List<ChmConsignmentDetail> chmConsignmentDetailList = new ArrayList<>();
            basfMawb.getMawbDetailList().forEach(detail ->{
                chmConsignmentDetailList.add(consignmentDetailService.convertToChmConsignmentDetailBasf(detail,chmConsignment));
            });
            chmConsignment.setChmConsignmentDetailList(chmConsignmentDetailList);

            //调用IClear接口进行运单数据校验
            String objJson = JsonToJava.toJson(chmConsignment);
            Header[] headers = HttpHeader.custom()
                    .other("Content-Type", "application/json")
                    .build();
            log.info("******************* : " + this.iclearCheckUrl);
            //推送海关回执数据
            HttpConfig config = HttpConfig.custom()
                    .headers(headers)
                    .url(this.iclearCheckUrl)
                    .encoding("utf-8")
                    .json(objJson);
            String json = HttpClientUtil.post(config);
            IClearCheckResponseResult iclearCheckResponseResult = JsonToJava.parseJson(json, IClearCheckResponseResult.class);
            result.setSuccess(iclearCheckResponseResult.getSuccess());
            result.setMsg(iclearCheckResponseResult.getMessage());
            log.info("<<<<<<<< checkMawb start >>>>>>>>>>  mawb:"+gson.toJson(basfMawb) +" result :" +result.getSuccess() +" iclear check response : " + json + " status : " + result.getSuccess());
        }catch (Exception e){
            log.error("checkMawb() error:" + e.getMessage());
        }
        return result;
    }
}