ApiService.java 14.3 KB
package com.erry.iclear.dateInterface.service;

import com.erry.iclear.dateInterface.enums.ErrorCodeEnum;
import com.erry.iclear.dateInterface.api.request.Mawb;
import com.erry.iclear.dateInterface.api.request.MawbDetail;
import com.erry.iclear.dateInterface.api.request.ReceiptMessage;
import com.erry.iclear.dateInterface.api.response.TokenResult;
import com.erry.iclear.dateInterface.entity.ChmConsignment;
import com.erry.iclear.dateInterface.entity.ChmConsignmentDetail;
import com.erry.iclear.dateInterface.entity.DeclearTask;
import com.erry.iclear.dateInterface.repository.ChmConsignmentRepository;
import com.erry.iclear.dateInterface.repository.DeclearTaskRepository;
import com.erry.iclear.dateInterface.repository.HsCodeRepository;
import com.erry.iclear.dateInterface.repository.ReceiptMessageRepository;
import com.erry.iclear.dateInterface.util.DateUtils;
import com.erry.iclear.dateInterface.util.HttpUtils;
import com.erry.iclear.dateInterface.util.JsonToJava;
import com.erry.iclear.dateInterface.util.SSLClient;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;
import java.math.BigDecimal;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;

/**
 * 调用API接口Service
 * mt
 * 2021年7月28日17:04:27
 */
@Service
@Slf4j
@Transactional(rollbackOn = Exception.class)
public class ApiService {
    @Value("${api.token-info.username}")
    String username;
    @Value("${api.token-info.password}")
    String password;
    @Value("${api.address.token-url}")
    String tokenUrl;
    @Value("${api.address.refresh-token-url}")
    String refreshTokenUrl;
    @Value("${api.address.customs-url}")
    String customsUrl;
    @Value("${api.address.complete-msg-url}")
    String completeMsgUrl;

    @Value("${api.address.proxy-url}")
    String proxyUrl;
    @Value("${api.address.proxy-port}")
    Integer proxyPort;

    @Value("${spring.profiles.active}")
    String env;

    @Autowired
    ReceiptMessageRepository receiptMessageRepository;

    @Autowired
    DeclearTaskRepository declearTaskRepository;

    @Autowired
    ChmConsignmentRepository consignmentRepository;

    @Autowired
    ChmConsignmentService consignmentService;

    @Autowired
    ChmConsignmentDetailService consignmentDetailService;

    @Autowired
    private HsCodeRepository hsCodeRepository;

    /**
     * 获取token信息
     * @return
     * @throws Exception
     */
    public TokenResult getToken() throws Exception{
        Map<String,String> map = new HashMap<String,String>();
        map.put("username", this.username);
        map.put("password", this.password);
//        String tokenJson = HttpUtils.doPost(this.tokenUrl,map);
        log.info("tokenUrl:"+this.tokenUrl);
        String tokenJson = HttpUtils.doProxyPost(this.tokenUrl,map,this.proxyUrl,this.proxyPort);
        log.info("getToken:"+tokenJson);

        TokenResult tokenResult = JsonToJava.parseJson(tokenJson,TokenResult.class);
        return tokenResult;
    }

    /**
     * 刷新token
     * @param token
     * @throws Exception
     */
    public void refreshToken(String token) throws Exception{
        Map<String,String> map = new HashMap<String,String>();
        map.put("token", token);
        HttpUtils.doProxyPost(this.refreshTokenUrl,map,this.proxyUrl,this.proxyPort);
    }

    /**
     * 传输海关回执数据
     * @param token
     * @throws Exception
     * GNo、codeTs、gName、gModel、gUnit
     */
    public void pushCustoms(String token){
        //获取海关回执数据
        List<ReceiptMessage> receiptMessageList = this.receiptMessageRepository.findReceiptMessageList();
        //去除微秒
        for(int i = 0 ; i < receiptMessageList.size() ; i ++){
            ReceiptMessage receiptMessage = receiptMessageList.get(i);
            Date noticeDate = DateUtils.string2Date(receiptMessage.getNoticeDate(),null);
            String nDate = DateUtils.formatDate(noticeDate,"yyyy-MM-dd HH:mm:ss");
            receiptMessage.setNoticeDate(nDate);
        }
        this.sendCustoms(token,receiptMessageList);
    }

