修改管理后台报表统计
1、修改管理后台充电订单统计
2、修改记录分账数据前先软删除之前的数据,然后根据实际支付金额(扣除退款)生成最新的分账记录
| | |
| | | |
| | | /** |
| | | * 获取小程序充电记录列表数据 |
| | | * |
| | | * @param appUserId |
| | | * @param type |
| | | * @param pageCurr |
| | |
| | | |
| | | /** |
| | | * 获取待开票订单列表 |
| | | * |
| | | * @param month 筛选时间2024-01-01 |
| | | * @param pageCurr |
| | | * @param pageSize |
| | |
| | | @Param("pageCurr") Integer pageCurr, @Param("pageSize") Integer pageSize); |
| | | |
| | | List<ChargingOrderVO> chargingOrder(@Param("pageInfo") PageInfo<ChargingOrderVO> pageInfo, @Param("req") ChargingOrderQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2,@Param("endTime1") String endTime1,@Param("endTime2") String endTime11); |
| | | |
| | | Map<String, Object> chargingOrderBaseSummary(@Param("req") ChargingOrderQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2,@Param("endTime1") String endTime1,@Param("endTime2") String endTime11); |
| | | |
| | | Map<String, Object> chargingOrderNolimit( @Param("req") ChargingOrderQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2,@Param("endTime1") String endTime1,@Param("endTime2") String endTime11); |
| | | |
| | | Map<String, Object> chargingOrderFundSummary(@Param("req") ChargingOrderQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2,@Param("endTime1") String endTime1,@Param("endTime2") String endTime11); |
| | | |
| | | List<Long> chargingOrderSummaryOrderIds(@Param("req") ChargingOrderQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2,@Param("endTime1") String endTime1,@Param("endTime2") String endTime11); |
| | | |
| | | Map<String, Object> exchangeCodeBalanceSummary(@Param("orderIds") List<Long> orderIds); |
| | | |
| | | List<Map<String, Object>> exchangeCodeBalanceIncomeByOrderIds(@Param("orderIds") List<Long> orderIds); |
| | | |
| | | List<ChargingOrderBalanceIncomeDetailVO> exchangeCodeBalanceIncomeDetail(@Param("orderIds") List<Long> orderIds); |
| | | |
| | | List<Map<String, Object>> chargingOrderShareIncomeByOrderIds(@Param("orderIds") List<Long> orderIds); |
| | | |
| | | Map<String, Object> chargingOrderShareIncomeSummaryByOrderIds(@Param("orderIds") List<Long> orderIds); |
| | | |
| | | List<PayOrderDto> payOrderQuery(@Param("pageInfo")PageInfo<PayOrderDto> pageInfo,@Param("data") PayOrderQueryDto payOrderQueryDto); |
| | | |
| | | List<EnterpriseChargingAnalysisVO> enterpriseChargingAnalysis(@Param("pageInfo") PageInfo<EnterpriseChargingAnalysisVO> pageInfo, |
| | | @Param("data") EnterpriseChargingAnalysisQuery query); |
| | | |
| | |
| | | BigDecimal sumSuccessfulShareAmount(@Param("siteIds") List<Integer> siteIds); |
| | | |
| | | Map<String, Object> countAll(@Param("siteIds")List<Integer> siteIds, @Param("partnerView") Boolean partnerView); |
| | | |
| | | List<Map<String, Object>> chargingOrderShareIncomeByPayChannel(@Param("sixBefore")LocalDate sixBefore,@Param("siteIds") List<Integer> siteIds); |
| | | |
| | | List<Map<String, Object>> getSumByType(@Param("start")LocalDateTime start,@Param("end")LocalDateTime end,@Param("siteIds")List<Integer> siteIds); |
| | |
| | | List<ChargingOrderListVO> chargingList(@Param("req") ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2); |
| | | |
| | | List<Map<String, Object>> chargingList1(@Param("pageInfo")PageInfo<ChargingOrderListVO> pageInfo, @Param("req") ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2); |
| | | |
| | | List<Map<String, Object>> chargingListAccountingSummary(@Param("orderIds") List<Long> orderIds); |
| | | |
| | | |
| | | |
| | | Map<String, Object> chargingListSum(@Param("req") ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2); |
| | | |
| | | List<Long> chargingListSummaryOrderIds(@Param("req") ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2); |
| | | |
| | | |
| | |
| | | |
| | | |
| | | List<Map<String, Object>> usersDay(@Param("statisticsQueryDto")ChargingStatisticsQueryDto statisticsQueryDto); |
| | | |
| | | List<Map<String, Object>> usersDay1(); |
| | | |
| | | List<Map<String, Object>> usersByQuery(@Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto); |
| | | |
| | | List<Map<String, Object>> usersByQuery1(@Param("statisticsQueryDto") ChargingStatisticsQueryDto statisticsQueryDto); |
| | | |
| | | List<Map<String, Object>> getUserTagCount(); |
| | |
| | | |
| | | /** |
| | | * 获取启动失败且时间超过1小时的订单 |
| | | * |
| | | * @return |
| | | */ |
| | | List<TChargingOrder> findFailedStartupOrder(); |
| | |
| | | |
| | | /** |
| | | * 获取停止中的数据 |
| | | * |
| | | * @return |
| | | */ |
| | | List<TChargingOrder> findStoppedOrder(); |
| | |
| | | |
| | | /** |
| | | * 获取充电中的订单 |
| | | * |
| | | * @return |
| | | */ |
| | | List<TChargingOrder> findChargingOrder(); |
| | |
| | | |
| | | /** |
| | | * 获取已结束的数据 |
| | | * |
| | | * @return |
| | | */ |
| | | List<TChargingOrder> findEndChargingOrder(); |
| | |
| | | |
| | | /** |
| | | * 获取需要手动修改订单状态的数据 |
| | | * |
| | | * @return |
| | | */ |
| | | List<TChargingOrder> findUpStatusChargingOrder(); |
| | |
| | | |
| | | /** |
| | | * 查询充电算账单数据 |
| | | * |
| | | * @param startTime |
| | | * @param endTime |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 查询账户结算账单数据 |
| | | * |
| | | * @param startTime |
| | | * @param endTime |
| | | */ |
| | |
| | | electrovalence, |
| | | serviceCharge); |
| | | } |
| | | |
| | | private TVip getVipSnapshot(TAppUserVipDetail vipDetail, Integer vipId) { |
| | | if (vipDetail != null && StringUtils.hasLength(vipDetail.getVipJson())) { |
| | | return JSON.parseObject(vipDetail.getVipJson(), TVip.class); |
| | |
| | | boolean shouldConsumeVipDiscount(BigDecimal discountAmount) { |
| | | return discountAmount != null && discountAmount.compareTo(BigDecimal.ZERO) > 0; |
| | | } |
| | | |
| | | @Override |
| | | public AjaxResult paymentChargingOrder(AddChargingOrder addChargingOrder) { |
| | | Long userId = tokenService.getLoginUserApplet().getUserId(); |
| | |
| | | pageInfo.setRecords(list); |
| | | return R.ok(pageInfo); |
| | | } |
| | | |
| | | @Override |
| | | public R<PageInfo<EnterpriseChargingAnalysisVO>> enterpriseChargingAnalysis(EnterpriseChargingAnalysisQuery query) { |
| | | PageInfo<EnterpriseChargingAnalysisVO> pageInfo = new PageInfo<>(query.getPageCurr(), query.getPageSize()); |
| | |
| | | if (thirdRefundAmount.compareTo(BigDecimal.ZERO) == 0) { |
| | | chargingOrderRefund.setRefundSerialNumber("BALANCE"); |
| | | finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount); |
| | | } |
| | | else if (isIcbcOrder(tChargingOrder)) { |
| | | } else if (isIcbcOrder(tChargingOrder)) { |
| | | R shareRefund = refundIcbcShareBeforeMainRefund(tChargingOrder, chargingOrderRefund, thirdRefundAmount); |
| | | if (shareRefund.getCode() != 200) { |
| | | return shareRefund; |
| | | } |
| | | refundByIcbcAndFinish(tChargingOrder, chargingOrderRefund, thirdRefundAmount, "取消订单", true, |
| | | manualRefundAmount, balanceRefundAmount); |
| | | } |
| | | else if (1 == tChargingOrder.getRechargePaymentType()) { |
| | | } else if (1 == tChargingOrder.getRechargePaymentType()) { |
| | | WxPaymentRefundModel model = new WxPaymentRefundModel(); |
| | | model.setOut_trade_no(tChargingOrder.getCode()); |
| | | model.setOut_refund_no(chargingOrderRefund.getRefundCode()); |
| | |
| | | chargingOrderRefund.setRefundFee(refund_fee); |
| | | chargingOrderRefundService.updateById(chargingOrderRefund); |
| | | } |
| | | } |
| | | |
| | | else if (2 == tChargingOrder.getRechargePaymentType()) { |
| | | } else if (2 == tChargingOrder.getRechargePaymentType()) { |
| | | RefundReq dto = new RefundReq(); |
| | | dto.setOutTradeNo(tChargingOrder.getCode()); |
| | | dto.setOutRequestNo(tChargingOrder.getCode()); |
| | |
| | | : firstNotBlank(resp == null ? null : resp.getMsg(), refundResult.getMsg(), "支付宝退款失败")); |
| | | } |
| | | finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount); |
| | | } |
| | | else if (3 == tChargingOrder.getRechargePaymentType()) { |
| | | } else if (3 == tChargingOrder.getRechargePaymentType()) { |
| | | RefundReq dto = new RefundReq(); |
| | | dto.setOutTradeNo(tChargingOrder.getRechargeSerialNumber()); |
| | | dto.setOutRequestNo(tChargingOrder.getCode()); |
| | |
| | | return R.fail(refundResult == null ? "支付宝H5退款服务无响应" : firstNotBlank(refundResult.getMsg(), "支付宝H5退款失败")); |
| | | } |
| | | finishManualChargingRefund(tChargingOrder, chargingOrderRefund, manualRefundAmount, balanceRefundAmount, thirdRefundAmount); |
| | | } |
| | | else { |
| | | } else { |
| | | return R.fail("不支持的退款支付方式"); |
| | | } |
| | | |
| | |
| | | |
| | | /** |
| | | * 获取已结束的数据 |
| | | * |
| | | * @return |
| | | */ |
| | | @Override |
| | |
| | | |
| | | /** |
| | | * 获取需要手动修改订单状态的数据 |
| | | * |
| | | * @return |
| | | */ |
| | | @Override |
| | |
| | | |
| | | /** |
| | | * 查询充电算账单数据 |
| | | * |
| | | * @param startTime |
| | | * @param endTime |
| | | */ |
| | |
| | | |
| | | /** |
| | | * 查询账户结算账单数据 |
| | | * |
| | | * @param startTime |
| | | * @param endTime |
| | | * @return |
| | |
| | | |
| | | /** |
| | | * 手动处理退款数据 |
| | | * |
| | | * @param refund_out_trade_no 退款商户单号 |
| | | */ |
| | | @Override |
| | |
| | | |
| | | /** |
| | | * 手动添加完善订单费用明细 |
| | | * |
| | | * @param orderId |
| | | */ |
| | | @Override |
| | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 软删除旧的非成功/处理中的分账记录,为退款后重新计算分账做准备。 |
| | | * 仅删除 onlineShareStatus 不是 SUCCESS 或 PROCESSING 的记录, |
| | | * 已成功线上分账的记录不可删除,避免重复分账。 |
| | | */ |
| | | private void softDeleteStaleChargingOrderShareRecords(TChargingOrder chargingOrder) { |
| | | if (chargingOrder == null || !StringUtils.hasLength(chargingOrder.getCode())) { |
| | | return; |
| | | } |
| | | LambdaUpdateWrapper<TChargingOrderShareRecord> wrapper = new LambdaUpdateWrapper<>(); |
| | | wrapper.eq(TChargingOrderShareRecord::getChargingOrderCode, chargingOrder.getCode()) |
| | | .eq(TChargingOrderShareRecord::getDelFlag, false) |
| | | .notIn(TChargingOrderShareRecord::getOnlineShareStatus, "SUCCESS", "PROCESSING") |
| | | .set(TChargingOrderShareRecord::getDelFlag, true); |
| | | int count = chargingOrderShareRecordMapper.update(null, wrapper); |
| | | if (count > 0) { |
| | | log.info("软删除充电订单旧分账记录,订单号:{},删除数量:{}", chargingOrder.getCode(), count); |
| | | } |
| | | } |
| | | |
| | | private void executeChargingOrderShare(TChargingOrder chargingOrder, Site site) { |
| | | try { |
| | | if (!isNeedChargingOrderShare(chargingOrder)) { |
| | | return; |
| | | } |
| | | // 先软删除旧的非成功分账记录,再基于剩余支付金额重新计算 |
| | | softDeleteStaleChargingOrderShareRecords(chargingOrder); |
| | | Partner partner = loadPartner(site); |
| | | for (TChargingOrderShareRecord shareRecord : buildChargingOrderShareRecords(chargingOrder, site, partner)) { |
| | | TChargingOrderShareRecord exist = chargingOrderShareRecordMapper.selectOne(new LambdaQueryWrapper<TChargingOrderShareRecord>() |
| | |
| | | .eq(TChargingOrderShareRecord::getPayChannel, shareRecord.getPayChannel()) |
| | | .eq(TChargingOrderShareRecord::getDelFlag, false) |
| | | .last("limit 1")); |
| | | if (exist != null && ("SUCCESS".equals(exist.getOnlineShareStatus()) || "PROCESSING".equals(exist.getOnlineShareStatus()))) { |
| | | if (exist != null) { |
| | | // 已有成功/处理中的线上分账记录,跳过不重复处理 |
| | | continue; |
| | | } |
| | | shareRecord = mergeChargingOrderShareRecord(exist, shareRecord); |
| | | saveOrUpdateChargingOrderShareRecord(shareRecord); |
| | | if (Boolean.TRUE.equals(shareRecord.getNeedOnlineShare())) { |
| | | processIcbcOnlineShare(shareRecord, partner); |
| | |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <?xml version="1.0" encoding="UTF-8"?> |
| | | <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
| | | <mapper namespace="com.ruoyi.order.mapper.TChargingOrderMapper"> |
| | | |
| | |
| | | b.id, |
| | | CASE WHEN count(a.id) > 0 THEN (UNIX_TIMESTAMP(MAX(b.end_time)) - UNIX_TIMESTAMP(MAX(b.start_time))) ELSE 0 END as time, |
| | | sum(a.charging_capacity) as total, |
| | | sum(CASE WHEN b.refund_status = 2 THEN 0 ELSE a.period_electric_price END) as electronicMoney, |
| | | sum(a.period_electric_price) as electronicMoney, |
| | | sum(CASE |
| | | WHEN b.refund_status = 2 THEN 0 |
| | | WHEN b.order_source = 1 THEN a.period_service_price |
| | | ELSE a.period_service_price * 0.8 |
| | | END) as serviceMoney, |
| | | sum(CASE |
| | | WHEN b.refund_status = 2 THEN 0 |
| | | ELSE a.period_electric_price |
| | | + CASE WHEN b.order_source = 1 THEN a.period_service_price ELSE a.period_service_price * 0.8 END |
| | | END) as income, |
| | | sum(a.period_electric_price + CASE WHEN b.order_source = 1 THEN a.period_service_price ELSE a.period_service_price * 0.8 END) as income, |
| | | MAX(b.recharge_payment_type) as recharge_payment_type, |
| | | MAX(b.is_whitelist) as is_whitelist, |
| | | MAX(b.electrovalence) as electrovalence, |