FTP上传与下载文件

package com.xx.epolicy.jobService.impl;

import com.alibaba.fastjson.JSON;
import com.xx.epolicy.config.propertiesConfig.UploadFtpConfig;
import com.xx.epolicy.constant.Const;
import com.xx.epolicy.imageInterface.*;
import com.xx.epolicy.jobService.PolicyBackBankService;
import com.xx.epolicy.mapper.epolicy.PolicyInfoMapper;
import com.xx.epolicy.mapper.epolicy.PolicyUploadMapper;
import com.xx.epolicy.pojo.po.PolicyInfo;
import com.xx.epolicy.pojo.po.TbFeedbackBankTemp;
import com.xx.epolicy.util.FTPUtil;
import com.xx.epolicy.util.PdfUtil;
import com.xx.epolicy.util.Utils;
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import org.apache.commons.httpclient.util.DateUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;


import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.Locale;
import java.util.stream.Collectors;

@Service
public class PolicyBackBankServiceImpl implements PolicyBackBankService {

    private final static Logger logger = LoggerFactory.getLogger(PolicyBackBankServiceImpl.class);


    @Autowired
    private PolicyUploadMapper policyUploadMapper;

    @Autowired
    private ImageOperation imageOperation;

    @Autowired
    private UploadFtpConfig uploadFtpConfig;

    @Autowired
    private PolicyInfoMapper policyInfoMapper;

    /**
     * 进行回传招xx处理
     * @throws Exception
     */
    @Override
    public void backCmbcBank() throws Exception {
        List<TbFeedbackBankTemp> policyInfo =policyUploadMapper.getPolicyCmbcBankData();
        if(policyInfo==null || policyInfo.size()<0){
            return;
        }
        //      PolicyBackBank bankInfo =new PolicyBackBank();
        for (int i=0;i<policyInfo.size();i++){
            TbFeedbackBankTemp info= policyInfo.get(i);

            ImageFile imageFile = ImageFactory.getDownImageFile(info.getImagePdfDocId(), Const.POLICY_BARCODE);
            ImageDoc imageDoc = ImageFactory.getDoc(imageFile, Const.DOWNLOAD);
            InputStream input = null;
            FileOutputStream downloadFile = null;
            try {
                imageOperation.downLoadImage(imageDoc);
                input = imageFile.getImagePageList().get(0).getFileInputStream();
                String filename=info.getPolicyNo()+".pdf";
                String PolicyPdfPaths ="/mnt/nfs/app_files/epolicy/";
                File PdfPath = new File(PolicyPdfPaths);
                if (!PdfPath.exists()) {
                    if (PdfPath.mkdirs()) {
                        logger.debug("目录["+PdfPath+"]创建成功");
                    } else {
                        logger.error("目录["+PdfPath+"]创建失败");
                    }
                }
                String destination=PolicyPdfPaths+filename;
                int index;
                byte[] bytes = new byte[1024];
                downloadFile = new FileOutputStream(destination);
                while ((index = input.read(bytes)) != -1) {
                    downloadFile.write(bytes, 0, index);
                    downloadFile.flush();
                }
                uploadToCmbcBankFTP(destination);
                policyUploadMapper.updatePolicBackCmbcBankInfo(info.getPolicyInfoId());
                policyUploadMapper.insertAddCmbcInfo(info);


            } catch (Exception e) {
                throw new ImageException("获取PDF文件异常" + e, e);
            } finally {
                if (null!= input){
                    input.close();
                }
                if (null != downloadFile){
                    downloadFile.close();
                }
            }

        }
    }

    /**
     * 取需要回传招xx的数据
     * @throws Exception
     */
    @Override
    public void InsertPolicybackCmbcBank() throws Exception {

        SimpleDateFormat sj = new SimpleDateFormat("yyyyMMdd");
        String time=sj.format(new Date())+"";
        policyUploadMapper.getBackCmbcBank(time);
        
    }

