FedexService.java 9.43 KB
package com.erry.iclear.dateInterface.service;

import com.alibaba.fastjson.JSON;
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.FedexMawbRepository;
import com.erry.iclear.dateInterface.util.HttpUtils;
import com.erry.iclear.dateInterface.util.JsonToJava;
import com.google.gson.Gson;
import io.swagger.annotations.ApiModelProperty;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.Header;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;

import javax.persistence.*;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.*;
import java.util.stream.Collectors;

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

    private Gson gson = new Gson();

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

    @Autowired
    private ChmConsignmentService consignmentService;

    @Autowired
    private ChmConsignmentDetailService consignmentDetailService;

    @Autowired
    private FedexMawbRepository fedexMawbRepository;

    /**
     * 保存主单Request --fedexc
     * @param fedexc
     */
    public FedexMawb saveMawbFedex(Fedexc fedexc){
        FedexMawb result=null;
        try{
            log.info("saveMawb start>>>>>>>>>>>");
            FedexMawb fedexMawb = this.generateFedexMawb(fedexc);
            result = fedexMawbRepository.save(fedexMawb);
            log.info("saveMawb end>>>>>>>>>>>");
        }catch (Exception e){
            log.error("saveMawb() error:"+e.getMessage());
        }
        return result;
    }

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

        fedexMawb.setEanNo(fedexc.getEanNo());
        //明细
        List<FedexMawbDetail> mawbDetailList = new ArrayList<>();
        List<FedexDetail> consignmentList = fedexc.getConsignmentList();
        if (Objects.nonNull(consignmentList) &&consignmentList.size()>0){
            for (FedexDetail fedexcDetail : fedexc.getConsignmentList()){
                FedexMawbDetail mawbDetail = new FedexMawbDetail();
                mawbDetail.setDetailId(String.valueOf(fedexcDetail.getConsignmentDetailId()));
                mawbDetail.setGmodel(fedexcDetail.getModel());
                mawbDetail.setCodeTS(fedexcDetail.getSkuCode());
                mawbDetail.setGname(fedexcDetail.getSkuName());
                mawbDetail.setGqty(fedexcDetail.getKnockdownNumber());
                mawbDetail.setGunit(fedexcDetail.getKnockdownUnit());
                mawbDetail.setFirstUnit(fedexcDetail.getUnitLegalFirst());
                mawbDetail.setFirstQty(fedexcDetail.getQtyLegalFirst());
                mawbDetail.setSecondQty(fedexcDetail.getQtyLegalSecond());
                mawbDetail.setSecondUnit(fedexcDetail.getUnitLegalSecond());
                mawbDetail.setDeclTotal(fedexcDetail.getDeclaredAmount());
                mawbDetail.setTradeCurr(fedexcDetail.getCurrency());
                mawbDetail.setDeclaredWeight(fedexcDetail.getDeclaredWeight());
                mawbDetailList.add(mawbDetail);
            }
        }
        fedexMawb.setMawbDetailList(mawbDetailList);

        return fedexMawb;
    }

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

            //1、将请求转换为运单
            ChmConsignment chmConsignment=consignmentService.convertToChmConsignmentFedex(fedexMawb,null,"IDE-ICLEAR-API");
            if(Objects.equals(chmConsignment,null)){
                result.setCode("30001");
                result.setMsg("数据格式不正确");
                return result;
            }
            List<ChmConsignmentDetail> chmConsignmentDetailList = new ArrayList<>();
            fedexMawb.getMawbDetailList().forEach(detail ->{
                chmConsignmentDetailList.add(consignmentDetailService.convertToChmConsignmentDetailFedex(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);
            Map<String,String> headerMap = new HashMap<>();
            headerMap.put("Content-Type", "application/json");
            String json = HttpUtils.doPost(this.iclearCheckUrl,objJson,headerMap);

            log.info("iclearCheckUrl:"+json);

            IClearCheckResponseResult iclearCheckResponseResult = JsonToJava.parseJson(json, IClearCheckResponseResult.class);
            result.setSuccess(iclearCheckResponseResult.getSuccess());
            result.setCode(iclearCheckResponseResult.getCode());
            result.setMsg(iclearCheckResponseResult.getMessage());
            log.info("<<<<<<<< checkMawb start >>>>>>>>>>  mawb:"+gson.toJson(fedexMawb) +" result :" +result.getSuccess() +" iclear check response : " + json + " status : " + result.getSuccess());
        }catch (Exception e){
            log.error("checkMawb() error:",e);
        }
        return result;
    }


    /**
     * 校验BASF接口信息
     * @param fedexc
     * @return
     */
    public ResultRS checkBasfInterfaceData(Fedexc fedexc){

        ResultRS result = new ResultRS(Boolean.FALSE,"","");

        if(Objects.equals(fedexc,null)){
            result.setCode("-7");
            result.setMsg("请求信息不能为空");
        }else{
            List<String> msgList = new ArrayList<>();
//            参数consignmentCode不能为空
            String consignmentCode = fedexc.getConsignmentCode();
            if(StringUtils.isEmpty(consignmentCode)){
                msgList.add("参数consignmentCode不能为空");
            }
//            参数consignmentId不能为空
//            Long consignmentId = fedexc.getConsignmentId();
//            if(Objects.isNull(consignmentId)){
//                msgList.add("参数consignmentId不能为空");
//            }
//            参数consType不能为空
            String consType = fedexc.getConsType();
            if(StringUtils.isEmpty(consType)){
                msgList.add("参数consType不能为空");
            }
//            参数sender不能为空
            String sender = fedexc.getSender();
            if(StringUtils.isEmpty(sender)){
                msgList.add("参数sender不能为空");
            }
//            参数shipperSCC不能为空
            String shipperSCC = fedexc.getShipperSCC();
            if(StringUtils.isEmpty(shipperSCC)){
                msgList.add("参数shipperSCC不能为空");
            }
            if(msgList.size() > 0){
                String join = msgList.stream().collect(Collectors.joining(";"));
                result.setCode("-7");
                result.setMsg(join);
            }
        }
        return result;
    }
}