CustomXmlHandleThread.java 11.3 KB
package com.tianbo.analysis.handle;

import com.tianbo.analysis.model.ALLOCATEARRIVAL;
import com.tianbo.analysis.model.CustomReception;
import com.tianbo.analysis.service.*;
import com.tianbo.analysis.service.imp.*;
import com.tianbo.analysis.tools.AWBTools;
import com.tianbo.util.Date.DateUtil;
import com.tianbo.util.XML.XMLXPath;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileExistsException;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.xml.sax.SAXParseException;

import javax.annotation.PostConstruct;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.UnsupportedEncodingException;
import java.util.concurrent.CountDownLatch;

/**
 * @author mrz
 * @e
 * 海关新舱单回执解析xml文件
 */
@Data
@Component
@Slf4j
public class CustomXmlHandleThread implements Runnable{

    private CountDownLatch latch;
    //备份目录
    @Value("${custom.receptBakDir}")
    private String bakupDir;

    //解析出错转移目录
    @Value("${custom.errBakDir}")
    private String errBakDir;

    private File xmlfile;
    private  static CustomXmlHandleThread customXmlHandle;
    //海关新舱单回执报头
    public final static String MessageID =      "//Manifest/Head/MessageID";
    public final static String FunctionCode =   "//Manifest/Head/FunctionCode";
    public final static String MessageType =    "//Manifest/Head/MessageType";
    public final static String SenderID =       "//Manifest/Head/SenderID";
    public final static String ReceiverID =     "//Manifest/Head/ReceiverID";
    public final static String SendTime =       "//Manifest/Head/SendTime";
    public final static String Version =        "//Manifest/Head/Version";


    /**
     * 海关普通业务新舱单回执报体
     */
    public final static String JourneyID =      "//Manifest/Response/BorderTransportMeans/JourneyID";
    public final static String WaybillMaster =  "//Manifest/Response/Consignment/TransportContractDocument/ID";
    public final static String WaybillSecond =  "//Manifest/Response/Consignment/AssociatedTransportDocument/ID";
    public final static String ResponseCode =   "//Manifest/Response/Consignment/ResponseType/Code";
    public final static String ResponseText =   "//Manifest/Response/Consignment/ResponseType/Text";

    /**
     * 海关国际转运业务回执报体
     */
    public final static String ImportJourneyID = "//Manifest/Response/ImportInformation/BorderTransportMeans/JourneyID";
    public final static String ImportWaybillMaster = "//Manifest/Response/ImportInformation/Consignment/TransportContractDocument/ID";
    public final static String ExportJourneyID = "//Manifest/Response/ExportInformation/BorderTransportMeans/JourneyID";
    public final static String ExportWaybillMaster = "//Manifest/Response/ExportInformation/Consignment/TransportContractDocument/ID";
    public final static String TransResponseCode =   "//Manifest/Response/ResponseType/Code";
    public final static String TransResponseText =   "//Manifest/Response/ResponseType/Text";


    //通过@PostConstruct实现初始化bean之前进行的操作,解决service调用空指针问题
    @PostConstruct
    public void init() {
        customXmlHandle = this;

        customXmlHandle.bakupDir = this.bakupDir;

        customXmlHandle.errBakDir = this.errBakDir;

        // 初使化时将已静态化的testService实例化
    }

