FTP下载和解析

FTP服务器地址:192.168.0.80
文件名称:ZJDX_BANK_POS_TRADE_DETAIL_|(yyyyMMdd)|_*
临时文件路径:D:\data\ABC\|date|
FTP服务器文件路径:\data\ABC
package com.skysz.app.cmcs.zjt.bankpos.task;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import com.skysz.app.cmcs.zjt.bankpos.domain.TradeDetailPos;
import com.skysz.app.cmcs.zjt.bankpos.service.TradeDetailPosService;
import com.skysz.framework.action.ActionResponse;
import com.skysz.framework.action.ResponseType;
import com.skysz.framework.file.FileUtils;
import com.skysz.framework.ftpConfig.domain.FTPParam;
import com.skysz.framework.ftpConfig.domain.FtpSolution;
import com.skysz.framework.ftpConfig.domain.FtpSolutionLine;
import com.skysz.framework.ftpConfig.service.FtpSolutionService;
import com.skysz.framework.schedule.Task;
import com.skysz.framework.utils.CollectionUtils;
import com.skysz.framework.utils.StringUtils;
import com.skysz.framework.utils.date.DateFormator;
import com.skysz.framework.utils.date.DateUtils;

public class TradeDetailPosTask extends Task {

	public static final String SEPARATOR = "\\|"; // 分割符
	protected TradeDetailPosService<TradeDetailPos> tradeDetailPosService;
	protected FtpSolutionService<FtpSolution> ftpSolutionService;

	public void setTradeDetailPosService(
			TradeDetailPosService<TradeDetailPos> tradeDetailPosService) {
		this.tradeDetailPosService = tradeDetailPosService;
	}

	public void setFtpSolutionService(
			FtpSolutionService<FtpSolution> ftpSolutionService) {
		this.ftpSolutionService = ftpSolutionService;
	}
	
	@Override
	public ActionResponse task(final String... arg0) {

		return TradeDetailPosTask.this.taskOperate(arg0);

	}

	public ActionResponse taskOperate(String... param) {
		ActionResponse ar = new ActionResponse(ResponseType.FAILURE);

		TradeDetailPosTaskForABC abc = new TradeDetailPosTaskForABC(ftpSolutionService,tradeDetailPosService);
		ar = abc.task(param);
		if (!ar.getResponseType().equals(ResponseType.SUCCESS)) {
			return ar;
		}

		TradeDetailPosTaskForCCB ccb = new TradeDetailPosTaskForCCB(ftpSolutionService,tradeDetailPosService);
		ar = ccb.task(param);
		if (!ar.getResponseType().equals(ResponseType.SUCCESS)) {
			return ar;
		}

		TradeDetailPosTaskForICBC icbc = new TradeDetailPosTaskForICBC(ftpSolutionService,tradeDetailPosService);
		ar = icbc.task(param);
		if (!ar.getResponseType().equals(ResponseType.SUCCESS)) {
			return ar;
		}
		ar.setResponseType(ResponseType.SUCCESS);
		return ar;
	}

	public String loginFtpAndDownload(String ftp_code, FTPParam param) {
		return this.ftpSolutionService.operate(ftp_code, param);
	}

	/**
	 * 获取配置的ftp配置信息
	 * 
	 * @param ftp_code
	 * @return
	 */
	public FtpSolutionLine getFtpConfig(String ftp_code) {
		List<FtpSolutionLine> list = this.tradeDetailPosService
				.findByFTPCode(ftp_code);
		if (!CollectionUtils.isEmpty(list)) {
			return list.get(0);
		}
		return null;
	}

	/**
	 * 解析下载后的文件
	 * 
	 * @author zhuzj
	 * @param filePath
	 *            下载文件的存放路径(此路径必须包含"|date|",具体请看FtpSolutionService里面operate方法实现)
	 * @param date 子目录
	 * @return
	 */
	public List<String[]> analysisFileByDownload(String filePath) {
		List<String[]> tdpList = new ArrayList<String[]>();
		String path = filePath.replace("|date|", DateUtils.toString(DateUtils.now(),DateFormator.YEAR_MONTH_DAY));
		File file = new File(path);
		// 得到下载目录下的所有文件名
		String[] fileNames = file.list();

		BufferedReader bufReader = null;
		InputStreamReader isr = null;
		try {
			for (int i = 0; i < fileNames.length; i++) {
				// 得到要读取的文件完整路径
				String realPath = path + FileUtils.getFileSeparator()
						+ FileUtils.getFileSeparator() + fileNames[i];
				isr = new InputStreamReader(new FileInputStream(realPath));
				bufReader = new BufferedReader(isr);
				while (bufReader.ready()) {
					// 1. 得到每一条数据
					String dataLine = bufReader.readLine();
					// log.info("================"+dataLine+"============================");
					String[] dataArray = StringUtils.split(dataLine, SEPARATOR);
					// 3.验证
					tdpList.add(dataArray);
				}
			}
		} catch (Exception e) {
			log.info("--------------------解析文件异常---------------------");
		}
		return tdpList;
	}

}



