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 tradeDetailPosService;
protected FtpSolutionService ftpSolutionService;

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

public void setFtpSolutionService(
FtpSolutionService 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 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 analysisFileByDownload(String filePath) {
List tdpList = new ArrayList();
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 ftpSolutionService,
TradeDetailPosService 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 strList = analysisFileByDownload(fl.getToPath());
// 3.组数据

List tdpList = new ArrayList();
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;
}

}

你可能感兴趣的:(FTP,下载,解析,计划任务,加锁,思凯科技专用)