FTP上载和解析
FTP下载和解析
FTP服务器地址:192.168.0.80
文件名称:ZJDX_BANK_POS_TRADE_DETAIL_|(yyyyMMdd)|_*
临时文件路径:D:\data\ABC\|date|
FTP服务器文件路径:\data\ABC
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; } }