package com.skysz.app.cmcs.zjt.bankpos.task;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.skysz.app.cb.bank.domain.CbBank;
import com.skysz.app.cmcs.zjt.bankpos.domain.TradeDetailPos;
import com.skysz.app.cmcs.zjt.bankpos.lock.TradeDetailPosLock;
import com.skysz.app.cmcs.zjt.bankpos.lock.TradeDetailPosLockEntity;
import com.skysz.app.cmcs.zjt.bankpos.service.TradeDetailPosService;
import com.skysz.framework.action.ActionResponse;
import com.skysz.framework.action.ActionUtils;
import com.skysz.framework.action.ResponseType;
import com.skysz.framework.ftpConfig.domain.FTPParam;
import com.skysz.framework.ftpConfig.domain.FtpSolution;
import com.skysz.framework.ftpConfig.domain.FtpSolutionLine;
import com.skysz.framework.ftpConfig.service.FtpSolutionService;
import com.skysz.framework.lock.ActionLockCallback;
import com.skysz.framework.lock.Lock;
import com.skysz.framework.lock.LockHandler;
import com.skysz.framework.utils.CollectionUtils;
import com.skysz.framework.utils.StringUtils;
import com.skysz.framework.utils.date.DateUtils;

public class TradeDetailPosTaskForABC extends TradeDetailPosTask {
	private final static String FTP_CODE = "ftpForABC";

	public TradeDetailPosTaskForABC() {

	}

	public TradeDetailPosTaskForABC(
			FtpSolutionService<FtpSolution> ftpSolutionService,
			TradeDetailPosService<TradeDetailPos> tradeDetailPosService) {
		this.ftpSolutionService = ftpSolutionService;
		this.tradeDetailPosService = tradeDetailPosService;
	}

	@Override
	public ActionResponse task(final String... arg0) {
		// 加锁
		LockHandler handler = new LockHandler();
		return (ActionResponse) handler.execute(new ActionLockCallback() {
			public Lock prepare() {
				Lock lock = TradeDetailPosLock.getLock(
						new TradeDetailPosLockEntity(1L),
						TradeDetailPosLock.getLockInfo());
				lock.lock();
				return lock;
			}

			public Object validHandler(Lock lock) {
				// 成功得到对象锁后 需要做的一些处理
				return TradeDetailPosTaskForABC.this.taskOperate(arg0);
			}
		});
	}

	public ActionResponse taskOperate(String... params) {
		ActionResponse ar = new ActionResponse(ResponseType.FAILURE);
		log.info("------------------农行POS交易明细数据接口计划任务start---------------------");
		Date startDate = DateUtils.preDays(DateUtils.now(), 1);// 默认前一天日期

		if (params.length > 0) {// 大于0表示手动执行
			if (!StringUtils.isNullOrBlank(params[0])) {
				startDate = DateUtils.toDate(params[0]);
				startDate = DateUtils.preDays(startDate, 1);
			}
		}

		FTPParam param = new FTPParam();
		param.setFileDate(startDate);
		// 1.登录Ftp 并下载文件
		String result = loginFtpAndDownload(FTP_CODE, param);
		if (!"succ".equals(result)) {
			log.info("文件下载失败,请检查FTP方案配置");
			ar.setResponseType(ResponseType.WARNING, "文件下载失败,请检查FTP方案配置.");
			return ar;
		}

		// 得到Ftp配置
		FtpSolutionLine fl = getFtpConfig(FTP_CODE);
		// 2.解析下载后的数据
		List<String[]> strList = analysisFileByDownload(fl.getToPath());
		// 3.组数据

		List<TradeDetailPos> tdpList = new ArrayList<TradeDetailPos>();
		for (String[] str : strList) {
			TradeDetailPos tdp = new TradeDetailPos();
			if (StringUtils.isNullOrBlank(str[0])) {
				continue;
			}
			if (StringUtils.isNullOrBlank(str[1])) {
				continue;
			}
			if (StringUtils.isNullOrBlank(str[2])) {
				continue;
			}
			if (StringUtils.isNullOrBlank(str[6])) {
				continue;
			}
			if (StringUtils.isNullOrBlank(str[7])) {
				continue;
			}
			if (StringUtils.isNullOrBlank(str[9])) {
				continue;
			}
			if (str[0].length() > 200) {
				tdp.setPosMerchNo(str[0].substring(0, 200));
			} else {
				tdp.setPosMerchNo(str[0]);
			}
			if (str[1].length() > 200) {
				tdp.setPosTerminalNo(str[1].substring(0, 200));
			} else {
				tdp.setPosTerminalNo(str[1]);
			}
			tdp.setBank(new CbBank(2L));
			tdp.setPosAmount(Double.parseDouble(str[2]));
			tdp.setPosFee(Double.parseDouble(str[3]));
			if (StringUtils.isNullOrBlank(str[4])) {
				tdp.setPosFeeInstalment(0.00d);
			} else {
				tdp.setPosFeeInstalment(Double.parseDouble(str[4]));
			}
			tdp.setPosSerialNo(str[5]);
			tdp.setPosCardNo(str[6]);
			tdp.setPosDate(DateUtils.toDate(str[7], "yyyyMMdd"));
			if (StringUtils.isNullOrBlank(str[8])) {
				tdp.setPosTime(DateUtils.toDate(str[7] + " " + str[8],
						"yyyyMMdd HHmmss"));
			}
			tdp.setTradeType(str[9]);
			tdp.setCancelNo(str[10]);
			ActionUtils.setWho(tdp);
			tdp.setEnable(true);
			tdpList.add(tdp);
		}

		// 保存
		if (CollectionUtils.isNotEmpty(tdpList)) {
			this.tradeDetailPosService.insertAll(tdpList);
		}
		ar.setResponseType(ResponseType.SUCCESS);
		log.info("------------------农行POS交易明细数据接口计划任务end---------------------");
		return ar;
	}

}

猜你喜欢

转载自jin8000608172.iteye.com/blog/1732217
今日推荐