@Component
public class QueryMerchantBalanceRemote extends BaseRemoteService<QueryMerchantBalanceReq, QueryMerchantBalanceResp,
MerchantBalanceReq, ResultRes<MerchantBalanceDetail>> {
@Autowired
private SettlementAccountService settlementAccountService;
@Override
protected MerchantBalanceReq parseRequest(QueryMerchantBalanceReq request) {
MerchantBalanceReq merchantBalanceReq = new MerchantBalanceReq();
merchantBalanceReq.setProviderCode(request.getProviderCode());
return merchantBalanceReq;
}
@Override
protected QueryMerchantBalanceResp fromRemoteResponse(ResultRes<MerchantBalanceDetail> remoteResp) {
if (!remoteResp.isSuccess()) {
throw new RemoteException(ResEnum.API_ERROR);
}
QueryMerchantBalanceResp resp = new QueryMerchantBalanceResp();
resp.setAccountBalance(remoteResp.getData().getAccountBalance());
resp.setActiveAccountBalance(remoteResp.getData().getActiveAccountBalance());
resp.setFreezeAccountBalance(remoteResp.getData().getFreezeAccountBalance());
return resp;
}
@Override
protected ResultRes<MerchantBalanceDetail> processCore(MerchantBalanceReq remoteRequest) throws Exception {
return settlementAccountService.queryMerchantBalance(remoteRequest);
}
@Override
protected String getServiceName() {
return "settlementAccount";
}
@Override
protected String getApiName() {
return "queryMerchantBalance";
}
}
@Component
@RequiredArgsConstructor
@Log4j2
public class OrderRepository extends ServiceImpl<OrderInfoDoMapper, OrderInfoDo> {
private final OrderExtInfoDoRepository orderExtInfoDoRepository;
private final OrderStatusChangeFLowRepository orderStatusChangeFLowRepository;
private final OrderFlowRepository orderFlowRepository;
private final OrderFlowDetailRepository orderFlowDetailRepository;
private final OrderDetailRepository orderDetailRepository;
/**
* 初始化订单信息
* @param createOrderContext 创单上下文
*/
public void saveInitOrder(CreateOrderContext createOrderContext) {
// 订单信息
OrderInfoDo orderInfoDo = OrderServiceHelper.buildOrderInfo(createOrderContext.getDeviceInfo(),
createOrderContext.getAliPaymentRes(), createOrderContext.getStoreInfo(),
createOrderContext.getUserInfoRes(), null, 0);
this.save(orderInfoDo);
createOrderContext.setOrderInfoDo(orderInfoDo);
// 新增订单额外信息
OrderExtInfoDO orderExtInfoDO = OrderServiceHelper.buildOrderExtInfoDO(orderInfoDo, createOrderContext.getDeviceInfo(),
createOrderContext.getStoreInfo());
orderExtInfoDoRepository.save(orderExtInfoDO);
// 增加订单流水信息 TODO
}
// TODO 增加动作原因和actcion
public void updateOrderStatus(OrderInfoDo orderInfoDo, OrderStatusEnum orderStatusEnum,
PayOrderStsEnum payOrderStsEnum, OrderStatusChangeEvent event) {
// 更新订单状态
Integer oriStatus = orderInfoDo.getStatus();
orderInfoDo.setUuid(orderInfoDo.getUuid());
orderInfoDo.setStatus(orderStatusEnum.getCode());
orderInfoDo.setLastUpdatedTime(LocalDateTime.now());
if(payOrderStsEnum != null){
orderInfoDo.setPayOrderStatus(payOrderStsEnum.getCode());
}
this.updateById(orderInfoDo);
// 插入状态变更流水
OrderStatusChangeFLowDo orderStatusChangeFLowDo = new OrderStatusChangeFLowDo();
orderStatusChangeFLowDo.setOrderCode(orderInfoDo.getOrderCode());
orderStatusChangeFLowDo.setOrderUuid(orderInfoDo.getUuid());
orderStatusChangeFLowDo.setPreStatus(String.valueOf(orderInfoDo.getStatus()));
orderStatusChangeFLowDo.setAfterStatus(String.valueOf(orderStatusEnum.getCode()));
orderStatusChangeFLowDo.setChangeReason(event.name());
orderStatusChangeFLowDo.setChangeAction(event.name());
orderStatusChangeFLowDo.initCreate();
orderStatusChangeFLowRepository.save(orderStatusChangeFLowDo);
log.info("订单状态变更结束,由: {}, 变更为: {}", oriStatus, orderStatusEnum.getCode());
}
public void updateOrderStatusToFinish(OrderInfoDo orderInfoDo, LocalDateTime paySuccessTime, String payChannelProduct,
String flowUuid, String payId) {
// 更新订单状态
OrderInfoDo orderInfoDoUpdater = new OrderInfoDo();
orderInfoDoUpdater.setUuid(orderInfoDo.getUuid());
if(orderInfoDo.getStatus().equals(OrderStatusEnum.UN_PAY.getCode())) {
orderInfoDoUpdater.setStatus(OrderStatusEnum.FINISH_PAY.getCode());
} else if (orderInfoDo.getStatus().equals(OrderStatusEnum.TO_MANUAL_FIX.getCode())) {
orderInfoDoUpdater.setStatus(OrderStatusEnum.MANUAL_FIXED.getCode());
}
orderInfoDoUpdater.setLastUpdatedTime(LocalDateTime.now());
orderInfoDoUpdater.setPayTime(paySuccessTime);
orderInfoDoUpdater.setPayChannelProduct(payChannelProduct);
orderInfoDoUpdater.setLastUpdatedTime(LocalDateTime.now());
orderInfoDoUpdater.setPayOrderStatus(PayOrderStsEnum.FINISH_PAY.getCode());
this.updateById(orderInfoDoUpdater);
OrderFlowDo orderFlowDoUpdater = new OrderFlowDo();
orderFlowDoUpdater.setUuid(flowUuid);
orderFlowDoUpdater.setOperationFinishTime(paySuccessTime);
orderFlowDoUpdater.setPayId(payId);
orderFlowDoUpdater.setFlowStatus(OrderFlowStatusEnum.FINISH_PAY.getCode());
orderFlowDoUpdater.setLastUpdatedTime(LocalDateTime.now());
orderFlowDoUpdater.setPayChannelProduct(payChannelProduct);
orderFlowRepository.updateById(orderFlowDoUpdater);
// 插入状态变更流水 TODO
OrderStatusChangeFLowDo orderStatusChangeFLowDo = new OrderStatusChangeFLowDo();
orderStatusChangeFLowDo.setOrderCode(orderInfoDo.getOrderCode());
orderStatusChangeFLowDo.setOrderUuid(orderInfoDo.getUuid());
orderStatusChangeFLowDo.setPreStatus(String.valueOf(orderInfoDo.getStatus()));
orderStatusChangeFLowDo.setAfterStatus(String.valueOf(OrderStatusEnum.FINISH_PAY.getCode()));
orderStatusChangeFLowDo.setChangeReason(OrderStatusChangeEvent.PAY_CALLBACK_SUCCESS.name());
orderStatusChangeFLowDo.setChangeAction(OrderStatusChangeEvent.PAY_CALLBACK_SUCCESS.name());
orderStatusChangeFLowDo.initCreate();
orderStatusChangeFLowRepository.save(orderStatusChangeFLowDo);
}
public OrderInfoDo findByOrderCode(String orderCode){
return this.lambdaQuery().eq(OrderInfoDo::getOrderCode, orderCode).eq(OrderInfoDo::getSts, StsEnum.ACTIVE.getValue()).one();
}
public Page<OrderInfoDo> queryListPage(OrderListQueryReq req){
LambdaQueryChainWrapper<OrderInfoDo> queryCdt = this.lambdaQuery().eq(OrderInfoDo::getSts, StsEnum.ACTIVE.getValue());
Page<OrderInfoDo> page = Page.of(req.getPageNum(), req.getPageSize());
List<Integer> payOrderStsLists = PayOrderStsEnum.getListByPreCode(req.getType());
queryCdt.in(req.getType() != null && req.getType() != 1
&& !CollectionUtils.isEmpty(payOrderStsLists),
OrderInfoDo::getPayOrderStatus, payOrderStsLists);
queryCdt.eq(StrUtil.isNotBlank(req.getUserUuid()),
OrderInfoDo::getUserUuid, req.getUserUuid());
queryCdt.eq(StrUtil.isNotBlank(req.getProviderCode()),
OrderInfoDo::getProviderCode, req.getProviderCode());
queryCdt.eq(StrUtil.isNotBlank(req.getDeviceUuid()),
OrderInfoDo::getDeviceUuid, req.getDeviceUuid());
queryCdt.in(!CollectionUtils.isEmpty(req.getStoreUuids()),
OrderInfoDo::getStoreUuid, req.getStoreUuids());
queryCdt.eq(StrUtil.isNotBlank(req.getOrderCode()),
OrderInfoDo::getOrderCode, req.getOrderCode());
queryCdt.ge(Objects.nonNull(req.getBeginTime()), BaseModel::getCreatedTime, req.getBeginTime());
queryCdt.le(Objects.nonNull(req.getEndTime()), BaseModel::getCreatedTime, req.getEndTime());
queryCdt.ne(OrderInfoDo::getStatus, OrderStatusEnum.CANCEL.getCode());
queryCdt.orderByDesc(OrderInfoDo::getCreatedTime);
return queryCdt.page(page);
}
public OrderFlowDo saveRefund(OrderTypeEnum orderTypeEnum, RefundContext refundContext, OrderInfoDo orderInfoDo) {
Integer refundMoneyPool = refundContext.getReq().getRefundTotalPrice();
Map<String, OrderRefundItemReq> refundItemMap = Optional.ofNullable(refundContext.getReq().getRefunds()).
map(s -> s.stream().collect(Collectors.toMap(OrderRefundItemReq::getGoodsUuid, Function.identity()))).orElse(new HashMap<>());
// 生成退款单和明细
OrderFlowDo orderFlowDo = OrderServiceHelper.buildInitOrderFlowDo(orderInfoDo, orderTypeEnum,
refundMoneyPool, refundMoneyPool, OrderFlowStatusEnum.TO_REFUND, 0, 0);
// 商品列表不为空并且是修正的退款需要存储修正详情
List<OrderFlowDetailDo> orderFlowDetailDos = new ArrayList<>();
if(OrderTypeEnum.FIX_ORDER_REFUND.getCode().equals(orderFlowDo.getOrderType())){
OrderAmendmentUtil.getConfigExt(refundContext.getOldDetails(), refundContext.getNewDetails(), orderFlowDo, orderFlowDetailDos);
log.info(" refund money : {}", JsonUtil.toJson(orderFlowDetailDos));
}else {
Map<String, OrderDetailDo> oldMap = refundContext.getOldDetails().stream().
collect(Collectors.toMap(OrderDetailDo::getGoodsUuid, Function.identity()));
refundItemMap.forEach((key, value) -> {
OrderDetailDo orderDetailDo = oldMap.get(key);
OrderFlowDetailDo orderFlowDetailDo = OrderServiceHelper.buildinitOrderFlowDetailDo(-value.getRefundMoney(),
orderDetailDo.getBasePrice(), orderFlowDo, 0, value.getGoodsUuid(), orderDetailDo.getTemplateUuid(), 0);
log.info("refund only refund money : {}", JsonUtil.toJson(orderFlowDetailDo));
orderFlowDetailDos.add(orderFlowDetailDo);
});
}
// 数据存储层
orderFlowRepository.save(orderFlowDo);
if(!CollectionUtils.isEmpty(orderFlowDetailDos)) {
orderFlowDetailRepository.saveBatch(orderFlowDetailDos);
}
if(!OrderTypeEnum.FIX_ORDER_REFUND.getCode().equals(orderFlowDo.getOrderType())) {
this.updateOrderStatus(orderInfoDo, OrderStatusEnum.TO_REFUND, PayOrderStsEnum.TO_REFUND, OrderStatusChangeEvent.REFUND);
}else {
this.updateOrderStatus(orderInfoDo, OrderStatusEnum.TO_MANUAL_REFUND, PayOrderStsEnum.TO_REFUND, OrderStatusChangeEvent.FIX);
}
return orderFlowDo;
}
public void updateOrderInfoAndSaveDetail(PayOrderContext payOrderContext, OrderCalFeeDTO orderCalFeeDTO, OrderInfoDo orderInfoDo) {
Integer oldStatus = orderInfoDo.getStatus();
orderInfoDo.setDealtBy(OrderDealtByEnum.getByCode(payOrderContext.getRequest().getIdentifySource()).getCode());
orderInfoDo.setStatus(OrderStatusEnum.IDENTIFIED.getCode());
orderInfoDo.setPayOrderStatus(PayOrderStsEnum.DOING.getCode());
orderInfoDo.setTotalMoney(orderCalFeeDTO.getTotalMoney());
orderInfoDo.setActualMoney(orderCalFeeDTO.getActualMoney());
orderInfoDo.setCouponMoney(orderCalFeeDTO.getCouponMoney());
orderInfoDo.setActivityMoney(orderCalFeeDTO.getActivityMoney());
orderInfoDo.initUpdate();
// 更新订单额外信息
OrderExtInfoDO orderExtInfoDO = new OrderExtInfoDO();
orderExtInfoDO.setId(orderInfoDo.getOrderCode());
orderExtInfoDO.setAlgorithmResultReturnTime(LocalDateTime.now());
orderExtInfoDO.setCreditPayRequestTime(LocalDateTime.now());
orderExtInfoDO.setRequestId(payOrderContext.getRequest().getRequestId());
orderExtInfoDO.setLastUpdatedTime(LocalDateTime.now());
// OrderFlowDo
OrderFlowDo orderFlowDo = OrderServiceHelper.getOrderFlowDoBYOrderInfoAndCal(orderInfoDo, orderCalFeeDTO, OrderTypeEnum.BUY);
// 订单明细
Map<String, OrderGoodsPriceItemBean> priceDetailMap = MoreObjects.firstNonNull(orderCalFeeDTO.getPriceDetail(), new HashMap<>());
List<OrderGoodsPriceItemBean> priceItems = new ArrayList<>(priceDetailMap.values());
List<OrderDetailDo> orderDetailDos = new ArrayList<>();
List<OrderFlowDetailDo> orderFlowDetailDos = new ArrayList<>();
for (OrderGoodsPriceItemBean priceItem : priceItems) {
OrderDetailDo detailDo = OrderServiceHelper.buildOrderDetailDo(orderInfoDo, priceItem,
payOrderContext.getDeviceRpcVo().getTemplateUuid(), priceItem.getGoodsName());
OrderFlowDetailDo orderFlowDetailDo = OrderServiceHelper.buildOrderFlowDetailDo(orderInfoDo,
priceItem, payOrderContext.getDeviceRpcVo().getTemplateUuid(), orderFlowDo);
orderDetailDos.add(detailDo);
orderFlowDetailDos.add(orderFlowDetailDo);
}
this.updateById(orderInfoDo);
orderExtInfoDoRepository.updateById(orderExtInfoDO);
orderDetailRepository.saveBatch(orderDetailDos);
orderFlowRepository.save(orderFlowDo);
orderFlowDetailRepository.saveBatch(orderFlowDetailDos);
// 插入状态变更流水
OrderStatusChangeFLowDo orderStatusChangeFLowDo = new OrderStatusChangeFLowDo();
orderStatusChangeFLowDo.setOrderCode(orderInfoDo.getOrderCode());
orderStatusChangeFLowDo.setOrderUuid(orderInfoDo.getUuid());
orderStatusChangeFLowDo.setPreStatus(String.valueOf(oldStatus));
orderStatusChangeFLowDo.setAfterStatus(String.valueOf(orderInfoDo.getStatus()));
orderStatusChangeFLowDo.setChangeReason(OrderStatusChangeEvent.FINISH_IDENTIFY.name());
orderStatusChangeFLowDo.setChangeAction(OrderStatusChangeEvent.FINISH_IDENTIFY.name());
orderStatusChangeFLowDo.initCreate();
orderStatusChangeFLowRepository.save(orderStatusChangeFLowDo);
payOrderContext.setOrderDetailExtDtoList(OrderServiceHelper.buildOrderExt(orderDetailDos));
payOrderContext.setOrderFlowDo(orderFlowDo);
log.info("算费和扣减库存结束保存后保存订单结束,orderCode: {}", orderInfoDo.getOrderCode());
}
}