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.
*
* 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点下载.
*/
@XxlJob(value="AliPayBillJob")
public ReturnT 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 list = new ArrayList();
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.
* @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 map = new HashMap();
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;
}
/**
* 下载对账单.
* @param urlStr
* @param billDate 下载账单日期.
* @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;
}
/**
* 创建文件夹.
*/
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天的备份文件.
* @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);
}
}