    /**
     * 回传后上传至招xxFTP
     * @throws Exception
     */
    private void uploadToCmbcBankFTP(String path) throws Exception {
        //获取上传文件流与文件名
        InputStream input=new FileInputStream(new File(path));
        String filename=new File(path).getName();

        String ftpAddr = "";
        String ftpUser = "";
        String ftpPass = "";
        String cmbTime = DateUtil.formatDate(new Date(), "yyyyMMdd");
        //  String cmbPath= uploadFtpConfig.getUpLoadEpolicyPath()+cmbTime;
        ftpAddr = uploadFtpConfig.getUpLoadEpolicyCmbAddrs()+cmbTime;
        ftpUser = uploadFtpConfig.getUpLoadEpolicyUserName();
        ftpPass = uploadFtpConfig.getUpLoadEpolicyPassword();
        URL url = new URL(ftpAddr);
        int port=url.getPort()>0?url.getPort():21;
        FTPUtil.uploadCMBFtpFile(url.getHost(),port,ftpUser, ftpPass, url.getPath(), filename, input);
    }


    /**
     * 取需要回传民生xx的数据,此处仅用于处理民生xx历史数据从临时表中回传
     * @throws Exception
     */
    @Override
    public void InsertPolicybackCmsbBank() throws Exception {

        SimpleDateFormat sj = new SimpleDateFormat("yyyyMMdd");
        String time=sj.format(new Date())+"";
        policyUploadMapper.getBackCmsbBank(time);
    }

    /**
     * 进行回传民生xx处理,此处仅用于处理民生xx历史数据从临时表中回传
     * @throws Exception
     */
    @Override
    public void backCmsbBank() throws Exception {
        List<TbFeedbackBankTemp> policyInfoList =policyUploadMapper.getPolicyCmsbBankData();
        if(policyInfoList==null || policyInfoList.size()<0){
            return;
        }
        String PolicyPdfPaths ="/mnt/nfs/app_files/epolicy/";
        File PdfPath = new File(PolicyPdfPaths);
        if (!PdfPath.exists()) {
            if (PdfPath.mkdirs()) {
                logger.debug("目录["+PdfPath+"]创建成功");
            } else {
                logger.error("目录["+PdfPath+"]创建失败");
            }
        }
        //历史数据回传放到下一天的路径
        Date date = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DATE, 1);
        String afterDate = Utils.formatDate(calendar.getTime(), "yyyyMMdd");

