xuhy
2024-09-02 3b0a898df3cafe2c876d20b5bf9dd0f1734acc81
Merge remote-tracking branch 'origin/master'
74个文件已修改
25个文件已添加
2954 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserVipDetailFallbackFactory.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserVipDetailClient.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/InvoiceInformationVo.java 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyDetailFallbackFactory.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingGunFallbackFactory.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ParkingLotFallbackFactory.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/SiteFallbackFactory.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyDetailClient.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ParkingLotClient.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/SiteClient.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TParkingRecord.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-chargingPile/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/PlatformStartChargingReplyFallbackFactory.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/SendMessageFallbackFactory.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/UploadRealTimeMonitoringDataFallbackFactory.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/PlatformStartChargingReplyClient.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/SendMessageClient.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/UploadRealTimeMonitoringDataClient.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/BaseModel.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/ChargingOrderAndUploadRealTimeMonitoringDataDto.java 209 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/UploadRealTimeMonitoringData.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-integration/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderAccountingStrategyClient.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrderAccountingStrategy.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TExchangeOrder.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderAppeal.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TShoppingOrder.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TVipOrder.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/ChargingOrderQuery.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/UploadRealTimeMonitoringDataQuery.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderInfoVO.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderListVO.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderTimeVO.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderVO.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TCharingOrderVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/ChargingOrderGroup.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/ChargingPercentProvinceDto.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserVipDetailController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyDetailController.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingLotController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingRecordController.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/dto/ChargingPercentBack.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/dto/ParkingRecordPageQuery.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TParkingRecordMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/ISiteService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TParkingRecordService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TParkingRecordServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TParkingRecordMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/pom.xml 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/PlatformStartChargingReplyController.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/UploadRealTimeMonitoringDataController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/PlatformStartChargingReplyService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/UploadRealTimeMonitoringDataService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/PlatformStartChargingReplyServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/UploadRealTimeMonitoringDataMessageListener.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/FinancialSettlementController.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java 366 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TExchangeOrderController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderAppealController.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderEvaluateController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TVipOrderController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ChargingListQuery.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ChargingStatisticsQueryDto.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PreChargeCheck.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/SixChargingDto.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/SixCircleDto.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/SixMonthTotal.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/SixShopDto.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/SixVipDto.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/filter/AuthFilter.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TShoppingOrderMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TVipOrderMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TOrderAppealService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TShoppingOrderService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TVipOrderService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderAccountingStrategyServiceImpl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 527 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TExchangeOrderServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderAppealServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TVipOrderServiceImpl.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/PreviousSixMonths.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ChargingOrderListInfoVO.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TShoppingOrderMapper.xml 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TVipOrderMapper.xml 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java
@@ -35,7 +35,7 @@
    
            @Override
            public R<TAppUser> getUserById(Long id) {
                return R.fail("根据id查询用户失败:"+throwable.getMessage());
                throw new RuntimeException("根据id查询用户失败:"+throwable.getMessage());
            }
            @Override
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserVipDetailFallbackFactory.java
@@ -26,7 +26,12 @@
    
            @Override
            public R<TAppUserVipDetail> getAppUserVipDetail(GetAppUserVipDetail getAppUserVipDetail) {
                return R.fail("获取用户当前有效的VIP明细调用失败:" + throwable.getMessage());
                throw new RuntimeException("获取用户当前有效的VIP明细调用失败:" + throwable.getMessage());
            }
            @Override
            public void updateAppUserVipDetail(TAppUserVipDetail appUserVipDetail) {
                throw new RuntimeException(throwable.getMessage());
            }
        };
    }
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserVipDetailClient.java
@@ -7,6 +7,7 @@
import com.ruoyi.common.core.domain.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
 * @author zhibing.pu
@@ -24,4 +25,10 @@
    R<TAppUserVipDetail> getAppUserVipDetail(GetAppUserVipDetail getAppUserVipDetail);
    
    
    /**
     * 修改会员明细
     * @param appUserVipDetail
     */
    @PostMapping("/appUserVipDetail/updateAppUserVipDetail")
    void updateAppUserVipDetail(@RequestBody TAppUserVipDetail appUserVipDetail);
}
ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/InvoiceInformationVo.java
New file
@@ -0,0 +1,62 @@
package com.ruoyi.account.api.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.ruoyi.common.core.web.domain.BasePojo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
 * <p>
 *
 * </p>
 *
 * @author luodangjia
 * @since 2024-08-06
 */
@Data
public class InvoiceInformationVo {
    private String id;
    @ApiModelProperty(value = "用户id")
    private Long appUserId;
    @ApiModelProperty(value = "发票类型(1=增值税普通发票,2=增值税专用发票)")
    private String invoiceType;
    @ApiModelProperty(value = "发票类型id")
    private Integer invoiceTypeId;
    @ApiModelProperty(value = "抬头类型(1=个人,2=企业)")
    private Integer invoicingObjectType;
    @ApiModelProperty(value = "名称")
    private String name;
    @ApiModelProperty(value = "纳税识别号")
    private String taxIdentificationNumber;
    @ApiModelProperty(value = "公司地址")
    private String companyAddress;
    @ApiModelProperty(value = "公司电话")
    private String companyPhone;
    @ApiModelProperty(value = "开户银行")
    private String depositBank;
    @ApiModelProperty(value = "银行账户")
    private String bankAccount;
    @ApiModelProperty(value = "设置默认(0=否,1=是)")
    private Integer isDefault;
}
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyDetailFallbackFactory.java
New file
@@ -0,0 +1,31 @@
package com.ruoyi.chargingPile.api.factory;
import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient;
import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
import com.ruoyi.common.core.domain.R;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
/**
 * @author zhibing.pu
 * @Date 2024/8/28 18:33
 */
@Component
public class AccountingStrategyDetailFallbackFactory  implements FallbackFactory<AccountingStrategyDetailClient> {
    private static final Logger log = LoggerFactory.getLogger(AccountingStrategyDetailFallbackFactory.class);
    @Override
    public AccountingStrategyDetailClient create(Throwable throwable) {
        log.error("计费策略调用失败:{}", throwable.getMessage());
        return new AccountingStrategyDetailClient(){
            @Override
            public R<TAccountingStrategyDetail> getNowData(Integer accountingStrategyId) {
                return R.fail("获取当前有效的计费策略明细失败:" + throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingGunFallbackFactory.java
@@ -35,7 +35,7 @@
    
            @Override
            public R<TChargingGun> getChargingGunById(Integer id) {
                return R.fail("根据id获取充电枪失败:" + throwable.getMessage());
                throw new RuntimeException("根据id获取充电枪失败:" + throwable.getMessage());
            }
            @Override
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ParkingLotFallbackFactory.java
@@ -11,6 +11,8 @@
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
/**
@@ -37,6 +39,11 @@
            public R<TParkingRecord> getRecordById(Long siteId) {
                return R.fail("通过id查询停车场记录:" + throwable.getMessage());
            }
            @Override
            public R<BigDecimal> getRecordAmount(LocalDate sixBefore) {
                return null;
            }
        };
    }
}
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/SiteFallbackFactory.java
@@ -1,5 +1,6 @@
package com.ruoyi.chargingPile.api.factory;
import com.ruoyi.chargingPile.api.dto.GetSiteListDTO;
import com.ruoyi.chargingPile.api.feignClient.SiteClient;
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.common.core.domain.R;
@@ -34,6 +35,11 @@
            public R<List<Site>> getSiteAll() {
                return R.fail("获取所有站点调用失败:" + throwable.getMessage());
            }
            @Override
            public R<List<GetSiteListDTO>> getSiteListByUserId(Long userId) {
                return null;
            }
        };
    }
}
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyDetailClient.java
New file
@@ -0,0 +1,26 @@
package com.ruoyi.chargingPile.api.feignClient;
import com.ruoyi.chargingPile.api.factory.AccountingStrategyDetailFallbackFactory;
import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
 * @author zhibing.pu
 * @Date 2024/8/28 18:33
 */
@FeignClient(contextId = "AccountingStrategyDetailClient", value = ServiceNameConstants.CHARGINGPILE_SERVICE, fallbackFactory = AccountingStrategyDetailFallbackFactory.class)
public interface AccountingStrategyDetailClient {
    /**
     * 获取当前有效的计费策略明细
     * @param accountingStrategyId
     * @return
     */
    @PostMapping("/t-accounting-strategy-detail/getNowData")
    R<TAccountingStrategyDetail> getNowData(@RequestParam("accountingStrategyId") Integer accountingStrategyId);
}
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ParkingLotClient.java
@@ -12,6 +12,8 @@
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
/**
@@ -30,4 +32,7 @@
    @PostMapping(value = "/t-parking-lot/getRecordById")
    public R<TParkingRecord> getRecordById(@RequestParam("id") Long siteId);
    @PostMapping(value = "/t-parking-lot/getRecordAmount")
    public R<BigDecimal> getRecordAmount(@RequestParam("sixBefore") LocalDate sixBefore);
}
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/SiteClient.java
@@ -1,12 +1,15 @@
package com.ruoyi.chargingPile.api.feignClient;
import com.ruoyi.chargingPile.api.dto.GetSiteListDTO;
import com.ruoyi.chargingPile.api.factory.SiteFallbackFactory;
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
@@ -31,4 +34,7 @@
     */
    @PostMapping("/site/getSiteAll")
    R<List<Site>> getSiteAll();
    @GetMapping("/site/getSiteList/byUserId")
    R<List<GetSiteListDTO>> getSiteListByUserId(@RequestParam("userId") Long userId);
}
ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TParkingRecord.java
@@ -39,6 +39,11 @@
    @ApiModelProperty(value = "车牌号")
    @TableField("license_plate")
    private String licensePlate;
    @TableField(exist = false)
    private String name;
    @TableField(exist = false)
    private String uid;
    @ApiModelProperty(value = "订单编号")
    @TableField("code")
    private String code;
ruoyi-api/ruoyi-api-chargingPile/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -2,3 +2,4 @@
com.ruoyi.chargingPile.api.factory.SiteFallbackFactory
com.ruoyi.chargingPile.api.factory.ParkingLotFallbackFactory
com.ruoyi.chargingPile.api.factory.ChargingGunFallbackFactory
com.ruoyi.chargingPile.api.factory.AccountingStrategyDetailFallbackFactory
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/PlatformStartChargingReplyFallbackFactory.java
New file
@@ -0,0 +1,34 @@
package com.ruoyi.integration.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.integration.api.feignClient.PlatformStartChargingReplyClient;
import com.ruoyi.integration.api.model.PlatformStartChargingReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2024/8/31 15:16
 */
@Component
public class PlatformStartChargingReplyFallbackFactory  implements FallbackFactory<PlatformStartChargingReplyClient> {
    private static final Logger log = LoggerFactory.getLogger(PlatformStartChargingReplyFallbackFactory.class);
    @Override
    public PlatformStartChargingReplyClient create(Throwable throwable) {
        log.error("远程启机应答调用失败:{}", throwable.getMessage());
        return new PlatformStartChargingReplyClient(){
            @Override
            public R<List<PlatformStartChargingReply>> getPlatformStartChargingReply(String code) {
                return R.fail("根据订单编号查询远程启机应答结果失败:" + throwable.getMessage());
            }
        };
    }
}
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/SendMessageFallbackFactory.java
@@ -28,6 +28,7 @@
    
            @Override
            public void platformStartCharging(PlatformStartCharging platformStartCharging) {
                throw new RuntimeException("远程启机失败" + throwable.getMessage());
            }
        };
    }
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/UploadRealTimeMonitoringDataFallbackFactory.java
@@ -9,6 +9,7 @@
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Set;
/**
 * 充电桩服务降级处理
@@ -35,6 +36,11 @@
            public R<List<UploadRealTimeMonitoringData>> getDataByOrderCode(String code) {
                return R.fail("根据订单编号获取所有监测数据失败:" + throwable.getMessage());
            }
            @Override
            public R<List<UploadRealTimeMonitoringData>> getAll(Set<String> values, Integer page, Integer size) {
                return null;
            }
        };
    }
}
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/PlatformStartChargingReplyClient.java
New file
@@ -0,0 +1,28 @@
package com.ruoyi.integration.api.feignClient;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.integration.api.factory.PlatformStartChargingReplyFallbackFactory;
import com.ruoyi.integration.api.model.PlatformStartChargingReply;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2024/8/31 15:16
 */
@FeignClient(contextId = "PlatformStartChargingReplyClient", value = ServiceNameConstants.INTEGRATION_SERVICE, fallbackFactory = PlatformStartChargingReplyFallbackFactory.class)
public interface PlatformStartChargingReplyClient {
    /**
     * 根据订单编号查询远程启机应答结果
     * @param code
     * @return
     */
    @PostMapping("/platformStartChargingReply/getPlatformStartChargingReply")
    R<List<PlatformStartChargingReply>> getPlatformStartChargingReply(@RequestParam("code") String code);
}
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/SendMessageClient.java
@@ -2,7 +2,6 @@
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.integration.api.factory.SendMessageFallbackFactory;
import com.ruoyi.integration.api.model.EndCharge;
import com.ruoyi.integration.api.model.PlatformStartCharging;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/UploadRealTimeMonitoringDataClient.java
@@ -9,6 +9,7 @@
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
import java.util.Set;
/**
 * @author zhibing.pu
@@ -32,4 +33,7 @@
     */
    @PostMapping("/uploadRealTimeMonitoringData/getDataByOrderCode")
    R<List<UploadRealTimeMonitoringData>> getDataByOrderCode(@RequestParam("code") String code);
    @PostMapping("/uploadRealTimeMonitoringData/getAll")
    R<List<UploadRealTimeMonitoringData>> getAll(@RequestParam("values") Set<String> values, @RequestParam("page") Integer page, @RequestParam("size")Integer size);
}
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/BaseModel.java
@@ -10,6 +10,7 @@
 */
@Data
public class BaseModel {
    private Date last_time = new Date();
    
