AliPayBillJob.java 12.3 KB
package com.zteits.pay.job;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.xxl.job.core.handler.annotation.XxlJob;
import com.zteits.pay.allipay.AlipayConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import org.apache.commons.lang3.StringUtils;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayDataDataserviceBillDownloadurlQueryRequest;
import com.alipay.api.response.AlipayDataDataserviceBillDownloadurlQueryResponse;
import com.clouds.common.utils.DateUtil;
import com.clouds.common.utils.ZIpUtil;
import com.clouds.common.utils.csv.CSVUtils;
import com.xiaoleilu.hutool.io.FileUtil;
import com.xxl.job.core.biz.model.ReturnT;

import com.xxl.job.core.context.XxlJobHelper;
import com.zteits.clouds.api.apibase.constants.ErrorType;
import com.zteits.clouds.api.apibase.exception.BizException;
import com.zteits.clouds.api.dto.pay.param.AliPayBillDownLoadQueryRequest;
import com.zteits.pay.allipay.AliPayBillConfig;
import com.zteits.pay.dao.TdBPayBlncacDao;
/**
 * 支付宝日账单下载JOB.<br/>
 *
 * Copyright: Copyright (c) 2017  zteits
 *
 * @ClassName: AliPayBillJob.java
 * @Description:
 * @version: v1.0.0
 * @author: wangfs
 * @date: 2017年7月5日   上午10:24:20
 * Modification History:
 * Date             Author          Version            Description
 *---------------------------------------------------------*
 * 2017年7月5日      wangfs           v1.0.0               创建
 */
@Component("com.zteits.pay.job.AliPayBillJob")
public class AliPayBillJob {
	private static final Logger logger = LoggerFactory.getLogger(AliPayBillJob.class);

	@Autowired
	private TdBPayBlncacDao tdBPayBlncacDao;

	/**
	 * 定时下载日账单-->每天1点下载.<br/>
	 */
	@XxlJob(value="AliPayBillJob")
	public ReturnT<String> execute(String... params) throws Exception {
	String param = XxlJobHelper.getJobParam();
	if (StringUtils.isNotEmpty(param) && params == null) {
		params = param.split(",");
	}


		AliPayBillDownLoadQueryRequest aliPayBillDownLoadQueryRequest = new AliPayBillDownLoadQueryRequest();
		Boolean downFlg = false;
		List<String[]> list = new ArrayList<String[]>();

		int insertCount = 0;

		this.logger("开始支付宝日账单下载定时任务...");

        try{
		    //1.创建文件夹
			createDirectory(new String[]{AliPayBillConfig.FILE_PATH,AliPayBillConfig.FILE_PATH_BAK});
			this.logger("完成创建文件夹创建...");
			//2.删除备份前60天的文件
			boolean deleteFlg = delFile(AliPayBillConfig.FILE_PATH_BAK);
			this.logger("删除前60天的备份数据,结果="+(deleteFlg ==true ? "是" : "否"));

			//3.删除文件
			boolean flg = this.deleteFile(AliPayBillConfig.FILE_PATH);
			this.logger("删除压缩后的csv文件,结果="+(flg == true ? "成功!" : "失败!"));

			String yesterday = DateUtil.getDateString(DateUtil.getOffsetDaysDate(new Date(), -1), DateUtil.DATE_FORMAT);
			this.logger("查询"+yesterday+"对账单下载地址");

			aliPayBillDownLoadQueryRequest.setBillDate(yesterday);
			/**3.获取对账单下载地址*/
			String billDownURL = queryBillDownLoadURL(aliPayBillDownLoadQueryRequest);
			this.logger("查询对账单地址="+(StringUtils.isNotEmpty(billDownURL)? billDownURL :"没有交易,查询对账单地址为空!"));
			if(StringUtils.isNotEmpty(billDownURL)){
				this.logger("开始下载对账单...");
				/**4.下载对账单.*/
				downFlg = BillDownLoad(billDownURL,yesterday);
			}
			this.logger("是否下载到日对账单? "+(downFlg == true ? "是" : "否"));
			if(downFlg){
				String yesterday_yyyMMdd = DateUtil.getDateString(DateUtil.getOffsetDaysDate(new Date(), -1), DateUtil.YYYYMMDD);
				//解压对账单
				ZIpUtil.unZip(AliPayBillConfig.FILE_PATH+yesterday+".zip",AliPayBillConfig.FILE_PATH);
				this.logger("解压完成...");
				//移动zip文件到备份目录
				FileUtil.move(new File(AliPayBillConfig.FILE_PATH+yesterday+".zip"), new File(AliPayBillConfig.FILE_PATH_BAK), true);
				this.logger("完成"+yesterday+".zip 文件备份...");
				//读取svc文件
				this.logger("开始读取日账单文件...");
			   list = CSVUtils.csvRead(AliPayBillConfig.FILE_PATH,AliPayBillConfig.FILE_NAME_PREFIX+
					   yesterday_yyyMMdd+AliPayBillConfig.FILE_NAME_SUFFIX,5L,"---业务明细列表结束--");
			   this.logger("完成日账单文件读取,结果(list.size)="+list.size());
			}
			if(!CollectionUtils.isEmpty(list)){

				this.logger("开始插入日账单文件...");
				/**插入日账单数据.*/
				insertCount = tdBPayBlncacDao.insert(list);
				this.logger("完成日账单入库,结果="+(insertCount >0 ? "插入成功"+insertCount+" 条。" :"插入失败!"));

			}
			this.logger("完成支付宝日账单下载定时任务...");
        }catch (Exception e) {
        	 if (e instanceof InterruptedException) {
        	        throw e;
        	    }
        	    logger.warn("{}", e);
		}
		return insertCount > 0 ? ReturnT.SUCCESS :ReturnT.FAIL;
	}