        for (int i=0;i<policyInfoList.size();i++){
            TbFeedbackBankTemp info= policyInfoList.get(i);
            // 根据保单id查询保单详情,用于脱敏
            PolicyInfo policy = policyInfoMapper.getPolicyInfoById(info.getPolicyInfoId());
            //logger.info("回传历史保单开始:"+ JSON.toJSONString(policy));

            //脱敏前的文件名
            String tempFilename=policy.getPolicyNo()+".pdf";
            String tempPdf=PolicyPdfPaths+tempFilename;
            //脱敏后的文件名
            String filename="CMBC_0039_DZBD_"+afterDate+"_"+policy.getPolicyNo()+".pdf";
            String destinationPdf=PolicyPdfPaths+filename;
            //列表清单文件名
            String listFilename="CMBC_0039_DZBD_LIST_"+afterDate+".txt";
            String listFile=PolicyPdfPaths+listFilename;
            try {
                //从影像系统下载保险合同
                downLoadImagePdf(policy,tempPdf);
                //进行脱敏处理【渠道代码为:1)事业部01且渠道3为00的新单及重出单;2)事业部01且渠道3为非00的重出单;均需调取影像件,影像件需隐藏客户信息部分(只需隐藏投保单第一页),其他部分正常展示】
                Integer pageNumber=null;
                if((!StringUtils.isEmpty(policy.getChannelCode())  && policy.getChannelCode().endsWith("00") && !StringUtils.isEmpty(policy.getImage()) && "Y".equals(policy.getImage()))
                        ||(!StringUtils.isEmpty(policy.getChannelCode()) && !policy.getChannelCode().endsWith("00") && !StringUtils.isEmpty(policy.getImage()) && "Y".equals(policy.getImage())
                        && !StringUtils.isEmpty(policy.getReappearStatusIdentification()) && "1".equals(policy.getReappearStatusIdentification()))    //保单状态标识 0:新单  1:重出 2:续保
                ) {
                    pageNumber = getNeedImage(tempPdf);
                    logger.info("银保脱机单的影像件在pdf的第"+ pageNumber+"页");
                }
                PdfUtil.pdfReplace(tempPdf, destinationPdf, pageNumber, policy);
                //上传保险合同至民生xxFTP
                uploadToCmsbBankFTP(destinationPdf,afterDate);
                //上传列表清单至民生xxFTP
                uploadListToCmsbBankFtp(listFile, policy, filename,afterDate);
                //回传后修改状态,进行数据记录
                policyUploadMapper.updatePolicBackCmsbBankInfo(policy.getPolicyInfoId());
                policyUploadMapper.insertAddCmsbInfo(info);

            } catch (Exception e) {
                logger.error("回传历史保单异常,获取PDF文件异常" + e);
                continue;
                //throw new ImageException("获取PDF文件异常" + e, e);
            }
        }

    }

    /**
     * 进行回传民生xx处理
     * @throws Exception
     */
    @Override
    public void backMsbBank() {
        Map paramMap = new HashMap();
        paramMap.put("batchNo", Utils.formatDate(new Date(), "yyyyMMdd"));
        List<PolicyInfo> policyInfoList =policyUploadMapper.getPolicyMsbBankData(paramMap);
        List<PolicyInfo> policyInfoList2 =policyUploadMapper.getPolicyMsbBankData2();
        policyInfoList.addAll(policyInfoList2);
        policyInfoList =filterDataList(policyInfoList);
        if(policyInfoList==null || policyInfoList.size()<=0){
            return;
        }
        String PolicyPdfPaths ="/mnt/nfs/app_files/epolicy/";
        File PdfPath = new File(PolicyPdfPaths);
        if (!PdfPath.exists()) {
            if (PdfPath.mkdirs()) {
                logger.debug("目录["+PdfPath+"]创建成功");
            } else {
                logger.error("目录["+PdfPath+"]创建失败");
            }
        }
        String currentDate = Utils.formatDate(new Date(), "yyyyMMdd");
        logger.info("待回传前一天民生xx的数据:"+ policyInfoList.size()+"条");
        //设置每次回传20单
        int count =20;
        count =policyInfoList.size()>count?count:policyInfoList.size();
        for (int i=0;i<count;i++){
            PolicyInfo policy= policyInfoList.get(i);
            logger.info("回传前一天保单开始:"+ policy.getPolicyNo()+","+policy.getPolicyInfoId());

            //脱敏前的文件名
            String tempFilename=policy.getPolicyNo()+".pdf";
            String tempPdf=PolicyPdfPaths+tempFilename;
            //脱敏后的文件名
            String filename="CMBC_0039_DZBD_"+currentDate+"_"+policy.getPolicyNo()+".pdf";
            String destinationPdf=PolicyPdfPaths+filename;
            //列表清单文件名
            String listFilename="CMBC_0039_DZBD_LIST_"+currentDate+".txt";
            String listFile=PolicyPdfPaths+listFilename;
            try {
                //从影像系统下载保险合同
                downLoadImagePdf(policy,tempPdf);
                //进行脱敏处理【渠道代码为:1)事业部01且渠道3为00的新单及重出单;2)事业部01且渠道3为非00的重出单;均需调取影像件,影像件需隐藏客户信息部分(只需隐藏投保单第一页),其他部分正常展示】
                Integer pageNumber=null;
                if((!StringUtils.isEmpty(policy.getChannelCode())  && policy.getChannelCode().endsWith("00") && !StringUtils.isEmpty(policy.getImage()) && "Y".equals(policy.getImage()))
                        ||(!StringUtils.isEmpty(policy.getChannelCode()) && !policy.getChannelCode().endsWith("00") && !StringUtils.isEmpty(policy.getImage()) && "Y".equals(policy.getImage())
                        && !StringUtils.isEmpty(policy.getReappearStatusIdentification()) && "1".equals(policy.getReappearStatusIdentification()))    //保单状态标识 0:新单  1:重出 2:续保
                ) {
                    pageNumber = getNeedImage(tempPdf);
                    logger.info("银保脱机单的影像件在pdf的第"+ pageNumber+"页");
                }
                PdfUtil.pdfReplace(tempPdf, destinationPdf, pageNumber, policy);
                //上传保险合同至民生xxFTP
                uploadToCmsbBankFTP(destinationPdf,currentDate);
                //上传列表清单至民生xxFTP
                uploadListToCmsbBankFtp(listFile, policy, filename,currentDate);
                //回传后进行数据记录
                insertAddCmsbInfo(policy);

                logger.info("回传前一天保单结束");
            } catch (Exception e) {
                logger.error("回传前一天保单异常" + e);
                continue;
            }
        }

    }


    /**
     * 进行重新回传民生xx处理
     * @throws Exception
     */
    @Override
    public void backMsbBankAgain() throws Exception{

        //从民生xxFTP取失败清单
        List<PolicyInfo> policyInfoList = getPolicyDataAgain();
        policyInfoList =filterDataList(policyInfoList);
        if(policyInfoList==null || policyInfoList.size()<=0){
            return;
        }
        String PolicyPdfPaths ="/mnt/nfs/app_files/epolicy/";
        File PdfPath = new File(PolicyPdfPaths);
        if (!PdfPath.exists()) {
            if (PdfPath.mkdirs()) {
                logger.debug("目录["+PdfPath+"]创建成功");
            } else {
                logger.error("目录["+PdfPath+"]创建失败");
            }
        }
        String currentDate = Utils.formatDate(new Date(), "yyyyMMdd");
        logger.info("待重新回传民生xx的数据:"+ policyInfoList.size()+"条");
        //设置每次回传20单
        int count =20;
        count =policyInfoList.size()>count?count:policyInfoList.size();
        for (int i=0;i<count;i++){
            PolicyInfo policy= policyInfoList.get(i);
            logger.info("重新回传保单开始:"+ policy.getPolicyNo()+","+policy.getPolicyInfoId());

            //脱敏前的文件名
            String tempFilename=policy.getPolicyNo()+".pdf";
            String tempPdf=PolicyPdfPaths+tempFilename;
            //脱敏后的文件名
            String filename="CMBC_0039_DZBD_"+currentDate+"_"+policy.getPolicyNo()+".pdf";
            String destinationPdf=PolicyPdfPaths+filename;
            //列表清单文件名
            String listFilename="CMBC_0039_DZBD_LIST_"+currentDate+".txt";
            String listFile=PolicyPdfPaths+listFilename;
            try {
                //从影像系统下载保险合同
                downLoadImagePdf(policy,tempPdf);
                //进行脱敏处理【渠道代码为:1)事业部01且渠道3为00的新单及重出单;2)事业部01且渠道3为非00的重出单;均需调取影像件,影像件需隐藏客户信息部分(只需隐藏投保单第一页),其他部分正常展示】
                Integer pageNumber=null;
                if((!StringUtils.isEmpty(policy.getChannelCode())  && policy.getChannelCode().endsWith("00") && !StringUtils.isEmpty(policy.getImage()) && "Y".equals(policy.getImage()))
                        ||(!StringUtils.isEmpty(policy.getChannelCode()) && !policy.getChannelCode().endsWith("00") && !StringUtils.isEmpty(policy.getImage()) && "Y".equals(policy.getImage())
                        && !StringUtils.isEmpty(policy.getReappearStatusIdentification()) && "1".equals(policy.getReappearStatusIdentification()))    //保单状态标识 0:新单  1:重出 2:续保
                ) {
                    pageNumber = getNeedImage(tempPdf);
                    logger.info("银保脱机单的影像件在pdf的第"+ pageNumber+"页");
                }
                PdfUtil.pdfReplace(tempPdf, destinationPdf, pageNumber, policy);
                //上传保险合同至民生xxFTP
                uploadToCmsbBankFTP(destinationPdf,currentDate);
                //上传列表清单至民生xxFTP
                uploadListToCmsbBankFtp(listFile, policy, filename,currentDate);
                //回传后进行数据记录
                insertAddCmsbInfo(policy);

                logger.info("重新回传保单结束:"+ policy.getPolicyNo()+","+policy.getPolicyInfoId());
            } catch (Exception e) {
                logger.error("重新回传保单异常" + e);
                continue;
            }
        }

    }

    /**
     * 从民生xxFTP下载失败清单
     * @throws Exception
     */
    private void downloadFailListFile(String path, String filename, String cmbTime) throws Exception {
        logger.info("下载失败清单开始:"+ path);
        String ftpAddr = "";
        String ftpUser = "";
        String ftpPass = "";
        //从ftp上下载前一天失败的清单文件
        //  String cmbPath= uploadFtpConfig.getUpLoadMsbPath()+cmbTime;
        ftpAddr = uploadFtpConfig.getUpLoadMsbAddrs()+cmbTime;
        ftpUser = uploadFtpConfig.getUpLoadMsbUserName();
        ftpPass = uploadFtpConfig.getUpLoadMsbPassword();
        URL url = new URL(ftpAddr);
        int port=url.getPort()>0?url.getPort():21;
        FTPUtil.downOneFileFromFtp(url.getHost(),port,ftpUser,ftpPass,url.getPath(),filename, path);
        logger.info("下载失败清单结束");
    }

    /**
     * 读取前一天的失败清单,查询需重新回传的保单
     * @throws Exception
     */
    private List<PolicyInfo> getPolicyDataAgain() throws Exception{
        List<PolicyInfo> policyInfoList =new ArrayList<>();
        List<String> policyNos =new ArrayList<>();

        Date date = new Date();
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DATE, -1);
        String beforeDate = Utils.formatDate(calendar.getTime(), "yyyyMMdd");

        String PolicyPdfPaths ="/mnt/nfs/app_files/epolicy/";
        //失败清单文件名
        String failFilename="CMBC_0039_DZBD_CHECK_"+beforeDate+".txt";
        String failFile=PolicyPdfPaths+failFilename;

        logger.info("读取失败清单开始:"+ failFile);
        BufferedReader in =null;
        try {
            //判断是否已下载失败清单
            File file = new File(failFile);
            if (!file.exists()) {
                //当日触发定时任务跑第一批下载失败清单到本地
                logger.info("下载失败清单路径名称:" + failFile);
                downloadFailListFile(PolicyPdfPaths, failFilename, beforeDate);
            } else {
                //由于没权限从本地nfs的路径删除,所以重新下载,方便测试
                //downloadFailListFile(PolicyPdfPaths, failFilename, beforeDate);

                //根据失败清单查询保单重新上传
                in = new BufferedReader(new FileReader(failFile));
                String line = null;
                while ((line = in.readLine()) != null) {
                    if (!StringUtils.isEmpty(line) && line.startsWith(Const.CMBS_CODE)) {
                        //首行 0039|1|
                    } else {
                        String[] split = line.split("\\|");
                        policyNos.add(split[1]);
                    }
                }
                in.close();
            }

            if (policyNos != null && policyNos.size() > 0) {
                Map paramMap = new HashMap();
                paramMap.put("batchNo",  Utils.formatDate(new Date(), "yyyyMMdd"));
                paramMap.put("policyNos", policyNos);
                policyInfoList = policyUploadMapper.getPolicyMsbBankDataAgain(paramMap);
            }
            logger.info("读取失败清单结束");
        } catch (Exception e) {
            logger.error("读取失败清单异常" + e);
            throw new IOException("读取失败清单异常" + e, e);
        } finally {
            if(in!=null) in.close();
        }
        return policyInfoList;
    }

    /**
     * 过滤数据,取符合条件的数据
     */
    public List<PolicyInfo> filterDataList(List<PolicyInfo> policyInfoList) {
        if(policyInfoList!=null && policyInfoList.size()>0) {
            //无保全变更单,取质检时间最早的那单回传(注意此处Null单或者N单包含了Y单下同保单号的Null单,是需要剔除)
            List<PolicyInfo> list1 = policyInfoList.stream().filter(info -> StringUtils.isEmpty(info.getChangeAppntFlag()) || !"Y".equals(info.getChangeAppntFlag()))
                    .sorted(Comparator.comparing(PolicyInfo::getCheckTime))
                    .collect(Collectors.collectingAndThen(
                            Collectors.toCollection(() -> new TreeSet<>(
                                    Comparator.comparing(user -> user.getPolicyNo()))), ArrayList::new));

            //有保全变更单,取质检时间最晚的那单保全变更单回传
            List<PolicyInfo> list2 = policyInfoList.stream().filter(info -> !StringUtils.isEmpty(info.getChangeAppntFlag()) && "Y".equals(info.getChangeAppntFlag()))
                    .sorted(Comparator.comparing(PolicyInfo::getCheckTime).reversed())
                    .collect(Collectors.collectingAndThen(
                            Collectors.toCollection(() -> new TreeSet<>(
                                    Comparator.comparing(user -> user.getPolicyNo()))), ArrayList::new));
            list1.addAll(list2);
            //剔除掉有保全变更Y单下同保单号的Null单或者N单
            list1 = list1.stream()
                    .sorted(Comparator.comparing(PolicyInfo::getChangeAppntFlag, Comparator.nullsLast(String::compareTo)).reversed())   //Y——>N——>NUll单排序
                    .collect(Collectors.collectingAndThen(
                            Collectors.toCollection(() -> new TreeSet<>(
                                    Comparator.comparing(user -> user.getPolicyNo()))), ArrayList::new));
            policyInfoList =list1;
        }
        return policyInfoList;
    }

    /**
     * 从影像系统下载保险合同
     * @throws Exception
     */
    public void downLoadImagePdf(PolicyInfo info,String tempPdf) throws Exception{
        logger.info("从影像系统下载保险合同开始:"+ info.getPolicyNo()+","+info.getPolicyInfoId());
        ImageFile imageFile = ImageFactory.getDownImageFile(info.getImagePdfDocId(), Const.POLICY_BARCODE);
        ImageDoc imageDoc = ImageFactory.getDoc(imageFile, Const.DOWNLOAD);
        InputStream input =null;
        FileOutputStream downloadFile=null;
        try {
            imageOperation.downLoadImage(imageDoc);
            input = imageFile.getImagePageList().get(0).getFileInputStream();
            int index;
            byte[] bytes = new byte[1024];
            downloadFile = new FileOutputStream(tempPdf);
            while ((index = input.read(bytes)) != -1) {
                downloadFile.write(bytes, 0, index);
            }
            downloadFile.flush();
            downloadFile.close();
            input.close();
            logger.info("从影像系统下载保险合同结束");
        } catch (Exception e) {
            logger.error("从影像系统下载保险合同异常,获取PDF文件异常" + e);
            throw new ImageException("从影像系统下载保险合同异常,获取PDF文件异常" + e, e);
        } finally {
            if(downloadFile!=null) downloadFile.close();
            if(input!=null) input.close();
        }
    }


    /**
     * 计算返回需要影像件图片页脱敏的pdf页码
     * @throws Exception
     */
    private Integer getNeedImage(String path){
        PdfDocument pdf =new PdfDocument();
        pdf.loadFromFile(path);
        int index=0;
        Integer imageIndex=null;
        //遍历PDF每一页
        for(int i=0;i<pdf.getPages().getCount();i++){
            //获取PDF页面
            PdfPageBase page = pdf.getPages().get(i);
            if(page.extractImages()!=null && page.extractImages().length>0){
                for (BufferedImage image:page.extractImages()) {
                    //需要脱敏的页(判断影像件页区别于二维码图片)
                    if(image.getHeight()>1000){
                        imageIndex=i+1;
                        //System.out.println("图片在:"+imageIndex +"页,图片宽:"+image.getWidth()+",高:"+image.getHeight());
                        break;
                    }
                }
                if(imageIndex!=null){
                    break;
                }
            }
        }
        pdf.close();
        logger.info("打印Locale.getDefault:"+ JSON.toJSONString(Locale.getDefault()));
        Locale.setDefault(Locale.CHINA);
        return imageIndex;
    }

    /**
     * 上传保险合同至民生xxFTP
     * @throws Exception
     */
    private void uploadToCmsbBankFTP(String path,String cmbTime) throws Exception {
        logger.info("上传Ftp开始:"+ path);
        //获取上传文件流与文件名
        final InputStream input=new FileInputStream(new File(path));
        String filename=new File(path).getName();

        String ftpAddr = "";
        String ftpUser = "";
        String ftpPass = "";
        // String cmbTime = Utils.formatDate(new Date(), "yyyyMMdd");
        //  String cmbPath= uploadFtpConfig.getUpLoadMsbPath()+cmbTime;
        ftpAddr = uploadFtpConfig.getUpLoadMsbAddrs()+cmbTime;
        ftpUser = uploadFtpConfig.getUpLoadMsbUserName();
        ftpPass = uploadFtpConfig.getUpLoadMsbPassword();
        URL url = new URL(ftpAddr);
        int port=url.getPort()>0?url.getPort():21;
        FTPUtil.uploadCMBFtpFile(url.getHost(),port,ftpUser, ftpPass, url.getPath(), filename, input);
        logger.info("上传Ftp结束");
    }

    /**
     * 上传列表清单至民生xxFTP
     * @throws Exception
     */
    private void uploadListToCmsbBankFtp(String path,PolicyInfo policy,String filename,String cmbTime) throws Exception {
        if(policy!=null) {
            logger.info("写入列表清单开始:"+ policy.getPolicyNo()+","+ policy.getPolicyInfoId());

            FileWriter out =null;
            BufferedReader in =null;
            RandomAccessFile raf =null;
            try {
                //1、判断文件存在则追加内容;如果文件不存在,则创建文件,此处设置为true即可追加
                out = new FileWriter(path, true);
                in = new BufferedReader(new FileReader(path));
                if (StringUtils.isEmpty(in.readLine())) {
                    out.write(Const.CMBS_CODE + "|1|\r\n");   //此处1代表保单数量
                } else {
                    out.write("\r\n");
                }
                in.close();
                //往文件追加  20190101|BD00000000001|CMBC_0040_DZBD_20190101_BD00000000001.pdf|
                String polApplyDate = Utils.formatDate(policy.getPolApplyDate(), "yyyyMMdd");
                //String polApplyDate =DateUtil.formatDate(policy.getPolApplyDate(), "yyyyMMdd");   //不要用此工具类,有问题,转换出来的日期少一天
                out.write(polApplyDate + "|" + policy.getPolicyNo() + "|" + filename + "|");

                //2、更新txt文本保单数量
                raf = new RandomAccessFile(path, "rw");
                String line = raf.readLine();
                if (!StringUtils.isEmpty(line) && line.startsWith(Const.CMBS_CODE + "|")) {
                    String[] split = line.split("\\|");
                    //移动RandomAccessFile的位置0则至行首,先写入分隔前部分的内容,再写入替换的内容,最后写入分隔后部分的内容
                    raf.seek(split[0].length());
                    int oldNum = Integer.valueOf(split[1].toString());
                    oldNum++;
                    String newNum = String.valueOf(oldNum);
                    raf.writeBytes("|" + newNum + "|");   //写入替换的新内容
                }
                raf.close();

                //刷新IO内存流
                out.flush();
                //关闭
                out.close();
                logger.info("写入列表清单结束");
                uploadToCmsbBankFTP(path, cmbTime);
            } catch (Exception e) {
                logger.error("写入列表清单异常" + e);
                throw new IOException("写入列表清单异常" + e, e);
            } finally {
                if(in!=null) in.close();
                if(raf!=null) raf.close();
                if(out!=null) out.close();
            }
        }
    }

    /**
     * 回传后进行记录
     */
    public void insertAddCmsbInfo(PolicyInfo info){
        //回传后进行数据记录
        TbFeedbackBankTemp tbInfo = new TbFeedbackBankTemp();
        String time = Utils.formatDate(new Date(), "yyyyMMdd");
        tbInfo.setBatchNo(time);
        tbInfo.setPolicyInfoId(info.getPolicyInfoId());
        tbInfo.setPolicyNo(info.getPolicyNo());
        tbInfo.setImagePdfDocId(info.getImagePdfDocId());
        tbInfo.setCheckTime(info.getCheckTime());
        policyUploadMapper.insertAddCmsbInfo(tbInfo);
    }


}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值