//package com.zteits.pay.job;
//
//import java.math.BigDecimal;
//import java.util.ArrayList;
//import java.util.Date;
//import java.util.List;
//
//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 com.clouds.common.utils.DateUtil;
//import com.xxl.job.core.biz.model.ReturnT;
//
////import com.xxl.job.core.context.XxlJobHelper;
//import com.zteits.pay.dao.TdBPayBlncacDiffDao;
//import com.zteits.pay.domain.TdBPayBlncacDiff;
///**
// * 支付宝/微信 对账定时任务.
// *
// * Copyright: Copyright (c) 2017 zteits
// *
// * @ClassName: CloudsParkDurationJob.java
// * @Description:
// * @version: v1.0.0
// * @author: wangfs
// * @date: 2017年10月13日 下午4:32:48
// * Modification History:
// * Date Author Version Description
// *---------------------------------------------------------*
// * 2017年10月13日 wangfs v1.0.0 创建
// */
//@XxlJob(value="BillReconciliationJob")
//@Component
//public class BillReconciliationJob {
//
// private static final Logger logger = LoggerFactory.getLogger(BillReconciliationJob.class);
//
// @Autowired
// private TdBPayBlncacDiffDao TdBPayBlncacDiffDao;
//
// /**
// * 每天 11:00 执行对账结果.
// */
// @Override
// public ReturnT execute(String... params) throws Exception {
// String param = XxlJobHelper.getJobParam();
// if (StringUtils.isNotEmpty(param) && params == null) {
// params = param.split(",");
// }
//
// try{
// this.beginAccounts();
// }catch (Exception e) {
// if (e instanceof InterruptedException) {
// throw e;
// }
// logger.warn("{}", e);
// return ReturnT.FAIL;
// }
// return ReturnT.SUCCESS;
// }
//
// /**
// * 开始对账.
// * 步骤:
// * 1.插入下载账单 left join 支付单信息数据(不卡支付单支付完成状态).
// * 3.插入支付单中下载账单中不存在的支付单信息.
// * 4.更新停车场/车牌号/泊位区间等信息.
// * 5.金额想减 对账.
// */
// private void beginAccounts(){
// String yesterday = DateUtil.getDateString(DateUtil.getOffsetDaysDate(new Date(), -1), DateUtil.DATE_FORMAT);
// this.logger("begin对账,对账账期="+yesterday+"...");
// //1.删除昨天帐期数据
// this.logger("开始删除昨天对账差异表数据...");
// int deleteCount = TdBPayBlncacDiffDao.deleteByBillTime(yesterday);
// this.logger("结束删除昨天对账差异表数据...结果(成果删除)="+deleteCount+"条。");
// //2.插入下载账单 left join 支付单信息数据(不卡支付单支付完成状态)
// this.logger("开始插入下载账单数据...");
// int intsetBillCount = TdBPayBlncacDiffDao.insertBillPayOrder(yesterday);
// this.logger("结果插入下载账单数据...结果(成功插入)="+intsetBillCount+"条。");
// //3.插入支付单中下载账单不存在的支付单信息
// this.logger("开始插入支付单中下载账单不存在的支付单信息...");
// int intsetBillNotExistCount = TdBPayBlncacDiffDao.insertPayOrderNotExitsInBill(yesterday);
// this.logger("结果插入支付单中下载账单不存在的支付单信息...结果(成功插入)="+intsetBillNotExistCount+"条。");
//
// //4.更新停车场/车牌号
// this.logger("开始更新停车场/车牌号等信息...");
// int updateCount = TdBPayBlncacDiffDao.updateTdBPayBlncacDiff(yesterday);
// this.logger("结果更新停车场/车牌号等信息...结果(成功更新)="+updateCount+"条。");
// //4.1.更新停车场/车牌号/泊位区间等信息
// this.logger("开始更新泊位区间等信息...");
// int updateCountAreaPark = TdBPayBlncacDiffDao.updateTdBPayBlncacDiffForAreaPark(yesterday);
// this.logger("结果更新泊位区间等信息...结果(成功更新)="+updateCountAreaPark+"条。");
// /**5.对账.*/
// this.beginBillReconciliation(yesterday);
// this.logger("end对账,对账账期="+yesterday+"...");
//
// }
// /**
// * 开始对账
// * 步骤:
// * 1.查询指定时间对账单结果信息.
// * 2.对账(金额相减法)
// * @param billTime
// */
// private void beginBillReconciliation(String billTime){
// //对账结果list
// List listReult = new ArrayList();
// List list = new ArrayList();
// this.logger("开始查询"+billTime+"对账差异表信息");
// list = TdBPayBlncacDiffDao.queryPayBlncacDifForList(billTime);
// this.logger("结果查询"+billTime+"对账差异表信息,结果(list.size)="+list.size());
// if(!CollectionUtils.isEmpty(list)){
// for(TdBPayBlncacDiff str:list){
// TdBPayBlncacDiff resultBlncacDiff = new TdBPayBlncacDiff();
// if(str != null){
// int diffFee= str.getBlncacActFee().subtract(str.getOrderPayedFee()).intValue();
// /** 差异费用=账文件记录费用 - 订单已付费用(单位:分). */
// //this.logger("记录ID="+str.getId()+" 账文件记录费用="+str.getBlncacActFee().toString()+" 订单已付费用="+str.getOrderPayedFee()+" 差异费用="+diffFee);
// /** 对账差异类型:0-无差异 1-金额差异(两侧都有但金额不同) 2-掉单(支付机构侧有,我侧没有) 3-多单(支付机构侧没有,我侧有). */
//
// if(0 == diffFee){
// resultBlncacDiff.setBlncacDiffType(0); //0-无差异
// resultBlncacDiff.setQeualType(1); // 平账类型 0:未平账 1:已平账.
// resultBlncacDiff.setBillRemarks("账文件记录费用-订单已付费用="+diffFee+"对账结果=已平账");
// }else{
// if(0 == str.getBlncacActFee().intValue() && 0 != str.getOrderPayedFee().intValue()){
// resultBlncacDiff.setBlncacDiffType(3); //3-多单(支付机构侧没有,我侧有)
// resultBlncacDiff.setQeualType(0); // 平账类型 0:未平账 1:已平账.
// resultBlncacDiff.setBillRemarks("账文件记录费用-订单已付费用="+diffFee+"对账结果=3多单(支付机构侧没有,我侧有)");
// }
// if(0 != str.getBlncacActFee().intValue() && 0== str.getOrderPayedFee().intValue()){
// resultBlncacDiff.setBlncacDiffType(2); //2-掉单(支付机构侧有,我侧没有)
// resultBlncacDiff.setQeualType(0); // 平账类型 0:未平账 1:已平账.
// resultBlncacDiff.setBillRemarks("账文件记录费用-订单已付费用="+diffFee+"对账结果=2掉单(支付机构侧有,我侧没有");
//
// }
// if(str.getBlncacActFee().intValue() > 0 && str.getOrderPayedFee().intValue() >0 && 0 != diffFee){
// resultBlncacDiff.setBlncacDiffType(1); //1-金额差异(两侧都有但金额不同)
// resultBlncacDiff.setQeualType(0); // 平账类型 0:未平账 1:已平账.
// resultBlncacDiff.setBillRemarks("账文件记录费用-订单已付费用="+diffFee+"对账结果=1金额差异(两侧都有但金额不同)");
// }
// }
// resultBlncacDiff.setId(str.getId());
// resultBlncacDiff.setDiffFee(new BigDecimal(diffFee));
// resultBlncacDiff.setModfiyDate(new Date());
// listReult.add(resultBlncacDiff);
//
// }
// }
// }else{
// this.logger("没有查询到"+billTime+"对账差异表信息");
// }
//
// if(!CollectionUtils.isEmpty(listReult)){
// //更新对账结果
// this.logger("开始更新对账结果到对账差异表");
// int updateCount = TdBPayBlncacDiffDao.updateBillReconciliationById(listReult);
// this.logger("结束更新对账结果到对账差异表,结果(更新条数)="+updateCount+"条。");
// /**更新支付单对账状态.*/
// this.updatePayOrderBlncacDiff();
// }
// }
// /**
// * 更新支付单对账状态.
// */
// private void updatePayOrderBlncacDiff(){
// this.logger("开始更新支付单对账状态,对账时间...");
// int updateCount = TdBPayBlncacDiffDao.updatePayOrderBlncacDiff();
// this.logger("end更新支付单对账状态,对账时间...,结果(成功更新)="+updateCount);
//
// }
//
// private void logger(String msg){
// XxlJobHelper.log(msg);
// logger.info(msg);
// }
//
//}