	/**
	 * 查询对账单URL.<br/>
	 * @param aliPayBillDownLoadQueryRequest
	 * @return
	 */
	private String queryBillDownLoadURL(AliPayBillDownLoadQueryRequest aliPayBillDownLoadQueryRequest){
		logger.info("[{}],开始查询对账单下载地址,入参={}",aliPayBillDownLoadQueryRequest.getBaseRequest().getRequestId(),JSONObject.toJSONString(aliPayBillDownLoadQueryRequest.getBillDate()));
		String billDownURL = "";
		try{
			if(StringUtils.isNotEmpty(aliPayBillDownLoadQueryRequest.getBillDate())){
				Map<String,String> map = new HashMap<String, String>();
				map.put("bill_type", "trade");
				map.put("bill_date", aliPayBillDownLoadQueryRequest.getBillDate());
				AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.BILL_URL_QUERY,
						AlipayConfig.APPID,
						AlipayConfig.APP_PRIVATE_KEY,
						 "json",
						 "GBK",
						 AlipayConfig.ALIPAY_PUBLIC_KEY,//"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvuJpdfmJxVtWWKwG3uBF7cfRIggJBbrJ9meT8jfkc6/DyF+wXazHBLD9f3qf1eALol95Yz6vXbteB3g3S9y6QtQDUJ4pl9TExtPZt46uIC0TaU4EDcSM5pqOmOq5tkKaiN5TITN41dO0XG+0ZsoIyAd0PuBQ/rxAp8ofpmW9Ev21IclxcYP8kQXUahg2exjQ1mjJJZfmBaurbgDzMUCpzSjj5Z5SPiiA+Y+Lm/d2jDFoHnAxU5RhUQl2SRwUAah91JZmexLlbJy4PG4ukp95F8o/tNSFakpLP6rAIcokSwrBkezv/tqqEhyRqPi9X8Wnioh+qOZ7Ll4dlwiTLgsBeQIDAQAB",
						 AlipayConfig.SIGN_TYPE);


				AlipayDataDataserviceBillDownloadurlQueryRequest request = new AlipayDataDataserviceBillDownloadurlQueryRequest();//创建API对应的request类
				request.setBizContent(JSONObject.toJSONString(map));
				AlipayDataDataserviceBillDownloadurlQueryResponse response = alipayClient.execute(request);
				if(response.isSuccess()){
					JSONObject result = JSONObject.parseObject(response.getBody());
					JSONObject jsonObject =(JSONObject) result.get("alipay_data_dataservice_bill_downloadurl_query_response");
					if("Success".equals(jsonObject.get("msg"))){
						logger.info("获取账单下载地址成功,bill_download_url={}",jsonObject.get("bill_download_url").toString());
						billDownURL = jsonObject.get("bill_download_url").toString();
					}else {
						logger.info("获取账单下载地址失败!");
					}
				}
			}else{
				throw new BizException(ErrorType.PARAMM_NULL, "入参不能为空!");
			}
		}catch (Exception e) {
			e.printStackTrace();
		}
		logger.info("[{}],完成查询对账单下载地址,返回结果={}",aliPayBillDownLoadQueryRequest.getBaseRequest().getRequestId(),billDownURL);
		return billDownURL;
	}

	/**
	 * 下载对账单.<br/>
	 * @param urlStr
	 * @param billDate 下载账单日期.<br/>
	 * @return
	 */
	private boolean BillDownLoad(String urlStr,String billDate){
		boolean flg =false;
		//指定希望保存的文件路径
		String filePath = AliPayBillConfig.FILE_PATH + billDate +".zip";
		logger.info("开始下载对账单,对账单下载路径={}",filePath);
		URL url = null;
		HttpURLConnection httpUrlConnection = null;
		InputStream fis = null;
		FileOutputStream fos = null;
		try {
		    url = new URL(urlStr);
		    httpUrlConnection = (HttpURLConnection) url.openConnection();
		    httpUrlConnection.setConnectTimeout(5 * 1000);
		    httpUrlConnection.setDoInput(true);
		    httpUrlConnection.setDoOutput(true);
		    httpUrlConnection.setUseCaches(false);
		    httpUrlConnection.setRequestMethod("GET");
		    httpUrlConnection.setRequestProperty("Charsert", "GBK");
		    httpUrlConnection.connect();
		    fis = httpUrlConnection.getInputStream();
		    byte[] temp = new byte[1024];
		    int b;
		    fos = new FileOutputStream (new File(filePath));
		    while ((b = fis.read(temp)) != -1) {
		        fos.write(temp, 0, b);
		        fos.flush();
		    }
		} catch (MalformedURLException e) {
		    e.printStackTrace();
		} catch (IOException e) {
		    e.printStackTrace();
		} finally {
		    try {
		    	if(fis != null){
		    		fis.close();
		    	}
		    	if(fos != null) {
		    		fos.close();
		    	}
		    	if (null != httpUrlConnection) {
		    		httpUrlConnection.disconnect();
		    	}
		    	flg = true;
		    } catch (IOException e) {
		        e.printStackTrace();
		    }
		}
		logger.info("完成下载对账单,对账单下载路径={}",filePath);
		return flg;
	}

	/**
	 * 创建文件夹.<br/>
	 */
	private static void  createDirectory(String[] filePath){
		if(filePath != null && filePath.length >0){
			for(String str: filePath){
				File file = new File(str);
				FileUtil.mkdir(file);
			}
		}

	}

	/**
	 * 删除文件
	 * @param filePath
	 * @return
	 */
	public boolean deleteFile(String filePath){
		File file = new File(filePath);
		boolean flg =false;
		if (file == null || file.exists() == false) {
			return true;
		}
		if(file.isDirectory()){
			File[] files = file.listFiles();
			for (File childFile : files) {
				flg = childFile.delete();
				if(!flg){
				  return false;
				}
			}
		}else{
			flg = file.delete();
		}
		return flg;
	}




	/**
	 * 删除前7天的备份文件.<br/>
	 * @param filePath
	 * @return
	 */
	private static boolean  delFile(String filePath){
		boolean flg = false;
		//获取前60天的日期
		String dateBeforSeven = DateUtil.getDateString(DateUtil.getOffsetDaysDate(new Date(), -60), DateUtil.YYYYMMDD);
		if(StringUtils.isNotEmpty(filePath)){
			File file = new File(filePath);
			if(file.isDirectory()){
				File[] ff = file.listFiles();
				for(File f:ff){
					if(f.isFile()){
						if(f.getName().contains(dateBeforSeven+".zip")){
							f.delete();
							flg = true;
						}
					}
				}
			}
		}
		return flg;
	}

	public static void main(String[] args) throws Exception {
        AliPayBillDownLoadQueryRequest aliPayBillDownLoadQueryRequest = new AliPayBillDownLoadQueryRequest();
        AliPayBillJob job = new AliPayBillJob();
		//1.创建文件夹
				createDirectory(new String[]{AliPayBillConfig.FILE_PATH,AliPayBillConfig.FILE_PATH_BAK});
				//2.删除备份前7天的文件
				delFile(AliPayBillConfig.FILE_PATH_BAK);
				//logger("删除前7天的备份数据,结果="+(deleteFlg ==true ? "是" : "否"));

				String yesterday = DateUtil.getDateString(DateUtil.getOffsetDaysDate(new Date(), -2), DateUtil.DATE_FORMAT);

				//this.logger("查询"+yesterday+"对账单下载地址");
				aliPayBillDownLoadQueryRequest.setBillDate(yesterday);
				/**获取对账单下载地址*/
				String billDownURL = job.queryBillDownLoadURL(aliPayBillDownLoadQueryRequest);
				if(StringUtils.isNotEmpty(billDownURL)){
					job.BillDownLoad(billDownURL,yesterday);
				}
				//this.logger("是否下载到日对账单? "+(downFlg == true ? "是" : "否"));
				//解压对账单
				ZIpUtil.unZip(AliPayBillConfig.FILE_PATH+yesterday+".zip",AliPayBillConfig.FILE_PATH);
				//移动
				FileUtil.move(new File(AliPayBillConfig.FILE_PATH+"2017-07-02.zip"), new File(AliPayBillConfig.FILE_PATH_BAK), true);

	//System.out.println(AliPayBillConfig.FILE_PATH+"2017-07-02.zip");

	  //ZIpUtil.unZip(AliPayBillConfig.FILE_PATH+"2017-07-02.zip",AliPayBillConfig.FILE_PATH);
	}

	private void logger(String msg){
		XxlJobHelper.log(msg);
		logger.info(msg);
	}








}