|
|
@@ -0,0 +1,189 @@ |
|
|
|
package cn.com.taiji.ias.manager.order; |
|
|
|
|
|
|
|
import cn.com.taiji.common.manager.net.http.ServiceHandleException; |
|
|
|
import cn.com.taiji.common.pub.TimeTools; |
|
|
|
import cn.com.taiji.core.entity.dict.basic.SourceType; |
|
|
|
import cn.com.taiji.core.entity.dict.issue.*; |
|
|
|
import cn.com.taiji.core.entity.issue.IssueOrderPay; |
|
|
|
import cn.com.taiji.core.entity.issue.IssueOrderRefund; |
|
|
|
import cn.com.taiji.core.entity.issue.IssueOrderinfo; |
|
|
|
import cn.com.taiji.core.entity.issue.IssueOrderinfoExt; |
|
|
|
import cn.com.taiji.core.model.comm.protocol.AbstractSignTypeResponse; |
|
|
|
import cn.com.taiji.core.model.comm.protocol.ias.order.AbstractIssueResponse; |
|
|
|
import cn.com.taiji.core.model.comm.protocol.ias.order.OrderCancelRequest; |
|
|
|
import cn.com.taiji.core.model.comm.protocol.ias.order.RetunInfoModel; |
|
|
|
import cn.com.taiji.core.model.comm.protocol.valid.ErrorMsgBuilder; |
|
|
|
import cn.com.taiji.core.repo.jpa.comm.OcrResultRepo; |
|
|
|
import cn.com.taiji.core.repo.jpa.issue.IssueOrderRefundRepo; |
|
|
|
import cn.com.taiji.ias.dict.DataType; |
|
|
|
import cn.com.taiji.ias.model.ServiceLogEvent; |
|
|
|
import org.springframework.beans.factory.annotation.Autowired; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
|
|
|
import java.time.LocalDateTime; |
|
|
|
import java.util.Arrays; |
|
|
|
import java.util.List; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
/** |
|
|
|
* <pre> |
|
|
|
* </pre> |
|
|
|
*/ |
|
|
|
@Service |
|
|
|
public class OrderCancelManager extends AbstractOrderManager<OrderCancelRequest> { |
|
|
|
|
|
|
|
public static final List<IssueOrderStep> ALLOW_CANCEL_STEP = |
|
|
|
Arrays.asList(IssueOrderStep.ORDER_INIT, IssueOrderStep.CUSTOMER_UPLOAD, IssueOrderStep.VEHICLE_UPLOAD, |
|
|
|
IssueOrderStep.ORDER_PAID, IssueOrderStep.ORDER_SIGNED, IssueOrderStep.WAITING_AUDIT, |
|
|
|
IssueOrderStep.AUDIT_FAIL, IssueOrderStep.WAITING_SEND); |
|
|
|
|
|
|
|
protected final String ORDERPAY = "orderPay"; |
|
|
|
@Autowired |
|
|
|
private OcrResultRepo ocrResultRepo; |
|
|
|
@Autowired |
|
|
|
private IssueOrderRefundRepo refundRepo; |
|
|
|
|
|
|
|
public OrderCancelManager() { |
|
|
|
super(DataType.ORDER_CANCEL); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
protected String getDataId(OrderCancelRequest req) { |
|
|
|
return req.getOrderNo(); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
protected void formatValidateInternal(ErrorMsgBuilder builder, OrderCancelRequest req, ServiceLogEvent event, |
|
|
|
Map<String, Object> dataStream) throws ServiceHandleException { |
|
|
|
req.relatedValid(builder); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
protected void businessValidateInternal(ErrorMsgBuilder builder, OrderCancelRequest request, |
|
|
|
ServiceLogEvent event, Map<String, Object> dataStream) throws ServiceHandleException { |
|
|
|
IssueOrderinfo order = checkOrder(request.getOrderNo()); |
|
|
|
if (hasText(request.getOpenId())) |
|
|
|
checkOpenId(request.getOpenId()); |
|
|
|
if (!IssueOrderStatus.NORMAL.equals(order.getOrderStatus()) || !ALLOW_CANCEL_STEP.contains(order.getOrderStep())) { |
|
|
|
throw newBusinessException("当前订单不支持取消"); |
|
|
|
} |
|
|
|
// 取消订单的操作来源要判断 |
|
|
|
if (SourceType.CHANNEL.equals(order.getOrderSource()) || SourceType.SERVICE_HALL.equals(order.getOrderSource())) { |
|
|
|
if (!request.getOrgCode().equals(order.getAgencyId())) { |
|
|
|
throw newBusinessException("不是您渠道的订单。取消失败"); |
|
|
|
} |
|
|
|
} |
|
|
|
// 需要支付的情况下,进行退费相关校验 |
|
|
|
if (order.getNeedPay()) { |
|
|
|
List<IssueOrderPay> pays = paymentDetections(request.getOrderNo()); |
|
|
|
List<OrderPayStatus> payStatus = pays.stream().distinct().map(IssueOrderPay::getPayStatus).collect(Collectors.toList()); |
|
|
|
if (payStatus.contains(OrderPayStatus.SUCCESS) && payStatus.size()>1) |
|
|
|
throw newBusinessException("有支付中的订单,请稍后重试"); |
|
|
|
if(request.getRefundStatus() == 1) { |
|
|
|
List<String> payOrderNos = pays.stream().map(IssueOrderPay::getExternalOrderNo).collect(Collectors.toList()); |
|
|
|
for (RetunInfoModel retunInfoModel : request.getRefundInfoList()) { |
|
|
|
if (!payOrderNos.contains(retunInfoModel.getPayOrderNo())){ |
|
|
|
throw newBusinessException("支付单号不存在:"+retunInfoModel.getPayOrderNo()); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
dataStream.put(ORDERPAY, pays); |
|
|
|
} |
|
|
|
dataStream.put(ORDER, order); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
protected void persistInternal(OrderCancelRequest request, ServiceLogEvent event, |
|
|
|
Map<String, Object> dataStream) throws ServiceHandleException { |
|
|
|
LocalDateTime now = LocalDateTime.now(); |
|
|
|
IssueOrderinfo order = (IssueOrderinfo)dataStream.get(ORDER); |
|
|
|
IssueOrderinfoExt orderInfoExt = orderInfoExtRepo.findByOrderNo(order.getOrderNo()); |
|
|
|
List<IssueOrderPay> pays = (List<IssueOrderPay>)dataStream.get(ORDERPAY); |
|
|
|
canceledAndRefund(order, request, pays); |
|
|
|
// 保存订单取消原因 |
|
|
|
order.setCancelTime(now); |
|
|
|
order.setOrderStatus(IssueOrderStatus.CANCEL); |
|
|
|
orderInfoExt.setCancelReason(request.getReason()); |
|
|
|
orderInfoExt.setCancelOpId(request.getOpenId()); |
|
|
|
orderInfoExtRepo.save(orderInfoExt); |
|
|
|
// 更改订单步骤并保存 |
|
|
|
orderInfoRepo.merge(order); |
|
|
|
orderPayRepo.persistAll(pays); |
|
|
|
transactionManager.persistTransaction(ISSUE_ORDER_SYNC, order.getOrderNo(), "订单取消"); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
protected AbstractSignTypeResponse getRes(OrderCancelRequest req, ServiceLogEvent event, |
|
|
|
Map<String, Object> dataStream) throws ServiceHandleException { |
|
|
|
AbstractIssueResponse res = new AbstractIssueResponse(); |
|
|
|
res.setReceiveTime(getReceiveTimeStr(event)); |
|
|
|
return res; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
protected void onSuccessInternal(OrderCancelRequest req, ServiceLogEvent event, |
|
|
|
Map<String, Object> dataStream) { |
|
|
|
IssueOrderinfo order = (IssueOrderinfo)dataStream.get(ORDER); |
|
|
|
executor.execute(() -> { |
|
|
|
try { |
|
|
|
syncOrder(order); |
|
|
|
} catch (Exception e) { |
|
|
|
logger.error("数据同步失败", e); |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
public void canceledAndRefund(IssueOrderinfo order, OrderCancelRequest request, List<IssueOrderPay> pays) throws ServiceHandleException { |
|
|
|
if (SourceType.CHANNEL.equals(order.getOrderSource())) {// 渠道订单的退款由自己完成 |
|
|
|
for (IssueOrderPay orderPay : pays) { |
|
|
|
if (OrderPayStatus.SUCCESS.equals(orderPay.getPayStatus())) { |
|
|
|
for (RetunInfoModel retunInfoModel : request.getRefundInfoList()) { |
|
|
|
if (retunInfoModel.getPayOrderNo().equals(orderPay.getExternalOrderNo())) { |
|
|
|
orderPay.setRefundAmount(retunInfoModel.getRefundAmount()); |
|
|
|
orderPay.setRefundOrderNo(retunInfoModel.getRefundOrderNo()); |
|
|
|
orderPay.setRefundTime(retunInfoModel.getRefundTime()); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
for (IssueOrderPay orderPay : pays) { |
|
|
|
if (OrderPayStatus.SUCCESS.equals(orderPay.getPayStatus())) { |
|
|
|
createOrderRefund(order, orderPay); |
|
|
|
orderPay.setPayStatus(OrderPayStatus.REFUND); |
|
|
|
order.setOrderStep(IssueOrderStep.REFUNDING); |
|
|
|
} else { |
|
|
|
orderPay.setPayStatus(OrderPayStatus.CANCELED);// |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private IssueOrderRefund createOrderRefund(IssueOrderinfo order, IssueOrderPay orderPay) { |
|
|
|
IssueOrderRefund orderRefund = new IssueOrderRefund(); |
|
|
|
orderRefund.setOrderNo(createRefundOrderNo()); |
|
|
|
orderRefund.setCardId(order.getCardId()); |
|
|
|
orderRefund.setVehiclePlate(order.getVehiclePlate()); |
|
|
|
orderRefund.setVehiclePlatecolor(order.getVehiclePlateColor()); |
|
|
|
orderRefund.setVehicleId(order.getVehicleId()); |
|
|
|
orderRefund.setAmount(orderPay.getFee()); |
|
|
|
orderRefund.setRefundAmount(orderPay.getFee()); |
|
|
|
orderRefund.setStatus(RefundStatus.NOTREFUND); |
|
|
|
orderRefund.setUserName(order.getCustomerName()); |
|
|
|
orderRefund.setUserMobile(order.getCustomerTel()); |
|
|
|
orderRefund.setOperateType(RefundOperateType.ORIGINAL); |
|
|
|
orderRefund.setPayConfigId(orderPay.getPayConfigId()); |
|
|
|
orderRefund.setExternalOrderNo(orderPay.getPayOrderNo()); |
|
|
|
orderRefund.setBusinessPort(RefundBusiness.ORDER_REFUND); |
|
|
|
orderRefund.setUpdateTime(LocalDateTime.now()); |
|
|
|
orderRefund.setAgencyId(order.getAgencyId()); |
|
|
|
return refundRepo.save(orderRefund); |
|
|
|
} |
|
|
|
|
|
|
|
private String createRefundOrderNo() { |
|
|
|
return "R" + LocalDateTime.now().format(TimeTools.yyyyMMddHHmmssSSS) |
|
|
|
+ (int)((Math.random() * 9 + 1) * Math.pow(10, 5)); |
|
|
|
} |
|
|
|
|
|
|
|
} |