    /**
     * 将海关回执数据发送至西门子
     * @param token
     * @param receiptMessageList
     */
    public void sendCustoms(String token ,List<ReceiptMessage> receiptMessageList){
        Map<String,String> headerMap = this.createHeaderMap(token);
        List<DeclearTask> declearTaskList = new ArrayList<DeclearTask>();
        receiptMessageList.forEach(d->{
            DeclearTask declearTask = new DeclearTask();
            try {
                //设置ID
                declearTask.setChmsignmentId(BigDecimal.valueOf(d.getId()));
                //推送时间
                declearTask.setPushTime(new Date());
                String objJson = JsonToJava.toJson(d);
                log.info("推送海关回执json: " + objJson);
                //推送海关回执数据
//                String json = HttpUtils.doPost(this.customsUrl,objJson,headerMap);
                String json = HttpUtils.doProxyPost(this.customsUrl,objJson,headerMap,this.proxyUrl,this.proxyPort);
                log.info("sendCustoms:"+json);
                //接口响应时间
                declearTask.setResponseTime(new Date());
                TokenResult tokenResult = JsonToJava.parseJson(json,TokenResult.class);
                if(tokenResult.getErrorcode().equals(ErrorCodeEnum.SUCCESS.getCode())){
                    //推送成功,记录推送状态
                    declearTask.setResponseResults(tokenResult.getErrorcode());
                    declearTask.setResponseContent(tokenResult.getErrormessage());
                    declearTaskList.add(declearTask);
                }else if(tokenResult.getErrorcode().equals(ErrorCodeEnum.ERROR_10004.getCode()) || tokenResult.getErrorcode().equals(ErrorCodeEnum.ERROR_10013.getCode())){
                    //如果凭证失效,则刷新凭证
                    refreshToken(token);
                }else{
                    //推送失败,记录推送状态
                    declearTask.setResponseResults(tokenResult.getErrorcode());
                    declearTask.setResponseContent(tokenResult.getErrormessage());
                    declearTaskList.add(declearTask);
                    log.info("海关回执推送失败,推送相应码为:"+tokenResult.getErrorcode() + ",推送ID为:" + d.getId());
                }
            }catch(Exception ex){
                //接口响应时间
                declearTask.setResponseTime(new Date());
                declearTask.setResponseResults("99999");
                declearTask.setResponseContent(ex.getMessage());
                declearTaskList.add(declearTask);

                log.error(ex.getMessage(),ex);
            }
        });
        declearTaskList.forEach(declearTask -> {
            //将已经推送完成的回执信息状态修改
            this.receiptMessageRepository.updateDeclearTaskStatus(declearTask.getPushTime(),
                    declearTask.getResponseTime(),
                    declearTask.getResponseResults(),
                    declearTask.getResponseContent(),
                    "2",
                    declearTask.getChmsignmentId().longValue());
        });
    }

    public void pushMawbAcc(String token,List<DeclearTask> declearTaskList){
        try{
            /****************将Export对象转换成西门子交互实体对象****************/
            //查询需要推送数据
            List<Mawb> mawbList = new ArrayList<Mawb>();
            declearTaskList.forEach(declearTask -> {
                Long consignmentId = declearTask.getChmsignmentId().longValue();
                //查询需要推送运单数据,并且转换
                ChmConsignment consignment = this.consignmentRepository.findChmConsignmentById(consignmentId);
                Mawb mawb = this.consignmentService.convertToChmConsignment(consignment);
                //获取需要推送运单数据,并且转换
                if(consignment.getChmConsignmentDetailList() != null){
                    List<MawbDetail> mawbDetailList = new ArrayList<MawbDetail>();
                    for(int i = 0 ; i < consignment.getChmConsignmentDetailList().size() ; i++){
                        ChmConsignmentDetail detail = consignment.getChmConsignmentDetailList().get(i);
                        MawbDetail mawbDetail = this.consignmentDetailService.convertToChmConsignmentDetail(detail, String.valueOf((i + 1)));
                        mawbDetailList.add(mawbDetail);
                    }
                    mawb.setMawbDetailList(mawbDetailList);
                }
                mawbList.add(mawb);
            });
            this.sendMawb(token,mawbList);
        }catch(Exception ex){
            log.error(ex.getMessage(),ex);
        }
    }
    /**
     * 传输完整报文数据
     * @param token
     * @throws Exception
     */
    public void pushMawb(String token){
        List<DeclearTask> declearTaskList = this.declearTaskRepository.findDeclearTask();
        if (declearTaskList == null){
            return;
        }
        this.pushMawbAcc(token,declearTaskList);
    }

