package com.zteits.ipay.biz;
import org.apache.commons.collections4.CollectionUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.clouds.common.utils.ListCopyUtil;
import com.zteits.clouds.api.apibase.bean.BizResult;
import com.zteits.clouds.api.apibase.constants.ErrorType;
import com.zteits.clouds.api.apibase.constants.PayOrderTypeEnum;
import com.zteits.clouds.api.apibase.constants.PayTypeEnum;
import com.zteits.clouds.api.apibase.constants.TerminalSourceEnum;
import com.zteits.clouds.api.apibase.exception.BizException;
import com.zteits.clouds.api.dto.clouds.param.PayOrderSuccessMsgRequest;
import com.zteits.clouds.api.dto.order.etc.dto.OrderEtcDTO;
import com.zteits.clouds.api.dto.order.etc.param.EtcNotifyReq;
import com.zteits.clouds.api.dto.order.etc.param.EtcQueryReq;
import com.zteits.clouds.api.dto.order.payorder.dto.PayOrderDTO;
import com.zteits.clouds.api.dto.pay.AliWxinPayNotifyDTO;
import com.zteits.clouds.api.dto.pay.param.AliPayNotifyRequest;
import com.zteits.clouds.api.dto.pay.param.AliWeixinPayOrderCreateRequest;
import com.zteits.clouds.api.dto.pay.param.EtcUpdatePayOrderRequest;
import com.zteits.clouds.api.dto.pda.param.ArrearageRecordInfo;
import com.zteits.clouds.api.dto.rocketmq.order.payorder.PayOrderSuccess;
import com.zteits.clouds.api.service.order.pay.EtcPayService;
import com.zteits.ipay.service.apppubpay.aliwxinpay.base.AliWxinPayInnerRouteService;
import com.zteits.ipay.service.apppubpay.busigroup.PubBusiPayInnerService;
import com.zteits.ipay.service.apppubpay.busigroup.base.BusiPayServiceBeanName;
import com.zteits.ipay.service.apppubpay.busigroup.base.PubBusiInnerRouteService;
import com.zteits.order.dao.backorder.BackDetailOrderDao;
import com.zteits.order.dao.orderetc.OrderEtcDao;
import com.zteits.order.dao.parkorder.OrderParkDao;
import com.zteits.order.dao.payorder.PayOrderDao;
import com.zteits.order.domain.OrderBackDetail;
import com.zteits.order.domain.OrderEtc;
import com.zteits.order.domain.OrderPark;
import com.zteits.order.domain.PayOrder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
*
* Copyright: Copyright (c) 2018 zteits
* ETC 支付相关服务
*
* @ClassName: EtcPayServiceImpl
* @Description:
* @version: v1.0.0
* @author: zengqc
* @date: 2020-06-03 11:11
*/
@Service("com.zteits.ipay.biz.EtcPayServiceImpl")
public class EtcPayServiceImpl implements EtcPayService {
private static final Logger logger = LoggerFactory.getLogger(EtcPayServiceImpl.class);
@Autowired
private PubBusiInnerRouteService busiInnerRouteService;
@Autowired
private PushPaySuccessMsgService pushPaySuccessMsgService;
@Autowired
private AliWxinPayInnerRouteService aliWxinPayInnerRouteService;
@Autowired
private PayOrderDao payOrderDao;
@Autowired
private OrderEtcDao orderEtcDao;
@Autowired
private BackDetailOrderDao backDetailOrderDao;
@Autowired
private OrderParkDao orderParkDao;
@Resource(name = BusiPayServiceBeanName.BackArrearageOrderPayInnerService)
private PubBusiPayInnerService backArrearageOrderPayInnerService;
/**
* 支付异步回调
*
* @return
* @throws Exception
*/
@Override
public BizResult payNotify(AliPayNotifyRequest request) throws Exception {
/**验证参数,获取相关支付信息*/
AliWxinPayNotifyDTO aliWxinPayNotifyDTO = aliWxinPayInnerRouteService.getRealService(request.getPayType()).getPayInfoByPayNotify(request);
if (aliWxinPayNotifyDTO.getIsRepetData() != null && aliWxinPayNotifyDTO.getIsRepetData()) {
/**重复数据,已经处理成功了*/
return new BizResult(true);
}
/**支付成功,处理相关的业务逻辑*/
PayOrderDTO payOrder = busiInnerRouteService.getRealServiceByPassBackParams(aliWxinPayNotifyDTO.getPassback_params()).payNotifyDeal(aliWxinPayNotifyDTO);
pushPaySuccessMsgService.sendPaySuccessMsg(Collections.singletonList(payOrder));
return new BizResult(true);
}
/**
* 根据 支付订单ID,更新ETC的运营方编号到appId
*
* @param request
* @return
*/
@Override
public BizResult updateEtcPayOrderAppId(EtcUpdatePayOrderRequest request) {
PayOrder payOrder = new PayOrder();
payOrder.setAppId(request.getEtcAppId());
payOrder.setPayOrderId(request.getPayOrderId());
int count = payOrderDao.updatePayOrderAppIdByPayOrderId(payOrder);
return new BizResult<>(count == 1);
}
/**
* 向ETC平台撤销追缴订单,因为车主已经通过其他方式补缴成功,所以要撤销这笔ETC追缴订单
*
* @param payOrderSuccessMsg
* @return
*/
@Override
public BizResult undoEtcOrder(PayOrderSuccessMsgRequest payOrderSuccessMsg) {
for (PayOrderSuccess order : payOrderSuccessMsg.getPayOrderSuccessList()) {
// 欠费补交订单通过非ETC方式补交成功后,从德亚ETC平台撤销订单
if (PayOrderTypeEnum.PARKBACK_PAY.value().equals(order.getPayOrderType())) {
// 1、通过 RltOrderId 对应 欠费订单表 order_back 的orderID
// 2、通过 orderID 找到 欠费补交明细 order_back_detail 的 rlt_order_id(批量补交对应多个)
List backDetails = backDetailOrderDao.queryByOrderId(order.getRltOrderId());
for (OrderBackDetail orderBackDetail : backDetails) {
// 3、查询该订单号之前有没有提交德亚追缴平台
List orderEtcs = orderEtcDao.getOrderEtcList(orderBackDetail.getRltOrderId(), 1);
if (orderEtcs.size() == 0) {
continue;
}
OrderEtcDTO orderEtcDTO = new OrderEtcDTO();
orderEtcDTO.setParkSerNo(orderBackDetail.getRltOrderId());
orderEtcDTO.setVehplateNo(orderBackDetail.getCarNumber());
orderEtcDTO.setEntryTime(orderBackDetail.getParkInTime());
orderEtcDTO.setOutTime(orderBackDetail.getParkOutTime());
orderEtcDTO.setBillAmount(orderBackDetail.getBackActFee());
orderEtcDTO.setParkingTime(orderBackDetail.getParkingDuration());
orderEtcDTO.setBatchUndo(1);
// 4、通过 rlt_order_id 撤销 ETC追缴订单
logger.info("撤销通行宝ETC订单: {}", JSONObject.toJSONString(orderEtcs));
OrderEtc orderEtc = new OrderEtc();
BeanUtils.copyProperties(orderEtcDTO, orderEtc);
orderEtc.setUndoRemarks("该订单已经支付,撤销订单信息");
// 5、撤销ETC追缴
orderEtcDao.updateEtcOrderStatus(orderBackDetail.getRltOrderId(), orderEtc);
}
}
}
return new BizResult<>(true);
}
/**
* ETC欠费补交扣款成功通知
*
* @return
*/
@Override
public BizResult arrearsPayNotify(EtcNotifyReq req) {
try {
String orderId = req.getParkSerNo();
OrderPark orderPark = orderParkDao.queryOrderParkByOrderId(orderId);
if (orderPark == null) {
logger.info("ETC追缴订单在order_park表中不存在, orderId: {}", orderId);
throw new BizException(ErrorType.BIZ_ERROR, "订单有问题");
}
AliWeixinPayOrderCreateRequest request = new AliWeixinPayOrderCreateRequest();
request.setPaySrcType(String.valueOf(PayOrderTypeEnum.PARKBACK_PAY.value()));
request.setCarNumber(orderPark.getCarNumber());
request.setCustId("");
request.setsOpName(null);
request.setsOpId(null);
request.setBackType(2);
request.setTerminalSource(String.valueOf(TerminalSourceEnum.ETC.value()));
request.setPayType(String.valueOf(PayTypeEnum.ETC_PAY.getValue()));
request.setBackDeveloperCode("");
request.setBackDeveloperName("");
ArrearageRecordInfo arrearageRecordInfo = new ArrearageRecordInfo();
arrearageRecordInfo.setOrderId(orderId);
arrearageRecordInfo.setOrderNotPayFee(orderPark.getArrearageFee());
arrearageRecordInfo.setParkId(orderPark.getPlNo());
List list = Collections.singletonList(arrearageRecordInfo);
String recordInfo = JSON.toJSONString(list);
request.setRecordArreaInfos(recordInfo);
logger.info("ETC扣费成功,{}", JSONObject.toJSONString(req));
PayOrder payOrder = backArrearageOrderPayInnerService.createBackOrderAndPayOrderForETCArrears(request, orderPark);
// 追缴成功记录状态
OrderEtc orderEtc = new OrderEtc();
orderEtc.setStatus(5);
orderEtcDao.updateEtcOrderStatus(orderId, orderEtc);
return new BizResult(true);
} catch (Exception e) {
logger.error(e.getMessage());
throw new BizException(ErrorType.BIZ_ERROR, e.getMessage());
}
}
/**
* 查询具备ETC追缴条件,但还没有追缴成功的订单
*
* @param req
* @return
*/
@Override
public BizResult> getSubmitSuccessEtcOrder(EtcQueryReq req) {
List list = orderEtcDao.getSubmitSuccessEtcOrder(req);
List dtoList = new ArrayList<>();
if(!CollectionUtils.isEmpty(list)) {
ListCopyUtil.listCopyProperties(list, dtoList, OrderEtcDTO.class);
}
return new BizResult>(dtoList);
}
}