    @Override
    public void run() {
        log.info("线程:{}开始",xmlfile.getName());
        try{
            int i =handelXmlDocument();
            String today = DateUtil.getTodayBy_yyyyMMdd();
            String backdireByDay =  customXmlHandle.bakupDir + "/" + today;
            //操作成功,则转移剪切解析文件到备份目录,否则转移到error目录备份
            if(i>0){
                File bakupDirectory = new File(backdireByDay);
                //复制一份到转发目录
                //解析成功备份一份到备份目录
                FileUtils.moveFileToDirectory(xmlfile,bakupDirectory,true);
            }else {
                errBak(xmlfile);
            }
        }catch (FileExistsException e){
            log.error("错误的解析文件剪切失败,目标目录已存在同名文件");
        }catch (Exception e){
            log.error("错误的解析文件剪切失败,目标目录已存在同名文件",e);
            errBak(xmlfile);
            e.printStackTrace();
        }

        log.info("线程:{}结束",xmlfile.getName());
        latch.countDown();
        log.info("剩余线程数量{}",latch.getCount());

    }
    /**
     *
     *
     * @return
     * @throws DocumentException
     * @throws UnsupportedEncodingException
     * @throws SAXParseException
     * @throws FileNotFoundException
     */
    public int handelXmlDocument() throws DocumentException,UnsupportedEncodingException,SAXParseException,FileNotFoundException {

        int i = 0;

        SAXReader saxReader = new SAXReader();
        Document document = saxReader.read(xmlfile);
        Element contentRoot = document.getRootElement();

        String flightNo = "";
        String flightDate = "";

        //开始解析
        String msgType = XMLXPath.getSingleValueByPath(document,MessageType);
        String journeyid = XMLXPath.getSingleValueByPath(document,JourneyID);
//            XMLXPath.getSingleValueByPath(document, )

        if(!StringUtils.isEmpty(journeyid)){

            String[] flightList = journeyid.split("/");
            if(flightList.length > 0){
                flightNo = flightList[0];
                flightDate = flightList[1];
            }


        }

        String awbA = XMLXPath.getSingleValueByPath(document,WaybillMaster);
        //全格式的分单 如 17212345678_ADBD
        String awbH = XMLXPath.getSingleValueByPath(document,WaybillSecond);
        String resCode = XMLXPath.getSingleValueByPath(document,ResponseCode);
        String resText = XMLXPath.getSingleValueByPath(document,ResponseText);
        String messageId = XMLXPath.getSingleValueByPath(document, MessageID);
        String sendTime = XMLXPath.getSingleValueByPath(document,SendTime);
        String sendId = XMLXPath.getSingleValueByPath(document,SenderID);
        String reciveId = XMLXPath.getSingleValueByPath(document,ReceiverID);
        String version = XMLXPath.getSingleValueByPath(document,Version);
        String functionCode = XMLXPath.getSingleValueByPath(document,FunctionCode);

        CustomReception customReception = new CustomReception(  msgType,
                                                                flightNo,
                                                                flightDate,
                                                                awbA,
                                                                awbH,
                                                                resCode,
                                                                resText,
                                                                messageId,
                                                                sendTime,
                                                                sendId,
                                                                reciveId,
                                                                version,
                                                                functionCode);
        switch (msgType){
            case "MT9999":
                i = customXmlHandle.coustomAnalysisService.insertRecept(customReception);
                break;
            case "MT3201":
                i= customXmlHandle.arrivedmasterService.insertRecept(customReception);
                break;
            case "MT5202":
                i = customXmlHandle.tallymasterService.insertRecept(customReception);
                break;
            case "MT5201":
                i = customXmlHandle.tallymasterService.insertRecept(customReception);
                break;
            case "MT4201":
                i = customXmlHandle.departuresloadingService.insertRecept(customReception);
                break;
            case "MT1201":
                i = customXmlHandle.coustomAnalysisService.insertRecept(customReception);
                break;
            case "MT2201":
                i = customXmlHandle.preparemasterService.insertRecept(customReception);
                break;
            case "MT6202":
                i = customXmlHandle.inportallocateService.insertRecept(customReception);
                break;
            case "MT3202":
                ALLOCATEARRIVAL allocatearrival = new ALLOCATEARRIVAL(customReception);
                i= allocatearrival.analysisReception();
                break;
            case "MT8205":
                transXmlHandel(document,customReception);
                break;
            default:
                break;

        }

        return i;

    }

    /**
     * 国际转运回执处理
     * @param document
     * @param customReception
     * @return
     */
    private int transXmlHandel(Document document,CustomReception customReception){

        String importJourneyID = XMLXPath.getSingleValueByPath(document,ImportJourneyID);
        String importFlightNo = "UNKONW";
        String importFlightDate = "00000000";
        if(!StringUtils.isEmpty(importJourneyID)){
            importFlightNo = AWBTools.splitFlightAndDate(importJourneyID)[0];
            importFlightDate = AWBTools.splitFlightAndDate(importJourneyID)[1];
        }


        String importWaybillMaster= XMLXPath.getSingleValueByPath(document,ImportWaybillMaster);
        String transResponseCode=XMLXPath.getSingleValueByPath(document,TransResponseCode);
        String transResponseText=XMLXPath.getSingleValueByPath(document,TransResponseText);
        CustomReception transCustomReception = new CustomReception(  customReception.getMessageType(),
                importFlightNo,
                importFlightDate,
                importWaybillMaster,
                transResponseCode,
                transResponseText,
                customReception.getMessageID(),
                customReception.getSendTime(),
                customReception.getSenderID(),
                customReception.getReceiverID(),
                customReception.getVersion(),
                customReception.getFunctionCode());
        int i=customXmlHandle.internationaltransitService.insertRecept(transCustomReception);

        return i;

    }

    public void errBak(File file){
        try {
            String today = DateUtil.getTodayBy_yyyyMMdd();
            String errDirByDay = customXmlHandle.errBakDir + "/" + today;
            File berrDirectory = new File(errDirByDay);
            FileUtils.moveFileToDirectory(file,berrDirectory,true);
            log.info("数据库未找到与回执适配的信息备份文件:{}:"+file.getName());
        }catch (FileExistsException e){
            log.error("备份解析错误文件失败,目标文件夹存在同名文件{}",file.getName());
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}