    private Date create_time = new Date();
}
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/ChargingOrderAndUploadRealTimeMonitoringDataDto.java
New file
@@ -0,0 +1,209 @@
package com.ruoyi.integration.api.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * 上传实时监测数据
 **/
@Data
@Document(collection = "upload_real_time_monitoring_data") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class ChargingOrderAndUploadRealTimeMonitoringDataDto extends BaseModel {
    @Id
    private String id;
    private String transaction_serial_number; // 交易流水号
    private String charging_pile_code; // 桩编码
    private String charging_gun_code; // 抢号
    private Integer charging_gun_status; // 状态(0:离线,1:故障,2:空闲,3:充电)
    private Integer homing_status; // 枪是否归位(0:否,1:是,2:未知)
    private Integer insertion_status; // 是否插枪(0:否,1:是)
    private BigDecimal output_voltage; // 输出电压,精确到小数点后一位;待机置零
    private BigDecimal output_current; // 输出电流,精确到小数点后一位;待机置零
    private Integer gun_line_temperature; // 枪线温度,整形,偏移量-50;待机置零
    private String gun_line_code; // 枪线编码,没有置零
    private Integer soc; // SOC待机置零;交流桩置零
    private Integer battery_temperature; // 电池组最高温度,整形,偏移量-50 ºC;待机置零;交流桩置零
    private Integer cumulative_charging_time; // 累计充电时间,单位:min;待机置零
    private Integer time_remaining; // 剩余时间,单位:min;待机置零、交流桩置零
    @ApiModelProperty("充电度数")
    private BigDecimal charging_degree; // 充电度数,精确到小数点后四位;待机置零
    private BigDecimal loss_of_charging_degree; // 计损充电度数,精确到小数点后四位;待机置零,未设置计损比例时等于充电度数
    private BigDecimal paid_amount; // 已充金额,精确到小数点后四位;待机置零(电费+服务费)*计损充电度数
    @ApiModelProperty("时段电价")
    private BigDecimal electrovalence_all;
    @ApiModelProperty("时段服务费单价")
    private BigDecimal service_charge;
    @ApiModelProperty("时段电费")
    private BigDecimal period_electric_price;
    @ApiModelProperty("时段服务费")
    private BigDecimal period_service_price;
    private Integer hardware_fault; // 硬件故障(1:急停按钮动作故障;2:无可用整流模块;3:出风口温度过高;4:交流防雷故障;5:交直流模块 DC20 通信中断;6:绝缘检测模块 FC08 通信中断;7:电度表通信中断;8:读卡器通信中断;9:RC10 通信中断;10:风扇调速板故障;11:直流熔断器故障;12:高压接触器故障;13:门打开)、
    @ApiModelProperty(value = "订单编号")
    @TableField("code")
    private String code;
    @ApiModelProperty(value = "订单类型(1=充电订单(小程序),2=充电订单(刷卡))")
    @TableField("order_type")
    private Integer orderType;
    @ApiModelProperty(value = "0平台1其他")
    @TableField("order_source")
    private Integer orderSource;
    @ApiModelProperty(value = "平台或其他第三分名字")
    @TableField("source_name")
    private String sourceName;
    @ApiModelProperty(value = "手续费")
    @TableField("commission_amount")
    private BigDecimal commissionAmount;
    @ApiModelProperty(value = "分佣")
    @TableField("sharing_amount")
    private BigDecimal sharingAmount;
    @ApiModelProperty(value = "订单分类(1=线上,2=线下)")
    @TableField("order_classification")
    private Integer orderClassification;
    @ApiModelProperty(value = "用户id")
    @TableField("app_user_id")
    private Long appUserId;
    @ApiModelProperty(value = "充电车辆 id")
    @TableField("app_user_car_id")
    private Long appUserCarId;
    @ApiModelProperty(value = "站点 id")
    @TableField("site_id")
    private Integer siteId;
    @ApiModelProperty(value = "停车场id")
    @TableField("parking_lot_id")
    private Integer parkingLotId;
    @ApiModelProperty(value = "充电桩id")
    @TableField("charging_pile_id")
    private Integer chargingPileId;
    @ApiModelProperty(value = "充电枪id")
    @TableField("charging_gun_id")
    private Integer chargingGunId;
    @ApiModelProperty(value = "充电总度数")
    @TableField("charging_capacity")
    private BigDecimal chargingCapacity;
    @ApiModelProperty(value = "充电功率")
    @TableField("charging_power")
    private BigDecimal chargingPower;
    @ApiModelProperty(value = "充电开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @TableField("start_time")
    private LocalDateTime startTime;
    @ApiModelProperty(value = "充电结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @TableField("end_time")
    private LocalDateTime endTime;
    @ApiModelProperty(value = "状态(0=未知,1=等待中/已插枪,2=启动中,3=充电中,4=停止中,5=已结束)")
    @TableField("status")
    private Integer status;
    @ApiModelProperty(value = "结束方式(0=异常终止,1=主动终止,2=满电终止,3=费用不足终止)")
    @TableField("end_mode")
    private Integer endMode;
    @ApiModelProperty(value = "充值金额")
    @TableField("recharge_amount")
    private BigDecimal rechargeAmount;
    @ApiModelProperty(value = "充值支付方式(1=微信,2=支付宝)")
    @TableField("recharge_payment_type")
    private Integer rechargePaymentType;
    @ApiModelProperty(value = "充值支付状态(1=待支付,2=已支付)")
    @TableField("recharge_payment_status")
    private Integer rechargePaymentStatus;
    @ApiModelProperty(value = "充值支付第三方流水号")
    @TableField("recharge_serial_number")
    private String rechargeSerialNumber;
    @ApiModelProperty(value = "订单金额(总金额)")
    @TableField("order_amount")
    private BigDecimal orderAmount;
    @ApiModelProperty(value = "优惠券id")
    @TableField("app_coupon_id")
    private Long appCouponId;
    @ApiModelProperty(value = "优惠券抵扣金额")
    @TableField("coupon_discount_amount")
    private BigDecimal couponDiscountAmount;
    @ApiModelProperty(value = "会员折扣")
    @TableField("vip_discount")
    private BigDecimal vipDiscount;
    @ApiModelProperty(value = "会员优惠金额")
    @TableField("vip_discount_amount")
    private BigDecimal vipDiscountAmount;
    @ApiModelProperty(value = "支付金额(实付)")
    @TableField("payment_amount")
    private BigDecimal paymentAmount;
    @ApiModelProperty(value = "退款流水号")
    @TableField("refund_code")
    private String refundCode;
    @ApiModelProperty(value = "退款金额")
    @TableField("refund_amount")
    private BigDecimal refundAmount;
    @ApiModelProperty(value = "累计服务费")
    @TableField("service_charge")
    private BigDecimal serviceCharge;
    @ApiModelProperty(value = "累计电费")
    @TableField("electrovalence")
    private BigDecimal electrovalence;
    @ApiModelProperty(value = "退款状态(1=退款中,2=退款成功)")
    @TableField("refund_status")
    private Integer refundStatus;
    @ApiModelProperty(value = "退款第三方流水号")
    @TableField("refund_serial_number")
    private String refundSerialNumber;
    @ApiModelProperty(value = "退款成功时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @TableField("refund_time")
    private LocalDateTime refundTime;
    @ApiModelProperty(value = "支付时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @TableField("pay_time")
    private LocalDateTime payTime;
}
ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/model/UploadRealTimeMonitoringData.java
@@ -1,8 +1,8 @@
package com.ruoyi.integration.api.model;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.math.BigDecimal;
@@ -16,7 +16,6 @@
@Accessors(chain = true)
public class UploadRealTimeMonitoringData extends BaseModel {
    @Id
    private String transaction_serial_number; // 交易流水号
    private String charging_pile_code; // 桩编码
    private String charging_gun_code; // 抢号
@@ -36,6 +35,14 @@
    private BigDecimal paid_amount; // 已充金额,精确到小数点后四位;待机置零(电费+服务费)*计损充电度数
    private Integer hardware_fault; // 硬件故障(1:急停按钮动作故障;2:无可用整流模块;3:出风口温度过高;4:交流防雷故障;5:交直流模块 DC20 通信中断;6:绝缘检测模块 FC08 通信中断;7:电度表通信中断;8:读卡器通信中断;9:RC10 通信中断;10:风扇调速板故障;11:直流熔断器故障;12:高压接触器故障;13:门打开)
    private BigDecimal electrovalence_all;// @ApiModelProperty("时段电价")
    private BigDecimal service_charge;//@ApiModelProperty("时段服务费单价")
    private BigDecimal period_electric_price;//    @ApiModelProperty("时段电费")
    private BigDecimal period_service_price;//    @ApiModelProperty("时段服务费")
}
ruoyi-api/ruoyi-api-integration/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -2,3 +2,4 @@
com.ruoyi.integration.api.factory.UploadRealTimeMonitoringDataFallbackFactory
com.ruoyi.integration.api.factory.ChargingHandshakeFallbackFactory
com.ruoyi.integration.api.factory.SendMessageFallbackFactory
com.ruoyi.integration.api.factory.PlatformStartChargingReplyFallbackFactory
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
@@ -1,13 +1,18 @@
package com.ruoyi.order.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.dto.ChargingOrderGroup;
import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
import com.ruoyi.order.api.feignClient.ChargingOrderClient;
import com.ruoyi.order.api.model.TChargingOrder;
import com.ruoyi.order.api.query.TChargingCountQuery;
import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
import java.util.List;
/**
 * 充电订单服务降级处理
@@ -36,6 +41,16 @@
            }
            @Override
            public R<List<TChargingOrder>> getList(Integer siteId) {
                return R.fail("根据站点id查询充电订单:" + throwable.getMessage());
            }
            @Override
            public R<List<ChargingOrderGroup>> getBySiteIdAndTime(ChargingPercentProvinceDto chargingPercentProvinceDto) {
                return null;
            }
            @Override
            public R<Integer> getChargingCount(TChargingCountQuery req) {
                return R.fail("根据会员id和有效期查询有效期内享受充电折扣次数:" + throwable.getMessage());
            }
@@ -49,6 +64,10 @@
            public R<Long> getCar() {
                return R.fail("获取用户最近使用车辆充电的车辆id:" + throwable.getMessage());
            }
            @Override
            public void chargeMonitoring(UploadRealTimeMonitoringDataQuery query) {
            }
        };
    }
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderAccountingStrategyClient.java
@@ -36,6 +36,6 @@
     * @param days
     * @return
     */
    @PostMapping("/t-charging-order-getDailyChargingDegree-strategy/getUtilizationTrend/{days}")
    @PostMapping("/t-charging-order-accounting-strategy/getDailyChargingDegree/{days}")
    R<List<Double>> getDailyChargingDegree(@PathVariable("days") Integer days, @RequestParam("siteIds") Set<Integer> siteIds);
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
@@ -2,14 +2,19 @@
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.dto.ChargingOrderGroup;
import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
import com.ruoyi.order.api.factory.ChargingOrderFallbackFactory;
import com.ruoyi.order.api.model.TChargingOrder;
import com.ruoyi.order.api.query.TChargingCountQuery;
import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
/**
 * 充电订单服务
@@ -22,6 +27,16 @@
    @PostMapping(value = "/t-charging-order/detail")
    R<TChargingOrder> orderDetail(@RequestParam("orderId") Long orderId);
    @PostMapping(value = "/t-charging-order/getList")
    R<List<TChargingOrder>> getList(@RequestParam("siteId") Integer siteId);
    @PostMapping(value = "/t-charging-order/getBySiteIdAndTime")
    R<List<ChargingOrderGroup>> getBySiteIdAndTime(@RequestBody ChargingPercentProvinceDto chargingPercentProvinceDto);
    /**
     * 查询会员在本月有多少次享受了充电折扣
@@ -46,4 +61,13 @@
     */
    @GetMapping(value = "/t-charging-order/getCar")
    public R<Long> getCar();
    /**
     * 处理充电订单实时监控数据相关的业务逻辑
     * @param query
     * @return
     */
    @PostMapping(value = "/t-charging-order/chargeMonitoring")
    void chargeMonitoring(@RequestBody UploadRealTimeMonitoringDataQuery query);
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java
@@ -39,6 +39,19 @@
    @ApiModelProperty(value = "订单类型(1=充电订单(小程序),2=充电订单(刷卡))")
    @TableField("order_type")
    private Integer orderType;
    @ApiModelProperty(value = "0平台1其他")
    @TableField("order_source")
    private Integer orderSource;
    @ApiModelProperty(value = "平台或其他第三分名字")
    @TableField("source_name")
    private String sourceName;
    @ApiModelProperty(value = "手续费")
    @TableField("commission_amount")
    private BigDecimal commissionAmount;
    @ApiModelProperty(value = "分佣")
    @TableField("sharing_amount")
    private BigDecimal sharingAmount;
    @ApiModelProperty(value = "订单分类(1=线上,2=线下)")
    @TableField("order_classification")
@@ -110,6 +123,10 @@
    @TableField("recharge_serial_number")
    private String rechargeSerialNumber;
    @ApiModelProperty(value = "剩余金额(用于前端展示)")
    @TableField("residual_amount")
    private BigDecimal residualAmount;
    @ApiModelProperty(value = "订单金额(总金额)")
    @TableField("order_amount")
    private BigDecimal orderAmount;
@@ -142,6 +159,14 @@
    @TableField("refund_amount")
    private BigDecimal refundAmount;
    @ApiModelProperty(value = "累计服务费")
    @TableField("service_charge")
    private BigDecimal serviceCharge;
    @ApiModelProperty(value = "累计电费")
    @TableField("electrovalence")
    private BigDecimal electrovalence;
    @ApiModelProperty(value = "退款状态(1=退款中,2=退款成功)")
    @TableField("refund_status")
    private Integer refundStatus;
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrderAccountingStrategy.java
@@ -64,5 +64,25 @@
    @TableField("charging_capacity")
    private BigDecimal chargingCapacity;
    @ApiModelProperty(value = "时段电费")
    @TableField("period_electric_price")
    private BigDecimal periodElectricPrice;
    @ApiModelProperty(value = "时段服务费")
    @TableField("period_service_price")
    private BigDecimal periodServicePrice;
    @ApiModelProperty(value = "会员抵扣")
    @TableField(exist = false)
    private BigDecimal vipDiscount;
    @ApiModelProperty(value = "优惠券抵扣")
    @TableField(exist = false)
    private BigDecimal couponDiscount;
    @ApiModelProperty(value = "最终服务费")
    @TableField(exist = false)
    private BigDecimal finalService;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TExchangeOrder.java
@@ -113,6 +113,15 @@
    @ApiModelProperty(value = "取消人")
    @TableField(exist = false)
    private String cancellationName;
    @ApiModelProperty(value = "商品名称")
    @TableField(exist = false)
    private String name;
    @ApiModelProperty(value = "下单手机号")
    @TableField(exist = false)
    private String phone;
    @ApiModelProperty(value = "订单id")
    @TableField(exist = false)
    private String uid;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderAppeal.java
@@ -70,6 +70,8 @@
    @ApiModelProperty(value = "申诉反馈")
    @TableField("feedback")
    private String feedback;
    @TableField(exist = false)
    private String uid;
    @ApiModelProperty(value = "反馈人id")
    @TableField("feedback_user_id")
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TShoppingOrder.java
@@ -162,7 +162,12 @@
    @TableField("pay_time")
    private LocalDateTime payTime;
    @ApiModelProperty(value = "下单手机号")
    @TableField(exist = false)
    private String phone;
    @ApiModelProperty(value = "商品/优惠券名称")
    @TableField(exist = false)
    private String name;
    @ApiModelProperty(value = "收货人")
    @TableField(exist = false)
    private String receivingName;
@@ -175,5 +180,8 @@
    @ApiModelProperty(value = "取消人")
    @TableField(exist = false)
    private String cancellationName;
    @ApiModelProperty(value = "订单id")
    @TableField(exist = false)
    private String uid;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TVipOrder.java
@@ -89,5 +89,14 @@
    @ApiModelProperty(value = "退款金额")
    @TableField("refund_amount")
    private BigDecimal refundAmount;
    @ApiModelProperty(value = "会员类型名称")
    @TableField(exist = false)
    private String name;
    @ApiModelProperty(value = "uid")
    @TableField(exist = false)
    private String uid;
    @ApiModelProperty(value = "userUid")
    @TableField(exist = false)
    private String userUid;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/ChargingOrderQuery.java
@@ -9,7 +9,7 @@
import java.util.List;
@Data
@ApiModel(value = "ChargingOrderQuery对象",description = "管理后台充电订单查询对象")
@ApiModel(value = "ChargingOrderQuery充电桩订单查询对象",description = "管理后台充电桩订单查询对象")
public class ChargingOrderQuery extends BasePage {
    @ApiModelProperty(value = "订单编号")
    private String code;
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/UploadRealTimeMonitoringDataQuery.java
New file
@@ -0,0 +1,36 @@
package com.ruoyi.order.api.query;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
 * 上传实时监测数据
 **/
@Data
public class UploadRealTimeMonitoringDataQuery {
    private String transaction_serial_number; // 交易流水号
    private String charging_pile_code; // 桩编码
    private String charging_gun_code; // 抢号
    private Integer charging_gun_status; // 状态(0:离线,1:故障,2:空闲,3:充电)
    private Integer homing_status; // 枪是否归位(0:否,1:是,2:未知)
    private Integer insertion_status; // 是否插枪(0:否,1:是)
    private BigDecimal output_voltage; // 输出电压,精确到小数点后一位;待机置零
    private BigDecimal output_current; // 输出电流,精确到小数点后一位;待机置零
    private Integer gun_line_temperature; // 枪线温度,整形,偏移量-50;待机置零
    private String gun_line_code; // 枪线编码,没有置零
    private Integer soc; // SOC待机置零;交流桩置零
    private Integer battery_temperature; // 电池组最高温度,整形,偏移量-50 ºC;待机置零;交流桩置零
    private Integer cumulative_charging_time; // 累计充电时间,单位:min;待机置零
    private Integer time_remaining; // 剩余时间,单位:min;待机置零、交流桩置零
    private BigDecimal charging_degree; // 充电度数,精确到小数点后四位;待机置零
    private BigDecimal loss_of_charging_degree; // 计损充电度数,精确到小数点后四位;待机置零,未设置计损比例时等于充电度数
    private BigDecimal paid_amount; // 已充金额,精确到小数点后四位;待机置零(电费+服务费)*计损充电度数
    private Integer hardware_fault; // 硬件故障(1:急停按钮动作故障;2:无可用整流模块;3:出风口温度过高;4:交流防雷故障;5:交直流模块 DC20 通信中断;6:绝缘检测模块 FC08 通信中断;7:电度表通信中断;8:读卡器通信中断;9:RC10 通信中断;10:风扇调速板故障;11:直流熔断器故障;12:高压接触器故障;13:门打开)
    private Date create_time;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderInfoVO.java
New file
@@ -0,0 +1,35 @@
package com.ruoyi.order.api.vo;
import com.ruoyi.order.api.model.TChargingOrder;
import com.ruoyi.order.api.model.TChargingOrderAccountingStrategy;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
@ApiModel(value = "充电桩订单列表查看详情",description = "充电桩订单列表查看详情")
public class ChargingOrderInfoVO {
    @ApiModelProperty(value = "充电电流")
    private String cdElectronic;
    @ApiModelProperty(value = "充电电压")
    private String cdVoltage;
    @ApiModelProperty(value = "剩余电量")
    private String  surplus;
    @ApiModelProperty(value = "实时总功率")
    private String totalPower;
    @ApiModelProperty(value = "车牌号")
    private String licensePlate;
    @ApiModelProperty(value = "车辆品牌")
    private String vehicleBrand;
    @ApiModelProperty(value = "车辆类型")
    private String vehicleModel;
    @ApiModelProperty(value = "用车类型")
    private String vehicleUse;
    @ApiModelProperty(value = "充电明细列表")
    private List<TChargingOrderAccountingStrategy> list;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderListVO.java
New file
@@ -0,0 +1,71 @@
package com.ruoyi.order.api.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.order.api.model.TChargingOrder;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
@ApiModel(value = "ChargingOrderListVO对象",description = "充电时段统计列表VO")
public class ChargingOrderListVO  {
    @ApiModelProperty(value = "电站名称")
    private String siteName;
    @ApiModelProperty(value = "电站id")
    private Integer siteId;
    @ApiModelProperty(value = "充电桩id")
    private Integer chargingPileId;
    @ApiModelProperty(value = "用户id")
    private Long appUserId;
    @ApiModelProperty(value = "用户车辆id")
    private Long appUserCarId;
    @ApiModelProperty(value = "充电枪id")
    private Integer chargingGunId;
    @ApiModelProperty(value = "订单编号")
    private String code;
    @ApiModelProperty(value = "订单类型(1=充电订单(小程序),2=充电订单(刷卡))")
    private String orderType;
    @ApiModelProperty(value = "充电终端名称 桩+枪")
    private String terminalName;
    @ApiModelProperty(value = "充电时间 秒")
    private Long chargingSecond;
    @ApiModelProperty(value = "充电电流 度")
    private BigDecimal chargingCapacity;
    @ApiModelProperty(value = "车牌号")
    private String licensePlate;
    @ApiModelProperty(value = "客户手机号")
    private String phone;
    @ApiModelProperty(value = "充电到账金额")
    private BigDecimal paymentAmount;
    @ApiModelProperty(value = "累计电费")
    private BigDecimal electrovalence;
    @ApiModelProperty(value = "累计服务费")
    private BigDecimal serviceCharge;
    @ApiModelProperty(value = "平台手续费")
    private BigDecimal commissionAmount;
    @ApiModelProperty(value = "引流平台")
    private String sourceName;
    @ApiModelProperty(value = "平台分佣")
    private BigDecimal sharingAmount;
    @ApiModelProperty(value = "开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime startTime;
    @ApiModelProperty(value = "结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime endTime;
    @ApiModelProperty(value = "开始soc")
    private String startSoc;
    @ApiModelProperty(value = "结束soc")
    private String endSoc;
    @ApiModelProperty(value = "结束原因 (0=异常终止,1=主动终止,2=满电终止,3=费用不足终止)")
    private Integer endMode;
    @ApiModelProperty(value = "电流占比")
    private String electronicProportion;
    @ApiModelProperty(value = "订单id")
    private Long id;
    @ApiModelProperty(value = "订单uid")
    private String uid;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderTimeVO.java
New file
@@ -0,0 +1,34 @@
package com.ruoyi.order.api.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.web.page.PageInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ApiModel(value = "ChargingOrderTimeVO对象",description = "充电时段统计VO")
public class ChargingOrderTimeVO {
    @ApiModelProperty(value = "订单数量")
    private Integer orderCount;
    @ApiModelProperty(value = "充电总度数")
    private BigDecimal chargingCapacity;
    @ApiModelProperty(value = "充电到账金额")
    private BigDecimal paymentAmount;
    @ApiModelProperty(value = "累计电费")
    private BigDecimal electrovalence;
    @ApiModelProperty(value = "累计服务费")
    private BigDecimal serviceCharge;
    @ApiModelProperty(value = "尖峰平谷充电量")
    private String capacityProportion;
    @ApiModelProperty(value = "尖峰平谷服务费")
    private String serviceProportion;
    @ApiModelProperty(value = "尖峰平谷充电到账")
    private String electronicProportion;
    @ApiModelProperty(value = "列表数据")
    private PageInfo<ChargingOrderListVO> list;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderVO.java
@@ -13,7 +13,7 @@
import java.util.List;
@Data
@ApiModel(value = "SiteDetailEvaluateVO对象",description = "站点详情订单评价")
@ApiModel(value = "ChargingOrderVO对象",description = "充电订单列表VO")
public class ChargingOrderVO extends TChargingOrder {
    @ApiModelProperty(value = "站点名称")
    private String siteName;
@@ -38,5 +38,4 @@
    private Integer count;
    @ApiModelProperty(value = "1明星充电 2快电 3新电途")
    private Integer orderSource;
}
ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TCharingOrderVO.java
@@ -8,7 +8,7 @@
import java.math.BigDecimal;
@Data
@ApiModel(value = "TOrderAppealVO对象", description = "充电桩订单VO")
@ApiModel(value = "充电桩订单列表对象", description = "充电桩订单VO")
public class TCharingOrderVO {
    @ApiModelProperty(value = "分页列表")
    private PageInfo<ChargingOrderVO> list;
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/ChargingOrderGroup.java
New file
@@ -0,0 +1,13 @@
package com.ruoyi.common.core.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ChargingOrderGroup {
    @ApiModelProperty("充电量")
    BigDecimal chargingCapacity;
    @ApiModelProperty("站点")
    Integer siteId;
}
ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/dto/ChargingPercentProvinceDto.java
New file
@@ -0,0 +1,13 @@
package com.ruoyi.common.core.dto;
import lombok.Data;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
public class ChargingPercentProvinceDto {
    String provinceCode;
    LocalDate date1;
    LocalDate date2;
}
ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserVipDetailController.java
@@ -57,5 +57,14 @@
        return R.ok(list);
    }
    /**
     * 修改会员明细
     * @param appUserVipDetail
     */
    @PostMapping("/updateAppUserVipDetail")
    public void updateAppUserVipDetail(@RequestBody TAppUserVipDetail appUserVipDetail){
        appUserVipDetailService.updateById(appUserVipDetail);
    }
    
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java
@@ -11,6 +11,9 @@
import com.ruoyi.chargingPile.api.query.SiteQuery;
import com.ruoyi.chargingPile.api.vo.*;
import com.ruoyi.chargingPile.domain.SiteMenu;
import com.ruoyi.chargingPile.dto.ChargingPercentBack;
import com.ruoyi.common.core.dto.ChargingOrderGroup;
import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
import com.ruoyi.chargingPile.service.*;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.GeodesyUtil;
@@ -18,6 +21,8 @@
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.order.api.feignClient.ChargingOrderClient;
import com.ruoyi.order.api.model.TChargingOrder;
import com.ruoyi.other.api.feignClient.RoleSiteClient;
import com.ruoyi.other.api.feignClient.UserSiteClient;
import com.ruoyi.system.api.domain.SysUser;
@@ -33,8 +38,11 @@
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.stream.Collectors;
/**
 * @author zhibing.pu
@@ -72,6 +80,9 @@
    @Autowired
    private TAccountingStrategyDetailService accountingStrategyDetailService;
    @Resource
    private ChargingOrderClient chargingOrderClient;
    /**
     * 小程序扫一扫
@@ -105,6 +116,112 @@
        PageInfo<GetSiteListDTO> list = siteService.getSiteList(siteList);
        return AjaxResult.success(list);
    }
    @GetMapping("/getSiteList/byUserId")
    @ApiOperation(value = "获取站点列表", tags = {"管理后台-站点管理"})
    public R<List<GetSiteListDTO>> getSiteListByUserId(@RequestParam("userId") Long userId){
        PageInfo<GetSiteListDTO> list = siteService.getSiteList1(userId);
        return R.ok(list.getRecords());
    }
    @GetMapping("/map/getSiteList")
    @ApiOperation(value = "获取站点", tags = {"管理后台-数据分析-电站分析"})
    public R<List<GetSiteListDTO>> getMapSiteList(GetSiteList siteList){
        siteList.setPageCurr(1);
        siteList.setPageCurr(99999);
        PageInfo<GetSiteListDTO> list = siteService.getSiteList(siteList);
        return R.ok(list.getRecords());
    }
    @GetMapping("/map/getPercent")
    @ApiOperation(value = "获取该充电站的利用率", tags = {"管理后台-数据分析-电站分析"})
    public R getPercent(Integer siteId){
        BigDecimal bigDecimal = new BigDecimal("0");
        //获取该站点的总充电度数
        List<TChargingOrder> chargingOrders = chargingOrderClient.getList(siteId).getData();
        for (TChargingOrder chargingOrder : chargingOrders) {
            bigDecimal = bigDecimal.add(chargingOrder.getChargingCapacity());
        }
        //获取该站点的所有充电桩
        List<TChargingPile> chargingPiles = chargingPileService.lambdaQuery().eq(TChargingPile::getSiteId, siteId).list();
        BigDecimal bigDecimal1 = new BigDecimal("0");
        for (TChargingPile chargingPile : chargingPiles) {
            bigDecimal1 = bigDecimal1.add(chargingPile.getRatedPower());
        }
        BigDecimal multiply = bigDecimal1.multiply(new BigDecimal("24"));
        BigDecimal divide = bigDecimal.divide(multiply, 0, BigDecimal.ROUND_HALF_UP);
        return R.ok(divide);
    }
    @PostMapping("/map/getPercentByprovinceCode")
    @ApiOperation(value = "获取该充电站的利用率", tags = {"管理后台-数据分析-电站分析"})
    public R getPercentByCityCode(@RequestBody ChargingPercentProvinceDto chargingPercentProvinceDto){
        if (chargingPercentProvinceDto.getDate1()==null){
            LocalDate today = LocalDate.now();
            LocalDate lastMonth = today.minusMonths(1);
            LocalDate firstDayOfLastMonth = lastMonth.withDayOfMonth(1);
            LocalDate lastDayOfLastMonth =lastMonth.withDayOfMonth(lastMonth.lengthOfMonth());
            chargingPercentProvinceDto.setDate1(firstDayOfLastMonth);
            chargingPercentProvinceDto.setDate2(lastDayOfLastMonth);
        }
        GetSiteList siteList = new GetSiteList();
        siteList.setProvinceCode(chargingPercentProvinceDto.getProvinceCode());
        siteList.setPageCurr(1);
        siteList.setPageCurr(9999);
        ChargingPercentBack chargingPercentBack = new ChargingPercentBack();
        //通过省编码获取充电站id
        List<GetSiteListDTO> records = siteService.getSiteList(siteList).getRecords();
        List<Integer> collect = records.stream().map(GetSiteListDTO::getId).collect(Collectors.toList());
        // 通过时间段获取和充电桩id获取各个充电站的充电订单
        List<ChargingOrderGroup> data = chargingOrderClient.getBySiteIdAndTime(chargingPercentProvinceDto).getData();
        // 计算利用率展示
        for (ChargingOrderGroup datum : data) {
            List<TChargingPile> chargingPiles = chargingPileService.lambdaQuery().eq(TChargingPile::getSiteId, datum.getSiteId()).list();
            BigDecimal bigDecimal1 = new BigDecimal("0");
            for (TChargingPile chargingPile : chargingPiles) {
                bigDecimal1 = bigDecimal1.add(chargingPile.getRatedPower());
            }
            long daysBetween = ChronoUnit.DAYS.between(chargingPercentProvinceDto.getDate1(), chargingPercentProvinceDto.getDate2()) + 1;
            BigDecimal multiply = bigDecimal1.multiply(new BigDecimal("24")).multiply(BigDecimal.valueOf(daysBetween));
            //得到利用率
            BigDecimal divide = datum.getChargingCapacity().divide(multiply, 0, BigDecimal.ROUND_HALF_UP);
            //如果利用率大于等于10
            if (divide.compareTo(BigDecimal.valueOf(10))>=0){
                chargingPercentBack.setCount1(chargingPercentBack.getCount1()+1);
            }
            //如果利用率大于等于5小于10
            if (divide.compareTo(BigDecimal.valueOf(5))>=0 && divide.compareTo(BigDecimal.valueOf(10))<0){
                chargingPercentBack.setCount2(chargingPercentBack.getCount2()+1);
            }
            //如果利用率大于等于1小于5
            if (divide.compareTo(BigDecimal.valueOf(1))>=0 && divide.compareTo(BigDecimal.valueOf(5))<0){
                chargingPercentBack.setCount3(chargingPercentBack.getCount3()+1);
            }
            //如果利用率小于1
            if (divide.compareTo(BigDecimal.valueOf(1))<0){
                chargingPercentBack.setCount4(chargingPercentBack.getCount4()+1);
            }
        }
        return R.ok(chargingPercentBack);
    }
    @GetMapping("/getSiteList1")
    @ApiOperation(value = "获取站点列表 不分页", tags = {"管理后台-活动费用统计"})
    public AjaxResult<List<Site>> getSiteList1(){
@@ -162,7 +279,7 @@
        return AjaxResult.success(chargingPileService.getChargingGunList(siteId,type));
    }
    @ApiOperation(value = "获取站点下充电枪数量统计", tags = {"小程序-站点管理-站点详情"})
    @ApiOperation(value = "获取站点下充电枪数量统计", tags = {"小程序-站点管理-站点详情","管理后台-数据分析-电站分析"})
    @GetMapping("/getChargingGunCount")
    public AjaxResult<Map<String,ChargingGunCountVO>> getChargingGunCount(@RequestParam(value = "siteId")@ApiParam(value = "站点id", required = true)Integer siteId){
        return AjaxResult.success(chargingGunService.getChargingGunCount(siteId));
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyDetailController.java
@@ -1,23 +1,23 @@
package com.ruoyi.chargingPile.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.chargingPile.api.model.TAccountingStrategy;
import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
import com.ruoyi.chargingPile.api.vo.StrategyPriceVO;
import com.ruoyi.chargingPile.api.vo.TAccountingStrategyDetailVO;
import com.ruoyi.chargingPile.service.ISiteService;
import com.ruoyi.chargingPile.service.TAccountingStrategyDetailService;
import com.ruoyi.chargingPile.service.TAccountingStrategyService;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.core.web.domain.AjaxResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Objects;
@@ -78,5 +78,18 @@
        return AjaxResult.ok(accountingStrategyDetailService.queryPrice(siteId));
    }
    /**
     * 获取当前有效的计费模板
     * @param accountingStrategyId
     * @return
     */
    @PostMapping("/getNowData")
    public R<TAccountingStrategyDetail> getNowData(@RequestParam("accountingStrategyId") Integer accountingStrategyId){
        TAccountingStrategyDetail one = accountingStrategyDetailService.getOne(new LambdaQueryWrapper<TAccountingStrategyDetail>()
                .eq(TAccountingStrategyDetail::getAccountingStrategyId, accountingStrategyId)
                .last(" and DATE_FORMAT(now(), '%H:%i') between start_time and end_time"));
        return R.ok(one);
    }
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingLotController.java
@@ -26,6 +26,8 @@
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.List;
@@ -149,5 +151,10 @@
    public R<TParkingRecord> getRecordById(@RequestParam("id") Long id){
        return R.ok(parkingRecordService.getById(id));
    }
    @PostMapping(value = "/getRecordAmount")
    public R<BigDecimal> getRecordAmount(@RequestParam("sixBefore") LocalDate sixBefore){
        BigDecimal sum =  parkingRecordService.getSum(sixBefore);
        return R.ok();
    }
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingRecordController.java
@@ -1,8 +1,18 @@
package com.ruoyi.chargingPile.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.chargingPile.api.model.TParkingLot;
import com.ruoyi.chargingPile.api.model.TParkingRecord;
import com.ruoyi.chargingPile.dto.ParkingRecordPageQuery;
import com.ruoyi.chargingPile.service.TParkingLotService;
import com.ruoyi.chargingPile.service.TParkingRecordService;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.domain.AjaxResult;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
 * <p>
@@ -15,6 +25,39 @@
@RestController
@RequestMapping("/t-parking-record")
public class TParkingRecordController {
    @Resource
    private TParkingRecordService parkingRecordService;
    @Resource
    private TParkingLotService parkingLotService;
    @ApiOperation(tags = {"后台-订单管理-停车记录"},value = "列表")
    @PostMapping(value = "/page")
    public R<Page<TParkingRecord>> page(@RequestBody ParkingRecordPageQuery query) {
        Page<TParkingRecord> page = parkingRecordService.lambdaQuery().ge(query.getStart() != null, TParkingRecord::getCreateTime, query.getStart())
                .le(query.getEnd() != null, TParkingRecord::getCreateTime, query.getEnd())
                .like(query.getLicensePlate() != null, TParkingRecord::getLicensePlate, query.getLicensePlate())
                .eq(query.getStatus() != null, TParkingRecord::getStatus, query.getStatus())
                .eq(query.getOutParkingType() != null, TParkingRecord::getOutParkingType, query.getOutParkingType())
                .page(Page.of(query.getPageCurr(), query.getPageSize()));
        for (TParkingRecord record : page.getRecords()) {
            record.setName(parkingLotService.getById(record.getParkingLotId()).getName());
            record.setUid(record.getId().toString());
        }
        return R.ok(page);
    }
    @ApiOperation(tags = {"后台-订单管理-停车记录"},value = "出场")
    @GetMapping(value = "/out")
    public R out(Long id) {
        TParkingRecord byId = parkingRecordService.getById(id);
        byId.setStatus(2);
        parkingRecordService.updateById(byId);
        return R.ok();
    }
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/dto/ChargingPercentBack.java
New file
@@ -0,0 +1,14 @@
package com.ruoyi.chargingPile.dto;
import lombok.Data;
import org.apache.poi.hpsf.Decimal;
import java.math.BigDecimal;
@Data
public class ChargingPercentBack {
    private Long count1 = 0L;
    private Long count2= 0L;
    private Long count3= 0L;
    private Long count4= 0L;
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/dto/ParkingRecordPageQuery.java
New file
@@ -0,0 +1,16 @@
package com.ruoyi.chargingPile.dto;
import com.ruoyi.common.core.web.page.BasePage;
import lombok.Data;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
public class ParkingRecordPageQuery extends BasePage {
    LocalDate start;
    LocalDate end;
    String licensePlate;
    Integer status;
    Integer outParkingType;
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TParkingRecordMapper.java
@@ -2,6 +2,10 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.chargingPile.api.model.TParkingRecord;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.time.LocalDate;
/**
 * <p>
@@ -13,4 +17,5 @@
 */
public interface TParkingRecordMapper extends BaseMapper<TParkingRecord> {
    BigDecimal getSum(@Param("sixBefore") LocalDate sixBefore);
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/ISiteService.java
@@ -28,6 +28,7 @@
     * @return
     */
    PageInfo<GetSiteListDTO> getSiteList(GetSiteList siteList);
    PageInfo<GetSiteListDTO> getSiteList1(Long userId);
    
    
    /**
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TParkingRecordService.java
@@ -3,6 +3,9 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.chargingPile.api.model.TParkingRecord;
import java.math.BigDecimal;
import java.time.LocalDate;
/**
 * <p>
 *  服务类
@@ -13,4 +16,5 @@
 */
public interface TParkingRecordService extends IService<TParkingRecord> {
    BigDecimal getSum(LocalDate sixBefore);
}
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java
@@ -109,6 +109,42 @@
    }
    
    
    @Override
    public PageInfo<GetSiteListDTO> getSiteList1(Long userId) {
        GetSiteList siteList = new GetSiteList();
        siteList.setPageCurr(1);
        siteList.setPageSize(9999);
        Set<Integer> ids = null;
        //校验合作商权限
        SysUser sysUser = sysUserClient.getSysUser(userId).getData();
        Integer roleType = sysUser.getRoleType();
        Integer objectId = sysUser.getObjectId();
        //合作商
        if(roleType == 2){
            ids = partnerService.authSite(objectId, SiteMenu.SITE_LIST);
        }else{
            //非管理员需要根据角色和用户配置查询允许的站点数据
            if(!SecurityUtils.isAdmin(SecurityUtils.getUserId())){
                List<Integer> data = userSiteClient.getSiteIds(sysUser.getUserId()).getData();
                List<Integer> data1 = roleSiteClient.getSiteIds(sysUser.getRoleId()).getData();
                data.addAll(data1);
                ids = new HashSet<>(data);
            }
        }
        PageInfo<GetSiteListDTO> pageInfo = new PageInfo<>(siteList.getPageCurr(), siteList.getPageSize());
        List<GetSiteListDTO> list = this.baseMapper.getSiteList(pageInfo, siteList, ids);
        for (GetSiteListDTO getSiteListDTO : list) {
            Integer siteId = getSiteListDTO.getId();
            getSiteListDTO.setAuthAccountingStrategy(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.SITE_ACCOUNTING_STRATEGY));
            //平台账号才有此权限
            getSiteListDTO.setAuthPartner(roleType == 1 ? true : false);
            getSiteListDTO.setAuthUpdate(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.SITE_UPDATE));
            getSiteListDTO.setAuthDelete(roleType == 1 ? true : partnerService.authMenu(objectId, siteId, SiteMenu.SITE_DELETE));
        }
        return pageInfo.setRecords(list);
    }
    
    
    /**
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java
@@ -40,6 +40,7 @@
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.*;
@@ -304,7 +305,12 @@
        chargeMonitoring.setNotCharged(total.size() - charging.size());
        chargeMonitoring.setRatedPower(ratedPower.setScale(4, RoundingMode.HALF_EVEN));
        chargeMonitoring.setRealTimePower(realTimePower.setScale(4, RoundingMode.HALF_EVEN));
        chargeMonitoring.setDemandPowerSatisfactionRate(realTimePower.divide(ratedPower).multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN));
        if(ratedPower.equals(BigDecimal.ZERO)){
            chargeMonitoring.setDemandPowerSatisfactionRate(BigDecimal.ZERO);
        }else{
            chargeMonitoring.setDemandPowerSatisfactionRate(realTimePower.divide(ratedPower, new MathContext(2, RoundingMode.HALF_EVEN))
                    .multiply(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN));
        }
        
        List<String> dates = new ArrayList<>();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MMM-dd");
@@ -325,9 +331,13 @@
        List<Double> data = chargingOrderAccountingStrategyClient.getDailyChargingDegree(6, siteIds).getData();
        List<Double> value2 = new ArrayList<>();
        for (Double datum : data) {
            if(list.size() == 0){
                value2.add(0D);
            }else{
            Double datum1 = new BigDecimal(datum).divide(new BigDecimal(list.size()).multiply(v).multiply(new BigDecimal(24))).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
            value2.add(datum1);
        }
        }
        Map<String, Object> utilizationTrend = new HashMap<>();
        utilizationTrend.put("date", dates);
        utilizationTrend.put("value", value2);
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TParkingRecordServiceImpl.java
@@ -6,6 +6,9 @@
import com.ruoyi.chargingPile.service.TParkingRecordService;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDate;
/**
 * <p>
 *  服务实现类
@@ -17,4 +20,8 @@
@Service
public class TParkingRecordServiceImpl extends ServiceImpl<TParkingRecordMapper, TParkingRecord> implements TParkingRecordService {
    @Override
    public BigDecimal getSum(LocalDate sixBefore) {
        return this.baseMapper.getSum(sixBefore);
    }
}
ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TParkingRecordMapper.xml
@@ -23,5 +23,8 @@
    <sql id="Base_Column_List">
        id, app_user_id, license_plate, vehicle_color, charging_order_id, parking_lot_id, in_parking_time, out_parking_time, parking_duration, order_amount, status, out_parking_type, create_time
    </sql>
    <select id="getSum" resultType="java.math.BigDecimal">
        select sum(timeout_amount) from t_parking_record where   in_parking_time >= #{sixBefore}
    </select>
</mapper>
ruoyi-service/ruoyi-integration/pom.xml
@@ -165,7 +165,10 @@
            <version>3.1.87</version>
        </dependency>
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-api-order</artifactId>
        </dependency>
    </dependencies>
    <build>
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/PlatformStartChargingReplyController.java
New file
@@ -0,0 +1,35 @@
package com.ruoyi.integration.controller;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.integration.api.model.PlatformStartChargingReply;
import com.ruoyi.integration.mongodb.service.PlatformStartChargingReplyService;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
/**
 * @author zhibing.pu
 * @Date 2024/8/31 15:09
 */
@RestController
@RequestMapping("/platformStartChargingReply")
public class PlatformStartChargingReplyController {
    @Resource
    private PlatformStartChargingReplyService platformStartChargingReplyService;
    /**
     * 根据订单编号查询远程启机应答结果
     * @param code
     * @return
     */
    @PostMapping("/getPlatformStartChargingReply")
    public R<List<PlatformStartChargingReply>> getPlatformStartChargingReply(@RequestParam("code") String code){
        List<PlatformStartChargingReply> platformStartChargingReply = platformStartChargingReplyService.getPlatformStartChargingReply(code);
        return R.ok(platformStartChargingReply);
    }
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/UploadRealTimeMonitoringDataController.java
@@ -10,6 +10,7 @@
import javax.annotation.Resource;
import java.util.List;
import java.util.Set;
/**
 * <p>
@@ -52,6 +53,14 @@
        return R.ok(list);
    }
    
    @PostMapping(value = "/getAll")
    public R<List<UploadRealTimeMonitoringData>> getAll(@RequestParam("values") Set<String> values,@RequestParam("page") Integer page, @RequestParam("size")Integer size){
        List<UploadRealTimeMonitoringData> list = uploadRealTimeMonitoringDataService.getDataAll(values,page,size);
        return R.ok(list);
    }
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/PlatformStartChargingReplyService.java
@@ -2,6 +2,17 @@
import com.ruoyi.integration.api.model.PlatformStartChargingReply;
import com.ruoyi.integration.mongodb.base.BaseService;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
public interface PlatformStartChargingReplyService extends BaseService<PlatformStartChargingReply> {
    /**
     * 根据订单编号查询远程启机应答数据
     * @param code
     * @return
     */
    List<PlatformStartChargingReply> getPlatformStartChargingReply(String code);
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/UploadRealTimeMonitoringDataService.java
@@ -5,6 +5,7 @@
import com.ruoyi.integration.mongodb.base.BaseService;
import java.util.List;
import java.util.Set;
public interface UploadRealTimeMonitoringDataService extends BaseService<UploadRealTimeMonitoringData> {
    
@@ -14,5 +15,6 @@
     * @return
     */
    List<UploadRealTimeMonitoringData> getDataByOrderCode(String code);
    List<UploadRealTimeMonitoringData> getDataAll(Set<String> values, Integer page, Integer size);
    
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/PlatformStartChargingReplyServiceImpl.java
@@ -5,6 +5,8 @@
import com.ruoyi.integration.mongodb.service.PlatformStartChargingReplyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -29,4 +31,18 @@
    public List<PlatformStartChargingReply> findAll() {
        return mongoTemplate.findAll(PlatformStartChargingReply.class);
    }
    /**
     * 根据订单编号查询远程启机应答数据
     * @param code
     * @return
     */
    @Override
    public List<PlatformStartChargingReply> getPlatformStartChargingReply(String code) {
        Query query = new Query();
        query.addCriteria(Criteria.where("transaction_serial_number").is(code));
        List<PlatformStartChargingReply> platformStartChargingReplies = mongoTemplate.find(query, PlatformStartChargingReply.class);
        return platformStartChargingReplies;
    }
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java
@@ -6,6 +6,8 @@
import com.ruoyi.integration.iotda.constant.IotConstant;
import com.ruoyi.integration.mongodb.service.UploadRealTimeMonitoringDataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
@@ -13,6 +15,7 @@
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Set;
@Service
public class UploadRealTimeMonitoringDataServiceImpl implements UploadRealTimeMonitoringDataService {
@@ -53,4 +56,21 @@
                , UploadRealTimeMonitoringData.class);
        return uploadRealTimeMonitoringData;
    }
    @Override
    public List<UploadRealTimeMonitoringData> getDataAll(Set<String> values, Integer page, Integer size) {
        Query query = new Query();
        if (!values.isEmpty()){
            query.addCriteria(Criteria.where("transaction_serial_number").in(values));
        }
        // 设置分页
        Pageable pageable = PageRequest.of(page, size);
        query.with(pageable);
        List<UploadRealTimeMonitoringData> uploadRealTimeMonitoringData = mongoTemplate.find(
                query.with(Sort.by("create_time"))
                , UploadRealTimeMonitoringData.class);
        return uploadRealTimeMonitoringData;
    }
}
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/UploadRealTimeMonitoringDataMessageListener.java
@@ -5,12 +5,16 @@
import com.ruoyi.integration.mongodb.service.UploadRealTimeMonitoringDataService;
import com.ruoyi.integration.rocket.model.UploadRealTimeMonitoringDataMessage;
import com.ruoyi.integration.rocket.util.EnhanceMessageHandler;
import com.ruoyi.order.api.feignClient.ChargingOrderClient;
import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Slf4j
@Component
@@ -24,6 +28,15 @@
    @Autowired
    private UploadRealTimeMonitoringDataService uploadRealTimeMonitoringDataService;
    @Resource
    private ChargingOrderClient chargingOrderClient;
    @Override
    protected void handleMessage(UploadRealTimeMonitoringDataMessage message) throws Exception {
        // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试
@@ -33,6 +46,9 @@
        BeanUtils.copyProperties(message,uploadRealTimeMonitoringData);
        uploadRealTimeMonitoringDataService.create(uploadRealTimeMonitoringData);
        // 业务处理
        UploadRealTimeMonitoringDataQuery query = new UploadRealTimeMonitoringDataQuery();
        BeanUtils.copyProperties(uploadRealTimeMonitoringData, query);
        chargingOrderClient.chargeMonitoring(query);
    }
    @Override
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/FinancialSettlementController.java
New file
@@ -0,0 +1,96 @@
package com.ruoyi.order.controller;
import com.ruoyi.account.api.feignClient.AppUserCarClient;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient;
import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient;
import com.ruoyi.chargingPile.api.feignClient.ParkingLotClient;
import com.ruoyi.chargingPile.api.feignClient.SiteClient;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.order.vo.ChargingOrderListInfoVO;
import com.ruoyi.order.api.vo.ChargingOrderTimeVO;
import com.ruoyi.order.dto.ChargingListQuery;
import com.ruoyi.order.service.*;
import com.ruoyi.payment.api.feignClient.AliPaymentClient;
import com.ruoyi.payment.api.feignClient.WxPaymentClient;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author xiaochen
 * @since 2024-08-07
 */
@Api(tags = "财务结算")
@RestController
@RequestMapping("/financial/settlement")
public class FinancialSettlementController {
    @Resource
    private TChargingOrderService chargingOrderService;
    @Autowired
    private TokenService tokenService;
    @Autowired
    private TOrderEvaluateService orderEvaluateService;
    @Resource
    private WxPaymentClient wxPaymentClient;
    @Resource
    private RedisService redisService;
    @Resource
    private AliPaymentClient aliPaymentClient;
    @Resource
    private TShoppingOrderService shoppingOrderService;
    @Resource
    private AppUserClient appUserClient;
    @Resource
    private TVipOrderService vipOrderService;
    @Resource
    private ParkingLotClient parkingLotClient;
    @Resource
    private TChargingOrderRefundService chargingOrderRefundService;
    @Resource
    private TShoppingOrderRefundService shoppingOrderRefundService;
    @Resource
    private TVipOrderRefundService vipOrderRefundService;
    @Resource
    private SiteClient siteClient;
    @Resource
    private ChargingPileClient chargingPileClient;
    @Resource
    private ChargingGunClient chargingGunClient;
    @Resource
    private AppUserCarClient appUserCarClient;
    @Resource
    private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService;
    @ResponseBody
    @PostMapping(value = "/chargingList")
    @ApiOperation(value = "充电时段统计列表", tags = {"管理后台-财务结算"})
    public AjaxResult<ChargingOrderTimeVO> chargingList(@RequestBody ChargingListQuery dto) {
        ChargingOrderTimeVO res = chargingOrderService.chargingList(dto);
        return AjaxResult.success(res);
    }
    @ResponseBody
    @GetMapping(value = "/chargingInfo")
    @ApiOperation(value = "充电时段统计列表-查看详情", tags = {"管理后台-财务结算"})
    public AjaxResult<ChargingOrderListInfoVO> chargingInfo(String uid) {
        ChargingOrderListInfoVO res = chargingOrderService.chargingInfo(uid);
        return AjaxResult.success(res);
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -1,6 +1,9 @@
package com.ruoyi.order.controller;
import com.google.common.collect.Lists;
import java.math.BigDecimal;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
@@ -8,6 +11,7 @@
import com.ruoyi.account.api.feignClient.AppUserCarClient;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.account.api.model.TAppUserCar;
import com.ruoyi.chargingPile.api.dto.GetSiteListDTO;
import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient;
import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient;
import com.ruoyi.chargingPile.api.feignClient.ParkingLotClient;
@@ -18,14 +22,24 @@
import com.ruoyi.chargingPile.api.model.TParkingRecord;
import com.ruoyi.chargingPile.api.vo.SiteVO;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.dto.ChargingOrderGroup;
import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.BasePage;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient;
import com.ruoyi.integration.api.model.ChargingOrderAndUploadRealTimeMonitoringDataDto;
import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
import com.ruoyi.order.api.model.*;
import com.ruoyi.order.api.query.ChargingOrderQuery;
import com.ruoyi.order.api.query.TChargingCountQuery;
import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery;
import com.ruoyi.order.api.vo.ChargingOrderInfoVO;
import com.ruoyi.order.api.vo.ChargingOrderVO;
import com.ruoyi.order.api.vo.TCharingOrderVO;
import com.ruoyi.order.dto.GetMyChargingOrderList;
@@ -35,12 +49,16 @@
import com.ruoyi.order.dto.OrderEvaluateVo;
import com.ruoyi.order.dto.*;
import com.ruoyi.order.service.*;
import com.ruoyi.order.util.PreviousSixMonths;
import com.ruoyi.payment.api.feignClient.AliPaymentClient;
import com.ruoyi.payment.api.feignClient.WxPaymentClient;
import com.ruoyi.payment.api.vo.AliQueryOrder;
import com.ruoyi.payment.api.vo.WxRefundNotifyResp;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import jdk.nashorn.internal.runtime.ListAdapter;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
@@ -49,10 +67,13 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.Collections;
import java.time.YearMonth;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.List;
import java.util.stream.Collectors;
/**
 * <p>
@@ -85,8 +106,9 @@
    @Resource
    private TShoppingOrderService shoppingOrderService;
    @Autowired
    @Resource
    private AppUserClient appUserClient;
    @Resource
    private TVipOrderService vipOrderService;
@@ -109,6 +131,9 @@
    private AppUserCarClient appUserCarClient;
    @Resource
    private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService;
    @ResponseBody
    @PostMapping(value = "/pay/order/list")
@@ -168,11 +193,12 @@
//                    payOrderInfoDto3.setRefundAmount(new BigDecimal("0"));
        }
        return R.ok();
    }
    @ResponseBody
    @GetMapping(value = "/pay/order/refund/detail")
    @ApiOperation(value = "退款信息", tags = {"管理后台-支付订单-订单信息"})
@@ -205,8 +231,10 @@
        payOrderChargingInfo.setChargingName(data1.getName());
        TChargingGun data2 = chargingGunClient.getChargingGunById(byId.getChargingGunId()).getData();
        payOrderChargingInfo.setGunName(data2.getName());
        if (byId.getAppUserCarId()!=null) {
        List<TAppUserCar> data3 = appUserCarClient.getCarByIds(Collections.singletonList(byId.getAppUserCarId())).getData();
        payOrderChargingInfo.setCarNum(data3.get(0).getLicensePlate());
        }
        return R.ok();
    }
@@ -219,6 +247,7 @@
    }
    @ResponseBody
    @PostMapping(value = "/pay/order/refund/list")
    @ApiOperation(value = "充电信息", tags = {"管理后台-支付订单-退款订单"})
@@ -226,6 +255,9 @@
        return chargingOrderService.getRefundList(chargingRefundDto);
    }
    @ResponseBody
@@ -241,9 +273,19 @@
    @ResponseBody
    @PostMapping(value = "/chargingOrderInfo")
    @ApiOperation(value = "充电桩订单列表查看详情", tags = {"管理后台-订单管理"})
    public AjaxResult<TCharingOrderVO> chargingOrderInfo(String orderId) {
        return AjaxResult.success();
    public AjaxResult<ChargingOrderInfoVO> chargingOrderInfo(String orderId) {
        ChargingOrderInfoVO chargingOrderInfoVO = new ChargingOrderInfoVO();
        chargingOrderInfoVO.setCdElectronic("");
        chargingOrderInfoVO.setCdVoltage("");
        chargingOrderInfoVO.setSurplus("");
        chargingOrderInfoVO.setTotalPower("");
        chargingOrderInfoVO.setLicensePlate("");
        chargingOrderInfoVO.setVehicleBrand("");
        chargingOrderInfoVO.setVehicleModel("");
        chargingOrderInfoVO.setVehicleUse("");
        List<TChargingOrderAccountingStrategy> tChargingOrderAccountingStrategies = new ArrayList<>();
        chargingOrderInfoVO.setList(tChargingOrderAccountingStrategies);
        return AjaxResult.success(chargingOrderInfoVO);
    }
    @ResponseBody
@@ -254,7 +296,6 @@
        orderEvaluateService.addOrderEvaluate(dto);
        return AjaxResult.success();
    }
    /**
     * 查询用户最近一次充电记录使用的车辆
     *
@@ -277,7 +318,6 @@
    /**
     * 查询会员在本月有多少次享受了充电折扣
     *
     * @param req
     * @return
     */
@@ -289,7 +329,6 @@
                .between(TChargingOrder::getStartTime, req.getStartTime(), req.getEndTime())).size();
        return R.ok(size);
    }
    //用户订单数量
    @PostMapping(value = "/useOrderCount")
    public R<Long> useOrderCount(@RequestParam("userId") Long userId) {
@@ -304,9 +343,22 @@
        return R.ok(chargingOrderService.getById(orderId));
    }
    @PostMapping(value = "/getList")
    public R<List<TChargingOrder>> getList(@RequestParam("siteId") Integer siteId) {
        List<TChargingOrder> list = chargingOrderService.lambdaQuery().eq(TChargingOrder::getSiteId, siteId).list();
        return R.ok(list);
    }
    @PostMapping(value = "/getBySiteIdAndTime")
    public R<List<ChargingOrderGroup>> getBySiteIdAndTime(@RequestBody ChargingPercentProvinceDto chargingPercentProvinceDto) {
        List<ChargingOrderGroup> groups = chargingOrderService.chargingOrderGroup(chargingPercentProvinceDto);
        return R.ok(groups);
    }
    /**
     * 根据充电枪id获取正在进行中的订单
     *
     * @param chargingGunId 充电枪id
     * @return
     */
@@ -316,6 +368,8 @@
                .eq(TChargingOrder::getDelFlag, 0).eq(TChargingOrder::getStatus, 3));
        return R.ok(one);
    }
    @ResponseBody
@@ -336,6 +390,7 @@
    }
    @ResponseBody
    @GetMapping(value = "/getNoInvoicedOrder")
    @ApiOperation(value = "获取未开票的订单数据", tags = {"小程序-充电发票"})
@@ -343,6 +398,7 @@
        List<MyChargingOrderList> list = chargingOrderService.getNoInvoicedOrder(query);
        return AjaxResult.success(list);
    }
    @ResponseBody
@@ -354,7 +410,6 @@
    /**
     * 充电充值支付回调
     *
     * @param request
     */
    @ResponseBody
@@ -396,6 +451,27 @@
    }
    /**
     * 远程启动失败后退款回调
     * @param request
     */
    @ResponseBody
    @PostMapping(value = "/chargingOrderALICallback")
    public void chargingOrderStartupFailureWxRefund(HttpServletRequest request){
        WxRefundNotifyResp data = wxPaymentClient.refundNotify(request).getData();
        if(null != data){
            String out_refund_no = data.getOut_refund_no();
            String refund_id = data.getRefund_id();
            String tradeState = data.getTradeState();
            String success_time = data.getSuccess_time();
            chargingOrderService.chargingOrderStartupFailureWxRefund(out_refund_no, refund_id, tradeState, success_time);
        }
    }
    @ResponseBody
    @GetMapping(value = "/preChargeCheck/{id}")
    @ApiOperation(value = "获取安全检测数据", tags = {"小程序-扫一扫"})
@@ -407,6 +483,7 @@
        Object cacheObject = redisService.getCacheObject(key);
        return AjaxResult.success(cacheObject);
    }
    @ResponseBody
@@ -430,5 +507,268 @@
    public AjaxResult stopCharging(@PathVariable String id) {
        return chargingOrderService.stopCharging(id);
    }
    @ResponseBody
    @GetMapping(value = "/six/charge")
    @ApiOperation(value = "电站收入分析", tags = {"后台-数据分析-平台收入分析"})
    public R<List<SixChargingDto>> charge(Integer siteId) {
        Long userId = SecurityUtils.getUserId();
        //如果没传siteId,获取当前登陆人所有的siteIds
        List<Integer> siteIds = new ArrayList<>();
        if (siteId==null){
            List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData();
            for (GetSiteListDTO datum : data) {
                siteIds.add(datum.getId());
            }
        }else {
            siteIds.add(siteId);
        }
        LocalDate sixBefore = PreviousSixMonths.get();
        //通过siteIds进行sql查询统计
        List<SixChargingDto> chargingDtos = chargingOrderService.charge(sixBefore, siteIds);
        return R.ok(chargingDtos);
}
    @ResponseBody
    @GetMapping(value = "/six/circle")
    @ApiOperation(value = "电站收入占比", tags = {"后台-数据分析-平台收入分析"})
    public R<List<SixCircleDto>> circle() {
        Long userId = SecurityUtils.getUserId();
        //获取当前登录的siteIds
        List<Integer> siteIds = new ArrayList<>();
            List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData();
            for (GetSiteListDTO datum : data) {
                siteIds.add(datum.getId());
            }
        //进行统计groupBySiteId
        LocalDate sixBefore = PreviousSixMonths.get();
        List<SixCircleDto> sixCircleDtos = chargingOrderService.circle(siteIds,sixBefore);
        for (SixCircleDto sixCircleDto : sixCircleDtos) {
            Site site = siteClient.getSiteByIds(Arrays.asList(sixCircleDto.getSiteId())).getData().get(0);
            sixCircleDto.setSiteName(site.getName());
        }
        return R.ok(sixCircleDtos);
    }
    @ResponseBody
    @GetMapping(value = "/six/shop")
    @ApiOperation(value = "购物收入", tags = {"后台-数据分析-平台收入分析"})
    public R<List<SixShopDto>> shop(Integer status) {
        //count近6个月的数据
        LocalDate sixBefore = PreviousSixMonths.get();
        List<SixShopDto> sixShopDtos =  shoppingOrderService.sixBefore(sixBefore,status);
        return R.ok(sixShopDtos);
    }
    @ResponseBody
    @GetMapping(value = "/six/vip")
    @ApiOperation(value = "vip收入", tags = {"后台-数据分析-平台收入分析"})
    public R<List<SixVipDto>> vip() {
        //count近6个月的数据
        LocalDate sixBefore = PreviousSixMonths.get();
        List<SixVipDto> vipDtos =  vipOrderService.sixBefore(sixBefore);
        return R.ok(vipDtos);
    }
    @ResponseBody
    @GetMapping(value = "/six/total")
    @ApiOperation(value = "底部数据分类", tags = {"后台-数据分析-平台收入分析"})
    public R<Map<String,BigDecimal>> total() {
        //count近6个月的数据
        LocalDate sixBefore = PreviousSixMonths.get();
        Map<String,BigDecimal>  map = chargingOrderService.countAll(sixBefore);
        BigDecimal data = parkingLotClient.getRecordAmount(sixBefore).getData();
        map.put("parkingAmount",data);
        BigDecimal data1 =   shoppingOrderService.getSumAmount(sixBefore);
        map.put("shopAmount",data1);
        BigDecimal data2 =   vipOrderService.getSumAmout(sixBefore);
        map.put("vipAmount",data2);
    return R.ok(map);
    }
    @Resource
    private UploadRealTimeMonitoringDataClient uploadRealTimeMonitoringDataClient;
    @ResponseBody
    @PostMapping(value = "/watch/chargingOrder")
    @ApiOperation(value = "监控订单", tags = {"管理后台-订单管理"})
    public AjaxResult<TCharingOrderVO> watchChargingOrder(@RequestBody ChargingOrderQuery dto) {
        Integer page = dto.getPageCurr();
        Integer pageSize = dto.getPageSize();
        List<Long> data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData();
        dto.setUserIds(data);
        dto.setPageCurr(1);
        dto.setPageSize(99999);
        TCharingOrderVO res = chargingOrderService.chargingOrder(dto);
        Map<String,TChargingOrder> map = new HashMap<>();
        //吧list放入map中
        for (ChargingOrderVO record : res.getList().getRecords()) {
            map.put(record.getCode(),record);
        }
        Set<String> strings = map.keySet();
        List<UploadRealTimeMonitoringData> data1 = uploadRealTimeMonitoringDataClient.getAll(strings, page, pageSize).getData();
        List<ChargingOrderAndUploadRealTimeMonitoringDataDto> dtos = new ArrayList<>();
        for (UploadRealTimeMonitoringData uploadRealTimeMonitoringData : data1) {
            ChargingOrderAndUploadRealTimeMonitoringDataDto dataDto = new ChargingOrderAndUploadRealTimeMonitoringDataDto();
            BeanUtils.copyProperties(uploadRealTimeMonitoringData,dataDto);
            BeanUtils.copyProperties(map.get(uploadRealTimeMonitoringData.getCharging_pile_code()),dataDto);
            dtos.add(dataDto);
        }
        return AjaxResult.success(res);
    }
    /**
     * 处理充电订单实时监控数据相关的业务逻辑
     * @param query
     */
    @PostMapping("/chargeMonitoring")
    public void chargeMonitoring(@RequestBody UploadRealTimeMonitoringDataQuery query){
        chargingOrderService.chargeMonitoring(query);
    }
//    @ResponseBody
//    @PostMapping(value = "/charging/statistics")
//    @ApiOperation(value = "统计", tags = {"管理后台-数据分析-充电运营分析"})
//    public R<TCharingOrderVO> watchChargingOrder(@RequestBody ChargingStatisticsQueryDto statisticsQueryDto){
//        List<Integer> siteIds =new ArrayList<>();
//        if (statisticsQueryDto.getSiteId()==null) {
//            Long userId = SecurityUtils.getUserId();
//            //获取当前登录的siteIds
//            List<GetSiteListDTO> data = siteClient.getSiteListByUserId(userId).getData();
//            for (GetSiteListDTO datum : data) {
//                siteIds.add(datum.getId());
//            }
//        }else {
//            siteIds.add(statisticsQueryDto.getSiteId());
//        }
//
//
//        LocalDate start = null;
//        LocalDate end = null;
//        if (statisticsQueryDto.getDayType()==1){
//            start = LocalDate.now();
//
//        }else if (statisticsQueryDto.getDayType()==2){
//            LocalDate today = LocalDate.now();
//
//            // 获取本周一的日期
//            LocalDate mondayThisWeek = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
//
//            System.out.println("本周一是: " + mondayThisWeek);
//        }
//        else if (statisticsQueryDto.getDayType()==3){
//            // 获取当前日期
//            LocalDate today = LocalDate.now();
//
//            // 获取本月1号的日期
//            YearMonth yearMonth = YearMonth.from(today);
//            start = yearMonth.atDay(1);
//
//            System.out.println("本月1号是: " + start);
//        }else if (statisticsQueryDto.getDayType()==4){
//            LocalDate today = LocalDate.now();
//            // 获取当前年份
//            int currentYear = today.getYear();
//            // 获取今年1月1日的日期
//            start = LocalDate.of(currentYear, 1, 1);
//            System.out.println("今年1月1日是: " + start);
//        }else if (statisticsQueryDto.getDayType()==5){
//
//            // 获取今年1月1日的日期
//            start = statisticsQueryDto.getStartTime();
//            end = statisticsQueryDto.getEndTime();
//        }
//        List<TChargingOrder> list = chargingOrderService.lambdaQuery().ge(TChargingOrder::getStartTime, start).le(TChargingOrder::getEndTime, end).in(TChargingOrder::getSiteId, siteIds).list();
//        List<Long> chargingOrderIds = list.stream().map(TChargingOrder::getId).collect(Collectors.toList());
//        //上方饼图
//         List<Map<String,BigDecimal>> maps =   chargingOrderService.getSumByType(chargingOrderIds);
//
//        if (statisticsQueryDto.getDayType()==1){
//            List<Map<String,BigDecimal>> maps1 = chargingOrderService.getDateData(chargingOrderIds);
//
//        }else if (statisticsQueryDto.getDayType()==2){
//            List<Map<String,BigDecimal>> maps1 = chargingOrderService.getWeekData(chargingOrderIds);
//        }else if (statisticsQueryDto.getDayType()==3){
//            List<Map<String,BigDecimal>> maps1 = chargingOrderService.getMonthData(chargingOrderIds);
//        }else  if (statisticsQueryDto.getDayType()==4){
//            List<Map<String,BigDecimal>> maps1 = chargingOrderService.getYearData(chargingOrderIds);
//        }
//
//
//
//
//
//
//    }
    public static void main(String[] args) {
        // 示例数据
        List<TChargingOrder> list = getSampleData();
        System.err.println(list);
        List<Map<String, BigDecimal>> result = processData(list);
        result.forEach(System.out::println);
    }
    private static List<TChargingOrder> getSampleData() {
        // 这里可以替换为实际查询逻辑
        List<TChargingOrder> list = new ArrayList<>();
        // 示例数据
        for (int i = 0; i < 24; i++) {
            TChargingOrder order = new TChargingOrder();
            order.setStartTime(LocalDateTime.now().minusHours(23 - i));
            order.setOrderAmount(BigDecimal.valueOf(i + 1));
            list.add(order);
        }
        return list;
    }
    private static List<Map<String, BigDecimal>> processData(List<TChargingOrder> list) {
        Map<LocalDateTime, BigDecimal> hourlySum = new HashMap<>();
        // 按每个小时分组并求和
        for (TChargingOrder order : list) {
            LocalDateTime hour = order.getStartTime().truncatedTo(ChronoUnit.HOURS);
            BigDecimal amount = order.getOrderAmount();
            hourlySum.merge(hour, amount, BigDecimal::add);
        }
        // 创建结果列表
        List<Map<String, BigDecimal>> resultList = new ArrayList<>();
        for (int i = 1; i <= 23; i++) {
            LocalDateTime keyHour = LocalDateTime.now().withHour(i);
            BigDecimal sum = BigDecimal.ZERO;
            // 计算键之后的一小时的数据之和
            for (int j = i + 1; j <= 23; j++) {
                LocalDateTime nextHour = LocalDateTime.now().withHour(j);
                sum = sum.add(hourlySum.getOrDefault(nextHour, BigDecimal.ZERO));
            }
            Map<String, BigDecimal> entry = new HashMap<>();
            entry.put(String.valueOf(i), sum);
            resultList.add(entry);
        }
        return resultList;
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TExchangeOrderController.java
@@ -93,7 +93,7 @@
    }
    @Resource
    private SysUserClient sysUserClient;
    @PostMapping("/getShoppingOrderInfoById")
    @GetMapping("/getShoppingOrderInfoById")
    @ApiOperation(value = "根据订单id查看订单详情", tags = {"管理后台-兑换订单"})
    public AjaxResult<TExchangeOrder> getShoppingOrderList(String id) {
        TExchangeOrder byId = exchangeOrderService.getById(id);
@@ -142,8 +142,10 @@
    }
    @GetMapping("/consignerShoppingOrder")
    @ApiOperation(value = "发货", tags = {"管理后台-兑换订单"})
    public AjaxResult consignerShoppingOrder(String id) {
    public AjaxResult consignerShoppingOrder(String id,String companyName,String code) {
        TExchangeOrder byId = exchangeOrderService.getById(id);
        byId.setExpressCompany(companyName);
        byId.setExpressNumber(code);
        Long userid = tokenService.getLoginUser().getUserid();
        byId.setConsignerId(userid);
        byId.setConsignerTime(LocalDateTime.now());
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderAppealController.java
@@ -9,18 +9,19 @@
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.common.security.utils.SecurityUtils;
import com.ruoyi.order.api.model.TOrderAppeal;
import com.ruoyi.order.api.model.*;
import com.ruoyi.order.api.query.TOrderAppealQuery;
import com.ruoyi.order.api.vo.TOrderAppealVO;
import com.ruoyi.order.dto.ManageFeedbackDto;
import com.ruoyi.order.dto.ManageOrderAppealQuery;
import com.ruoyi.order.service.TOrderAppealService;
import com.ruoyi.order.service.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.Arrays;
/**
 * <p>
@@ -38,6 +39,16 @@
    private final TokenService tokenService;
    @Resource
    private AppUserClient appUserClient;
    @Resource
    private TChargingOrderService chargingOrderService;
    @Resource
    private TShoppingOrderService shoppingOrderService;
    @Resource
    private TExchangeOrderService exchangeOrderService;
    @Resource
    private TVipOrderService vipOrderService;
    @Autowired
    public TOrderAppealController(TOrderAppealService orderAppealService, TokenService tokenService) {
@@ -53,9 +64,19 @@
                .like(manageOrderAppealQuery.getPhone() != null, TOrderAppeal::getPhone, manageOrderAppealQuery.getPhone())
                .eq(manageOrderAppealQuery.getOrderType() != null, TOrderAppeal::getOrderType, manageOrderAppealQuery.getOrderType())
                .in(TOrderAppeal::getOrderType, 1, 2).page(Page.of(manageOrderAppealQuery.getPageCurr(), manageOrderAppealQuery.getPageSize()));
        for (TOrderAppeal record : page.getRecords()) {
            record.setUid(record.getId().toString());
        }
        return R.ok(page);
    }
    @ApiOperation(tags = {"后台-订单管理-订单申诉"},value = "删除")
    @DeleteMapping (value = "/manage/delete")
    public R<Page<TOrderAppeal>> delete(String ids) {
        orderAppealService.removeBatchByIds(Arrays.asList(ids.split(",")));
        return R.ok();
    }
    @ApiOperation(tags = {"后台-订单管理-订单申诉"},value = "后台-订单管理-订单申诉")
@@ -83,7 +104,7 @@
     */
    @GetMapping(value = "/getDetailById")
    @ApiOperation(tags = {"小程序-订单申诉"},value = "查询订单申诉详情")
    public AjaxResult<TOrderAppealVO> getDetailById(Integer id) {
    public AjaxResult<TOrderAppealVO> getDetailById(String id) {
        return AjaxResult.ok(orderAppealService.getDetailById(id));
    }
    
@@ -98,6 +119,20 @@
        orderAppeal.setAppUserId(appUserId);
        orderAppeal.setStatus(1);
        orderAppeal.setPhone(data.getPhone());
        if (orderAppeal.getOrderType()==1){
            TChargingOrder byId = chargingOrderService.getById(orderAppeal.getOrderId());
            orderAppeal.setCode(byId.getCode());
        }else if(orderAppeal.getOrderType()==2){
            TShoppingOrder byId = shoppingOrderService.getById(orderAppeal.getOrderId());
            orderAppeal.setCode(byId.getCode());
        }else if(orderAppeal.getOrderType()==3){
            TExchangeOrder byId = exchangeOrderService.getById(orderAppeal.getOrderId());
            orderAppeal.setCode(byId.getCode());
        }else if(orderAppeal.getOrderType()==4){
            TVipOrder byId = vipOrderService.getById(orderAppeal.getOrderId());
            orderAppeal.setCode(byId.getCode());
        }
        orderAppealService.save(orderAppeal);
        return AjaxResult.success();
    }
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderEvaluateController.java
@@ -54,7 +54,7 @@
    
    
    
    @GetMapping(value = "/getPageList")
    @PostMapping(value = "/getPageList")
    @ApiOperation(value = "获取充电评价列表", tags = {"管理后台-充电评价"})
    public AjaxResult<PageInfo<GetOrderEvaluatePageListDTO>> getPageList(@RequestBody GetOrderEvaluatePageList pageList){
        PageInfo<GetOrderEvaluatePageListDTO> list = orderEvaluateService.getPageList(pageList);
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java
@@ -86,7 +86,7 @@
    }
    @Resource
    private SysUserClient sysUserClient;
    @PostMapping("/getShoppingOrderInfoById")
    @GetMapping("/getShoppingOrderInfoById")
    @ApiOperation(value = "根据订单id查看订单详情", tags = {"管理后台-购物订单"})
    public AjaxResult<TShoppingOrder> getShoppingOrderList(String id) {
        TShoppingOrder byId = shoppingOrderService.getById(id);
@@ -144,6 +144,9 @@
                // todo 部署到线上之后写回调地址
//                wxPaymentRefundModel.setNotify_url("");
                String string = byId.getPaymentAmount().multiply(new BigDecimal("100")).toString();
                if (string.contains(".")){
                    string = string.substring(0,string.indexOf("."));
                }
                int i = Integer.parseInt(string);
                WxPaymentRefundModel.RefundAmount refundAmount = new WxPaymentRefundModel.RefundAmount();
                refundAmount.setTotal(i);
@@ -178,8 +181,10 @@
    }
    @GetMapping("/consignerShoppingOrder")
    @ApiOperation(value = "发货", tags = {"管理后台-购物订单"})
    public AjaxResult consignerShoppingOrder(String id) {
    public AjaxResult consignerShoppingOrder(String id,String companyName,String code) {
        TShoppingOrder byId = shoppingOrderService.getById(id);
        byId.setExpressCompany(companyName);
        byId.setExpressNumber(code);
        Long userid = tokenService.getLoginUser().getUserid();
        byId.setConsignerId(userid);
        byId.setConsignerTime(LocalDateTime.now());
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TVipOrderController.java
@@ -52,7 +52,7 @@
    @PostMapping("/addVipOrder")
    @ApiOperation(value = "添加会员订单", tags = {"管理后台-会员订单"})
    public AjaxResult addVipOrder(@RequestBody TVipOrder dto) {
        vipOrderService.save(dto);
        vipOrderService.saveOrUpdate(dto);
        return AjaxResult.success();
    }
    @GetMapping("/deleteVipOrder")
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ChargingListQuery.java
New file
@@ -0,0 +1,38 @@
package com.ruoyi.order.dto;
import com.ruoyi.common.core.web.page.BasePage;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
@Data
public class ChargingListQuery extends BasePage {
    @ApiModelProperty("订单编号")
    private String code;
    @ApiModelProperty("电站id")
    private Integer siteId;
    @ApiModelProperty("状态(0=未知,1=等待中,2=启动中,3=充电中,4=停止中,5=已结束)")
    private Integer status;
    @ApiModelProperty("手机号")
    private String phone;
    @ApiModelProperty("车牌号")
    private String licensePlate;
    @ApiModelProperty("订单类型(1=充电订单(小程序),2=充电订单(刷卡))")
    private Integer orderType;
    @ApiModelProperty("开始时间 2020-01-01 12:00:00 - 2020-01-01 23:00:00")
    private String startTime;
    @ApiModelProperty("结束时间 2020-01-01 12:00:00 - 2020-01-01 23:00:00")
    private String endTime;
    @ApiModelProperty("用户ids 前端忽略")
    private List<Long> userIds;
    @ApiModelProperty("车辆ids 前端忽略")
    private List<Long> carIds;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ChargingStatisticsQueryDto.java
New file
@@ -0,0 +1,18 @@
package com.ruoyi.order.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDate;
@Data
public class ChargingStatisticsQueryDto {
    @ApiModelProperty("电站id")
    private Integer siteId;
    @ApiModelProperty("1今日2本周3本月4今年5自定义")
    private Integer dayType;
    @ApiModelProperty("开始时间")
    private LocalDate startTime;
    @ApiModelProperty("结束时间")
    private LocalDate endTime;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderDto.java
@@ -31,5 +31,7 @@
    private LocalDateTime endTime;
    @ApiModelProperty("支付时间")
    private LocalDateTime payTime;
    private Integer refundStatus;
    private Double finalAmount;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PreChargeCheck.java
@@ -17,4 +17,8 @@
    private Boolean insulationTesting;
    @ApiModelProperty("电子锁锁止")
    private Boolean electronicLockLock;
    @ApiModelProperty("启动成功(1=启动中,2=启动成功,3=启动失败,退款)")
    private Integer startupSuccess;
    @ApiModelProperty("失败原因(0:无,1:设备编号不匹配,2:枪已在充电,3:设备故障,4:设备离线,5:未插枪桩在收到启充命令后,检测到未插枪则发送 0x33 报文回复充电失败。若在 60 秒(以收到 0x34 时间开始计算)内检测到枪重新连接,则补送 0x33 成功报文;超时或者离线等其他异常,桩不启充、不补发 0x33 报文)")
    private Integer failureCause;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/SixChargingDto.java
New file
@@ -0,0 +1,19 @@
package com.ruoyi.order.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
public class SixChargingDto {
    private String month;
    @ApiModelProperty("电费")
    private BigDecimal electrovalence;
    @ApiModelProperty("服务费")
    private BigDecimal serviceCharge;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/SixCircleDto.java
New file
@@ -0,0 +1,11 @@
package com.ruoyi.order.dto;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class SixCircleDto {
    Integer siteId;
    BigDecimal paymentAmount;
    String siteName;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/SixMonthTotal.java
New file
@@ -0,0 +1,5 @@
package com.ruoyi.order.dto;
public class SixMonthTotal {
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/SixShopDto.java
New file
@@ -0,0 +1,13 @@
package com.ruoyi.order.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class SixShopDto {
    private String month;
    private Long count;
    private BigDecimal paymentAmount;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/SixVipDto.java
New file
@@ -0,0 +1,13 @@
package com.ruoyi.order.dto;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class SixVipDto {
    private String month;
    private String vipName;
    private Integer vipId;
    private BigDecimal paymentAmount;
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/filter/AuthFilter.java
@@ -80,7 +80,7 @@
                return;
            }
        }
        filterChain.doFilter(request, response);
        filterChain.doFilter(servletRequest, servletResponse);
    }
    
    
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java
@@ -1,18 +1,20 @@
package com.ruoyi.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.common.core.dto.ChargingOrderGroup;
import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.order.api.model.TChargingOrder;
import com.ruoyi.order.api.model.TChargingOrderRefund;
import com.ruoyi.order.api.query.ChargingOrderQuery;
import com.ruoyi.order.api.vo.ChargingOrderListVO;
import com.ruoyi.order.api.vo.ChargingOrderVO;
import com.ruoyi.order.dto.ChargingRefundDto;
import com.ruoyi.order.dto.GetNoInvoicedOrder;
import com.ruoyi.order.dto.PayOrderDto;
import com.ruoyi.order.dto.PayOrderQueryDto;
import com.ruoyi.order.dto.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
@@ -55,4 +57,26 @@
    List<PayOrderDto> payOrderQuery(@Param("pageInfo")PageInfo<PayOrderDto> pageInfo,@Param("data") PayOrderQueryDto payOrderQueryDto);
    List<TChargingOrderRefund> getRefundList(@Param("pageInfo")PageInfo<TChargingOrderRefund> pageInfo,@Param("data")  ChargingRefundDto chargingRefundDto);
    List<ChargingOrderGroup> chargingOrderGroup(@Param("chargingPercentProvinceDto")ChargingPercentProvinceDto chargingPercentProvinceDto);
    List<SixChargingDto> charge(@Param("sixBefore")LocalDate sixBefore,@Param("siteIds") List<Integer> siteIds);
    List<SixCircleDto> circle(@Param("siteIds")List<Integer> siteIds,@Param("sixBefore")LocalDate sixBefore);
    Map<String, BigDecimal> countAll(@Param("sixBefore")LocalDate sixBefore);
    List<Map<String, BigDecimal>> getSumByType(@Param("chargingOrderIds")List<Long> chargingOrderIds);
    List<Map<String, BigDecimal>> getDateData(List<Long> chargingOrderIds);
    List<Map<String, BigDecimal>> getWeekData(List<Long> chargingOrderIds);
    List<Map<String, BigDecimal>> getMonthData(List<Long> chargingOrderIds);
    List<Map<String, BigDecimal>> getYearData(List<Long> chargingOrderIds);
    List<ChargingOrderListVO> chargingList(@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<ChargingOrderListVO> chargingList1( @Param("req")ChargingListQuery dto, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2, @Param("endTime1")String endTime1, @Param("endTime2")String endTime2);
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TShoppingOrderMapper.java
@@ -6,9 +6,12 @@
import com.ruoyi.order.api.query.ShoppingOrderQuery;
import com.ruoyi.order.api.query.TActivityStatisticsQuery;
import com.ruoyi.order.api.vo.TActivityStatisticslVO;
import com.ruoyi.order.dto.SixShopDto;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
/**
@@ -38,4 +41,7 @@
    List<TShoppingOrder> pageList(@Param("pageInfo")PageInfo<TShoppingOrder> pageInfo, @Param("req")ShoppingOrderQuery query, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2);
    List<SixShopDto> sixBefore(@Param("sixBefore")LocalDate sixBefore,@Param("status") Integer status);
    BigDecimal getSumAmount(@Param("sixBefore")LocalDate sixBefore);
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TVipOrderMapper.java
@@ -6,9 +6,12 @@
import com.ruoyi.order.api.model.TVipOrder;
import com.ruoyi.order.api.query.ShoppingOrderQuery;
import com.ruoyi.order.api.query.VipShoppingOrderQuery;
import com.ruoyi.order.dto.SixVipDto;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
/**
@@ -25,4 +28,7 @@
    List<TVipOrder> pageList(@Param("pageInfo")PageInfo<TVipOrder> pageInfo, @Param("req") VipShoppingOrderQuery query, @Param("startTime1")String startTime1, @Param("startTime2")String startTime2);
    List<SixVipDto> sixBefore(@Param("sixBefore")LocalDate sixBefore);
    BigDecimal getSumAmout(@Param("sixBefore")LocalDate sixBefore);
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
@@ -2,17 +2,24 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.dto.ChargingOrderGroup;
import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.BasePage;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.order.api.model.TChargingOrder;
import com.ruoyi.order.api.model.TChargingOrderRefund;
import com.ruoyi.order.api.query.ChargingOrderQuery;
import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery;
import com.ruoyi.order.api.vo.ChargingOrderTimeVO;
import com.ruoyi.order.api.vo.ChargingOrderVO;
import com.ruoyi.order.api.vo.TCharingOrderVO;
import com.ruoyi.order.dto.*;
import com.ruoyi.order.vo.ChargingOrderListInfoVO;
import org.springframework.web.bind.annotation.RequestBody;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
@@ -71,6 +78,18 @@
    
    
    /**
     * 充电启动失败后的退款回调处理
     * @param out_refund_no
     * @param refund_id
     * @param tradeState
     * @param success_time
     * @return
     */
    AjaxResult chargingOrderStartupFailureWxRefund(String out_refund_no, String refund_id, String tradeState, String success_time);
    /**
     * 获取充电中的详情
     * @param id
     * @return
@@ -90,4 +109,33 @@
    R<PageInfo<PayOrderDto>> payOrderQuery(PayOrderQueryDto payOrderQueryDto);
    R<PageInfo<TChargingOrderRefund>> getRefundList(ChargingRefundDto chargingRefundDto);
    List<ChargingOrderGroup> chargingOrderGroup(ChargingPercentProvinceDto chargingPercentProvinceDto);
    List<SixChargingDto> charge(LocalDate sixBefore, List<Integer> siteIds);
    List<SixCircleDto> circle(List<Integer> siteIds,LocalDate sixBefore);
    Map<String, BigDecimal> countAll(LocalDate sixBefore);
    List<Map<String, BigDecimal>> getSumByType(List<Long> chargingOrderIds);
    List<Map<String, BigDecimal>> getDateData(List<Long> chargingOrderIds);
    List<Map<String, BigDecimal>> getWeekData(List<Long> chargingOrderIds);
    List<Map<String, BigDecimal>> getMonthData(List<Long> chargingOrderIds);
    List<Map<String, BigDecimal>> getYearData(List<Long> chargingOrderIds);
    ChargingOrderTimeVO chargingList(ChargingListQuery dto);
    ChargingOrderListInfoVO chargingInfo(String uid);
    /**
     * 处理充电订单实时监控数据相关的业务逻辑
     * @param query
     */
    void chargeMonitoring(UploadRealTimeMonitoringDataQuery query);
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TOrderAppealService.java
@@ -28,5 +28,5 @@
     * @param id
     * @return
     */
    TOrderAppealVO getDetailById(Integer id);
    TOrderAppealVO getDetailById(String id);
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TShoppingOrderService.java
@@ -8,13 +8,12 @@
import com.ruoyi.order.api.query.TActivityStatisticsQuery;
import com.ruoyi.order.api.vo.TActivityStatisticslVO;
import com.ruoyi.order.api.vo.TActivityVO;
import com.ruoyi.order.dto.GetMyShoppingOrderList;
import com.ruoyi.order.dto.GetNoInvoicedOrder;
import com.ruoyi.order.dto.MyShoppingOrderInfo;
import com.ruoyi.order.dto.MyShoppingOrderList;
import com.ruoyi.order.dto.*;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
@@ -78,4 +77,7 @@
    PageInfo<TShoppingOrder> pageList(ShoppingOrderQuery query);
    List<SixShopDto> sixBefore(LocalDate sixBefore, Integer status);
    BigDecimal getSumAmount(LocalDate sixBefore);
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TVipOrderService.java
@@ -4,6 +4,11 @@
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.order.api.model.TVipOrder;
import com.ruoyi.order.api.query.VipShoppingOrderQuery;
import com.ruoyi.order.dto.SixVipDto;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
/**
 * <p>
@@ -16,4 +21,8 @@
public interface TVipOrderService extends IService<TVipOrder> {
    PageInfo<TVipOrder> pageList(VipShoppingOrderQuery query);
    List<SixVipDto> sixBefore(LocalDate sixBefore);
    BigDecimal getSumAmout(LocalDate sixBefore);
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderAccountingStrategyServiceImpl.java
@@ -71,21 +71,21 @@
            map2.put("name", "峰");
            BigDecimal value2 = list1.stream().filter(s -> orderIds.contains(s.getChargingOrderId()) && s.getType() == 2)
                    .map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
            map1.put("value", value2.setScale(2, RoundingMode.HALF_EVEN));
            map2.put("value", value2.setScale(2, RoundingMode.HALF_EVEN));
            datas.add(map2);
            
            Map<String, Object> map3 = new HashMap<>();
            map3.put("name", "平");
            BigDecimal value3 = list1.stream().filter(s -> orderIds.contains(s.getChargingOrderId()) && s.getType() == 3)
                    .map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
            map1.put("value", value3.setScale(2, RoundingMode.HALF_EVEN));
            map3.put("value", value3.setScale(2, RoundingMode.HALF_EVEN));
            datas.add(map3);
            
            Map<String, Object> map4 = new HashMap<>();
            map4.put("name", "谷");
            BigDecimal value4 = list1.stream().filter(s -> orderIds.contains(s.getChargingOrderId()) && s.getType() == 4)
                    .map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
            map1.put("value", value4.setScale(2, RoundingMode.HALF_EVEN));
            map4.put("value", value4.setScale(2, RoundingMode.HALF_EVEN));
            datas.add(map4);
            list2.add(datas);
        }
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.account.api.feignClient.AppUserCarClient;
import com.ruoyi.account.api.feignClient.AppUserClient;
@@ -10,38 +11,51 @@
import com.ruoyi.account.api.model.TAppUserCar;
import com.ruoyi.account.api.model.TAppUserVipDetail;
import com.ruoyi.account.api.vo.GetAppUserVipDetail;
import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient;
import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient;
import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient;
import com.ruoyi.chargingPile.api.feignClient.SiteClient;
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
import com.ruoyi.chargingPile.api.model.TChargingGun;
import com.ruoyi.chargingPile.api.model.TChargingPile;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.dto.ChargingOrderGroup;
import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.BasePage;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.integration.api.feignClient.ChargingHandshakeClient;
import com.ruoyi.integration.api.feignClient.PlatformStartChargingReplyClient;
import com.ruoyi.integration.api.feignClient.SendMessageClient;
import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient;
import com.ruoyi.integration.api.model.ChargingHandshake;
import com.ruoyi.integration.api.model.PlatformStartCharging;
import com.ruoyi.integration.api.model.PlatformStartChargingReply;
import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
import com.ruoyi.order.api.model.TChargingOrder;
import com.ruoyi.order.api.model.TChargingOrderAccountingStrategy;
import com.ruoyi.order.api.model.TChargingOrderRefund;
import com.ruoyi.order.api.model.TOrderEvaluate;
import com.ruoyi.order.api.model.*;
import com.ruoyi.order.api.query.ChargingOrderQuery;
import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery;
import com.ruoyi.order.api.vo.ChargingOrderListVO;
import com.ruoyi.order.api.vo.ChargingOrderTimeVO;
import com.ruoyi.order.api.vo.ChargingOrderVO;
import com.ruoyi.order.api.vo.TCharingOrderVO;
import com.ruoyi.order.dto.*;
import com.ruoyi.order.mapper.TChargingOrderMapper;
import com.ruoyi.order.service.TChargingOrderAccountingStrategyService;
import com.ruoyi.order.service.TChargingOrderRefundService;
import com.ruoyi.order.service.TChargingOrderService;
import com.ruoyi.order.service.TOrderEvaluateService;
import com.ruoyi.other.api.domain.TCoupon;
import com.ruoyi.other.api.domain.TGoods;
import com.ruoyi.order.vo.ChargingOrderListInfoVO;
import com.ruoyi.payment.api.feignClient.AliPaymentClient;
import com.ruoyi.payment.api.feignClient.WxPaymentClient;
import com.ruoyi.payment.api.model.RefundReq;
import com.ruoyi.payment.api.model.RefundResp;
import com.ruoyi.payment.api.model.WxPaymentRefundModel;
import com.ruoyi.payment.api.vo.*;
import io.seata.spring.annotation.GlobalTransactional;
import io.swagger.annotations.ApiModelProperty;
@@ -52,11 +66,13 @@
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.concurrent.*;
import java.util.stream.Collectors;
/**
@@ -82,6 +98,10 @@
    private AppUserClient appUserClient;
    
    @Resource
    private ChargingPileClient chargingPileClient;
    @Resource
    private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService;
    
    @Resource
@@ -93,8 +113,7 @@
    @Resource
    private AliPaymentClient aliPaymentClient;
    
    @Resource
    private ChargingPileClient chargingPileClient;
    
    @Resource
@@ -114,6 +133,19 @@
    
    @Resource
    private TOrderEvaluateService orderEvaluateService;
    @Resource
    private AccountingStrategyDetailClient accountingStrategyDetailClient;
    @Resource
    private PlatformStartChargingReplyClient platformStartChargingReplyClient;
    @Resource
    private TChargingOrderRefundService chargingOrderRefundService;
    //计数器
    private Map<String, Integer> counter_map = new HashMap<>();
    
    
    
@@ -416,6 +448,7 @@
     * @return
     */
    @Override
    @GlobalTransactional(rollbackFor = Exception.class)
    public AjaxResult chargingOrderCallback(Integer paymentType, String out_trade_no, String transaction_id, String attach) {
        TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, out_trade_no));
        if(chargingOrder.getRechargePaymentStatus() == 2){
@@ -423,35 +456,189 @@
        }
        chargingOrder.setRechargePaymentStatus(2);
        chargingOrder.setRechargeSerialNumber(transaction_id);
        chargingOrder.setStatus(2);
        this.updateById(chargingOrder);
        //添加安全检测数据到缓存中,每步安全检测完成后需要更新缓存数据
        PreChargeCheck preChargeCheck = new PreChargeCheck();
        preChargeCheck.setElectronicLockLock(false);
        preChargeCheck.setInsulationTesting(false);
        preChargeCheck.setSecureConnectionDetection(false);
        preChargeCheck.setStartupSuccess(1);
        String key = "AQJC_" + chargingOrder.getChargingGunId();
        redisService.setCacheObject(key, preChargeCheck);
        
        //根据当前充值的金额和计费模板算出充电的金额
        BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
        //计算充电金额,会员需要将折扣金额加入到充电总金额中
        TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
        TAccountingStrategyDetail strategyDetail = accountingStrategyDetailClient.getNowData(chargingGun.getAccountingStrategyId()).getData();
        //总单价
        BigDecimal totalUnitPrice = strategyDetail.getServiceCharge().add(strategyDetail.getElectrovalence());
        //计算能充电的度数
        BigDecimal degrees = rechargeAmount.divide(totalUnitPrice);
        //计算电费金额和服务费
        BigDecimal serviceCharge = strategyDetail.getServiceCharge().multiply(degrees);
        BigDecimal electrovalence = strategyDetail.getElectrovalence().multiply(degrees);
        
//        TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
//        if(){
//            appUser.getVipId()
//        }
//
//
//        //调用远程启动充电消息
//        PlatformStartCharging platformStartCharging = new PlatformStartCharging();
//        platformStartCharging.setTransaction_serial_number(chargingOrder.getCode());
//        platformStartCharging.setCharging_pile_code();
//        platformStartCharging.setCharging_gun_code();
//        platformStartCharging.setCard_number();
//        platformStartCharging.setAccount_balance()
//        sendMessageClient.platformStartCharging(platformStartCharging);
        //再处理会员折扣
        BigDecimal discount = BigDecimal.ZERO;
        TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
        if(null != appUser.getVipId()){
            GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
            getAppUserVipDetail.setAppUserId(chargingOrder.getAppUserId());
            getAppUserVipDetail.setVipId(appUser.getVipId());
            TAppUserVipDetail data = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
            if(data.getChargeNum() > 0){
                discount = serviceCharge.multiply(data.getDiscount().divide(new BigDecimal(10)));
                data.setChargeNum(data.getChargeNum() - 1);
                appUserVipDetailClient.updateAppUserVipDetail(data);
            }
        }
        electrovalence = electrovalence.add(discount);
        TChargingPile chargingPile = chargingPileClient.getChargingPileById(chargingGun.getChargingPileId()).getData();
        //调用远程启动充电消息
        PlatformStartCharging platformStartCharging = new PlatformStartCharging();
        platformStartCharging.setTransaction_serial_number(chargingOrder.getCode());
        platformStartCharging.setCharging_pile_code(chargingPile.getCode());
        platformStartCharging.setCharging_gun_code(chargingGun.getCode());
        //使用订单id作为逻辑卡号
        platformStartCharging.setCard_number(chargingOrder.getId().toString());
        platformStartCharging.setAccount_balance(electrovalence);
        sendMessageClient.platformStartCharging(platformStartCharging);
        //异步线程检测远程启动的应答结果。如果失败,则需要全额退款
        String code = chargingOrder.getCode();
        //执行5分钟的定时任务检测
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
        scheduler.scheduleAtFixedRate(()->{
            List<PlatformStartChargingReply> data = platformStartChargingReplyClient.getPlatformStartChargingReply(code).getData();
            if(data.size() != 0){
                PlatformStartChargingReply platformStartChargingReply = data.get(1);
                Integer startup_result = platformStartChargingReply.getStartup_result();
                Integer failure_cause = platformStartChargingReply.getFailure_cause();
                Integer counter = counter_map.get(code);
                PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key);
                //状态为5的时候,硬件会间隔60秒后再次检测,依然未插枪,则不启动充电
                //因这里是间隔5秒执行检测,所以累计次数在30次以上
                if(failure_cause == 5 && null == counter || counter < 35){
                    counter++;
                    counter_map.put(code, counter);
                    //启动失败
                    preChargeCheck1.setStartupSuccess(3);
                    preChargeCheck1.setFailureCause(failure_cause);
                    redisService.setCacheObject(key, preChargeCheck1);
                    return;
                }
                //清除计时器中的无效数据
                counter_map.remove(code);
                //开始处理退款
                TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code));
                if(0 == startup_result){
                    //启动失败
                    preChargeCheck1.setStartupSuccess(3);
                    preChargeCheck1.setFailureCause(failure_cause);
                    //启动失败后取消订单,退款操作
                    refund(code);
                    order.setStatus(5);
                    order.setEndMode(0);
                }else{
                    preChargeCheck1.setStartupSuccess(2);
                    order.setStatus(3);
                    order.setStartTime(LocalDateTime.now());
                }
                this.updateById(order);
                redisService.setCacheObject(key, preChargeCheck1);
                //提前结束定时任务
                scheduler.shutdown();
            }
        }, 5, 300, TimeUnit.SECONDS);
        return AjaxResult.success();
    }
    /**
     * 启动失败后的退款,取消订单
     * @param code
     */
    public void refund(String code){
        TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code));
        if(chargingOrder.getStatus() == 2){
            Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
            BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
            //构建退款明细
            TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
            chargingOrderRefund.setChargingOrderId(chargingOrder.getId());
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
            chargingOrderRefund.setRefundCode("CDF" + sdf.format(new Date()) + (Math.random() * 1000));
            chargingOrderRefund.setRefundAmount(rechargeAmount);
            chargingOrderRefund.setRefundStatus(1);
            chargingOrderRefund.setPayType(rechargePaymentType);
            chargingOrderRefund.setRefundStatus(1);
            chargingOrderRefund.setCode(code);
            chargingOrderRefund.setRefundTitle("充电失败");
            chargingOrderRefund.setRefundContent("充电失败");
            chargingOrderRefund.setRefundReason("充电失败");
            chargingOrderRefund.setRefundRemark("全额退款");
            chargingOrderRefund.setRefundTotalAmount(rechargeAmount);
            chargingOrderRefund.setPayAmount(rechargeAmount);
            if(1 == rechargePaymentType){
                WxPaymentRefundModel model = new WxPaymentRefundModel();
                model.setOut_trade_no(chargingOrder.getCode());
                model.setOut_refund_no(chargingOrderRefund.getRefundCode());
                model.setReason("充电失败,取消充电订单");
                model.setNotify_url("http://127.0.0.1:9000/order/t-charging-order/chargingOrderStartupFailureWxRefund");
                WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
                amount.setRefund(rechargeAmount.multiply(new BigDecimal(100)).intValue());
                amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
                amount.setCurrency("CNY");
                model.setAmount(amount);
                R<String> orderR = wxPaymentClient.refundOrderR(model);
                if(200 == orderR.getCode()){
                    chargingOrderRefundService.save(chargingOrderRefund);
                }
            }
            if(2 == rechargePaymentType){
                RefundReq dto = new RefundReq();
                dto.setOutTradeNo(chargingOrder.getCode());
                dto.setOutRequestNo(chargingOrderRefund.getCode());
                dto.setRefundAmount(rechargeAmount.toString());
                dto.setRefundReason("充电失败,取消充电订单");
                RefundResp resp = aliPaymentClient.refund(dto).getData();
                if(null != resp){
                    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE");
                    AjaxResult success = chargingOrderStartupFailureWxRefund(resp.getOutTradeNo(), resp.getTradeNo(), "SUCCESS", sdf1.format(new Date()));
                    if(success.isSuccess()){
                        chargingOrderRefundService.save(chargingOrderRefund);
                    }
                }
            }
        }
    }
    /**
     * 启动失败后微信退款的回调处理
     * @param out_refund_no
     * @param refund_id
     * @param tradeState
     * @param success_time
     * @return
     */
    public AjaxResult chargingOrderStartupFailureWxRefund(String out_refund_no, String refund_id, String tradeState, String success_time){
        if("SUCCESS".equals(tradeState)){
            TChargingOrderRefund one = chargingOrderRefundService.getOne(new LambdaQueryWrapper<TChargingOrderRefund>().eq(TChargingOrderRefund::getRefundCode, out_refund_no));
            one.setRefundSerialNumber(refund_id);
            one.setRefundStatus(2);
            one.setRefundTime(LocalDateTime.parse(success_time, DateTimeFormatter.ofPattern("yyyy-MM-DDTHH:mm:ss+TIMEZONE")));
            chargingOrderRefundService.updateById(one);
        }
        return AjaxResult.success();
    }
    
    
    /**
@@ -475,6 +662,7 @@
        chargingDetails.setName(site.getName() + "-" + chargingPile.getName());
        chargingDetails.setCode(one.getCode());
        chargingDetails.setStatus(one.getStatus());
        chargingDetails.setChargingCost(one.getResidualAmount());
        UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataClient.chargingOrderInfo(one.getCode()).getData();
        if(null != data){
            chargingDetails.setChargeCurrent(data.getOutput_current());
@@ -485,7 +673,6 @@
            chargingDetails.setRemainingChargeTime(data.getTime_remaining());
            chargingDetails.setChargedDegrees(data.getCharging_degree());
            chargingDetails.setChargedTime(data.getCumulative_charging_time());
            chargingDetails.setChargingCost(data.getPaid_amount());
        }
        ChargingHandshake chargingHandshake = chargingHandshakeClient.getDataByOrderCode(one.getCode()).getData();
        if(null != chargingHandshake && null != data && null != one.getAppUserCarId()){
@@ -516,9 +703,6 @@
        chargingOrder.setEndMode(1);
        this.updateById(chargingOrder);
        //调用硬件停止充电,停止成功后开始计算费用退款
        // todo 待完善
        return AjaxResult.success();
    }
@@ -569,6 +753,12 @@
         BigDecimal electronicMoney = new BigDecimal("0");
         BigDecimal serviceMoney = new BigDecimal("0");
        for (ChargingOrderVO chargingOrderVO : list) {
            TChargingGun data3 = chargingGunClient.getChargingGunById(chargingOrderVO.getChargingGunId()).getData();
            TChargingPile data2 = chargingPileClient.getChargingPileById(chargingOrderVO.getChargingPileId()).getData();
            if (data2!=null && data3!=null){
                chargingOrderVO.setTerminalName(data2.getName()+"-"+data3.getName());
            }
            if (chargingOrderVO.getChargingCapacity()!=null){
                total = total.add(chargingOrderVO.getChargingCapacity());
            }
@@ -579,14 +769,8 @@
            BigDecimal electronicMoney1 = new BigDecimal("0");
            // 单个订单累计服务费
            BigDecimal serviceMoney1 = new BigDecimal("0");
            LocalDateTime startTime = chargingOrderVO.getStartTime();
            LocalDateTime endTime = chargingOrderVO.getEndTime();
            // 计算时间差 秒 充电时长
            if (startTime!=null && endTime!=null){
                long between = ChronoUnit.SECONDS.between(startTime, endTime);
                chargingOrderVO.setChargingSecond(between);
                time += between;
            }
            UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrderVO.getCode()).getData();
            chargingOrderVO.setChargingSecond(data5.getTime_remaining()*60L);
            // 总收入
            if (chargingOrderVO.getRefundStatus() !=null && chargingOrderVO.getRefundStatus() == 2){
                income = income.add(chargingOrderVO.getPaymentAmount().subtract(chargingOrderVO.getRefundAmount()));
@@ -651,4 +835,283 @@
        return R.ok(pageInfo);
    }
    @Override
    public List<ChargingOrderGroup> chargingOrderGroup(ChargingPercentProvinceDto chargingPercentProvinceDto) {
        return this.baseMapper.chargingOrderGroup(chargingPercentProvinceDto);
    }
    @Override
    public List<SixChargingDto> charge(LocalDate sixBefore, List<Integer> siteIds) {
        return this.baseMapper.charge(sixBefore,siteIds);
    }
    @Override
    public List<SixCircleDto> circle(List<Integer> siteIds,LocalDate sixBefore) {
        return this.baseMapper.circle(siteIds,sixBefore);
    }
    @Override
    public Map<String, BigDecimal> countAll(LocalDate sixBefore) {
        return this.baseMapper.countAll(sixBefore);
    }
    @Override
    public List<Map<String, BigDecimal>> getSumByType(List<Long> chargingOrderIds) {
        return this.baseMapper.getSumByType(chargingOrderIds);
    }
    @Override
    public List<Map<String, BigDecimal>> getDateData(List<Long> chargingOrderIds) {
        return this.baseMapper.getDateData(chargingOrderIds);
    }
    @Override
    public List<Map<String, BigDecimal>> getWeekData(List<Long> chargingOrderIds) {
        return this.baseMapper.getWeekData(chargingOrderIds);
    }
    @Override
    public List<Map<String, BigDecimal>> getMonthData(List<Long> chargingOrderIds) {
        return this.baseMapper.getMonthData(chargingOrderIds);
    }
    @Override
    public List<Map<String, BigDecimal>> getYearData(List<Long> chargingOrderIds) {
        return this.baseMapper.getYearData(chargingOrderIds);
    }
    @Override
    public ChargingOrderTimeVO chargingList(ChargingListQuery dto) {
        String startTime1 = null;
        String startTime2 = null;
        String endTime1 = null;
        String endTime2 = null;
        if (StringUtils.hasLength(dto.getStartTime())){
            String[] split = dto.getStartTime().split(" - ");
            startTime1 = split[0];
            startTime2 = split[1];
        }
        if (StringUtils.hasLength(dto.getEndTime())){
            String[] split = dto.getEndTime().split(" - ");
            endTime1 = split[0];
            endTime2 = split[1];
        }
        ChargingOrderTimeVO chargingOrderTimeVO = new ChargingOrderTimeVO();
        PageInfo<ChargingOrderListVO> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize());
        List<ChargingOrderListVO> list = this.baseMapper.chargingList(pageInfo,dto,startTime1,startTime2,endTime1,endTime2);
        for (ChargingOrderListVO chargingOrderListVO : list) {
            chargingOrderListVO.setUid(chargingOrderListVO.getId()+"");
            List<Integer> integers = new ArrayList<>();
            integers.add(chargingOrderListVO.getSiteId());
            List<Site> data = siteClient.getSiteByIds(integers).getData();
            if (!data.isEmpty()) {
                chargingOrderListVO.setSiteName(data.get(0).getName());
            }
            TChargingGun data1 = chargingGunClient.getChargingGunById(chargingOrderListVO.getChargingGunId()).getData();
            TChargingPile data2 = chargingPileClient.getChargingPileById(chargingOrderListVO.getChargingPileId()).getData();
            if (data2 != null && data1 != null) {
                chargingOrderListVO.setTerminalName(data2.getName() + "-" + data1.getName());
            }
            // 获取充电时间
            UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrderListVO.getCode()).getData();
            if (data5!=null){
                if (data5.getTime_remaining()!=null){
                    chargingOrderListVO.setChargingSecond(data5.getTime_remaining()*60L);
                }
            }
            // 获取开始SOC 结束soc
            List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataClient.getDataByOrderCode(chargingOrderListVO.getCode()).getData();
            if (!data6.isEmpty()){
                // 第一条数据soc为开始 最后一条数据soc为结束soc
                chargingOrderListVO.setStartSoc(data6.get(0).getSoc().toString());
                chargingOrderListVO.setEndSoc(data6.get(data6.size()-1).getSoc().toString());
            }
            TAppUser data3 = appUserClient.getUserById(chargingOrderListVO.getAppUserId()).getData();
            List<Long> carId = new ArrayList<>();
            if (chargingOrderListVO.getAppUserCarId() != null) {
                carId.add(chargingOrderListVO.getAppUserCarId());
                List<TAppUserCar> data4 = appUserCarClient.getCarByIds(carId).getData();
                if (!data4.isEmpty()) chargingOrderListVO.setLicensePlate(data4.get(0).getLicensePlate());
            }
            if (data3 != null) chargingOrderListVO.setPhone(data3.getPhone());
            List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategyService.lambdaQuery()
                    .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrderListVO.getId()).list();
            // 尖峰平谷充电量 度数
            BigDecimal jian = new BigDecimal("0");
            BigDecimal feng = new BigDecimal("0");
            BigDecimal ping = new BigDecimal("0");
            BigDecimal gu = new BigDecimal("0");
            BigDecimal total = new BigDecimal("0");
            for (TChargingOrderAccountingStrategy temp : list2) {
                switch (temp.getType()) {
                    case 1:
                        jian = jian.add(temp.getChargingCapacity());
                        break;
                    case 2:
                        feng = feng.add(temp.getChargingCapacity());
                        break;
                    case 3:
                        ping = ping.add(temp.getChargingCapacity());
                        break;
                    case 4:
                        gu = gu.add(temp.getChargingCapacity());
                        break;
                }
            }
            total = total.add(jian).add(feng).add(ping).add(gu);
            chargingOrderListVO.setElectronicProportion(
                    jian.divide(total,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%(尖)/"
                    +feng.divide(total,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%(峰)/"
                    +ping.divide(total,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%(平)/"
                    +gu.divide(total,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%(谷)");
        }
        // 不分页
        List<ChargingOrderListVO> list1 = this.baseMapper.chargingList1(dto,startTime1,startTime2,endTime1,endTime2);
        chargingOrderTimeVO.setOrderCount(list1.size());
        // 计算充电总度数
        BigDecimal electronic = new BigDecimal("0");
        // 支付金额
        BigDecimal paymentAmount = new BigDecimal("0");
        // 电费
        BigDecimal electrovalence = new BigDecimal("0");
        // 服务费
        BigDecimal serviceCharge = new BigDecimal("0");
        // 尖峰平谷充电到账
        BigDecimal jianElectronic = new BigDecimal("0");
        BigDecimal fengElectronic = new BigDecimal("0");
        BigDecimal pingElectronic = new BigDecimal("0");
        BigDecimal guElectronic   = new BigDecimal("0");
        // 尖峰平谷服务费
        BigDecimal jianService = new BigDecimal("0");
        BigDecimal fengService = new BigDecimal("0");
        BigDecimal pingService = new BigDecimal("0");
        BigDecimal guService = new BigDecimal("0");
        // 尖峰平谷充电量 度数
        BigDecimal jian = new BigDecimal("0");
        BigDecimal feng = new BigDecimal("0");
        BigDecimal ping = new BigDecimal("0");
        BigDecimal gu = new BigDecimal("0");
        for (ChargingOrderListVO chargingOrderListVO : list1) {
            electronic = electronic.add(chargingOrderListVO.getChargingCapacity());
            paymentAmount = paymentAmount.add(chargingOrderListVO.getPaymentAmount());
            electrovalence = electrovalence.add(chargingOrderListVO.getElectrovalence());
            serviceCharge = serviceCharge.add(chargingOrderListVO.getServiceCharge());
            List<TChargingOrderAccountingStrategy> list2 = chargingOrderAccountingStrategyService.lambdaQuery()
                    .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrderListVO.getId()).list();
            for (TChargingOrderAccountingStrategy temp : list2) {
                switch (temp.getType()){
                    case 1:
                        jian = jian.add(temp.getChargingCapacity());
                        jianElectronic = jianElectronic.add(temp.getChargingCapacity());
                        jianService = jianService.add(temp.getChargingCapacity());
                        break;
                    case 2:
                        feng = feng.add(temp.getChargingCapacity());
                        fengElectronic = fengElectronic.add(temp.getChargingCapacity());
                        fengService = fengService.add(temp.getChargingCapacity());
                        break;
                    case 3:
                        ping = ping.add(temp.getChargingCapacity());
                        pingElectronic = pingElectronic.add(temp.getChargingCapacity());
                        pingService = pingService.add(temp.getChargingCapacity());
                        break;
                    case 4:
                        gu = gu.add(temp.getChargingCapacity());
                        guElectronic = guElectronic.add(temp.getChargingCapacity());
                        guService = guService.add(temp.getChargingCapacity());
                        break;
                }
            }
        }
        chargingOrderTimeVO.setChargingCapacity(electronic);
        chargingOrderTimeVO.setPaymentAmount(paymentAmount);
        chargingOrderTimeVO.setElectrovalence(electrovalence);
        chargingOrderTimeVO.setServiceCharge(serviceCharge);
        // 计算尖峰平谷充电量占比
        BigDecimal add = jianElectronic.add(fengElectronic).add(pingElectronic).add(guElectronic);
        // 计算尖峰平谷服务费占比
        BigDecimal add1 = jianService.add(fengService).add(pingService).add(guService);
        // 计算尖峰平谷充电到账占比
        BigDecimal add2 = jian.add(feng).add(ping).add(gu);
        chargingOrderTimeVO.setCapacityProportion(jianElectronic+"度/"+fengElectronic+"度/"+pingElectronic+"度/"+guElectronic+"度-"
                +jianElectronic.divide(add,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/"
                +fengElectronic.divide(add,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/"
                +pingElectronic.divide(add,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/"
                +guElectronic.divide(add,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%");
        chargingOrderTimeVO.setServiceProportion(jianService+"元/"+fengService+"元/"+pingService+"元/"+guService+"元-"
                +jianService.divide(add1,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/"
                +fengService.divide(add1,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/"
                +pingService.divide(add1,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/"
                +guService.divide(add1,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%");
        chargingOrderTimeVO.setElectronicProportion(jian+"元/"+feng+"元/"+ping+"元/"+gu+"元-"
                +jian.divide(add2,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/"
                +feng.divide(add2,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/"
                +ping.divide(add2,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%/"
                +gu.divide(add2,4,BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100"))+"%");
        chargingOrderTimeVO.setList(pageInfo);
        return chargingOrderTimeVO;
    }
    @Override
    public ChargingOrderListInfoVO chargingInfo(String uid) {
        TChargingOrder chargingOrder= this.getById(uid);
        ChargingOrderListInfoVO chargingOrderListInfoVO = new ChargingOrderListInfoVO();
        chargingOrderListInfoVO.setCode(chargingOrder.getCode());
        List<Site> data = siteClient.getSiteByIds(Arrays.asList(chargingOrder.getSiteId())).getData();
        if (!data.isEmpty()){
            chargingOrderListInfoVO.setSiteName(data.get(0).getName());
            chargingOrderListInfoVO.setSiteAddress(data.get(0).getAddress());
        }
        TChargingGun data1 = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
        TChargingPile data2 = chargingPileClient.getChargingPileById(data1.getChargingPileId()).getData();
        if (data1!=null){
            chargingOrderListInfoVO.setGunCode(data1.getCode());
            chargingOrderListInfoVO.setTerminalName(data2.getName()+data1.getName());
        }
        chargingOrderListInfoVO.setEndMode(chargingOrder.getEndMode());
        // todo 周一完善
//        chargingOrderListInfoVO.setStartSoc();
//        chargingOrderListInfoVO.setEndSoc();
//        chargingOrderListInfoVO.setChargingCapacity();
//        chargingOrderListInfoVO.setSiteId();
//        chargingOrderListInfoVO.setChargingPileId();
//        chargingOrderListInfoVO.setAppUserId();
//        chargingOrderListInfoVO.setAppUserCarId();
//        chargingOrderListInfoVO.setChargingGunId();
//        chargingOrderListInfoVO.setOrderType();
//        chargingOrderListInfoVO.setChargingSecond();
//        chargingOrderListInfoVO.setLicensePlate();
//        chargingOrderListInfoVO.setPhone();
//        chargingOrderListInfoVO.setPaymentAmount();
//        chargingOrderListInfoVO.setElectrovalence();
//        chargingOrderListInfoVO.setServiceCharge();
//        chargingOrderListInfoVO.setStartTime();
//        chargingOrderListInfoVO.setEndTime();
//        chargingOrderListInfoVO.setId();
//        chargingOrderListInfoVO.setUid();
//        chargingOrderListInfoVO.setList();
        return null;
    }
    /**
     * 处理充电订单实时监控数据相关的业务逻辑
     * @param query
     */
    @Override
    public void chargeMonitoring(UploadRealTimeMonitoringDataQuery query) {
        // todo 需完善
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TExchangeOrderServiceImpl.java
@@ -3,6 +3,8 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.account.api.feignClient.AppUserAddressClient;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.account.api.model.TAppUser;
import com.ruoyi.account.api.model.TAppUserAddress;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.security.service.TokenService;
@@ -52,7 +54,8 @@
    @Resource
    private AppUserAddressClient appUserAddressClient;
    
    @Resource
    private AppUserClient appUserClient;
    
    
    
@@ -168,7 +171,29 @@
        }
        PageInfo<TExchangeOrder> pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize());
        List<TExchangeOrder> list = this.baseMapper.pageList(pageInfo,query,startTime1,startTime2);
        for (TExchangeOrder tShoppingOrder : list) {
            tShoppingOrder.setUid(tShoppingOrder.getId().toString());
            switch (tShoppingOrder.getOrderType()){
                case 1:
                    TGoods data = goodsClient.getGoodsById(tShoppingOrder.getGoodsId()).getData();
                    if (data!=null){
                        tShoppingOrder.setName(data.getName());
                    }
                    break;
                case 2:
                    TCoupon data1 = couponClient.getCouponById1(tShoppingOrder.getCouponId()).getData();
                    if (data1!=null){
                        tShoppingOrder.setName(data1.getName());
                    }
                    break;
            }
            if (tShoppingOrder.getAppUserId() != null){
                TAppUser data = appUserClient.getUserById(tShoppingOrder.getAppUserId()).getData();
                if (data!=null){
                    tShoppingOrder.setPhone(data.getPhone());
                }
            }
        }
        pageInfo.setRecords(list);
        return pageInfo;
    }
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderAppealServiceImpl.java
@@ -76,7 +76,7 @@
    }
    @Override
    public TOrderAppealVO getDetailById(Integer id) {
    public TOrderAppealVO getDetailById(String id) {
        TOrderAppeal orderAppeal = this.baseMapper.selectById(id);
        TOrderAppealVO orderAppealVO = new TOrderAppealVO();
        BeanUtils.copyProperties(orderAppeal,orderAppealVO);
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java
@@ -90,7 +90,7 @@
    public AjaxResult addOrderInvoice(AddOrderInvoice addOrderInvoice) {
        Long userId = tokenService.getLoginUserApplet().getUserId();
        String orders = addOrderInvoice.getOrders();
        if(StringUtils.isNotEmpty(orders)){
        if(StringUtils.isEmpty(orders)){
            return AjaxResult.error("请选择有效的订单");
        }
        JSONArray parse = JSONArray.parse(orders);
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java
@@ -6,6 +6,8 @@
import com.ruoyi.account.api.dto.GrantCouponDto;
import com.ruoyi.account.api.feignClient.AppCouponClient;
import com.ruoyi.account.api.feignClient.AppUserAddressClient;
import com.ruoyi.account.api.feignClient.AppUserClient;
import com.ruoyi.account.api.model.TAppUser;
import com.ruoyi.account.api.model.TAppUserAddress;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.web.domain.AjaxResult;
@@ -42,6 +44,7 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
@@ -66,6 +69,8 @@
    
    @Resource
    private CouponClient couponClient;
    @Resource
    private AppUserClient appUserClient;
    
    @Resource
    private AppUserAddressClient appUserAddressClient;
@@ -401,6 +406,7 @@
    public AjaxResult cancelShoppingOrderWxRefund(String out_refund_no, String refund_id, String refund_status, String success_time) {
        if("SUCCESS".equals(refund_status)){
            TShoppingOrderRefund one = shoppingOrderRefundService.getOne(new LambdaQueryWrapper<TShoppingOrderRefund>().eq(TShoppingOrderRefund::getRefundCode, out_refund_no));
            one.setRefundStatus(2);
            one.setRefundSerialNumber(refund_id);
            one.setRefundTime(LocalDateTime.parse(success_time, DateTimeFormatter.ofPattern("yyyy-MM-DDTHH:mm:ss+TIMEZONE")));
            shoppingOrderRefundService.updateById(one);
@@ -502,8 +508,43 @@
        }
        PageInfo<TShoppingOrder> pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize());
        List<TShoppingOrder> list = this.baseMapper.pageList(pageInfo,query,startTime1,startTime2);
        for (TShoppingOrder tShoppingOrder : list) {
            tShoppingOrder.setUid(tShoppingOrder.getId().toString());
            switch (tShoppingOrder.getOrderType()){
                case 1:
                    TGoods data = goodsClient.getGoodsById(tShoppingOrder.getGoodsId()).getData();
                    if (data!=null){
                        tShoppingOrder.setName(data.getName());
                    }
                    break;
                case 2:
                    TCoupon data1 = couponClient.getCouponById1(tShoppingOrder.getCouponId()).getData();
                    if (data1!=null){
                        tShoppingOrder.setName(data1.getName());
                    }
                    break;
            }
            if (tShoppingOrder.getAppUserId() != null){
                TAppUser data = appUserClient.getUserById(tShoppingOrder.getAppUserId()).getData();
                if (data!=null){
                    tShoppingOrder.setPhone(data.getPhone());
                }
            }
        }
        pageInfo.setRecords(list);
        return pageInfo;
    }
    @Override
    public List<SixShopDto> sixBefore(LocalDate sixBefore, Integer status) {
        return this.baseMapper.sixBefore(sixBefore,status);
    }
    @Override
    public BigDecimal getSumAmount(LocalDate sixBefore) {
        return this.baseMapper.getSumAmount(sixBefore);
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TVipOrderServiceImpl.java
@@ -5,11 +5,17 @@
import com.ruoyi.order.api.model.TShoppingOrder;
import com.ruoyi.order.api.model.TVipOrder;
import com.ruoyi.order.api.query.VipShoppingOrderQuery;
import com.ruoyi.order.dto.SixVipDto;
import com.ruoyi.order.mapper.TVipOrderMapper;
import com.ruoyi.order.service.TVipOrderService;
import com.ruoyi.other.api.domain.TVip;
import com.ruoyi.other.api.feignClient.VipClient;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.math.BigDecimal;
import java.time.LocalDate;
import javax.annotation.Resource;
import java.util.List;
/**
@@ -23,6 +29,8 @@
@Service
public class TVipOrderServiceImpl extends ServiceImpl<TVipOrderMapper, TVipOrder> implements TVipOrderService {
    @Resource
    private VipClient vipClient;
    @Override
    public PageInfo<TVipOrder> pageList(VipShoppingOrderQuery query) {
        String startTime1 = null;
@@ -36,8 +44,25 @@
        }
        PageInfo<TVipOrder> pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize());
        List<TVipOrder> list = this.baseMapper.pageList(pageInfo,query,startTime1,startTime2);
        for (TVipOrder tVipOrder : list) {
            tVipOrder.setUid(tVipOrder.getId().toString());
            tVipOrder.setUserUid(tVipOrder.getAppUserId().toString());
            TVip data = vipClient.getInfo(tVipOrder.getVipId()).getData();
            if (data!=null){
                tVipOrder.setName(data.getName());
            }
        }
        pageInfo.setRecords(list);
        return pageInfo;
    }
    @Override
    public List<SixVipDto> sixBefore(LocalDate sixBefore) {
        return this.baseMapper.sixBefore(sixBefore);
    }
    @Override
    public BigDecimal getSumAmout(LocalDate sixBefore) {
        return this.baseMapper.getSumAmout(sixBefore);
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/PreviousSixMonths.java
New file
@@ -0,0 +1,20 @@
package com.ruoyi.order.util;
import java.time.LocalDate;
import java.time.Period;
import java.time.temporal.TemporalAdjusters;
public class PreviousSixMonths {
    public static LocalDate get() {
        // 获取当前日期
        LocalDate currentDate = LocalDate.now();
        // 计算六个月前的日期
        LocalDate sixMonthsAgo = currentDate.minusMonths(6);
        // 调整为该月的第一天
        LocalDate firstDayOfSixMonthsAgo = sixMonthsAgo.with(TemporalAdjusters.firstDayOfMonth());
        return firstDayOfSixMonthsAgo;
    }
}
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ChargingOrderListInfoVO.java
New file
@@ -0,0 +1,70 @@
package com.ruoyi.order.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
@Data
@ApiModel(value = "ChargingOrderListInfoVO对象",description = "充电时段统计列表查看详情VO")
public class ChargingOrderListInfoVO {
    @ApiModelProperty(value = "订单编号")
    private String code;
    @ApiModelProperty(value = "电站名称")
    private String siteName;
    @ApiModelProperty(value = "电站地址")
    private String siteAddress;
    @ApiModelProperty(value = "终端编号")
    private String gunCode;
    @ApiModelProperty(value = "充电终端名称 桩+枪")
    private String terminalName;
    @ApiModelProperty(value = "结束原因 (0=异常终止,1=主动终止,2=满电终止,3=费用不足终止)")
    private Integer endMode;
    @ApiModelProperty(value = "开始soc")
    private String startSoc;
    @ApiModelProperty(value = "结束soc")
    private String endSoc;
    @ApiModelProperty(value = "充电电流 度")
    private BigDecimal chargingCapacity;
    @ApiModelProperty(value = "电站id")
    private Integer siteId;
    @ApiModelProperty(value = "充电桩id")
    private Integer chargingPileId;
    @ApiModelProperty(value = "用户id")
    private Long appUserId;
    @ApiModelProperty(value = "用户车辆id")
    private Long appUserCarId;
    @ApiModelProperty(value = "充电枪id")
    private Integer chargingGunId;
    @ApiModelProperty(value = "订单类型(1=充电订单(小程序),2=充电订单(刷卡))")
    private String orderType;
    @ApiModelProperty(value = "充电时间 秒")
    private Long chargingSecond;
    @ApiModelProperty(value = "车牌号")
    private String licensePlate;
    @ApiModelProperty(value = "客户手机号")
    private String phone;
    @ApiModelProperty(value = "充电到账金额")
    private BigDecimal paymentAmount;
    @ApiModelProperty(value = "累计电费")
    private BigDecimal electrovalence;
    @ApiModelProperty(value = "累计服务费")
    private BigDecimal serviceCharge;
    @ApiModelProperty(value = "开始时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime startTime;
    @ApiModelProperty(value = "结束时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime endTime;
    @ApiModelProperty(value = "订单id")
    private Long id;
    @ApiModelProperty(value = "订单uid")
    private String uid;
    @ApiModelProperty(value = "充电信息")
    List<UploadRealTimeMonitoringData> list;
}
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
@@ -24,6 +24,7 @@
        <result column="recharge_payment_type" property="rechargePaymentType" />
        <result column="recharge_payment_status" property="rechargePaymentStatus" />
        <result column="recharge_serial_number" property="rechargeSerialNumber" />
        <result column="residual_amount" property="residualAmount" />
        <result column="order_amount" property="orderAmount" />
        <result column="app_coupon_id" property="appCouponId" />
        <result column="coupon_discount_amount" property="couponDiscountAmount" />
@@ -233,4 +234,189 @@
    </select>
    <select id="chargingOrderGroup" resultType="com.ruoyi.common.core.dto.ChargingOrderGroup">
        SELECT SUM(charging_capacity) ,site_id
        FROM t_charging_order
        GROUP BY site_id
        <where>
            <if test="chargingPercentProvinceDto.date1 != null">
                AND create_time &gt;= #{chargingPercentProvinceDto.date1}
            </if>
            <if test="chargingPercentProvinceDto.date2 != null">
                AND create_time &lt;= #{chargingPercentProvinceDto.date2}
            </if>
            <if test="chargingPercentProvinceDto.provinceCode != null">
                AND province_code = #{chargingPercentProvinceDto.provinceCode}
            </if>
        </where>
    </select>
    <select id="charge" resultType="com.ruoyi.order.dto.SixChargingDto">
        SELECT
            DATE_FORMAT( subquery.create_time, '%m' ) AS MONTH,
    SUM(electrovalence) AS electrovalence,
    SUM(service_charge) AS service_charge
        FROM
            (
            SELECT
            create_time,
            electrovalence,
            service_charge
            FROM
            t_charging_order
            <where>
                del_flag = 0 and recharge_payment_status = 2 and  ISNULL(refund_status)
                <if test="sixBefore != null">
                    AND create_time &gt;= #{sixBefore}
                </if>
                <if test="siteIds != null and siteIds.size() > 0">
                    AND site_id IN
                    <foreach collection="siteIds" item="siteId" open="(" separator="," close=")">
                        #{siteId}
                    </foreach>
                </if>
            </where>
            ) AS subquery
        GROUP BY
            DATE_FORMAT( subquery.create_time, '%m' )
    </select>
    <select id="circle" resultType="com.ruoyi.order.dto.SixCircleDto">
        SELECT
            site_id as siteId,SUM(payment_amount) as paymentAmount
        FROM
            t_charging_order
        <where>
            del_flag = 0 and recharge_payment_status = 2 and  ISNULL(refund_status)
            <if test="siteIds != null and siteIds.size() > 0">
                AND site_id IN
                <foreach collection="siteIds" item="siteId" open="(" separator="," close=")">
                    #{siteId}
                </foreach>
            </if>
            <if test="sixBefore != null">
                AND create_time &gt;= #{sixBefore}
            </if>
        </where>
        GROUP BY
            site_id
    </select>
    <select id="countAll" resultType="java.util.Map">
        select sum(electrovalence),sum(service_charge),sum(commission_amount),sum(sharing_amount)
        from t_charging_order
        where create_time &gt;= #{sixBefore} and del_flag = 0 and recharge_payment_status = 2 and  ISNULL(refund_status)
    </select>
    <select id="getSumByType" resultType="java.util.Map">
        SELECT
            type,
            SUM( charging_capacity ) as charging_capacity ,
            SUM( period_service_price ) as period_electric_price,
            SUM(period_electric_price+period_service_price) as total_amount
        FROM
            t_charging_order_accounting_strategy
        <where>
            <if test="chargingOrderIds != null and chargingOrderIds.size() > 0">
                AND charging_order_id IN
                <foreach collection="chargingOrderIds" item="chargingOrderId" open="(" separator="," close=")">
                    #{chargingOrderId}
                </foreach>
            </if>
        </where>
        GROUP BY
            type
    </select>
    <select id="getDateData" resultType="java.util.Map">
        SELECT
            DATE_FORMAT( create_time, '%Y-%m-%d %H' ) as time,
    SUM(service_charge) as servicecharge,
    SUM(electrovalence) as electrovalence
        FROM
            t_charging_order
        <where>
            del_flag = 0 and recharge_payment_status = 2 and  ISNULL(refund_status) and DATE(create_time) = CURDATE()
            <if test="chargingOrderIds != null and chargingOrderIds.size() > 0">
                AND id IN
                <foreach collection="chargingOrderIds" item="chargingOrderId" open="(" separator="," close=")">
                    #{chargingOrderId}
                </foreach>
            </if>
        </where>
        GROUP BY
            time
        ORDER BY
            time
    </select>
    <select id="getWeekData" resultType="java.util.Map">
        SELECT
        DATE_FORMAT( create_time, '%Y-%m-%d' ) as time,
        SUM(service_charge) as servicecharge,
        SUM(electrovalence) as electrovalence
        FROM
        t_charging_order
        <where>
            del_flag = 0 and recharge_payment_status = 2 and  ISNULL(refund_status) and YEARWEEK(DATE_FORMAT(create_time, '%Y-%m-%d'), 1) = YEARWEEK(NOW(), 1)
            <if test="chargingOrderIds != null and chargingOrderIds.size() > 0">
                AND id IN
                <foreach collection="chargingOrderIds" item="chargingOrderId" open="(" separator="," close=")">
                    #{chargingOrderId}
                </foreach>
            </if>
        </where>
        GROUP BY
        time
        ORDER BY
        time
    </select>
    <select id="getMonthData" resultType="java.util.Map">
        SELECT
        DATE_FORMAT( create_time, '%Y-%m-%d' ) as time,
        SUM(service_charge) as servicecharge,
        SUM(electrovalence) as electrovalence
        FROM
        t_charging_order
        <where>
            del_flag = 0 and recharge_payment_status = 2 and  ISNULL(refund_status) and MONTH(create_time) = MONTH(NOW())  AND YEAR(create_time) = YEAR(NOW())
            <if test="chargingOrderIds != null and chargingOrderIds.size() > 0">
                AND id IN
                <foreach collection="chargingOrderIds" item="chargingOrderId" open="(" separator="," close=")">
                    #{chargingOrderId}
                </foreach>
            </if>
        </where>
        GROUP BY
        time
        ORDER BY
        time
    </select>
    <select id="getYearData" resultType="java.util.Map">
        SELECT
        DATE_FORMAT( create_time, '%Y-%m-%d' ) as time,
        SUM(service_charge) as servicecharge,
        SUM(electrovalence) as electrovalence
        FROM
        t_charging_order
        <where>
            del_flag = 0 and recharge_payment_status = 2 and  ISNULL(refund_status) and YEAR(createTime) = YEAR(NOW())
            <if test="chargingOrderIds != null and chargingOrderIds.size() > 0">
                AND id IN
                <foreach collection="chargingOrderIds" item="chargingOrderId" open="(" separator="," close=")">
                    #{chargingOrderId}
                </foreach>
            </if>
        </where>
        GROUP BY
        time
        ORDER BY
        time
    </select>
</mapper>
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TShoppingOrderMapper.xml
@@ -256,4 +256,40 @@
        and t1.payment_status = 2
        AND t1.del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()}
    </select>
    <select id="sixBefore" resultType="com.ruoyi.order.dto.SixShopDto">
        SELECT
            DATE_FORMAT( subquery.create_time, '%m' ) AS MONTH,
    count(1) AS orderNum,
    SUM(payment_amount) AS paymentAmount
        FROM
            (
            SELECT
            create_time,
            payment_amount
            FROM
            t_shopping_order
        <where>
            WHERE del_flag = 0 and payment_status = 2 and ISNULL(refund_status) and status!=4
            <if test="null != sixBefore">
                and DATE_FORMAT(create_time, '%Y-%m-%d') &gt;= DATE_FORMAT(#{sixBefore}, '%Y-%m-%d')
            </if>
            <if test="null != status">
                and status = #{status}
            </if>
        </where>
            ) AS subquery
        GROUP BY
            DATE_FORMAT( subquery.create_time, '%m' );
    </select>
    <select id="getSumAmount" resultType="java.math.BigDecimal">
        select sum(payment_amount)
        from t_shopping_order
        where del_flag = 0 and payment_status = 2 and ISNULL(refund_status) and status!=4
        <if test="null != sixBefore">
            and DATE_FORMAT(create_time, '%Y-%m-%d') &gt;= DATE_FORMAT(#{sixBefore}, '%Y-%m-%d')
        </if>
    </select>
</mapper>
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TVipOrderMapper.xml
@@ -46,5 +46,46 @@
        </if>
        AND t1.del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()}
    </select>
    <select id="sixBefore" resultType="com.ruoyi.order.dto.SixVipDto">
        SELECT
            DATE_FORMAT(subquery.create_time, '%Y-%m') AS MONTH,
    subquery.vip_id,
    COUNT(1) AS orderNum,
    SUM(subquery.payment_amount) AS paymentAmount
        FROM (
            SELECT
            vip_id,
            create_time,
            payment_amount
            FROM
            t_vip_order
        <where>
            del_flag = 0 AND
            payment_status = 2 AND
            refund_amount IS NULL
            <if test="sixBefore != null">
                AND create_time &gt; #{sixBefore}
            </if>
        </where>
            ) AS subquery
        GROUP BY
            DATE_FORMAT(subquery.create_time, '%Y-%m'),
            subquery.vip_id;
    </select>
    <select id="getSumAmout" resultType="java.math.BigDecimal">
        SELECT
            SUM(payment_amount) AS paymentAmount
        FROM
            t_vip_order
        WHERE
            del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()} AND
            payment_status = 2 AND
            refund_amount IS NULL
            <if test="sixBefore != null">
                AND create_time &gt; #{sixBefore}
            </if>
    </select>
</mapper>