    /**
     * 将完整报文发送至西门子
     * @param token
     * @param mawbList
     */
    public void sendMawb(String token ,List<Mawb> mawbList){
        Map<String,String> headerMap = this.createHeaderMap(token);
        List<DeclearTask> declearTaskList = new ArrayList<DeclearTask>();
        mawbList.forEach(d->{
            DeclearTask declearTask = new DeclearTask();
            try {
                //设置ID
                declearTask.setChmsignmentId(BigDecimal.valueOf(d.getId()));
                //推送时间
                declearTask.setPushTime(new Date());
                String objJson = JsonToJava.toJson(d);
                //推送海关回执数据
                String json = HttpUtils.doProxyPost(this.completeMsgUrl,objJson,headerMap,this.proxyUrl,this.proxyPort);
                log.info("sendMawb:"+json);
                //接口响应时间
                declearTask.setResponseTime(new Date());
                TokenResult tokenResult = JsonToJava.parseJson(json,TokenResult.class);
                if(tokenResult.getErrorcode().equals(ErrorCodeEnum.SUCCESS.getCode())){
                    //推送成功,记录推送状态
                    declearTask.setResponseResults(tokenResult.getErrorcode());
                    declearTask.setResponseContent(tokenResult.getErrormessage());
                    declearTaskList.add(declearTask);
                }else if(tokenResult.getErrorcode().equals(ErrorCodeEnum.ERROR_10004.getCode()) || tokenResult.getErrorcode().equals(ErrorCodeEnum.ERROR_10013.getCode())){
                    //如果凭证失效,则刷新凭证
                    refreshToken(token);
                }else{
                    //推送失败,记录推送状态
                    declearTask.setResponseResults(tokenResult.getErrorcode());
                    declearTask.setResponseContent(tokenResult.getErrormessage());
                    declearTaskList.add(declearTask);
                    log.info("完整报关单推送失败,推送相应码为:"+tokenResult.getErrorcode() + ",推送ID为:" + d.getId());
                }
            }catch(Exception ex){
                //接口响应时间
                declearTask.setResponseTime(new Date());
                declearTask.setResponseResults("99999");
                declearTask.setResponseContent(ex.getMessage());
                declearTaskList.add(declearTask);

                log.error(ex.getMessage(),ex);
            }
        });
        declearTaskList.forEach(declearTask -> {
            //将已经推送完成的报关单状态修改
            this.receiptMessageRepository.updateDeclearTaskStatus(declearTask.getPushTime(),
                    declearTask.getResponseTime(),
                    declearTask.getResponseResults(),
                    declearTask.getResponseContent(),
                    "1",
                    declearTask.getChmsignmentId().longValue());
        });
    }
    /**
     * 传输推送失败回执数据
     * @param token
     * @throws Exception
     */
    public void pushErrorReturnDate(String token){
        //获取海关回执数据
        List<ReceiptMessage> receiptMessageList = receiptMessageRepository.findReceiptMessageErrorReturnList();
        if (receiptMessageList !=null && receiptMessageList.size() > 0){
            //去除微秒
            for(int i = 0 ; i < receiptMessageList.size() ; i ++){
                ReceiptMessage receiptMessage = receiptMessageList.get(i);
                Date noticeDate = DateUtils.string2Date(receiptMessage.getNoticeDate(),null);
                String nDate = DateUtils.formatDate(noticeDate,"yyyy-MM-dd HH:mm:ss");
                receiptMessage.setNoticeDate(nDate);
            }
            sendCustoms(token,receiptMessageList);
        }
    }
    /**
     * 传输推送失败申报数据
     * @param token
     * @throws Exception
     */
    public void pushErrorDeclareDate(String token){
        //获取海关申报数据
        List<DeclearTask> declearTaskList = this.declearTaskRepository.findErrorDeclearTask();
        if (declearTaskList == null){
            return;
        }
       pushMawbAcc(token,declearTaskList);
    }

    /**
     * 连接iclear应用指定节点,并且判断是否正常访问
     * @param url
     * @return
     */
    public boolean connectIclearNode(String url){
        boolean result = false;
        try {
            Integer statusCode = HttpUtils.doProxyGet(url,this.proxyUrl,this.proxyPort);
            if(statusCode == 200){
                result = true;
            }
        } catch (Exception ex) {
            log.error(ex.getMessage(),ex);
        }
        return result;
    }

    /**
     * 获取headerMap
     * @param token
     * @return
     */
    private Map<String,String> createHeaderMap(String token){
        Map<String,String> headerMap = new HashMap<String,String>();
        headerMap.put("Content-Type", "application/json");
        headerMap.put("Authorization", token);
        return headerMap;
    }
}