From ce19680b98669f8b4e66b2ce82fe0dcebe178445 Mon Sep 17 00:00:00 2001 From: luodangjia <luodangjia> Date: 星期二, 10 九月 2024 09:46:16 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java | 376 ++++++ ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/UploadRealTimeMonitoringDataFallbackFactory.java | 7 ruoyi-service/ruoyi-payment/src/main/resources/cert/apiclient_cert.pem | 25 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java | 2 ruoyi-service/ruoyi-chargingPile/src/main/resources/template/运营商名称1-充电桩名称1-结算对账单明细-结算月份1.xlsx | 0 ruoyi-api/ruoyi-api-chargingPile/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports | 3 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java | 7 ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/VipClient.java | 4 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TParkingRecordServiceImpl.java | 39 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TParkingRecord.java | 24 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/OfflineParkingOrder.java | 91 + ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/server/ParkingOrderService.java | 134 ++ ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/CloudParkingOrder.java | 84 + ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserVipDetailController.java | 6 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TParkingRecordMapper.java | 21 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/UploadRealTimeMonitoringDataController.java | 20 ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TSettlementConfirmMapper.xml | 39 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderTimeVO.java | 2 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java | 23 ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml | 75 + ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/GiveVipUtil.java | 50 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java | 6 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/AccountVO.java | 85 + ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingBillVO.java | 2 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingBillServiceImpl.java | 4 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java | 2 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java | 18 ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java | 9 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TRepairMapper.java | 3 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TSettlementConfirm.java | 200 +++ ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/config/IotDAConfig.java | 6 ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java | 12 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java | 136 ++ ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/server/CouponService.java | 120 ++ ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ParkingLotClient.java | 10 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/GetCouponReq.java | 31 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/TParkingRecordPageInfoVO.java | 31 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/dto/SettlementConfirmAdd.java | 26 ruoyi-service/ruoyi-payment/src/main/resources/cert/apiclient_cert.p12 | 0 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/SiteClient.java | 11 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ParkingRecordFallbackFactory.java | 48 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/SiteFallbackFactory.java | 15 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/CloudParkingSpace.java | 35 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TSettlementConfirmServiceImpl.java | 34 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ParkingRecordClient.java | 54 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TRepairController.java | 3 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/SettlementListQuery.java | 25 ruoyi-service/ruoyi-chargingPile/src/main/resources/template/账户结算账单.xlsx | 0 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserCarFallbackFactory.java | 5 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/PartnerController.java | 7 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/controller/CouponController.java | 50 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/Parameter.java | 47 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TParkingRecordService.java | 10 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/UsedCoupon.java | 47 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java | 21 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java | 11 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingLotController.java | 14 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TSettlementConfirmService.java | 24 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/SiteMapper.java | 2 ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/UploadRealTimeMonitoringDataClient.java | 9 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/token/IotTokenUtil.java | 2 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/OfflineParkingResponse.java | 36 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ParkingLotFallbackFactory.java | 5 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/TChargingOrderExport.java | 159 ++ ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/query/ParkingRecordQuery.java | 26 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java | 23 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/SettlementTotalVO.java | 21 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/TParkingRecordVO.java | 23 ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TParkingRecordMapper.xml | 55 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TSettlementConfirmMapper.java | 33 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargingBillController.java | 20 ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserCarClient.java | 9 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserCarController.java | 18 ruoyi-service/ruoyi-payment/src/main/resources/cert/证书使用说明.txt | 18 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/OfflineParkingSpace.java | 39 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/GetChargingOrderByLicensePlate.java | 24 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/GetCouponResp.java | 43 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingRecordController.java | 122 ++ ruoyi-service/ruoyi-payment/src/main/resources/bootstrap.yml | 1 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/ChargingListQuery.java | 36 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/BaseResponse.java | 31 ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/GetParkingRecord.java | 19 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/AccountListVO.java | 31 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/controller/ParkingOrderController.java | 101 + ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java | 2 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/FinancialSettlementController.java | 148 + ruoyi-service/ruoyi-payment/src/main/resources/cert/apiclient_key.pem | 28 ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TParkingLotMapper.xml | 3 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/export/TParkingRecordExport.java | 41 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingBillListVO.java | 8 90 files changed, 3,208 insertions(+), 122 deletions(-) diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserCarFallbackFactory.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserCarFallbackFactory.java index 7c406e4..2a15a88 100644 --- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserCarFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserCarFallbackFactory.java @@ -31,6 +31,11 @@ public R<List<TAppUserCar>> getCarByIds(List<Long> carIds) { return R.fail("根据用户车辆id查询车辆信息失败:"+throwable.getMessage()); } + + @Override + public R<TAppUserCar> getAppUserCarByLicensePlate(String licensePlate) { + return R.fail("根据车牌号查询数据失败:" + throwable.getMessage()); + } }; } } diff --git a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserCarClient.java b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserCarClient.java index 27f3229..80a88a5 100644 --- a/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserCarClient.java +++ b/ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserCarClient.java @@ -28,4 +28,13 @@ */ @PostMapping(value = "/t-app-user-car/getCarByIds") public R<List<TAppUserCar>> getCarByIds(@RequestBody List<Long> carIds); + + + /** + * 根据车牌号查询数据 + * @param licensePlate + * @return + */ + @PostMapping(value = "/t-app-user-car/getAppUserCarByLicensePlate") + R<TAppUserCar> getAppUserCarByLicensePlate(@RequestParam("licensePlate") String licensePlate); } diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ParkingLotFallbackFactory.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ParkingLotFallbackFactory.java index d66b799..74e56bf 100644 --- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ParkingLotFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ParkingLotFallbackFactory.java @@ -44,6 +44,11 @@ public R<BigDecimal> getRecordAmount(LocalDate sixBefore) { return null; } + + @Override + public R<TParkingLot> getParkingLotByAppKey(String appKey) { + return R.fail("根据停车场标识查询失败:" + throwable.getMessage()); + } }; } } diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ParkingRecordFallbackFactory.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ParkingRecordFallbackFactory.java new file mode 100644 index 0000000..0bd9750 --- /dev/null +++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ParkingRecordFallbackFactory.java @@ -0,0 +1,48 @@ +package com.ruoyi.chargingPile.api.factory; + +import com.ruoyi.chargingPile.api.feignClient.ParkingRecordClient; +import com.ruoyi.chargingPile.api.model.TParkingRecord; +import com.ruoyi.chargingPile.api.vo.GetParkingRecord; +import com.ruoyi.common.core.domain.R; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + + +/** + * 停车场服务降级处理 + * + * @author ruoyi + */ +@Component +public class ParkingRecordFallbackFactory implements org.springframework.cloud.openfeign.FallbackFactory<ParkingRecordClient> +{ + private static final Logger log = LoggerFactory.getLogger(ParkingRecordFallbackFactory.class); + + @Override + public ParkingRecordClient create(Throwable throwable) { + log.error("停车记录调用失败:{}", throwable.getMessage()); + return new ParkingRecordClient() { + + + @Override + public R<TParkingRecord> getParkingRecord(GetParkingRecord query) { + return R.fail("根据车牌和状态查询停车数据失败:" + throwable.getMessage()); + } + + @Override + public void updateParkingRecord(TParkingRecord parkingRecord) { + + } + + @Override + public R<TParkingRecord> getParkingRecordById(Long id) { + return R.fail("根据id获取数失败:" + throwable.getMessage()); + } + + @Override + public void addParkingRecord(TParkingRecord parkingRecord) { + } + }; + } +} diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/SiteFallbackFactory.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/SiteFallbackFactory.java index b4cdc47..d33b267 100644 --- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/SiteFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/SiteFallbackFactory.java @@ -2,7 +2,9 @@ import com.ruoyi.chargingPile.api.dto.GetSiteListDTO; import com.ruoyi.chargingPile.api.feignClient.SiteClient; +import com.ruoyi.chargingPile.api.model.Partner; import com.ruoyi.chargingPile.api.model.Site; +import com.ruoyi.chargingPile.api.model.TChargingPile; import com.ruoyi.common.core.domain.R; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,7 +27,12 @@ public SiteClient create(Throwable throwable) { log.error("站点调用失败:{}", throwable.getMessage()); return new SiteClient() { - + + @Override + public R<List<TChargingPile>> getPileListBySiteId(Integer siteId) { + return R.fail("根据站点id 查询所有充电桩:" + throwable.getMessage()); + } + @Override public R<List<Site>> getSiteByIds(List<Integer> ids) { return R.fail("根据id集合获取站点数据调用失败:" + throwable.getMessage()); @@ -40,6 +47,12 @@ public R<List<GetSiteListDTO>> getSiteListByUserId(Long userId) { return null; } + + @Override + public R<Partner> getPartnerR(Integer id) { + return R.fail("根据合作商id获取合作商详情失败:" + throwable.getMessage()); + + } }; } } diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ParkingLotClient.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ParkingLotClient.java index bc3338a..fea8b39 100644 --- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ParkingLotClient.java +++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ParkingLotClient.java @@ -34,5 +34,13 @@ @PostMapping(value = "/t-parking-lot/getRecordAmount") public R<BigDecimal> getRecordAmount(@RequestParam("sixBefore") LocalDate sixBefore); - + + + /** + * 根据停车场标识查询停车场 + * @param appKey + * @return + */ + @PostMapping(value = "/t-parking-lot/getParkingLotByAppKey") + R<TParkingLot> getParkingLotByAppKey(@RequestParam("appKey") String appKey); } diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ParkingRecordClient.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ParkingRecordClient.java new file mode 100644 index 0000000..b86ad6d --- /dev/null +++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ParkingRecordClient.java @@ -0,0 +1,54 @@ +package com.ruoyi.chargingPile.api.feignClient; + +import com.ruoyi.chargingPile.api.factory.ParkingRecordFallbackFactory; +import com.ruoyi.chargingPile.api.model.TParkingRecord; +import com.ruoyi.chargingPile.api.vo.GetParkingRecord; +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.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * @author zhibing.pu + * @Date 2024/9/5 14:05 + */ +@FeignClient(contextId = "ParkingRecordClient", value = ServiceNameConstants.CHARGINGPILE_SERVICE, fallbackFactory = ParkingRecordFallbackFactory.class) +public interface ParkingRecordClient { + + + /** + * 根据车牌和状态查询停车数据 + * @param query + * @return + */ + @PostMapping("/t-parking-record/getParkingRecord") + R<TParkingRecord> getParkingRecord(@RequestBody GetParkingRecord query); + + + /** + * 修改停车数据 + * @param parkingRecord + */ + @PostMapping("/t-parking-record/updateParkingRecord") + void updateParkingRecord(@RequestBody TParkingRecord parkingRecord); + + + /** + * 根据id获取数据 + * @param id + * @return + */ + @PostMapping("/t-parking-record/getParkingRecordById") + R<TParkingRecord> getParkingRecordById(@RequestParam("id") Long id); + + + /** + * 添加数据 + * @param parkingRecord + */ + @PostMapping("/t-parking-record/addParkingRecord") + void addParkingRecord(@RequestBody TParkingRecord parkingRecord); + +} diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/SiteClient.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/SiteClient.java index a56392f..c311954 100644 --- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/SiteClient.java +++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/SiteClient.java @@ -2,14 +2,13 @@ import com.ruoyi.chargingPile.api.dto.GetSiteListDTO; import com.ruoyi.chargingPile.api.factory.SiteFallbackFactory; +import com.ruoyi.chargingPile.api.model.Partner; import com.ruoyi.chargingPile.api.model.Site; +import com.ruoyi.chargingPile.api.model.TChargingPile; 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 org.springframework.web.bind.annotation.*; import java.util.List; @@ -19,6 +18,8 @@ */ @FeignClient(contextId = "SiteClient", value = ServiceNameConstants.CHARGINGPILE_SERVICE, fallbackFactory = SiteFallbackFactory.class) public interface SiteClient { + @GetMapping("/site/getPileListBySiteId/{siteId}") + public R<List<TChargingPile>> getPileListBySiteId(@PathVariable("siteId")Integer siteId); /** * 根据id集合获取数据 @@ -37,4 +38,6 @@ @GetMapping("/site/getSiteList/byUserId") R<List<GetSiteListDTO>> getSiteListByUserId(@RequestParam("userId") Long userId); + @GetMapping("/getPartnerR/{id}") + R<Partner> getPartnerR(@PathVariable("id") Integer id); } diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TParkingRecord.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TParkingRecord.java index 889907b..cead23c 100644 --- a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TParkingRecord.java +++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TParkingRecord.java @@ -39,11 +39,13 @@ @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; @@ -87,6 +89,26 @@ @ApiModelProperty(value = "添加时间") @TableField("create_time") private LocalDateTime createTime; + + @ApiModelProperty(value = "超时占位费") + @TableField("timeout_amount") + private BigDecimal timeoutAmount; + + @ApiModelProperty(value = "电话") + @TableField("phone") + private String phone; + + @ApiModelProperty(value = "免费时长(分钟)") + @TableField("free_duration") + private Integer freeDuration; + + @ApiModelProperty(value = "免费金额") + @TableField("free_amount") + private BigDecimal freeAmount; + + @ApiModelProperty(value = "车场流水号") + @TableField("serialnumber") + private String serialnumber; } diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/query/ParkingRecordQuery.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/query/ParkingRecordQuery.java new file mode 100644 index 0000000..224a867 --- /dev/null +++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/query/ParkingRecordQuery.java @@ -0,0 +1,26 @@ +package com.ruoyi.chargingPile.api.query; + +import com.ruoyi.common.core.query.TimeRangePageQuery; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +@ApiModel(value = "停车缴费订单Query") +public class ParkingRecordQuery extends TimeRangePageQuery { + + @ApiModelProperty(value = "站点id") + private Integer siteId; + + @ApiModelProperty(value = "订单编号") + private String code; + + @ApiModelProperty(value = "车牌号") + private String licensePlate; + + @ApiModelProperty(value = "停车场id集合 前端忽略") + private List<Integer> lotIds; + +} diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/GetParkingRecord.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/GetParkingRecord.java new file mode 100644 index 0000000..40259a7 --- /dev/null +++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/GetParkingRecord.java @@ -0,0 +1,19 @@ +package com.ruoyi.chargingPile.api.vo; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2024/9/5 14:16 + */ +@Data +public class GetParkingRecord { + /** + * 车牌 + */ + private String licensePlate; + /** + * 状态(1=已进场,2=已出场,3=已缴费出场) + */ + private Integer status; +} diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/TParkingRecordPageInfoVO.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/TParkingRecordPageInfoVO.java new file mode 100644 index 0000000..e27db5c --- /dev/null +++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/TParkingRecordPageInfoVO.java @@ -0,0 +1,31 @@ +package com.ruoyi.chargingPile.api.vo; + +import com.ruoyi.common.core.web.page.PageInfo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel(value = "停车记录分页VO") +public class TParkingRecordPageInfoVO implements Serializable { + + @ApiModelProperty(value = "订单数") + private Integer orderCount; + + @ApiModelProperty(value = "超时占位费") + private BigDecimal timeoutAmountSum; + + @ApiModelProperty(value = "超时占用时长") + private Integer feeDurationSum; + + @ApiModelProperty(value = "总占用时长") + private Integer parkingDurationSum; + + @ApiModelProperty(value = "列表") + private PageInfo<TParkingRecordVO> parkingRecordVOS; + + +} diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/TParkingRecordVO.java b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/TParkingRecordVO.java new file mode 100644 index 0000000..623192c --- /dev/null +++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/TParkingRecordVO.java @@ -0,0 +1,23 @@ +package com.ruoyi.chargingPile.api.vo; + +import com.ruoyi.chargingPile.api.model.TParkingRecord; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@ApiModel(value = "停车记录VO") +public class TParkingRecordVO extends TParkingRecord { + + @ApiModelProperty(value = "停车费") + private BigDecimal parkingFee; + + @ApiModelProperty(value = "收费时长") + private Integer feeDuration; + + @ApiModelProperty(value = "站点名称") + private String siteName; + +} diff --git a/ruoyi-api/ruoyi-api-chargingPile/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/ruoyi-api/ruoyi-api-chargingPile/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 5e160da..440d517 100644 --- a/ruoyi-api/ruoyi-api-chargingPile/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/ruoyi-api/ruoyi-api-chargingPile/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -3,4 +3,5 @@ com.ruoyi.chargingPile.api.factory.ParkingLotFallbackFactory com.ruoyi.chargingPile.api.factory.ChargingGunFallbackFactory com.ruoyi.chargingPile.api.factory.AccountingStrategyDetailFallbackFactory -com.ruoyi.chargingPile.api.factory.AccountingStrategyFallbackFactory \ No newline at end of file +com.ruoyi.chargingPile.api.factory.AccountingStrategyFallbackFactory +com.ruoyi.chargingPile.api.factory.ParkingRecordFallbackFactory \ No newline at end of file diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/UploadRealTimeMonitoringDataFallbackFactory.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/UploadRealTimeMonitoringDataFallbackFactory.java index 2586a69..d39a68e 100644 --- a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/UploadRealTimeMonitoringDataFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/UploadRealTimeMonitoringDataFallbackFactory.java @@ -31,7 +31,12 @@ public R<UploadRealTimeMonitoringData> chargingOrderInfo(String orderId) { return R.fail("查询充电桩实时监测数据失败:" + throwable.getMessage()); } - + + @Override + public R<List<UploadRealTimeMonitoringData>> getOrderInfoByCodes(String orderId) { + return R.fail("根据订单编号s获取所有监测数据失败:" + throwable.getMessage()); + } + @Override public R<List<UploadRealTimeMonitoringData>> getDataByOrderCode(String code) { return R.fail("根据订单编号获取所有监测数据失败:" + throwable.getMessage()); diff --git a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/UploadRealTimeMonitoringDataClient.java b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/UploadRealTimeMonitoringDataClient.java index 902dff5..5ceab1f 100644 --- a/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/UploadRealTimeMonitoringDataClient.java +++ b/ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/UploadRealTimeMonitoringDataClient.java @@ -25,7 +25,14 @@ */ @PostMapping("/uploadRealTimeMonitoringData/getOrderInfoByCode") R<UploadRealTimeMonitoringData> chargingOrderInfo(String orderId); - + + /** + * 批量查询 + * @param orderId + * @return + */ + @PostMapping(value = "/uploadRealTimeMonitoringData/getOrderInfoByCodes") + public R<List<UploadRealTimeMonitoringData>> getOrderInfoByCodes(@RequestParam("orderId") String orderId); /** * 根据订单编号获取所有监测数据 * @param code diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/dto/SettlementConfirmAdd.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/dto/SettlementConfirmAdd.java new file mode 100644 index 0000000..fe67ee4 --- /dev/null +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/dto/SettlementConfirmAdd.java @@ -0,0 +1,26 @@ +package com.ruoyi.order.api.dto; + +import com.ruoyi.common.core.web.page.BasePage; +import com.ruoyi.order.api.model.TSettlementConfirm; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +@ApiModel(value = "SettlementConfirmAdd生成结算确认表对象",description = "管理后台-财务结算生成结算确认表对象") +public class SettlementConfirmAdd { + @ApiModelProperty(value = "站点id") + private Integer siteId; + @ApiModelProperty(value = "费用归属日期类型 1开始 2结束") + private Integer type; + @ApiModelProperty(value = "开始时间2020-01-01 00:00:00") + private String startTime; + @ApiModelProperty(value = "结束时间2020-01-01 23:59:59") + private String endTime; + @ApiModelProperty(value = "点击去生成 传1 填完表格数据点击保存 传2") + private Integer state; + @ApiModelProperty(value = "保存的数据") + private TSettlementConfirm data; +} diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java index e713d31..960f451 100644 --- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java @@ -6,9 +6,12 @@ import com.ruoyi.order.api.feignClient.ChargingOrderClient; import com.ruoyi.order.api.model.ChargingListQuery; import com.ruoyi.order.api.model.TChargingOrder; +import com.ruoyi.order.api.model.TSettlementConfirm; import com.ruoyi.order.api.query.TChargingCountQuery; import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery; import com.ruoyi.order.api.vo.ChargingBillVO; +import com.ruoyi.order.api.vo.GetChargingOrderByLicensePlate; +import com.ruoyi.order.api.vo.SettlementTotalVO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; @@ -90,6 +93,21 @@ public void excelEndCharge(String code) { } + + @Override + public R<TChargingOrder> getChargingOrderByLicensePlate(GetChargingOrderByLicensePlate query) { + return R.fail("根据车牌号和时间查询有效的充电数据失败:" + throwable.getMessage()); + } + + @Override + public R<TSettlementConfirm> downloadSettlement(String uid) { + return R.fail("通过id查询结算确认失败:" + throwable.getMessage()); + } + + @Override + public R<SettlementTotalVO> settlementTotalR(String time) { + return R.fail("查询结算汇总表导出列表失败:" + throwable.getMessage()); + } }; } } diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java index 35c5873..61b14b5 100644 --- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java @@ -3,9 +3,11 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.dto.ExchangeDto; import com.ruoyi.order.api.feignClient.OrderClient; +import com.ruoyi.order.api.model.ChargingListQuery; import com.ruoyi.order.api.model.TShoppingOrder; import com.ruoyi.order.api.model.TVipOrder; import com.ruoyi.order.api.query.TActivityStatisticsQuery; +import com.ruoyi.order.api.vo.AccountListVO; import com.ruoyi.order.api.vo.TActivityVO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -73,6 +75,11 @@ return R.fail("查询活动费用统计失败:" + cause.getMessage()); } + @Override + public R<AccountListVO> accountBillList(ChargingListQuery dto) { + return R.fail("账户结算账单导出失败:" + cause.getMessage()); + } + }; } diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java index 225e498..80529c0 100644 --- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java @@ -7,10 +7,13 @@ import com.ruoyi.order.api.factory.ChargingOrderFallbackFactory; import com.ruoyi.order.api.model.ChargingListQuery; import com.ruoyi.order.api.model.TChargingOrder; +import com.ruoyi.order.api.model.TSettlementConfirm; import com.ruoyi.order.api.query.TChargingCountQuery; import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery; import com.ruoyi.order.api.vo.ChargingBillVO; +import com.ruoyi.order.api.vo.SettlementTotalVO; import io.swagger.annotations.ApiOperation; +import com.ruoyi.order.api.vo.GetChargingOrderByLicensePlate; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; @@ -95,4 +98,24 @@ */ @PostMapping("/t-charging-order/excelEndCharge") void excelEndCharge(@RequestParam("code") String code); + + + /** + * 根据车牌号和时间查询有效的充电数据 + * @param query + * @return + */ + @PostMapping("/t-charging-order/getChargingOrderByLicensePlate") + R<TChargingOrder> getChargingOrderByLicensePlate(@RequestBody GetChargingOrderByLicensePlate query); + + /** + * 获取充电结算记录 + * @param uid + * @return + */ + @GetMapping(value = "/financial/settlement/downloadSettlement/{uid}") + public R<TSettlementConfirm> downloadSettlement(@PathVariable("uid") String uid); + + @GetMapping(value = "/financial/settlement/settlementTotalR") + public R<SettlementTotalVO> settlementTotalR(String time); } diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java index c0f9cd8..c49e25f 100644 --- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/OrderClient.java @@ -4,10 +4,13 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.dto.ExchangeDto; import com.ruoyi.order.api.factory.OrderFallbackFactory; +import com.ruoyi.order.api.model.ChargingListQuery; import com.ruoyi.order.api.model.TShoppingOrder; import com.ruoyi.order.api.model.TVipOrder; import com.ruoyi.order.api.query.TActivityStatisticsQuery; +import com.ruoyi.order.api.vo.AccountListVO; import com.ruoyi.order.api.vo.TActivityVO; +import io.swagger.annotations.ApiOperation; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; @@ -50,5 +53,8 @@ */ @PostMapping(value = "/t-exchange-order/activityStatistics") public R<TActivityVO> activityStatistics(@RequestBody TActivityStatisticsQuery dto); + @PostMapping(value = "/chargingBill/accountBillList") + @ApiOperation(value = "列表查询", tags = {"管理后台-账户结算账单"}) + R<AccountListVO> accountBillList(@RequestBody ChargingListQuery dto); } diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/ChargingListQuery.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/ChargingListQuery.java index 10e711c..4b32bce 100644 --- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/ChargingListQuery.java +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/ChargingListQuery.java @@ -9,14 +9,38 @@ import java.util.List; @Data -@ApiModel(value = "充电账单列表查询参数") +@ApiModel("充电时段统计DTO") public class ChargingListQuery extends BasePage { - @ApiModelProperty("订单分类 1全站 2各个站点") - private String type; - @ApiModelProperty("账单周期2020-01-01 00:00:00 - 2020-01-01 23:59:59") - private String startTime; - @ApiModelProperty("1已出账 2未出账") + @ApiModelProperty("订单编号") + private String code; + + @ApiModelProperty("电站id") + private Integer siteId; + @ApiModelProperty("状态(0=未知,1=等待中,2=启动中,3=充电中,4=停止中,5=已结束)") + private Integer status; + @ApiModelProperty("订单分类(1全站 2各个站点)") + private Integer type; + @ApiModelProperty("状态(1未出账 2已出账)") private Integer state; @ApiModelProperty("uid 前端忽略") private String uid; + + @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; + } diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TSettlementConfirm.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TSettlementConfirm.java new file mode 100644 index 0000000..796d4a9 --- /dev/null +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TSettlementConfirm.java @@ -0,0 +1,200 @@ +package com.ruoyi.order.api.model; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.web.domain.BasePojo; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * <p> + * + * </p> + * + * @author xiaochen + * @since 2024-08-07 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("t_settlement confirm") +@ApiModel(value="TSettlementConfirm对象", description="") +public class TSettlementConfirm extends BasePojo { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "站点id") + @TableField("site_id") + private Integer siteId; + @ApiModelProperty(value = "合作商id") + @TableField("partner_id") + private Integer partnerId; + @ApiModelProperty(value = "结算电费备注") + @TableField("remark") + private String remark; + @ApiModelProperty(value = "结算服务费备注") + @TableField("service_remark") + private String serviceRemark; + + @ApiModelProperty(value = "计量电量(电量合计)") + @TableField("metering_electronic") + private BigDecimal meteringElectronic; + @ApiModelProperty(value = "充电电量") + @TableField("charging_electronic") + private BigDecimal chargingElectronic; + @ApiModelProperty(value = "电损电量") + @TableField("loss_electronic") + private BigDecimal lossElectronic; + @ApiModelProperty(value = "收入合计") + @TableField("收入合计") + private BigDecimal income; + + @ApiModelProperty(value = "场地费") + @TableField("venue") + private BigDecimal venue; + @ApiModelProperty(value = "计量电费") + @TableField("metering") + private BigDecimal metering; + @ApiModelProperty(value = "清洁费") + @TableField("clean") + private BigDecimal clean; + @ApiModelProperty(value = "日常维护费") + @TableField("maintain") + private BigDecimal maintain; + @ApiModelProperty(value = "成本") + @TableField("cost") + private BigDecimal cost; + @ApiModelProperty(value = "合计可分配金额") + @TableField("distribution") + private BigDecimal distribution; + @ApiModelProperty(value = "利润") + @TableField("profit_money") + private BigDecimal profitMoney; + @ApiModelProperty(value = "新能源利润") + @TableField("new_money") + private BigDecimal newMoney; + @ApiModelProperty(value = "新能源结算金额") + @TableField("new_Settlement") + private BigDecimal newSettlement; + + @ApiModelProperty(value = "供电局结算电费") + @TableField("supply_electronic") + private BigDecimal supplyElectronic; + @ApiModelProperty(value = "合作商承担电损占比") + @TableField("proportion_partner") + private BigDecimal proportionPartner; + @ApiModelProperty(value = "承担金额") + @TableField("proportion_money") + private BigDecimal proportionMoney; + @ApiModelProperty(value = "本期结算电费总金额 (实际电费转账)") + @TableField("total_electronic") + private BigDecimal totalElectronic; + @ApiModelProperty(value = "本期结算服务费总金额(实际服务费转账)") + @TableField("total_service") + private BigDecimal totalService; + @ApiModelProperty(value = "合作商充电服务费根据合同约定分成比例") + @TableField("service_partner") + private BigDecimal servicePartner; + @ApiModelProperty(value = "合作商充电服务费根据合同约定分成金额") + @TableField("service_money") + private BigDecimal serviceMoney; + + @ApiModelProperty(value = "三方收费(合计三方平台收费)") + @TableField("sharing_amount") + private BigDecimal sharingAmount; + @ApiModelProperty(value = " 交易手续费 三方收费*0.06%") + @TableField("commission_amount") + private BigDecimal commissionAmount; + @ApiModelProperty(value = "充电电费计费(平台合计电费)") + @TableField("electrovalence") + private BigDecimal electrovalence; + @ApiModelProperty(value = "充电服务费计费(实收服务费)") + @TableField("service_charge") + private BigDecimal serviceCharge; + @ApiModelProperty(value = "交易手续费计费") + @TableField("order_commission") + private BigDecimal orderCommission; + @ApiModelProperty(value = "会员抵扣") + @TableField("vip_discount") + private BigDecimal vipDiscount; + @ApiModelProperty(value = "优惠券抵扣") + @TableField("coupon_discount") + private BigDecimal couponDiscount; + + + + + + + + + + + + + + + + + + + + + + + + + + + @ApiModelProperty(value = "类型(1=开始,2=结束)") + @TableField("type") + private Integer type; + @ApiModelProperty(value = "开始时间") + @TableField("start_time") + private LocalDateTime startTime; + @ApiModelProperty(value = "结束时间") + @TableField("end_time") + private LocalDateTime endTime; + @ApiModelProperty(value = "站点名称") + @TableField(exist = false) + private String siteName; + @ApiModelProperty(value = "合作商名称") + @TableField(exist = false) + private String partnerName; + + @ApiModelProperty(value = "uid") + @TableField(exist = false) + private String uid; + + @ApiModelProperty(value = "结账日期 2024年09月06日17:10:06至2024年09月06日17:10:06") + @TableField(exist = false) + private String time; + @ApiModelProperty(value = "充电记录明细") + @TableField(exist = false) + private List<TChargingOrder> list; + @ApiModelProperty(value = "收入合计涨幅/跌幅 正数为涨幅负数为跌幅 字段为空 说明没有上月记录 不展示涨幅跌幅") + @TableField(exist = false) + private String incomePercentage; + @ApiModelProperty(value = "总利润涨幅/跌幅 正数为涨幅负数为跌幅 字段为空 说明没有上月记录 不展示涨幅跌幅") + @TableField(exist = false) + private String totalPercentage; + @ApiModelProperty(value = "利用率") + @TableField(exist = false) + private String rate; + @ApiModelProperty(value = "参与电力市场交易退补电费") + @TableField(exist = false) + private Integer electronicRefund; + +} diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/SettlementListQuery.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/SettlementListQuery.java new file mode 100644 index 0000000..7117147 --- /dev/null +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/SettlementListQuery.java @@ -0,0 +1,25 @@ +package com.ruoyi.order.api.query; + +import com.ruoyi.common.core.web.page.BasePage; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.List; + +@Data +@ApiModel(value = "SettlementListQuery结算表记录列表查询对象",description = "管理后台-财务结算-结算表记录列表查询对") +public class SettlementListQuery extends BasePage { + + @ApiModelProperty(value = "类型(1=开始,2=结束)") + private Integer type; + @ApiModelProperty(value = "站点ids 选择全部 不传") + private List<Integer> siteIds; + @ApiModelProperty(value = "合作商id ") + private Integer partnerId; + @ApiModelProperty(value = "开始时间2020-01-01 00:00:00") + private String startTime; + @ApiModelProperty(value = "结束时间2021-01-01 23:59:59") + private String endTime; + +} diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/AccountListVO.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/AccountListVO.java new file mode 100644 index 0000000..f2ea33c --- /dev/null +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/AccountListVO.java @@ -0,0 +1,31 @@ +package com.ruoyi.order.api.vo; + +import com.ruoyi.common.core.web.page.PageInfo; +import com.ruoyi.order.api.model.TChargingBill; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.List; + +@Data +@ApiModel(value = "ChargingBillListVO对象",description = "充电算帐单列表VO") +public class AccountListVO{ + @ApiModelProperty(value = "账单数量") + private Integer billCount; + @ApiModelProperty(value = "总入账金额") + private BigDecimal totalAmount; + @ApiModelProperty(value = "总支付结算金额") + private BigDecimal paymentAmount; + @ApiModelProperty(value = "总退款结算金额") + private BigDecimal refundAmount; + @ApiModelProperty(value = "平台手续费") + private BigDecimal commissionAmount; + @ApiModelProperty(value = "分佣") + private BigDecimal sharingAmount; + @ApiModelProperty(value = "列表数据") + private PageInfo<ChargingBillListVO> list; + +} diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/AccountVO.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/AccountVO.java new file mode 100644 index 0000000..c03dc79 --- /dev/null +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/AccountVO.java @@ -0,0 +1,85 @@ +package com.ruoyi.order.api.vo; + +import com.ruoyi.common.core.web.page.PageInfo; +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.util.List; + +@Data +@ApiModel(value = "ChargingBillVO对象",description = "充电算帐单") +public class AccountVO { + @ApiModelProperty(value = "账单编号") + private String code; + @ApiModelProperty(value = "账户类型") + private String accountType; + @ApiModelProperty(value = "账单类型") + private String orderType; + @ApiModelProperty(value = "账单分类") + private String type; +// @ApiModelProperty(value = "账单周期") +// private String accountType; +// @ApiModelProperty(value = "站点名称") +// private String accountType; +// @ApiModelProperty(value = "账户类型") +// private String accountType; +// @ApiModelProperty(value = "账户类型") +// private String accountType; +// @ApiModelProperty(value = "账户类型") +// private String accountType; +// @ApiModelProperty(value = "账户类型") +// private String accountType; +// @ApiModelProperty(value = "账户类型") +// private String accountType; +// @ApiModelProperty(value = "账户类型") +// private String accountType; +// @ApiModelProperty(value = "账户类型") +// private String accountType; +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// @ApiModelProperty(value = "订单总金额") +// private BigDecimal orderAmount; +// @ApiModelProperty(value = "累计电费") +// private BigDecimal electrovalence; +// @ApiModelProperty(value = "累计服务费") +// private BigDecimal serviceCharge; +// @ApiModelProperty(value = "订单数量") +// private Integer orderCount; +// @ApiModelProperty(value = "平台手续费") +// private BigDecimal commissionAmount; +// @ApiModelProperty(value = "三方平台分佣") +// private BigDecimal sharingAmount; +// @ApiModelProperty(value = "优惠抵扣") +// private BigDecimal discount; +// @ApiModelProperty(value = "账单分类 1全站 2各个站点 前端忽略") +// private String category; +// @ApiModelProperty(value = "账单类型 月结 前端忽略") +// private String type; +// @ApiModelProperty(value = "站点名称 前端忽略") +// private String siteName; +// @ApiModelProperty(value = "账单周期 前端忽略") +// private String billWeek; +// @ApiModelProperty(value = "账单生成日期 前端忽略") +// private String createTime; +// @ApiModelProperty(value = "账单编号 前端忽略") +// private String code; +// @ApiModelProperty(value = "充电时长 前端忽略") +// private String chargingTime; + +} diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingBillListVO.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingBillListVO.java index 47c25c5..78139c6 100644 --- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingBillListVO.java +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingBillListVO.java @@ -20,8 +20,12 @@ private Integer orderCount; @ApiModelProperty(value = "站点名称") private String siteName; - @ApiModelProperty(value = "实收金额") + @ApiModelProperty(value = "实收金额(支付结算金额)") private BigDecimal paymentAmount; + @ApiModelProperty(value = "退款结算金额") + private BigDecimal refundAmount; + @ApiModelProperty(value = "平台分佣") + private BigDecimal sharingAmount; @ApiModelProperty(value = "总金额") private BigDecimal orderAmount; @ApiModelProperty(value = "累计电费") @@ -30,8 +34,6 @@ private BigDecimal serviceCharge; @ApiModelProperty(value = "平台手续费") private BigDecimal commissionAmount; - @ApiModelProperty(value = "平台分佣") - private BigDecimal sharingAmount; @ApiModelProperty(value = "充电电流 度") private BigDecimal chargingCapacity; } diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingBillVO.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingBillVO.java index 9ea35ee..2000729 100644 --- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingBillVO.java +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingBillVO.java @@ -18,6 +18,8 @@ private BigDecimal paymentAmount; @ApiModelProperty(value = "订单总金额") private BigDecimal orderAmount; + @ApiModelProperty(value = "总退款金额") + private BigDecimal refundAmount; @ApiModelProperty(value = "累计电费") private BigDecimal electrovalence; @ApiModelProperty(value = "累计服务费") diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderTimeVO.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderTimeVO.java index eef3f64..02a5021 100644 --- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderTimeVO.java +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderTimeVO.java @@ -31,4 +31,6 @@ private String electronicProportion; @ApiModelProperty(value = "列表数据") private PageInfo<ChargingOrderListVO> list; + @ApiModelProperty(value = "导出列表数据") + private List<ChargingOrderListVO> exportList; } diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/GetChargingOrderByLicensePlate.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/GetChargingOrderByLicensePlate.java new file mode 100644 index 0000000..eeb0421 --- /dev/null +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/GetChargingOrderByLicensePlate.java @@ -0,0 +1,24 @@ +package com.ruoyi.order.api.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author zhibing.pu + * @Date 2024/9/5 14:25 + */ +@Data +public class GetChargingOrderByLicensePlate { + /** + * 车牌 + */ + private String licensePlate; + /** + * 开始时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime startTime; + +} diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/SettlementTotalVO.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/SettlementTotalVO.java new file mode 100644 index 0000000..bbe3edf --- /dev/null +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/SettlementTotalVO.java @@ -0,0 +1,21 @@ +package com.ruoyi.order.api.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.order.api.model.TChargingOrderAccountingStrategy; +import com.ruoyi.order.api.model.TSettlementConfirm; +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 = "SettlementTotalVO对象",description = "结算汇总表列表VO") +public class SettlementTotalVO { + @ApiModelProperty(value = "列表数据") + List<TSettlementConfirm> list1; + @ApiModelProperty(value = "合计数据") + List<TSettlementConfirm> list2; +} diff --git a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/VipClient.java b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/VipClient.java index 2082451..e958ad7 100644 --- a/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/VipClient.java +++ b/ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/VipClient.java @@ -33,7 +33,9 @@ * @return */ @PostMapping("/vip/getInfo1") - public R<TVip> getInfo1(@RequestParam("id") Integer id); + R<TVip> getInfo1(@RequestParam("id") Integer id); + + @PostMapping(value = "/vip/getInfo") R<TVip> getInfo(@RequestParam("id") Integer id); diff --git a/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java index 77abd3e..1cc1d79 100644 --- a/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java +++ b/ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java @@ -9,6 +9,7 @@ import io.seata.spring.annotation.GlobalTransactional; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import com.ruoyi.auth.form.LoginBody; import com.ruoyi.auth.form.RegisterBody; @@ -48,11 +49,11 @@ HashMap<String, Object> map = new HashMap<>(); map.put("token", tokenService.createToken(userInfo)); List<SysRole> roles = userInfo.getSysUser().getRoles(); -// if(CollectionUtils.isEmpty(roles)){ -// return R.fail("请关联角色!"); -// } + if(CollectionUtils.isEmpty(roles)){ + return R.fail("请关联角色!"); + } -// map.put("roleName",roles.get(0).getRoleName()); + map.put("roleName",roles.get(0).getRoleName()); map.put("info", userInfo); // 修改用户最后登录时间 SysUser sysUser = new SysUser(); diff --git a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java index 4cce577..d748b39 100644 --- a/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java +++ b/ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java @@ -94,7 +94,7 @@ public LoginUserApplet getLoginUserApplet() { LoginUserApplet loginUserAppletToken = getLoginUserAppletToken(ServletUtils.getRequest()); if (loginUserAppletToken == null) { - throw new UserAppletException("登录失效,请重新登录!", 401); + throw new RuntimeException("令牌已过期,请重新登录!"); } return loginUserAppletToken; } @@ -130,7 +130,11 @@ * @return 用户信息 */ public LoginUser getLoginUser() { - return getLoginUser(ServletUtils.getRequest()); + LoginUser loginUser = getLoginUser(ServletUtils.getRequest()); + if (loginUser == null) { + throw new RuntimeException("令牌已过期,请重新登录!"); + } + return loginUser; } /** @@ -209,10 +213,10 @@ public void refreshToken1(LoginUserApplet dto) { dto.setLoginTime(System.currentTimeMillis()); - dto.setExpireTime(dto.getLoginTime() + expireTime * MILLIS_MINUTE); + dto.setExpireTime(dto.getLoginTime() + expireAppletTime * MILLIS_MINUTE); // 根据uuid将loginUser缓存 String userKey = getTokenKey(dto.getToken()); - redisService.setCacheObject(userKey, dto, expireTime, TimeUnit.MINUTES); + redisService.setCacheObject(userKey, dto, expireAppletTime, TimeUnit.MINUTES); } private String getTokenKey(String token) { diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserCarController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserCarController.java index d438eb7..dda013b 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserCarController.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserCarController.java @@ -1,15 +1,13 @@ package com.ruoyi.account.controller; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.account.api.model.TAppUserCar; import com.ruoyi.account.service.TAppUserCarService; import com.ruoyi.common.core.domain.R; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -37,6 +35,18 @@ public R<List<TAppUserCar>> getCarByIds(@RequestBody List<Long> carIds){ return R.ok(appUserCarService.list(Wrappers.lambdaQuery(TAppUserCar.class).in(TAppUserCar::getId,carIds))); } + + + /** + * 根据车牌号查询数据 + * @param licensePlate + * @return + */ + @PostMapping(value = "/t-app-user-car/getAppUserCarByLicensePlate") + public R<TAppUserCar> getAppUserCarByLicensePlate(@RequestParam("licensePlate") String licensePlate){ + TAppUserCar one = appUserCarService.getOne(new LambdaQueryWrapper<TAppUserCar>().eq(TAppUserCar::getLicensePlate, licensePlate).eq(TAppUserCar::getDelFlag, 0)); + return R.ok(one); + } } diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserVipDetailController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserVipDetailController.java index 690629f..47aab16 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserVipDetailController.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserVipDetailController.java @@ -51,8 +51,10 @@ List<TAppUserVipDetail> list = appUserVipDetailService.lambdaQuery().eq(TAppUserVipDetail::getAppUserId, userId).last(" and now() between start_time and end_time order by start_time desc").list(); for (TAppUserVipDetail tAppUserVipDetail : list) { - TVip data = vipClient.getInfo1(tAppUserVipDetail.getVipId()).getData(); - tAppUserVipDetail.setVipName(data.getName()); + if(null != tAppUserVipDetail.getVipId()){ + TVip data = vipClient.getInfo1(tAppUserVipDetail.getVipId()).getData(); + tAppUserVipDetail.setVipName(data.getName()); + } } return R.ok(list); } diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/GiveVipUtil.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/GiveVipUtil.java index e5fdd18..ef92923 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/GiveVipUtil.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/GiveVipUtil.java @@ -17,6 +17,7 @@ import javax.annotation.Resource; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; @Component @@ -44,7 +45,10 @@ R<TVip> info = vipClient.getInfo1(vipId); TVip vip = info.getData(); - List<SendCouponDto> javaList = JSON.parseArray(vip.getCoupon()).toJavaList(SendCouponDto.class); + List<SendCouponDto> javaList = new ArrayList<>(); + if (vip.getCoupon()!=null) { + javaList = JSON.parseArray(vip.getCoupon()).toJavaList(SendCouponDto.class); + } tAppUserVipDetail.setCouponIds(vip.getCoupon()); tAppUserVipDetail.setSendChargeNum(vip.getDiscountTimes()); @@ -80,16 +84,42 @@ }else { nowUser.setVipEndTime(nowUser.getVipEndTime().plusDays(plusDay).minusDays(1)); //获取detail里结束时间大于当前时间的数据,并将enttime延长 - TAppUserVipDetail tAppUserVipDetail = tAppUserVipDetailService.lambdaQuery().eq(TAppUserVipDetail::getAppUserId, nowUser.getId()).orderByDesc(TAppUserVipDetail::getEndTime).last("limit 1").one(); + TAppUserVipDetail tAppUserVipDetail = tAppUserVipDetailService.lambdaQuery().eq(TAppUserVipDetail::getVipId,vipId).eq(TAppUserVipDetail::getAppUserId, nowUser.getId()).orderByDesc(TAppUserVipDetail::getEndTime).last("limit 1").one(); + if (tAppUserVipDetail!=null) { + List<TAppUserVipDetail> list = tAppUserVipDetailService.lambdaQuery().eq(TAppUserVipDetail::getAppUserId, nowUser.getId()).ge(TAppUserVipDetail::getStartTime, tAppUserVipDetail.getEndTime()).list(); + for (TAppUserVipDetail appUserVipDetail : list) { + appUserVipDetail.setStartTime(appUserVipDetail.getStartTime().plusMonths(plusDay).minusDays(1)); + appUserVipDetail.setEndTime(appUserVipDetail.getEndTime().plusMonths(plusDay).minusDays(1)); + } + tAppUserVipDetailService.updateBatchById(list); + tAppUserVipDetail.setEndTime(tAppUserVipDetail.getEndTime().plusMonths(plusDay).minusDays(1)); -// TAppUserVipDetail newAppUser = new TAppUserVipDetail(); -// newAppUser.setAppUserId(nowUser.getId()); -// newAppUser.setStartTime(tAppUserVipDetail.getEndTime()); - tAppUserVipDetail.setEndTime(tAppUserVipDetail.getEndTime().plusMonths(plusDay).minusDays(1)); -// newAppUser.setVipId(vipId); - tAppUserVipDetailService.updateById(tAppUserVipDetail); -// tAppUserVipDetail.setEndTime(tAppUserVipDetail.getEndTime().plusDays(plusDay)); -// tAppUserVipDetailService.updateById(tAppUserVipDetail); + tAppUserVipDetailService.updateById(tAppUserVipDetail); + }else { + TAppUserVipDetail tAppUserVipDetail2 = tAppUserVipDetailService.lambdaQuery().eq(TAppUserVipDetail::getAppUserId, nowUser.getId()).orderByDesc(TAppUserVipDetail::getEndTime).last("limit 1").one(); + + TAppUserVipDetail tAppUserVipDetail1 = new TAppUserVipDetail(); + tAppUserVipDetail1.setAppUserId(nowUser.getId()); + tAppUserVipDetail1.setStartTime(tAppUserVipDetail2.getEndTime()); + tAppUserVipDetail1.setEndTime(tAppUserVipDetail2.getEndTime().plusMonths(plusDay).minusDays(1)); + tAppUserVipDetail1.setVipId(vipId); + + R<TVip> info = vipClient.getInfo1(vipId); + TVip vip = info.getData(); + List<SendCouponDto> javaList = new ArrayList<>(); + if (vip.getCoupon()!=null) { + javaList = JSON.parseArray(vip.getCoupon()).toJavaList(SendCouponDto.class); + } + + tAppUserVipDetail1.setCouponIds(vip.getCoupon()); + tAppUserVipDetail1.setSendChargeNum(vip.getDiscountTimes()); + tAppUserVipDetail1.setChargeNum(vip.getDiscountTimes()); + tAppUserVipDetail1.setDiscountMoney(vip.getMaximumDeduction()); + tAppUserVipDetail1.setSendMonth(1); + tAppUserVipDetailService.save(tAppUserVipDetail1); + + } + } } diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/PartnerController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/PartnerController.java index 3c71cd9..7f3c920 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/PartnerController.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/PartnerController.java @@ -9,6 +9,7 @@ import com.ruoyi.chargingPile.api.query.SetPermissionConfiguration; import com.ruoyi.chargingPile.dto.ResetPassword; import com.ruoyi.chargingPile.service.IPartnerService; +import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.security.utils.SecurityUtils; @@ -68,6 +69,12 @@ Partner partner = partnerService.getPartner(id); return AjaxResult.success(partner); } + @ResponseBody + @GetMapping("/getPartnerR/{id}") + public R<Partner> getPartnerR(@PathVariable("id") Integer id){ + Partner partner = partnerService.getPartner(id); + return R.ok(partner); + } diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java index 1db4d7c..fc48e33 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/SiteController.java @@ -82,6 +82,17 @@ @Resource private ChargingOrderClient chargingOrderClient; + + /** + * 根据站点id 查询所有充电桩 + * @param siteId + * @return + */ + @GetMapping("/getPileListBySiteId/{siteId}") + public R<List<TChargingPile>> getPileListBySiteId(@PathVariable("siteId")Integer siteId){ + + return R.ok(chargingPileService.lambdaQuery().eq(TChargingPile::getSiteId, siteId).list()); + } /** * 小程序扫一扫 * @param number diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java index ca22e94..98956eb 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TApplyChargingPileController.java @@ -1,7 +1,16 @@ package com.ruoyi.chargingPile.controller; +import java.time.LocalDateTime; import java.math.BigDecimal; + +import com.ruoyi.chargingPile.api.feignClient.SiteClient; +import com.ruoyi.chargingPile.api.model.Partner; +import com.ruoyi.chargingPile.api.model.Site; +import com.ruoyi.common.core.utils.WebUtils; import com.ruoyi.common.core.web.page.PageInfo; +import com.ruoyi.order.api.feignClient.OrderClient; import com.ruoyi.order.api.model.TChargingOrder; +import com.ruoyi.order.api.model.TSettlementConfirm; +import com.ruoyi.order.api.vo.AccountListVO; import com.ruoyi.order.api.vo.ChargingBillListVO; @@ -35,6 +44,7 @@ import com.ruoyi.order.api.feignClient.ChargingOrderClient; import com.ruoyi.order.api.model.ChargingListQuery; import com.ruoyi.order.api.vo.ChargingBillVO; +import com.ruoyi.order.api.vo.SettlementTotalVO; import io.swagger.annotations.ApiOperation; import org.apache.commons.codec.CharEncoding; import org.springframework.beans.BeanUtils; @@ -50,6 +60,8 @@ import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedList; import java.util.List; import java.util.regex.Pattern; @@ -70,6 +82,10 @@ private final RedisService redisService; @Resource private ChargingOrderClient chargingOrderClient; + @Resource + private OrderClient orderClient; + @Resource + private SiteClient siteClient; @Autowired public TApplyChargingPileController(TApplyChargingPileService applyChargingPileService, TokenService tokenService, RedisService redisService) { @@ -212,9 +228,7 @@ applyChargingPileExportDto.setIs3("否"); } exportDtos.add(applyChargingPileExportDto); - } - // excel模板封装 ExcelWriterBuilder excelWriterBuilder = EasyExcelFactory.write(response.getOutputStream()); InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream("template/" +"充电桩申请记录" + ".xlsx"); @@ -272,6 +286,124 @@ } return R.ok(); } + @ApiOperation(value = "下载", tags = {"管理后台-账户结算账单"}) + @PutMapping("/downloadAccount") + public R downloadAccount(@RequestBody ChargingListQuery dto,HttpServletResponse response) + { + AccountListVO data = orderClient.accountBillList(dto).getData(); + try { + response.setCharacterEncoding(Constants.UTF8); + response.setContentType("application/vnd.ms-excel"); + response.setHeader("Access-Control-Expose-Headers", "Content-disposition"); + response.setHeader("Content-Disposition", "attachment;filename=" + + URLEncoder.encode("账户结算账单", CharEncoding.UTF_8) + ".xlsx"); + } catch (UnsupportedEncodingException e) { + return R.fail("excel导出失败!"); + } + try { + // excel模板封装 + ExcelWriterBuilder excelWriterBuilder = EasyExcelFactory.write(response.getOutputStream()); + InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream("template/" +"账户结算账单" + ".xlsx"); + // 自动释放资源 + try (ExcelWriter excelWriter = excelWriterBuilder.withTemplate(stream).build()) { + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.VERTICAL).build(); + excelWriter.fill(new FillWrapper("data1", data.getList().getRecords()), fillConfig, writeSheet); + excelWriter.finish(); + } catch (Exception e) { + return R.fail("excel导出失败!"); + } + } catch (IOException e) { + return R.fail("excel导出失败!"); + } + return R.ok(); + } + + @ApiOperation(value = "导出", tags = {"管理后台-结算汇总表"}) + @GetMapping("/downloadSettlementTotal") + public R downloadSettlementTotal(String time,HttpServletResponse response) + { + SettlementTotalVO data = chargingOrderClient.settlementTotalR(time).getData(); + try { + response.setCharacterEncoding(Constants.UTF8); + response.setContentType("application/vnd.ms-excel"); + response.setHeader("Access-Control-Expose-Headers", "Content-disposition"); + response.setHeader("Content-Disposition", "attachment;filename=" + + URLEncoder.encode("结算确认单", CharEncoding.UTF_8) + ".xlsx"); + } catch (UnsupportedEncodingException e) { + return R.fail("excel导出失败!"); + } + try { + // excel模板封装 + ExcelWriterBuilder excelWriterBuilder = EasyExcelFactory.write(response.getOutputStream()); + InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream("template/" +"运营商名称1-充电桩名称1-结算对账单明细-结算月份1" + ".xlsx"); + // 自动释放资源 + try (ExcelWriter excelWriter = excelWriterBuilder.withTemplate(stream).build()) { + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.VERTICAL).build(); + excelWriter.fill(new FillWrapper("data1", data.getList1()), fillConfig, writeSheet); + excelWriter.fill(new FillWrapper("data2", data.getList2()), fillConfig, writeSheet); + excelWriter.finish(); + } catch (Exception e) { + return R.fail("excel导出失败!"); + } + } catch (IOException e) { + return R.fail("excel导出失败!"); + } + return R.ok(); + } + @ApiOperation(value = "下载", tags = {"管理后台-结算表记录"}) + @GetMapping("/downloadSettlement") + public R downloadSettlement(String uid,HttpServletResponse response) + { + TSettlementConfirm data = chargingOrderClient.downloadSettlement(uid).getData(); + List<Site> data1 = siteClient.getSiteByIds(Arrays.asList(data.getSiteId())).getData(); + if (!data1.isEmpty()){ + data.setSiteName(data1.get(0).getName()); + } + Partner data2 = siteClient.getPartnerR(data.getPartnerId()).getData(); + if (data2!=null){ + data.setPartnerName(data2.getName()); + } + List<TSettlementConfirm> chargingBillVOS = new ArrayList<>(); + chargingBillVOS.add(data); + try { + response.setCharacterEncoding(Constants.UTF8); + response.setContentType("application/vnd.ms-excel"); + response.setHeader("Access-Control-Expose-Headers", "Content-disposition"); + response.setHeader("Content-Disposition", "attachment;filename=" + + URLEncoder.encode("结算确认单", CharEncoding.UTF_8) + ".xlsx"); + } catch (UnsupportedEncodingException e) { + return R.fail("excel导出失败!"); + } + try { + // excel模板封装 + ExcelWriterBuilder excelWriterBuilder = EasyExcelFactory.write(response.getOutputStream()); + InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream("template/" +"运营商名称1-充电桩名称1-结算对账单明细-结算月份1" + ".xlsx"); + // 自动释放资源 + try (ExcelWriter excelWriter = excelWriterBuilder.withTemplate(stream).build()) { + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + WriteSheet writeSheet2 = EasyExcel.writerSheet().build(); + WriteSheet writeSheet3 = EasyExcel.writerSheet().build(); + FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build(); + excelWriter.fill(new FillWrapper("data1", chargingBillVOS), fillConfig, writeSheet); + excelWriter.fill(new FillWrapper("data2", chargingBillVOS), fillConfig, writeSheet2); + excelWriter.fill(new FillWrapper("data3", data.getList()), fillConfig, writeSheet3); + excelWriter.finish(); + } catch (Exception e) { + return R.fail("excel导出失败!"); + } + } catch (IOException e) { + return R.fail("excel导出失败!"); + } + return R.ok(); + } + + + + + + @ApiOperation(value = "下载-未出账", tags = {"管理后台-充电算账单"}) @GetMapping("/download") public R download(String uid,HttpServletResponse response) diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingLotController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingLotController.java index 22746d3..b00e89c 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingLotController.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingLotController.java @@ -1,6 +1,7 @@ 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.dto.TParkingLotDTO; import com.ruoyi.chargingPile.api.model.TCarport; @@ -156,5 +157,18 @@ BigDecimal sum = parkingRecordService.getSum(sixBefore); return R.ok(); } + + + /** + * 根据停车场标识查询停车场 + * @param appKey + * @return + */ + @PostMapping(value = "/getParkingLotByAppKey") + public R<TParkingLot> getParkingLotByAppKey(@RequestParam("appKey") String appKey){ + TParkingLot parkingLot = parkingLotService.getOne(new LambdaQueryWrapper<TParkingLot>() + .eq(TParkingLot::getAppKey, appKey).eq(TParkingLot::getDelFlag, 0)); + return R.ok(parkingLot); + } } diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingRecordController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingRecordController.java index dab0830..fec52ef 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingRecordController.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingRecordController.java @@ -1,18 +1,41 @@ package com.ruoyi.chargingPile.controller; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.api.query.ParkingRecordQuery; +import com.ruoyi.chargingPile.api.vo.GetParkingRecord; +import com.ruoyi.chargingPile.api.vo.TParkingRecordPageInfoVO; +import com.ruoyi.chargingPile.api.vo.TParkingRecordVO; import com.ruoyi.chargingPile.dto.ParkingRecordPageQuery; +import com.ruoyi.chargingPile.export.TParkingRecordExport; import com.ruoyi.chargingPile.service.TParkingLotService; import com.ruoyi.chargingPile.service.TParkingRecordService; import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.utils.DateUtils; +import com.ruoyi.common.core.utils.WebUtils; import com.ruoyi.common.core.web.domain.AjaxResult; +import com.ruoyi.common.core.web.page.PageInfo; +import com.ruoyi.common.log.annotation.Log; +import com.ruoyi.common.log.enums.BusinessType; +import com.ruoyi.order.api.query.TOrderInvoiceQuery; +import com.ruoyi.order.api.vo.TOrderInvoiceVO; import io.swagger.annotations.ApiOperation; +import org.apache.poi.ss.usermodel.Workbook; +import org.springframework.beans.BeanUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.List; /** * <p> @@ -47,12 +70,59 @@ return R.ok(page); } + @ApiOperation(tags = {"后台-订单管理-停车记录"},value = "停车缴费订单列表") + @PostMapping(value = "/pageList") + public R<TParkingRecordPageInfoVO> pageList(@RequestBody ParkingRecordQuery query) { + return R.ok(parkingRecordService.pageList(query)); + } + @ApiOperation(tags = {"后台-订单管理-停车记录"},value = "导出") + @PutMapping("/export") + public void export(@RequestBody ParkingRecordQuery query) + { + List<TParkingRecordVO> records = parkingRecordService.pageList(query).getParkingRecordVOS().getRecords(); + List<TParkingRecordExport> orderInvoiceExports = new ArrayList<>(); + for (TParkingRecordVO orderInvoiceVO : records) { + TParkingRecordExport orderInvoiceExport = new TParkingRecordExport(); + BeanUtils.copyProperties(orderInvoiceVO,orderInvoiceExport); + if (orderInvoiceVO.getFreeDuration()!=null){ + orderInvoiceExport.setParkingDuration(orderInvoiceVO.getParkingDuration()-orderInvoiceVO.getFreeDuration()); + }else{ + orderInvoiceExport.setParkingDuration(orderInvoiceVO.getParkingDuration()); + } + if (orderInvoiceVO.getTimeoutAmount()!=null){ + orderInvoiceExport.setAmount(orderInvoiceVO.getOrderAmount().subtract(orderInvoiceVO.getTimeoutAmount())); + }else{ + orderInvoiceExport.setAmount(orderInvoiceVO.getOrderAmount()); + } + orderInvoiceExports.add(orderInvoiceExport); + } + Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), TParkingRecordExport.class, orderInvoiceExports); + HttpServletResponse response = WebUtils.response(); + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding("utf-8"); + ServletOutputStream outputStream = null; + try { + String fileName = URLEncoder.encode("停车记录.xls", "utf-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + fileName); + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + response.setHeader("Pragma", "no-cache"); + response.setHeader("Cache-Control", "no-cache"); + outputStream = response.getOutputStream(); + workbook.write(outputStream); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } @ApiOperation(tags = {"后台-订单管理-停车记录"},value = "详情") @GetMapping(value = "/detail") public R<TParkingRecord> detail(Long id) { - return R.ok(parkingRecordService.getById(id)); - } @ApiOperation(tags = {"后台-订单管理-停车记录"},value = "出场") @@ -64,8 +134,50 @@ return R.ok(); } - - - + + + /** + * 根据车牌和状态查询停车数据 + * @param query + * @return + */ + @PostMapping("/getParkingRecord") + public R<TParkingRecord> getParkingRecord(@RequestBody GetParkingRecord query){ + TParkingRecord one = parkingRecordService.getOne(new LambdaQueryWrapper<TParkingRecord>() + .eq(TParkingRecord::getLicensePlate, query.getLicensePlate()).eq(TParkingRecord::getStatus, query.getStatus())); + return R.ok(one); + } + + + /** + * 修改停车数据 + * @param parkingRecord + */ + @PostMapping("/updateParkingRecord") + public void updateParkingRecord(@RequestBody TParkingRecord parkingRecord){ + parkingRecordService.updateById(parkingRecord); + } + + + /** + * 根据id获取数据 + * @param id + * @return + */ + @PostMapping("/getParkingRecordById") + public R<TParkingRecord> getParkingRecordById(@RequestParam("id") Long id){ + TParkingRecord parkingRecord = parkingRecordService.getById(id); + return R.ok(parkingRecord); + } + + + /** + * 添加数据 + * @param parkingRecord + */ + @PostMapping("/addParkingRecord") + public void addParkingRecord(@RequestBody TParkingRecord parkingRecord){ + parkingRecordService.save(parkingRecord); + } } diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TRepairController.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TRepairController.java index 981cc4b..6820fa6 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TRepairController.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TRepairController.java @@ -35,7 +35,8 @@ public AjaxResult<PageInfo<TRepair>> getRepairList(String name, String siteId, BasePage basePage){ PageInfo<TRepair> pageInfo = new PageInfo<>(basePage.getPageCurr(), basePage.getPageSize()); List<TRepair> repairList = repairService.getRepairList(pageInfo, name, siteId); - return AjaxResult.success(repairList); + pageInfo.setRecords(repairList); + return AjaxResult.success(pageInfo); } diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/export/TParkingRecordExport.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/export/TParkingRecordExport.java new file mode 100644 index 0000000..a34bb11 --- /dev/null +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/export/TParkingRecordExport.java @@ -0,0 +1,41 @@ +package com.ruoyi.chargingPile.export; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel(value = "导出充电算帐单-导出") +public class TParkingRecordExport implements Serializable { + + @Excel(name = "账单编号",width = 30) + private String code; + @Excel(name = "站点名称",width = 30) + private String siteName; + @Excel(name = "出场时间",width = 30) + private String outParkingTime; + @Excel(name = "进场时间",width = 30) + private String inParkingTime; + @Excel(name = "车牌号",width = 30) + private String licensePlate; + @Excel(name = "车辆颜色",width = 30) + private String vehicleColor; + @Excel(name = "总费用",width = 30) + private BigDecimal orderAmount; + @Excel(name = "超时占位费",width = 30) + private BigDecimal timeoutAmount; + @Excel(name = "停车费",width = 30) + private BigDecimal amount; + @Excel(name = "免费时长(分钟)",width = 30) + private Integer freeDuration; + @Excel(name = "停车总时长(分钟)",width = 30) + private Integer parkingDuration; + @Excel(name = "收费时长(分钟)",width = 30) + private Integer payDuration; + +} diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/SiteMapper.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/SiteMapper.java index 0b4fa13..9a7ab8d 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/SiteMapper.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/SiteMapper.java @@ -8,6 +8,7 @@ import com.ruoyi.chargingPile.api.vo.SiteDetailVO; import com.ruoyi.chargingPile.api.vo.SiteVO; import com.ruoyi.common.core.web.page.PageInfo; +import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -17,6 +18,7 @@ * @author zhibing.pu * @Date 2024/8/7 19:49 */ +@Mapper public interface SiteMapper extends BaseMapper<Site> { diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TParkingRecordMapper.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TParkingRecordMapper.java index 248c63f..d0b6ced 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TParkingRecordMapper.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TParkingRecordMapper.java @@ -2,10 +2,15 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.chargingPile.api.model.TParkingRecord; +import com.ruoyi.chargingPile.api.query.ParkingRecordQuery; +import com.ruoyi.chargingPile.api.vo.TParkingRecordPageInfoVO; +import com.ruoyi.chargingPile.api.vo.TParkingRecordVO; +import com.ruoyi.common.core.web.page.PageInfo; import org.apache.ibatis.annotations.Param; import java.math.BigDecimal; import java.time.LocalDate; +import java.util.List; /** * <p> @@ -18,4 +23,20 @@ public interface TParkingRecordMapper extends BaseMapper<TParkingRecord> { BigDecimal getSum(@Param("sixBefore") LocalDate sixBefore); + + /** + * 停车缴费订单列表 + * @param query + * @param pageInfo + * @return + */ + List<TParkingRecordVO> pageList(@Param("query") ParkingRecordQuery query, @Param("pageInfo")PageInfo<TParkingRecordVO> pageInfo); + + /** + * 统计 + * @param query + * @return + */ + TParkingRecordPageInfoVO getParkingRecordCount(@Param("query")ParkingRecordQuery query); + } diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TRepairMapper.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TRepairMapper.java index afe8e9f..c9190aa 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TRepairMapper.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TRepairMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.chargingPile.api.model.TRepair; import com.ruoyi.common.core.web.page.PageInfo; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -24,6 +25,6 @@ * @param siteId * @return */ - List<TRepair> getRepairList(PageInfo<TRepair> pageInfo, String name, String siteId); + List<TRepair> getRepairList(PageInfo<TRepair> pageInfo, @Param("name") String name, @Param("siteId") String siteId); } diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TParkingRecordService.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TParkingRecordService.java index 2af1069..9479008 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TParkingRecordService.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TParkingRecordService.java @@ -2,6 +2,9 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.chargingPile.api.model.TParkingRecord; +import com.ruoyi.chargingPile.api.query.ParkingRecordQuery; +import com.ruoyi.chargingPile.api.vo.TParkingRecordPageInfoVO; +import com.ruoyi.common.core.web.page.PageInfo; import java.math.BigDecimal; import java.time.LocalDate; @@ -17,4 +20,11 @@ public interface TParkingRecordService extends IService<TParkingRecord> { BigDecimal getSum(LocalDate sixBefore); + + /** + * 停车缴费订单列表 + * @param query + * @return + */ + TParkingRecordPageInfoVO pageList(ParkingRecordQuery query); } diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java index 7cf4f33..97458c6 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java @@ -378,7 +378,7 @@ this.updateById(site); List<TChargingGun> list = chargingGunService.list(new LambdaQueryWrapper<TChargingGun>().in(TChargingGun::getChargingPileId, id).eq(TChargingGun::getDelFlag, 0)); for (TChargingGun tChargingGun : list) { - tChargingGun.setChargingPileId(accountingStrategyId); + tChargingGun.setAccountingStrategyId(accountingStrategyId); } chargingGunService.updateBatchById(list); } diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java index d497796..00e72b4 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java @@ -242,7 +242,7 @@ List<Integer> id = setAccountingStrategy.getId(); List<TChargingGun> list = chargingGunService.list(new LambdaQueryWrapper<TChargingGun>().in(TChargingGun::getChargingPileId, id).eq(TChargingGun::getDelFlag, 0)); for (TChargingGun tChargingGun : list) { - tChargingGun.setChargingPileId(setAccountingStrategy.getAccountingStrategyId()); + tChargingGun.setAccountingStrategyId(setAccountingStrategy.getAccountingStrategyId()); } chargingGunService.updateBatchById(list); } diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TParkingRecordServiceImpl.java b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TParkingRecordServiceImpl.java index 73fccbb..8e6f6e9 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TParkingRecordServiceImpl.java +++ b/ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TParkingRecordServiceImpl.java @@ -1,13 +1,28 @@ package com.ruoyi.chargingPile.service.impl; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.chargingPile.api.model.Site; +import com.ruoyi.chargingPile.api.model.TParkingLot; import com.ruoyi.chargingPile.api.model.TParkingRecord; +import com.ruoyi.chargingPile.api.query.ParkingRecordQuery; +import com.ruoyi.chargingPile.api.vo.TParkingLotVO; +import com.ruoyi.chargingPile.api.vo.TParkingRecordPageInfoVO; +import com.ruoyi.chargingPile.api.vo.TParkingRecordVO; +import com.ruoyi.chargingPile.domain.SiteMenu; +import com.ruoyi.chargingPile.mapper.SiteMapper; +import com.ruoyi.chargingPile.mapper.TParkingLotMapper; import com.ruoyi.chargingPile.mapper.TParkingRecordMapper; import com.ruoyi.chargingPile.service.TParkingRecordService; +import com.ruoyi.common.core.web.page.PageInfo; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.time.LocalDate; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; /** * <p> @@ -20,8 +35,32 @@ @Service public class TParkingRecordServiceImpl extends ServiceImpl<TParkingRecordMapper, TParkingRecord> implements TParkingRecordService { + @Autowired + private SiteMapper siteMapper; + @Autowired + private TParkingLotMapper parkingLotMapper; + @Override public BigDecimal getSum(LocalDate sixBefore) { return this.baseMapper.getSum(sixBefore); } + + @Override + public TParkingRecordPageInfoVO pageList(ParkingRecordQuery query) { + // 查询站点的停车场id + if(Objects.nonNull(query.getSiteId())){ + Site site = siteMapper.selectById(query.getSiteId()); + List<TParkingLot> tParkingLots = parkingLotMapper.selectList(Wrappers.lambdaQuery(TParkingLot.class) + .eq(TParkingLot::getSiteId, site.getId())); + List<Integer> lotIds = tParkingLots.stream().map(TParkingLot::getId).collect(Collectors.toList()); + query.setLotIds(lotIds); + } + PageInfo<TParkingRecordVO> pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize()); + List<TParkingRecordVO> list = this.baseMapper.pageList(query,pageInfo); + pageInfo.setRecords(list); + // 查询总数 + TParkingRecordPageInfoVO infoVO = this.baseMapper.getParkingRecordCount(query); + infoVO.setParkingRecordVOS(pageInfo); + return infoVO; + } } diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TParkingLotMapper.xml b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TParkingLotMapper.xml index ce9ef7e..d20746a 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TParkingLotMapper.xml +++ b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TParkingLotMapper.xml @@ -25,8 +25,7 @@ </sql> <select id="pageList" resultType="com.ruoyi.chargingPile.api.vo.TParkingLotVO"> SELECT - tpl.id, tpl.`name`, tpl.code, tpl.site_id, tpl.charge_free_duration, tpl.charge_capping, tpl.charge_rate, tpl.non_charge_free_duration, - tpl.non_charge_capping, tpl.non_charge_rate, tpl.remark, tpl.create_time, tpl.del_flag, ts.name AS siteName + tpl.*, ts.name AS siteName FROM t_parking_lot tpl LEFT JOIN t_site ts ON tpl.site_id = ts.id <where> diff --git a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TParkingRecordMapper.xml b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TParkingRecordMapper.xml index defbedf..3bc729d 100644 --- a/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TParkingRecordMapper.xml +++ b/ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TParkingRecordMapper.xml @@ -17,6 +17,7 @@ <result column="status" property="status" /> <result column="out_parking_type" property="outParkingType" /> <result column="create_time" property="createTime" /> + <result column="code" property="code" /> </resultMap> <!-- 通用查询结果列 --> @@ -26,5 +27,59 @@ <select id="getSum" resultType="java.math.BigDecimal"> select sum(timeout_amount) from t_parking_record where in_parking_time >= #{sixBefore} </select> + <select id="pageList" resultType="com.ruoyi.chargingPile.api.vo.TParkingRecordVO"> + select + tpr.id, tpr.app_user_id, tpr.license_plate, tpr.vehicle_color, tpr.charging_order_id, tpr.parking_lot_id, tpr.in_parking_time, tpr.out_parking_time, + tpr.parking_duration, tpr.order_amount, tpr.status, tpr.out_parking_type, tpr.create_time,(tpr.order_amount - tpr.timeout_amount) as parkingFee, + (tpr.parking_duration - tpr.free_duration) as feeDuration,ts.name as siteName + from t_parking_record tpr + left join t_parking_lot tpl on tpr.parking_lot_id = tpl.id + left join t_site ts on tpl.site_id = ts.id + <where> + <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''"> + AND tpr.create_time BETWEEN #{query.startTime} AND #{query.endTime} + </if> + <if test="query.code != null and query.code != ''"> + AND tpr.code LIKE concat('%',#{query.code},'%') + </if> + <if test="query.licensePlate != null and query.licensePlate != ''"> + AND tpr.licensePlate LIKE concat('%',#{query.licensePlate},'%') + </if> + <if test="query.lotIds != null and query.lotIds.size()>0"> + AND tpr.parking_lot_id IN + <foreach collection="query.lotIds" item="item" open="(" separator="," close=")"> + #{item} + </foreach> + </if> + AND tpr.status = 3 + </where> + ORDER BY tpr.create_time DESC + </select> + <select id="getParkingRecordCount" resultType="com.ruoyi.chargingPile.api.vo.TParkingRecordPageInfoVO"> + SELECT count(id) as orderCount, + sum(timeout_amount) as timeoutAmountSum, + sum(parking_duration - free_duration) as feeDurationSum, + sum(parking_duration) as parkingDurationSum + from t_parking_record + <where> + <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''"> + AND create_time BETWEEN #{query.startTime} AND #{query.endTime} + </if> + <if test="query.code != null and query.code != ''"> + AND code LIKE concat('%',#{query.code},'%') + </if> + <if test="query.licensePlate != null and query.licensePlate != ''"> + AND licensePlate LIKE concat('%',#{query.licensePlate},'%') + </if> + <if test="query.lotIds != null and query.lotIds.size()>0"> + AND parking_lot_id IN + <foreach collection="query.lotIds" item="item" open="(" separator="," close=")"> + #{item} + </foreach> + </if> + AND status = 3 + </where> + ORDER BY create_time DESC + </select> </mapper> diff --git "a/ruoyi-service/ruoyi-chargingPile/src/main/resources/template/\350\264\246\346\210\267\347\273\223\347\256\227\350\264\246\345\215\225.xlsx" "b/ruoyi-service/ruoyi-chargingPile/src/main/resources/template/\350\264\246\346\210\267\347\273\223\347\256\227\350\264\246\345\215\225.xlsx" new file mode 100644 index 0000000..296d45b --- /dev/null +++ "b/ruoyi-service/ruoyi-chargingPile/src/main/resources/template/\350\264\246\346\210\267\347\273\223\347\256\227\350\264\246\345\215\225.xlsx" Binary files differ diff --git "a/ruoyi-service/ruoyi-chargingPile/src/main/resources/template/\350\277\220\350\220\245\345\225\206\345\220\215\347\247\2601-\345\205\205\347\224\265\346\241\251\345\220\215\347\247\2601-\347\273\223\347\256\227\345\257\271\350\264\246\345\215\225\346\230\216\347\273\206-\347\273\223\347\256\227\346\234\210\344\273\2751.xlsx" "b/ruoyi-service/ruoyi-chargingPile/src/main/resources/template/\350\277\220\350\220\245\345\225\206\345\220\215\347\247\2601-\345\205\205\347\224\265\346\241\251\345\220\215\347\247\2601-\347\273\223\347\256\227\345\257\271\350\264\246\345\215\225\346\230\216\347\273\206-\347\273\223\347\256\227\346\234\210\344\273\2751.xlsx" new file mode 100644 index 0000000..807ae43 --- /dev/null +++ "b/ruoyi-service/ruoyi-chargingPile/src/main/resources/template/\350\277\220\350\220\245\345\225\206\345\220\215\347\247\2601-\345\205\205\347\224\265\346\241\251\345\220\215\347\247\2601-\347\273\223\347\256\227\345\257\271\350\264\246\345\215\225\346\230\216\347\273\206-\347\273\223\347\256\227\346\234\210\344\273\2751.xlsx" Binary files differ diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/controller/CouponController.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/controller/CouponController.java new file mode 100644 index 0000000..f98d54e --- /dev/null +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/controller/CouponController.java @@ -0,0 +1,50 @@ +package com.ruoyi.integration.barrierGate.controller; + +import com.ruoyi.integration.barrierGate.model.BaseResponse; +import com.ruoyi.integration.barrierGate.model.GetCouponReq; +import com.ruoyi.integration.barrierGate.model.GetCouponResp; +import com.ruoyi.integration.barrierGate.model.UsedCoupon; +import com.ruoyi.integration.barrierGate.server.CouponService; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * 优惠券控制器 + * @author zhibing.pu + * @Date 2024/9/5 11:10 + */ +@RestController +@RequestMapping("/coupon") +public class CouponController { + + @Resource + private CouponService couponService; + + + /** + * 获取优惠券 + * 减免停车费的优惠 + * @param req + * @return + */ + @ResponseBody + @PostMapping("/getCoupon") + public BaseResponse<GetCouponResp> getCoupon(@RequestBody GetCouponReq req){ + GetCouponResp coupon = couponService.getCoupon(req); + return BaseResponse.ok(coupon); + } + + + /** + * 使用优惠券 + * @param req + * @return + */ + @ResponseBody + @PostMapping("/usedCoupon") + public BaseResponse usedCoupon(@RequestBody UsedCoupon req){ + couponService.usedCoupon(req); + return BaseResponse.ok(); + } +} diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/controller/ParkingOrderController.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/controller/ParkingOrderController.java new file mode 100644 index 0000000..e37685a --- /dev/null +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/controller/ParkingOrderController.java @@ -0,0 +1,101 @@ +package com.ruoyi.integration.barrierGate.controller; + +import com.ruoyi.integration.barrierGate.model.*; +import com.ruoyi.integration.barrierGate.server.ParkingOrderService; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * @author zhibing.pu + * @Date 2024/9/5 16:14 + */ +@RestController +@RequestMapping("/parkingOrder") +public class ParkingOrderController { + + @Resource + private ParkingOrderService parkingOrderService; + + + /** + * 云停车入场 + * @param order + */ + @ResponseBody + @PostMapping("/cloudParkingInOrder") + public BaseResponse cloudParkingInOrder(@RequestBody CloudParkingOrder order){ + parkingOrderService.cloudParkingInOrder(order); + return BaseResponse.ok(); + } + + + /** + * 云停车出场 + * @param order + */ + @ResponseBody + @PostMapping("/cloudParkingOutOrder") + public BaseResponse cloudParkingOutOrder(@RequestBody CloudParkingOrder order){ + parkingOrderService.cloudParkingOutOrder(order); + return BaseResponse.ok(); + } + + + /** + * 云停车实时车位 + * @param parkingSpace + */ + @ResponseBody + @PostMapping("/cloudParkingSpace") + public BaseResponse cloudParkingSpace(@RequestBody CloudParkingSpace parkingSpace){ + parkingOrderService.cloudParkingSpace(parkingSpace); + return BaseResponse.ok(); + } + + + + /** + * 线下停车场入场 + * @param order + */ + @ResponseBody + @PostMapping("/offlineParkingInOrder") + public BaseResponse offlineParkingInOrder(@RequestBody OfflineParkingOrder order){ + parkingOrderService.offlineParkingInOrder(order); + OfflineParkingResponse offlineParkingResponse = new OfflineParkingResponse(); + offlineParkingResponse.setCode(0); + offlineParkingResponse.setTakeover(0); + offlineParkingResponse.setIsfree(false); + return offlineParkingResponse; + } + + + /** + * 线下停车场出场 + * @param order + */ + @ResponseBody + @PostMapping("/offlineParkingOutOrder") + public BaseResponse offlineParkingOutOrder(@RequestBody OfflineParkingOrder order){ + parkingOrderService.offlineParkingOutOrder(order); + OfflineParkingResponse offlineParkingResponse = new OfflineParkingResponse(); + offlineParkingResponse.setCode(0); + offlineParkingResponse.setTakeover(0); + offlineParkingResponse.setIsfree(false); + return offlineParkingResponse; + } + + + /** + * 线下停车场实时车位 + * @param parkingSpace + */ + @ResponseBody + @PostMapping("/offlineParkingSpace") + public BaseResponse offlineParkingSpace(@RequestBody OfflineParkingSpace parkingSpace){ + parkingOrderService.offlineParkingSpace(parkingSpace); + return BaseResponse.ok(); + } + +} diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/BaseResponse.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/BaseResponse.java new file mode 100644 index 0000000..8f63c73 --- /dev/null +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/BaseResponse.java @@ -0,0 +1,31 @@ +package com.ruoyi.integration.barrierGate.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2024/9/5 11:29 + */ +@Data +public class BaseResponse<T> { + + private Integer code; + + private String msg; + + private T data; + + + public static BaseResponse ok(){ + return ok(new Object()); + } + + + public static <T> BaseResponse<T> ok(T data){ + BaseResponse baseResponse = new BaseResponse(); + baseResponse.setCode(0); + baseResponse.setData(data); + baseResponse.setMsg("成功"); + return baseResponse; + } +} diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/CloudParkingOrder.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/CloudParkingOrder.java new file mode 100644 index 0000000..af10c3d --- /dev/null +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/CloudParkingOrder.java @@ -0,0 +1,84 @@ +package com.ruoyi.integration.barrierGate.model; + +import lombok.Data; + +/** + * 云停车订单实体 + * @author zhibing.pu + * @Date 2024/9/5 15:54 + */ +@Data +public class CloudParkingOrder { + /** + * 停车场appKey + */ + private String appkey; + /** + * 车场业务ID + */ + private String id; + /** + * 入场通道号 + */ + private String enterChannel; + /** + * 入场时间 + */ + private String enterDateTime; + /** + * 车牌号 + */ + private String plate; + /** + * 入场通道名称 + */ + private String enterChannelName; + /** + * 车牌颜色 + */ + private String plateColor; + /** + * 卡种类 + */ + private String kind; + /** + * 姓名 + */ + private String name; + /** + * 应收金额 + */ + private String receivable; + /** + * 实收金额 + */ + private String payment; + /** + * 支付方式 + */ + private String payType; + /** + * 离场通道号 + */ + private String leaveChannel; + /** + * 离场时间 + */ + private String leaveDateTime; + /** + * 离场通道名称 + */ + private String leaveChannelName; + /** + * 停车时长 + */ + private String longTime; + /** + * 时间戳 + */ + private String timestamp; + /** + * 签名 + */ + private String sign; +} diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/CloudParkingSpace.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/CloudParkingSpace.java new file mode 100644 index 0000000..743db0c --- /dev/null +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/CloudParkingSpace.java @@ -0,0 +1,35 @@ +package com.ruoyi.integration.barrierGate.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2024/9/5 16:22 + */ +@Data +public class CloudParkingSpace { + /** + * 停车场appkey + */ + private String appkey; + /** + * 总车位数 + */ + private String total; + /** + * 已用车位 + */ + private String used; + /** + * 空余车位 + */ + private String free; + /** + * 时间戳 + */ + private String timestamp; + /** + * 签名 + */ + private String sign; +} diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/GetCouponReq.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/GetCouponReq.java new file mode 100644 index 0000000..964c335 --- /dev/null +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/GetCouponReq.java @@ -0,0 +1,31 @@ +package com.ruoyi.integration.barrierGate.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2024/9/5 11:12 + */ +@Data +public class GetCouponReq { + /** + * 停车场appkey + */ + private String appKey; + /** + * 车牌号 + */ + private String carNumber; + /** + * 时间戳 + */ + private String timestamp; + /** + * 停车费用 + */ + private String fee; + /** + * 签名 + */ + private String sign; +} diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/GetCouponResp.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/GetCouponResp.java new file mode 100644 index 0000000..58bbb7b --- /dev/null +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/GetCouponResp.java @@ -0,0 +1,43 @@ +package com.ruoyi.integration.barrierGate.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2024/9/5 11:19 + */ +@Data +public class GetCouponResp { + /** + * 优惠券记录id + */ + private Long recordId; + /** + * 车牌号 + */ + private String carNumber; + /** + * 平台编号 + */ + private String sysOrgId; + /** + * 商户名称 + */ + private String posName; + /** + * 优惠券名称 + */ + private String couponName; + /** + * 发放人 + */ + private String lssuer; + /** + * 类型:1单次全免、2金额优惠、3单笔折扣、4优惠时长、5日期范围全免 + */ + private Integer type; + /** + * 优惠明细 + */ + private Parameter parameter; +} diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/OfflineParkingOrder.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/OfflineParkingOrder.java new file mode 100644 index 0000000..41e1691 --- /dev/null +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/OfflineParkingOrder.java @@ -0,0 +1,91 @@ +package com.ruoyi.integration.barrierGate.model; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +/** + * 云停车订单实体 + * @author zhibing.pu + * @Date 2024/9/5 15:54 + */ +@Data +public class OfflineParkingOrder { + /** + * 停车场appKey + */ + private String appkey; + /** + * 10 位时间戳 + */ + private String timestamp; + /** + * 签名 + */ + private String sign; + /** + * 进出记录 ID + */ + private String id; + /** + * 卡号 + */ + private String cardid; + /** + * 会员 ID + */ + private String memberid; + /** + * 会员类型 + */ + private String membertype; + /** + * 会员姓名 + */ + private String name; + /** + * 车牌号 + */ + private String platenumber; + /** + * 车牌颜色 + */ + private String platecolor; + /** + * 入场通道 + */ + private String enterchannel; + /** + * 入场时间 + */ + private String entertime; + /** + * 是否库中库 0、不是库中库,1、是库中库 + */ + private Integer subplace; + /** + * 抓拍图片(base64) + */ + private String image; + /** + * 备注 + */ + private String remark; + /** + * 停车时长(分钟) + */ + @JsonProperty("long") + private String longTime; + /** + * 停车费用 + */ + private String money; + /** + * 出场通道 + */ + private String leavechannel; + /** + * 出场时间 + */ + private String leavetime; +} diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/OfflineParkingResponse.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/OfflineParkingResponse.java new file mode 100644 index 0000000..9b016e6 --- /dev/null +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/OfflineParkingResponse.java @@ -0,0 +1,36 @@ +package com.ruoyi.integration.barrierGate.model; + +import lombok.Data; + +import java.util.List; + +/** + * @author zhibing.pu + * @Date 2024/9/6 15:10 + */ +@Data +public class OfflineParkingResponse extends BaseResponse{ + /** + * 0、正常流程(opendoor、led、sound 无效),1、流程接 + * 管(opendoor、led、sound 生效)软件不再进行后续流 + * 程 + */ + private Integer takeover; + /** + * 1、开闸,0、不开闸 + */ + private Integer opendoor; + /** + * 对于显示到 LED 上的每一行信息 + */ + private List<String> led; + /** + * 语音播报内容 + */ + private String sound; + /** + * 是否免费(不接管的情况下) + */ + private Boolean isfree; + +} diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/OfflineParkingSpace.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/OfflineParkingSpace.java new file mode 100644 index 0000000..b5a720d --- /dev/null +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/OfflineParkingSpace.java @@ -0,0 +1,39 @@ +package com.ruoyi.integration.barrierGate.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2024/9/5 16:22 + */ +@Data +public class OfflineParkingSpace { + /** + * 停车场appkey + */ + private String appkey; + /** + * 10 位时间戳 + */ + private String timestamp; + /** + * 签名 + */ + private String sign; + /** + * 总车位数 + */ + private Integer place; + /** + * 剩余车位数 + */ + private Integer surplus; + /** + * 固定车数量 + */ + private Integer fixed; + /** + * 临时车数量 + */ + private Integer interim; +} diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/Parameter.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/Parameter.java new file mode 100644 index 0000000..79e7f63 --- /dev/null +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/Parameter.java @@ -0,0 +1,47 @@ +package com.ruoyi.integration.barrierGate.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2024/9/5 11:24 + */ +@Data +public class Parameter { + /** + * 使用门槛 + */ + private Boolean isHaveUseRequirement; + /** + * 金额优惠满减阈值 + */ + private Double minAmount; + /** + * 时长优惠满减阈值 + */ + private Double minRequirement; + /** + * 全免标记 + */ + private Boolean freeFlag; + /** + * 优惠折扣 + */ + private Double discount; + /** + * 优惠金额 + */ + private Double money; + /** + * 优惠时长 + */ + private Integer time; + /** + * 开始日期 yyyy-mm-dd HH:mm:ss #日期范围开始 + */ + private String startTime; + /** + * 结束日期 yyyy-mm-dd HH:mm:ss #日期范围开始 + */ + private String endTime; +} diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/UsedCoupon.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/UsedCoupon.java new file mode 100644 index 0000000..58584d8 --- /dev/null +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/UsedCoupon.java @@ -0,0 +1,47 @@ +package com.ruoyi.integration.barrierGate.model; + +import lombok.Data; + +/** + * @author zhibing.pu + * @Date 2024/9/5 15:39 + */ +@Data +public class UsedCoupon { + /** + * 停车场appkey + */ + private String appKey; + /** + * 车牌号 + */ + private String carNumber; + /** + * 车场流水号 + */ + private String serialnumber; + /** + * 时间戳 + */ + private String timestamp; + /** + * 未优惠停车费用 + */ + private String fee; + /** + * 优惠金额 + */ + private String actualFee; + /** + * 优惠券id + */ + private String recordId; + /** + * 平台编号 + */ + private String sysOrgId; + /** + * 签名 + */ + private String sign; +} diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/server/CouponService.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/server/CouponService.java new file mode 100644 index 0000000..0f3445f --- /dev/null +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/server/CouponService.java @@ -0,0 +1,120 @@ +package com.ruoyi.integration.barrierGate.server; + +import com.ruoyi.chargingPile.api.feignClient.ParkingLotClient; +import com.ruoyi.chargingPile.api.feignClient.ParkingRecordClient; +import com.ruoyi.chargingPile.api.model.TParkingLot; +import com.ruoyi.chargingPile.api.model.TParkingRecord; +import com.ruoyi.chargingPile.api.vo.GetParkingRecord; +import com.ruoyi.integration.barrierGate.model.GetCouponReq; +import com.ruoyi.integration.barrierGate.model.GetCouponResp; +import com.ruoyi.integration.barrierGate.model.Parameter; +import com.ruoyi.integration.barrierGate.model.UsedCoupon; +import com.ruoyi.order.api.feignClient.ChargingOrderClient; +import com.ruoyi.order.api.model.TChargingOrder; +import com.ruoyi.order.api.vo.GetChargingOrderByLicensePlate; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.RequestBody; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @author zhibing.pu + * @Date 2024/9/5 11:11 + */ +@Service +public class CouponService { + + @Resource + private ParkingLotClient parkingLotClient; + + @Resource + private ParkingRecordClient parkingRecordClient; + + @Resource + private ChargingOrderClient chargingOrderClient; + + + + + + /** + * 获取优惠券 + * @param req + * @return + */ + public GetCouponResp getCoupon(GetCouponReq req){ + //根据车牌查询入场时间,后再根据入场时间和车牌查询是否有充电订单 + String carNumber = req.getCarNumber(); + String appKey = req.getAppKey(); + TParkingLot parkingLot = parkingLotClient.getParkingLotByAppKey(appKey).getData(); + if(null == parkingLot){ + return null; + } + GetParkingRecord query = new GetParkingRecord(); + query.setStatus(1); + query.setLicensePlate(carNumber); + TParkingRecord data = parkingRecordClient.getParkingRecord(query).getData(); + if(null == data){ + return null; + } + //入场时间 + LocalDateTime inParkingTime = data.getInParkingTime(); + //开始查询充电订单 + GetChargingOrderByLicensePlate getChargingOrderByLicensePlate = new GetChargingOrderByLicensePlate(); + getChargingOrderByLicensePlate.setLicensePlate(carNumber); + getChargingOrderByLicensePlate.setStartTime(inParkingTime); + TChargingOrder tChargingOrder = chargingOrderClient.getChargingOrderByLicensePlate(getChargingOrderByLicensePlate).getData(); + + GetCouponResp resp = new GetCouponResp(); + resp.setRecordId(data.getId()); + resp.setCarNumber(carNumber); + // todo 需要第三方提供数据 + resp.setSysOrgId(""); + resp.setPosName(""); + resp.setLssuer("admin"); + resp.setType(4); + Parameter parameter = new Parameter(); + parameter.setFreeFlag(false); + if(null == tChargingOrder){ + //按照非充电进行优惠计算 + resp.setCouponName("普通停车时长优惠"); + parameter.setTime(parkingLot.getNonChargeFreeDuration()); + data.setFreeDuration(parkingLot.getNonChargeFreeDuration()); + parkingRecordClient.updateParkingRecord(data); + }else{ + resp.setCouponName("充电停车时长优惠"); + parameter.setTime(parkingLot.getChargeFreeDuration()); + data.setFreeDuration(parkingLot.getNonChargeFreeDuration()); + data.setChargingOrderId(tChargingOrder.getId()); + data.setAppUserId(tChargingOrder.getAppUserId()); + parkingRecordClient.updateParkingRecord(data); + } + resp.setParameter(parameter); + return resp; + } + + + /** + * 使用优惠券 + * @param req + */ + public void usedCoupon(UsedCoupon req){ + TParkingRecord data = parkingRecordClient.getParkingRecordById(Long.valueOf(req.getRecordId())).getData(); + data.setSerialnumber(req.getSerialnumber()); + data.setFreeAmount(new BigDecimal(req.getActualFee())); + data.setOrderAmount(new BigDecimal(req.getFee())); + BigDecimal subtract = data.getOrderAmount().subtract(data.getFreeAmount()); + if(BigDecimal.ZERO.compareTo(subtract) < 0){ + data.setTimeoutAmount(subtract); + data.setOutParkingType(1); + data.setStatus(3); + }else{ + data.setTimeoutAmount(BigDecimal.ZERO); + data.setOutParkingType(2); + data.setStatus(2); + } + parkingRecordClient.updateParkingRecord(data); + } +} diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/server/ParkingOrderService.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/server/ParkingOrderService.java new file mode 100644 index 0000000..bb2f544 --- /dev/null +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/server/ParkingOrderService.java @@ -0,0 +1,134 @@ +package com.ruoyi.integration.barrierGate.server; + +import com.ruoyi.account.api.feignClient.AppUserCarClient; +import com.ruoyi.chargingPile.api.feignClient.ParkingLotClient; +import com.ruoyi.chargingPile.api.feignClient.ParkingRecordClient; +import com.ruoyi.chargingPile.api.model.TParkingLot; +import com.ruoyi.chargingPile.api.model.TParkingRecord; +import com.ruoyi.chargingPile.api.vo.GetParkingRecord; +import com.ruoyi.integration.barrierGate.model.CloudParkingOrder; +import com.ruoyi.integration.barrierGate.model.CloudParkingSpace; +import com.ruoyi.integration.barrierGate.model.OfflineParkingOrder; +import com.ruoyi.integration.barrierGate.model.OfflineParkingSpace; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Date; + +/** + * @author zhibing.pu + * @Date 2024/9/5 16:15 + */ +@Service +public class ParkingOrderService { + + @Resource + private ParkingRecordClient parkingRecordClient; + + @Resource + private AppUserCarClient appUserCarClient; + + @Resource + private ParkingLotClient parkingLotClient; + + + + + + /** + * 云停车入场记录 + * @param order + */ + public void cloudParkingInOrder(CloudParkingOrder order) { + TParkingRecord parkingRecord = new TParkingRecord(); + parkingRecord.setLicensePlate(order.getPlate()); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + String code = "TC" + Math.random() * 1000 + sdf.format(new Date()); + parkingRecord.setCode(code); + parkingRecord.setVehicleColor(order.getPlateColor()); + TParkingLot data = parkingLotClient.getParkingLotByAppKey(order.getAppkey()).getData(); + parkingRecord.setParkingLotId(data.getId()); + parkingRecord.setInParkingTime(LocalDateTime.parse(order.getEnterDateTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + parkingRecord.setStatus(1); + parkingRecord.setCreateTime(LocalDateTime.now()); + parkingRecord.setSerialnumber(order.getId()); + parkingRecordClient.addParkingRecord(parkingRecord); + } + + + /** + * 云停车出场记录 + * @param order + */ + public void cloudParkingOutOrder(CloudParkingOrder order) { + GetParkingRecord query = new GetParkingRecord(); + query.setLicensePlate(order.getPlate()); + query.setStatus(1); + TParkingRecord parkingRecord = parkingRecordClient.getParkingRecord(query).getData(); + parkingRecord.setOutParkingTime(LocalDateTime.parse(order.getLeaveDateTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + parkingRecord.setParkingDuration(Integer.valueOf(order.getLongTime())); + parkingRecord.setOrderAmount(new BigDecimal(order.getReceivable())); + BigDecimal payment = new BigDecimal(order.getPayment()); + parkingRecord.setStatus(BigDecimal.ZERO.compareTo(payment) == 0 ? 2 : 3); + parkingRecordClient.updateParkingRecord(parkingRecord); + } + + + /** + * 云停车实时车位 + * @param parkingSpace + */ + public void cloudParkingSpace(CloudParkingSpace parkingSpace){ + + } + + + /** + * 线下停车场入场记录 + * @param order + */ + public void offlineParkingInOrder(OfflineParkingOrder order) { + TParkingRecord parkingRecord = new TParkingRecord(); + parkingRecord.setLicensePlate(order.getPlatenumber()); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + String code = "TC" + Math.random() * 1000 + sdf.format(new Date()); + parkingRecord.setCode(code); + parkingRecord.setVehicleColor(order.getPlatecolor()); + TParkingLot data = parkingLotClient.getParkingLotByAppKey(order.getAppkey()).getData(); + parkingRecord.setParkingLotId(data.getId()); + parkingRecord.setInParkingTime(LocalDateTime.parse(order.getEntertime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + parkingRecord.setStatus(1); + parkingRecord.setCreateTime(LocalDateTime.now()); + parkingRecord.setSerialnumber(order.getId()); + parkingRecordClient.addParkingRecord(parkingRecord); + } + + + /** + * 线下停车场出场记录 + * @param order + */ + public void offlineParkingOutOrder(OfflineParkingOrder order) { + GetParkingRecord query = new GetParkingRecord(); + query.setLicensePlate(order.getPlatenumber()); + query.setStatus(1); + TParkingRecord parkingRecord = parkingRecordClient.getParkingRecord(query).getData(); + parkingRecord.setOutParkingTime(LocalDateTime.parse(order.getLeavetime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + parkingRecord.setParkingDuration(Integer.valueOf(order.getLongTime())); + parkingRecord.setOrderAmount(new BigDecimal(order.getMoney())); + parkingRecordClient.updateParkingRecord(parkingRecord); + } + + + /** + * 线下停车场实时车位 + * @param parkingSpace + */ + public void offlineParkingSpace(OfflineParkingSpace parkingSpace){ + + } +} diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/UploadRealTimeMonitoringDataController.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/UploadRealTimeMonitoringDataController.java index aedff15..b3b1995 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/UploadRealTimeMonitoringDataController.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/UploadRealTimeMonitoringDataController.java @@ -9,6 +9,7 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -40,6 +41,25 @@ } return R.ok(); } + + /** + * 批量查询 + * @param orderId + * @return + */ + @PostMapping(value = "/getOrderInfoByCodes") + public R<List<UploadRealTimeMonitoringData>> getOrderInfoByCodes(@RequestParam("orderId") String orderId){ + List<UploadRealTimeMonitoringData> res = new ArrayList<>(); + for (String s : orderId.split(",")) { + List<UploadRealTimeMonitoringData> dataByOrderCode = uploadRealTimeMonitoringDataService.getDataByOrderCode(s); + if(dataByOrderCode.size() > 0){ + UploadRealTimeMonitoringData uploadRealTimeMonitoringData = dataByOrderCode.get(dataByOrderCode.size() - 1); + res.add(uploadRealTimeMonitoringData); + } + + } + return R.ok(res); + } /** diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/config/IotDAConfig.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/config/IotDAConfig.java index 27e04ad..c69b333 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/config/IotDAConfig.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/config/IotDAConfig.java @@ -20,15 +20,15 @@ */ private String sk; /** - * endpoint配置 938d8d39e2.iotda.cn-north-4.myhuaweicloud.com + * endpoint配置 94cb3eb5f9.st1.iotda-app.cn-south-1.myhuaweicloud.com */ private String endpoint; /** - * project_id配置 0cc59978c61e4b4da24e8c3d02937b45 + * project_id配置 f31c21e190e04fb0aebf8c0b1e7959cd */ private String projectId; /** - * Instance-Id配置 c60f266a-57a2-460c-a24e-eabda84602eb + * Instance-Id配置 d21a37d3-c578-43aa-a1ab-be3854e7c337 */ private String instanceId; diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/token/IotTokenUtil.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/token/IotTokenUtil.java index c2a2428..91d8a7f 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/token/IotTokenUtil.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/token/IotTokenUtil.java @@ -5,9 +5,9 @@ import com.huaweicloud.sdk.core.exception.ServiceResponseException; import com.huaweicloud.sdk.iam.v3.model.*; import com.ruoyi.common.redis.service.RedisService; -import com.ruoyi.integration.iotda.constant.IotConstant; import com.ruoyi.integration.iotda.builder.IotBuilder; import com.ruoyi.integration.iotda.config.IotAccountConfig; +import com.ruoyi.integration.iotda.constant.IotConstant; import com.ruoyi.integration.iotda.utils.time.UtcToSeconds; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargingBillController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargingBillController.java index d219870..4416b85 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargingBillController.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChargingBillController.java @@ -18,6 +18,7 @@ import com.ruoyi.order.api.model.TChargingBill; import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.query.TOrderInvoiceQuery; +import com.ruoyi.order.api.vo.AccountListVO; import com.ruoyi.order.api.vo.ChargingBillListVO; import com.ruoyi.order.api.vo.ChargingBillVO; import com.ruoyi.order.api.model.ChargingListQuery; @@ -66,7 +67,24 @@ @Resource private TChargingOrderService chargingOrderService; - + @PostMapping(value = "/accountBillList") + @ApiOperation(value = "列表查询", tags = {"管理后台-账户结算账单"}) + public R<AccountListVO> accountBillList(@RequestBody ChargingListQuery dto) { + AccountListVO accountListVO = new AccountListVO(); + ChargingBillVO res = chargingBillService.chargingBillList(dto); + dto.setPageCurr(1); + dto.setPageSize(99999999); + ChargingBillVO res1 = chargingBillService.chargingBillList(dto); + List<ChargingBillListVO> records = res1.getList().getRecords(); + accountListVO.setBillCount(records.size()); + accountListVO.setTotalAmount(res1.getPaymentAmount().subtract(res1.getRefundAmount()).subtract(res1.getCommissionAmount()).subtract(res1.getSharingAmount())); + accountListVO.setPaymentAmount(res1.getPaymentAmount()); + accountListVO.setRefundAmount(res1.getRefundAmount()); + accountListVO.setCommissionAmount(res1.getCommissionAmount()); + accountListVO.setSharingAmount(res1.getSharingAmount()); + accountListVO.setList(res.getList()); + return R.ok(accountListVO); + } @PostMapping(value = "/chargingBillList") @ApiOperation(value = "充电算帐单列表查询", tags = {"管理后台-充电算账单"}) public AjaxResult<ChargingBillVO> chargingBillList(@RequestBody ChargingListQuery dto) { diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/FinancialSettlementController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/FinancialSettlementController.java index 950f938..569f7f2 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/FinancialSettlementController.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/FinancialSettlementController.java @@ -1,27 +1,55 @@ package com.ruoyi.order.controller; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; 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.domain.R; +import com.ruoyi.common.core.utils.DateUtils; +import com.ruoyi.common.core.utils.WebUtils; import com.ruoyi.common.core.web.domain.AjaxResult; +import com.ruoyi.common.core.web.page.PageInfo; +import com.ruoyi.common.log.annotation.Log; +import com.ruoyi.common.log.enums.BusinessType; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.service.TokenService; +import com.ruoyi.order.api.dto.SettlementConfirmAdd; +import com.ruoyi.order.api.model.ChargingListQuery; +import com.ruoyi.order.api.model.TChargingOrder; +import com.ruoyi.order.api.model.TSettlementConfirm; +import com.ruoyi.order.api.query.SettlementListQuery; +import com.ruoyi.order.api.query.TOrderInvoiceQuery; +import com.ruoyi.order.api.vo.ChargingOrderListVO; +import com.ruoyi.order.api.vo.SettlementTotalVO; +import com.ruoyi.order.api.vo.TOrderInvoiceVO; +import com.ruoyi.order.export.OrderInvoiceExport; +import com.ruoyi.order.export.TChargingOrderExport; import com.ruoyi.order.vo.ChargingOrderListInfoVO; import com.ruoyi.order.api.vo.ChargingOrderTimeVO; -import com.ruoyi.order.api.model.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 io.swagger.annotations.ApiParam; +import org.apache.poi.ss.usermodel.Workbook; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.net.URLEncoder; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; /** * <p> @@ -38,59 +66,95 @@ @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 + private TSettlementConfirmService tSettlementConfirmService; @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); } + @ApiOperation(value = "充电时段统计-导出", tags = {"管理后台-财务结算"}) + @PostMapping("/export") + public void export(@RequestBody ChargingListQuery dto) + { + ChargingOrderTimeVO res = chargingOrderService.chargingList(dto); + List<TChargingOrderExport> tChargingOrderExports = new ArrayList<>(); + List<ChargingOrderListVO> exportList = res.getExportList(); + for (ChargingOrderListVO chargingOrderListVO : exportList) { + TChargingOrderExport tChargingOrderExport = new TChargingOrderExport(); + BeanUtils.copyProperties(chargingOrderListVO,tChargingOrderExport); + tChargingOrderExports.add(tChargingOrderExport); + + } + Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), TChargingOrderExport.class, tChargingOrderExports); + HttpServletResponse response = WebUtils.response(); + response.setContentType("application/vnd.ms-excel"); + response.setCharacterEncoding("utf-8"); + ServletOutputStream outputStream = null; + try { + String fileName = URLEncoder.encode("充电时段统计导出.xls", "utf-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + fileName); + response.setContentType("application/vnd.ms-excel;charset=UTF-8"); + response.setHeader("Pragma", "no-cache"); + response.setHeader("Cache-Control", "no-cache"); + outputStream = response.getOutputStream(); + workbook.write(outputStream); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + @GetMapping(value = "/settlementTotal") + @ApiOperation(value = "结算汇总-列表查询", tags = {"管理后台-财务结算"}) + @ApiParam(name = "time", value = "汇报时间2024-01-01 00:00:00") + public AjaxResult<SettlementTotalVO> settlementTotal(String time) { + SettlementTotalVO res = chargingOrderService.settlementTotal(time); + return AjaxResult.success(res); + } + @GetMapping(value = "/settlementTotalR") + public R<SettlementTotalVO> settlementTotalR( String time) { + SettlementTotalVO res = chargingOrderService.settlementTotal(time); + return R.ok(res); + } + @PostMapping(value = "/settlementAdd") + @ApiOperation(value = "结算确认表-生成/保存结算确认表", tags = {"管理后台-财务结算"}) + public R<TSettlementConfirm> settlementAdd(@RequestBody SettlementConfirmAdd dto) { + TSettlementConfirm res = chargingOrderService.settlementAdd(dto); + return R.ok(res); + } + @PostMapping(value = "/settlementList") + @ApiOperation(value = "结算表记录-列表查询", tags = {"管理后台-财务结算"}) + public R<PageInfo<TSettlementConfirm>> settlementList(@RequestBody SettlementListQuery dto) { + PageInfo<TSettlementConfirm> res = chargingOrderService.settlementList(dto); + return R.ok(res); + } + @GetMapping(value = "/downloadSettlement/{uid}") + public R<TSettlementConfirm> downloadSettlement(@PathVariable("uid") String uid) { + TSettlementConfirm byId = tSettlementConfirmService.getById(uid); + if (byId!=null){ + List<TChargingOrder> list = chargingOrderService.lambdaQuery().eq(TChargingOrder::getSiteId, byId.getSiteId()) + .between(TChargingOrder::getStartTime, byId.getStartTime(), byId.getEndTime()) + .eq(TChargingOrder::getStatus, 5) + .eq(TChargingOrder::getRechargePaymentStatus, 2).list(); + byId.setList(list); + String format = byId.getStartTime().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss")); + String format1 = byId.getEndTime().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss")); + byId.setTime(format+"至"+format1); + } + return R.ok(byId); + } + } diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java index 009e275..d12f4b6 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java @@ -41,6 +41,10 @@ import com.ruoyi.order.api.query.TChargingCountQuery; import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery; import com.ruoyi.order.api.vo.*; +import com.ruoyi.order.api.vo.ChargingOrderInfoVO; +import com.ruoyi.order.api.vo.ChargingOrderVO; +import com.ruoyi.order.api.vo.GetChargingOrderByLicensePlate; +import com.ruoyi.order.api.vo.TCharingOrderVO; import com.ruoyi.order.dto.GetMyChargingOrderList; import com.ruoyi.order.dto.GetNoInvoicedOrder; import com.ruoyi.order.dto.MyChargingOrderInfo; @@ -257,6 +261,13 @@ @PostMapping(value = "/pay/order/refund/list") @ApiOperation(value = "列表", tags = {"管理后台-支付订单-退款订单"}) public R<PageInfo<TChargingOrderRefund>> refundList(@RequestBody ChargingRefundDto chargingRefundDto) { + return chargingOrderService.getRefundList(chargingRefundDto); + + } + @ResponseBody + @PostMapping(value = "/pay/order/refund/list1") + @ApiOperation(value = "列表1", tags = {"管理后台-支付订单-退款订单"}) + public R<PageInfo<TChargingOrderRefund>> refundList1(@RequestBody ChargingRefundDto chargingRefundDto) { return chargingOrderService.getRefundList(chargingRefundDto); } @@ -921,4 +932,16 @@ public void excelEndCharge(@RequestParam("code") String code){ chargingOrderService.excelEndCharge(code); } + + + /** + * 根据车牌号和时间查询有效的充电数据 + * @param query + * @return + */ + @PostMapping("/getChargingOrderByLicensePlate") + public R<TChargingOrder> getChargingOrderByLicensePlate(@RequestBody GetChargingOrderByLicensePlate query){ + TChargingOrder chargingOrder = chargingOrderService.getChargingOrderByLicensePlate(query); + return R.ok(chargingOrder); + } } diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/TChargingOrderExport.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/TChargingOrderExport.java new file mode 100644 index 0000000..08c1165 --- /dev/null +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/TChargingOrderExport.java @@ -0,0 +1,159 @@ +package com.ruoyi.order.export; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +@ApiModel(value = "充电时段统计-导出") +public class TChargingOrderExport implements Serializable { + @Excel(name = "序号",width = 30) + private Integer id; + @Excel(name = "订单编号",width = 30) + private String code; + @Excel(name = "电站编号",width = 30) + private String siteCode; + @Excel(name = "电站名称",width = 30) + private String siteName; + @Excel(name = "终端名称",width = 30) + private String terminalName; + @Excel(name = "所属城市",width = 30) + private String city; + @Excel(name = "市区名称",width = 30) + private String cityName; + @Excel(name = "所属合作商",width = 30) + private String partner; + @Excel(name = "电站类型",width = 30,replace = {"其他_0","公共_1","个人_2","公交_3","环卫_4","物流_5","出租车_6"}) + private Integer siteType; + @Excel(name = "售电模式",width = 30,replace = {"正常使用_1","维修中_2","关闭下线_3"}) + private String saleType; + @Excel(name = "运营类型",width = 30,replace = {"直营_1","非直营_2"}) + private String businessCategory; + @Excel(name = "计费模板",width = 30) + private String name; + @Excel(name = "收款方式",width = 30,replace = {"线上_1","线下_2"}) + private String orderClassification; + @Excel(name = "充电启动方式",width = 30) + private String startType; + @Excel(name = "一级来源",width = 30) + private String one; + @Excel(name = "二级来源",width = 30) + private String two; + @Excel(name = "订单创建时间",width = 30) + private String createTime; + @Excel(name = "充电开始时间",width = 30) + private String startTime; + @Excel(name = "充电结束时间",width = 30) + private String endTime; + @Excel(name = "订单状态",width = 30,replace = {"待支付_1","已支付_2"}) + private String rechargePaymentStatus; + @Excel(name = "订单类型",width = 30) + private String type; + @Excel(name = "充电形式",width = 30) + private String chargingType; + @Excel(name = "判定结束原因",width = 30,replace = {"异常终止_0","主动终止_1","满电终止_2","费用不足终止_3"}) + private String endmode; + @Excel(name = "充电结束账号",width = 30) + private String chargingEndAccount; + @Excel(name = "是否是免费订单",width = 30) + private String isFree; + @Excel(name = "充电电费(元)",width = 30) + private String electrovalence; + @Excel(name = "充电服务费(元)",width = 30) + private String serviceCharge; + @Excel(name = "充电费用(元)",width = 30) + private String total; + @Excel(name = "充电电量(度)",width = 30) + private String chargingCapacity; + @Excel(name = "平均电费单价(元)",width = 30) + private String electrovalencePrice; + @Excel(name = "平均服务费实际单价(元)",width = 30) + private String serviceChargePrice; + @Excel(name = "平均服务费挂牌单价(元)",width = 30) + private String serviceChargePriceLook; + @Excel(name = "充电时长(分钟)",width = 30) + private String cumulativeChargingTime; + @Excel(name = "充电前面soc",width = 30) + private String startSoc; + @Excel(name = "充电后soc",width = 30) + private String endtSoc; + @Excel(name = "是否限制soc",width = 30) + private String isSoc; + @Excel(name = "限制soc方式",width = 30) + private String isSocType; + @Excel(name = "限制soc值",width = 30) + private String isSocNum; + @Excel(name = "客户类型",width = 30) + private String userType; + @Excel(name = "会员类型",width = 30) + private String vipType; + @Excel(name = "是否PLUS订单",width = 30) + private String isPlus; + @Excel(name = "客户编号",width = 30) + private String userCode; + @Excel(name = "真实姓名",width = 30) + private String realName; + @Excel(name = "设备号",width = 30) + private String deviceCode; + @Excel(name = "手机号",width = 30) + private String phone; + @Excel(name = "昵称",width = 30) + private String nickName; + @Excel(name = "企业编号",width = 30) + private String companyCode; + @Excel(name = "企业名称",width = 30) + private String companyName; + @Excel(name = "扣费账户类型",width = 30) + private String accountType; + @Excel(name = "使用人",width = 30) + private String useUser; + @Excel(name = "卡号",width = 30) + private String bankCard; + @Excel(name = "代充使用人",width = 30) + private String replaceUser; + @Excel(name = "车架号",width = 30) + private String carSiteName; + @Excel(name = "车架号来源",width = 30) + private String carSiteSource; + @Excel(name = "车牌号",width = 30) + private String carNumber; + @Excel(name = "发动机号",width = 30) + private String carEngineNumber; + @Excel(name = "车辆自编号",width = 30) + private String carNumberCode; + @Excel(name = "第三方商户订单",width = 30) + private String orderCode; + @Excel(name = "判定车牌号",width = 30) + private String carNumberSource; + @Excel(name = "是否单枪",width = 30) + private String isSingle; + @Excel(name = "选择车型",width = 30) + private String carType; + @Excel(name = "车辆品牌",width = 30) + private String carBrand; + @Excel(name = "判定车系",width = 30) + private String carSeries; + @Excel(name = "判定车系来源",width = 30) + private String carSeriesSource; + @Excel(name = "收款时间",width = 30) + private String payTime; + @Excel(name = "电费结算方编码",width = 30) + private String electrovalenceSiteCode; + @Excel(name = "电费结算方名称",width = 30) + private String electrovalenceSiteName; + @Excel(name = "管理公司",width = 30) + private String companyNameAdmin; + @Excel(name = "计费方式",width = 30) + private String moneyType; + @Excel(name = "设备接入方式",width = 30) + private String deviceType; + @Excel(name = "核算公司",width = 30) + private String settlementCompanyName; + @Excel(name = "预支付类型",width = 30) + private String prePaymentType; + @Excel(name = "是否安全防护订单",width = 30) + private String isSecurity; +} diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TSettlementConfirmMapper.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TSettlementConfirmMapper.java new file mode 100644 index 0000000..260ee56 --- /dev/null +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TSettlementConfirmMapper.java @@ -0,0 +1,33 @@ +package com.ruoyi.order.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.common.core.web.page.PageInfo; +import com.ruoyi.order.api.model.TSettlementConfirm; +import com.ruoyi.order.api.model.TVipOrder; +import com.ruoyi.order.api.query.SettlementListQuery; +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 javax.validation.constraints.Pattern; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.List; + +/** + * <p> + * Mapper 接口 + * </p> + * + * @author xiaochen + * @since 2024-08-07 + */ +@Mapper +public interface TSettlementConfirmMapper extends BaseMapper<TSettlementConfirm> { + + + List<TSettlementConfirm> settlementList(@Param("pageInfo") PageInfo<TSettlementConfirm> pageInfo, @Param("req") SettlementListQuery dto); + + List<TSettlementConfirm> settlementTotal(@Param("time") String time); +} diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java index 742f396..61aad66 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java @@ -6,13 +6,15 @@ import com.ruoyi.common.core.dto.ChargingPercentProvinceDto; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; +import com.ruoyi.order.api.dto.SettlementConfirmAdd; import com.ruoyi.order.api.model.ChargingListQuery; import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.model.TChargingOrderRefund; +import com.ruoyi.order.api.model.TSettlementConfirm; import com.ruoyi.order.api.query.ChargingOrderQuery; +import com.ruoyi.order.api.query.SettlementListQuery; import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery; -import com.ruoyi.order.api.vo.ChargingOrderTimeVO; -import com.ruoyi.order.api.vo.TCharingOrderVO; +import com.ruoyi.order.api.vo.*; import com.ruoyi.order.dto.*; import com.ruoyi.order.vo.ChargingOrderListInfoVO; import org.springframework.web.bind.annotation.RequestBody; @@ -183,4 +185,19 @@ Long getAver(List<Integer> siteIds); List<Map<String, Object>> getLevelEvaluate(List<Integer> siteIds); + + + /** + * 根据车牌号和开始时间查询充电数据 + * @param query + * @return + */ + TChargingOrder getChargingOrderByLicensePlate(GetChargingOrderByLicensePlate query); + + + TSettlementConfirm settlementAdd(SettlementConfirmAdd dto); + + PageInfo<TSettlementConfirm> settlementList(SettlementListQuery dto); + + SettlementTotalVO settlementTotal(String time); } diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TSettlementConfirmService.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TSettlementConfirmService.java new file mode 100644 index 0000000..f46e6dd --- /dev/null +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TSettlementConfirmService.java @@ -0,0 +1,24 @@ +package com.ruoyi.order.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.web.page.PageInfo; +import com.ruoyi.order.api.model.TSettlementConfirm; +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> + * 服务类 + * </p> + * + * @author xiaochen + * @since 2024-08-07 + */ +public interface TSettlementConfirmService extends IService<TSettlementConfirm> { + +} diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingBillServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingBillServiceImpl.java index e1cf6a0..e72db84 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingBillServiceImpl.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingBillServiceImpl.java @@ -80,6 +80,7 @@ BigDecimal sharingAmountTotal = new BigDecimal("0"); BigDecimal chargingCapacityTotal = new BigDecimal("0"); BigDecimal discountTotal = new BigDecimal("0"); + BigDecimal refundAmount = new BigDecimal("0"); int orderCount = 0; for (ChargingBillListVO chargingBillListVO : list) { String temp = ""; @@ -243,6 +244,9 @@ electrovalence = electrovalence.add(tChargingOrder.getElectrovalence()); electrovalenceTotal = electrovalenceTotal.add(tChargingOrder.getElectrovalence()); } + if (tChargingOrder.getRefundAmount()!=null && tChargingOrder.getRefundStatus() == 2){ + refundAmount = refundAmount.add(tChargingOrder.getRefundAmount()); + } // 累加累计服务费 if (tChargingOrder.getServiceCharge()!=null){ serviceCharge = serviceCharge.add(tChargingOrder.getServiceCharge()); diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java index 8bd83ae..3dbf5be 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java @@ -1,7 +1,9 @@ package com.ruoyi.order.service.impl; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -29,17 +31,17 @@ import com.ruoyi.integration.api.feignClient.*; import com.ruoyi.integration.api.model.*; import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply; +import com.ruoyi.order.api.dto.SettlementConfirmAdd; import com.ruoyi.order.api.feignClient.AccountingStrategyDetailOrderClient; import com.ruoyi.order.api.feignClient.ChargingOrderAccountingStrategyClient; import com.ruoyi.order.api.model.*; import com.ruoyi.order.api.query.ChargingOrderQuery; +import com.ruoyi.order.api.query.SettlementListQuery; 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.api.vo.*; import com.ruoyi.order.dto.*; import com.ruoyi.order.mapper.TChargingOrderMapper; +import com.ruoyi.order.mapper.TSettlementConfirmMapper; import com.ruoyi.order.service.TChargingOrderAccountingStrategyService; import com.ruoyi.order.service.TChargingOrderRefundService; import com.ruoyi.order.service.TChargingOrderService; @@ -50,6 +52,7 @@ import com.ruoyi.order.vo.ChargingOrderListInfoVO; import com.ruoyi.other.api.domain.TIntegralRule; import com.ruoyi.other.api.feignClient.IntegralRuleClient; +import com.ruoyi.other.api.feignClient.OtherClient; import com.ruoyi.other.api.feignClient.RoleSiteClient; import com.ruoyi.other.api.feignClient.UserSiteClient; import com.ruoyi.payment.api.feignClient.AliPaymentClient; @@ -59,6 +62,7 @@ import com.ruoyi.payment.api.model.WxPaymentRefundModel; import com.ruoyi.payment.api.vo.*; import com.ruoyi.system.api.feignClient.SysUserClient; +import com.sun.org.apache.bcel.internal.generic.NEW; import io.seata.spring.annotation.GlobalTransactional; import io.swagger.annotations.ApiModelProperty; import org.slf4j.Logger; @@ -96,10 +100,13 @@ @Resource private ChargingGunClient chargingGunClient; - + @Resource + private TSettlementConfirmMapper tSettlementConfirmMapper; + @Resource private SiteClient siteClient; - + + @Resource private AppUserCarClient appUserCarClient; @Resource @@ -107,7 +114,6 @@ @Resource private ChargingPileClient chargingPileClient; - @Resource private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService; @@ -120,7 +126,6 @@ @Resource private AliPaymentClient aliPaymentClient; - @Resource private AppCouponClient appCouponClient; @@ -440,7 +445,7 @@ chargingOrder.setVipDiscountAmount(discountAmount); } } - + } this.save(chargingOrder); @@ -592,7 +597,7 @@ preChargeCheck1.setFailureCause(failure_cause); //启动失败后取消订单,退款操作 refund(code); - order.setStatus(5); + order.setStatus(-1); order.setEndMode(0); }else{ preChargeCheck1.setStartupSuccess(2); @@ -639,7 +644,7 @@ 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"); + model.setNotify_url("http://221.182.45.100: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()); @@ -949,7 +954,7 @@ 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"); + model.setNotify_url("http://221.182.45.100:9000/order/t-charging-order/chargingOrderStartupFailureWxRefund"); WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount(); amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue()); amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue()); @@ -1240,6 +1245,7 @@ } // 不分页 List<ChargingOrderListVO> list1 = this.baseMapper.chargingList1(dto,startTime1,startTime2,endTime1,endTime2); + chargingOrderTimeVO.setExportList(list1); chargingOrderTimeVO.setOrderCount(list1.size()); // 计算充电总度数 BigDecimal electronic = new BigDecimal("0"); @@ -1350,7 +1356,6 @@ chargingOrderListInfoVO.setTerminalName(data2.getName()+data1.getName()); } chargingOrderListInfoVO.setEndMode(chargingOrder.getEndMode()); - // todo 周一完善 // 获取开始SOC 结束soc List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataClient.getDataByOrderCode(chargingOrder.getCode()).getData(); if (!data6.isEmpty()){ @@ -1648,7 +1653,7 @@ model.setOut_refund_no(chargingOrderRefund.getRefundCode()); model.setTransaction_id(tChargingOrder.getRechargeSerialNumber()); model.setReason("取消订单"); - model.setNotify_url("http://127.0.0.1:9000/order/t-shopping-order/cancelShoppingOrderWxRefund"); + model.setNotify_url("http://221.182.45.100:9000/order/t-shopping-order/cancelShoppingOrderWxRefund"); WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount(); amount.setRefund(payOrderQueryDto.getRefundAmount().multiply(new BigDecimal(100)).intValue()); amount.setTotal(tChargingOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue()); @@ -1684,4 +1689,347 @@ return null; } + + + /** + * 根据车牌号和开始时间查询充电数据 + * @param query + * @return + */ + @Override + public TChargingOrder getChargingOrderByLicensePlate(GetChargingOrderByLicensePlate query) { + TAppUserCar appUserCar = appUserCarClient.getAppUserCarByLicensePlate(query.getLicensePlate()).getData(); + if(null == appUserCar){ + return null; + } + TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserCarId, appUserCar.getId()) + .eq(TChargingOrder::getDelFlag, 0).gt(TChargingOrder::getStartTime, query.getStartTime()) + .eq(TChargingOrder::getRechargePaymentStatus, 2).ne(TChargingOrder::getStatus, -1)); + return one; + } + + @Override + public TSettlementConfirm settlementAdd(SettlementConfirmAdd dto) { + List<Site> data = siteClient.getSiteByIds(Arrays.asList(dto.getSiteId())).getData(); + TSettlementConfirm tSettlementConfirm = new TSettlementConfirm(); + if (!data.isEmpty()){ + tSettlementConfirm.setSiteName(data.get(0).getName()); + tSettlementConfirm.setPartnerId(data.get(0).getPartnerId()); + if (data.get(0).getPartnerId()!=null){ + Partner data1 = siteClient.getPartnerR(data.get(0).getPartnerId()).getData(); + if (data1!=null){ + tSettlementConfirm.setPartnerName(data1.getName()); + tSettlementConfirm.setPartnerId(data1.getId()); + } + } + } + String startTime = dto.getStartTime(); + String endTime = dto.getEndTime(); + // 将这两个时间转化为localDateTime + tSettlementConfirm.setStartTime(LocalDateTime.parse(startTime)); + tSettlementConfirm.setEndTime(LocalDateTime.parse(endTime)); + // 根据站点id和开始时间和结束时间和归属日期 查询充电订单列表 + QueryWrapper<TChargingOrder> eq = new QueryWrapper<TChargingOrder>() + .eq("site_id", dto.getSiteId()) + .eq("recharge_payment_status",2); + switch (dto.getType()){ + case 1: + eq.between("start_time", startTime, endTime); + break; + case 2: + eq.between("end_time", startTime, endTime); + break; + } + List<TChargingOrder> tChargingOrders = this.baseMapper.selectList(eq); + // 充电电量 度 + BigDecimal chargingElectronic = new BigDecimal("0"); + // 三方收费 分佣 + BigDecimal sharingAmount = new BigDecimal("0"); + // 三方交易手续费 三方收费*0.6% + BigDecimal commissionAmount = new BigDecimal("0"); + // 累计电费 + BigDecimal electrovalence = new BigDecimal("0"); + // 累计服务费 + BigDecimal serviceCharge = new BigDecimal("0"); + // 订单手续费 订单支付金额*0.6% + BigDecimal orderCommission = new BigDecimal("0"); + // 会员抵扣 + BigDecimal vipDiscount = new BigDecimal("0"); + // 优惠券抵扣 + BigDecimal couponDiscount = new BigDecimal("0"); + // 支付订单金额 需要减去退款金额 + BigDecimal paymentAmount = new BigDecimal("0"); + for (TChargingOrder tChargingOrder : tChargingOrders) { + // 累加充电总度数 + chargingElectronic = chargingElectronic.add(tChargingOrder.getChargingCapacity()); + // 累加分佣 + sharingAmount = sharingAmount.add(tChargingOrder.getSharingAmount()); + // 累加电费 + electrovalence = electrovalence.add(tChargingOrder.getElectrovalence()); + // 累加服务费 + serviceCharge = serviceCharge.add(tChargingOrder.getServiceCharge()); + // 累加会员折扣 + if (tChargingOrder.getVipDiscountAmount()!=null){ + vipDiscount = vipDiscount.add(tChargingOrder.getVipDiscountAmount()); + } + // 累加优惠券折扣 + if (tChargingOrder.getCouponDiscountAmount()!=null){ + couponDiscount = couponDiscount.add(tChargingOrder.getCouponDiscountAmount()); + } + if (tChargingOrder.getRefundStatus() == 2){ + // 如果成功退款 那么减去退款金额 + paymentAmount = paymentAmount.add(tChargingOrder.getPaymentAmount().subtract(tChargingOrder.getRefundAmount())); + }else{ + paymentAmount = paymentAmount.add(tChargingOrder.getPaymentAmount()); + } + } + // 三方交易手续费 三方收费*0.6% + commissionAmount = sharingAmount.multiply(new BigDecimal("0.006")); + // 订单手续费 订单支付金额 - 退款金额*0.6% + orderCommission = paymentAmount.multiply(new BigDecimal("0.006")); + tSettlementConfirm.setSharingAmount(sharingAmount); + tSettlementConfirm.setCommissionAmount(commissionAmount); + tSettlementConfirm.setElectrovalence(electrovalence); + // 服务费=总服务费-三费收费-交易手续费-交易手续费-服务费会员抵扣-服务费优惠券抵扣 + tSettlementConfirm.setServiceCharge(serviceCharge.subtract(commissionAmount).subtract(sharingAmount).subtract(orderCommission).subtract(vipDiscount).subtract(couponDiscount)); + tSettlementConfirm.setOrderCommission(orderCommission); + tSettlementConfirm.setVipDiscount(vipDiscount); + tSettlementConfirm.setCouponDiscount(couponDiscount); + tSettlementConfirm.setSiteId(dto.getSiteId()); + tSettlementConfirm.setMeteringElectronic(dto.getData().getMeteringElectronic()); + tSettlementConfirm.setChargingElectronic(chargingElectronic); + tSettlementConfirm.setLossElectronic(dto.getData().getLossElectronic()); + tSettlementConfirm.setIncome(chargingElectronic.add(serviceCharge)); + tSettlementConfirm.setVenue(dto.getData().getVenue()); + tSettlementConfirm.setMetering(dto.getData().getMetering()); + tSettlementConfirm.setClean(dto.getData().getClean()); + tSettlementConfirm.setMaintain(dto.getData().getMaintain()); + tSettlementConfirm.setCost(dto.getData().getVenue().add(dto.getData().getClean()).add(dto.getData().getMaintain())); + tSettlementConfirm.setProfitMoney(new BigDecimal("0")); + tSettlementConfirm.setNewMoney(new BigDecimal("0")); + tSettlementConfirm.setNewSettlement(new BigDecimal("0")); + tSettlementConfirm.setVipDiscount(vipDiscount); + tSettlementConfirm.setCouponDiscount(couponDiscount); + tSettlementConfirm.setSupplyElectronic(dto.getData().getSupplyElectronic()); + tSettlementConfirm.setType(dto.getType()); + tSettlementConfirm.setProportionPartner(dto.getData().getProportionPartner()); + tSettlementConfirm.setProportionMoney(dto.getData().getProportionMoney()); + tSettlementConfirm.setTotalElectronic(dto.getData().getTotalElectronic()); + tSettlementConfirm.setTotalService(dto.getData().getTotalService()); + tSettlementConfirm.setRemark(dto.getData().getRemark()); + tSettlementConfirm.setServicePartner(dto.getData().getServicePartner()); + tSettlementConfirm.setServiceMoney(dto.getData().getServiceMoney()); + tSettlementConfirm.setTotalService(dto.getData().getTotalService()); + tSettlementConfirm.setServiceRemark(dto.getData().getServiceRemark()); + tSettlementConfirm.setDistribution(dto.getData().getDistribution()); + tSettlementConfirm.setIncome(dto.getData().getElectrovalence().add(dto.getData().getServiceCharge())); + if (dto.getState() == 2){ + tSettlementConfirmMapper.insert(tSettlementConfirm); + } + return tSettlementConfirm; + } + + @Override + public PageInfo<TSettlementConfirm> settlementList(SettlementListQuery dto) { + PageInfo<TSettlementConfirm> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize()); + List<TSettlementConfirm> list = tSettlementConfirmMapper.settlementList(pageInfo,dto); + for (TSettlementConfirm tSettlementConfirm : list) { + tSettlementConfirm.setUid(tSettlementConfirm.getId().toString()); + Partner data = siteClient.getPartnerR(tSettlementConfirm.getPartnerId()).getData(); + List<Site> data1 = siteClient.getSiteByIds(Arrays.asList(tSettlementConfirm.getSiteId())).getData(); + if (!data1.isEmpty()){ + tSettlementConfirm.setSiteName(data1.get(0).getName()); + } + if (data!=null){ + tSettlementConfirm.setPartnerName(data.getName()); + } + String format = tSettlementConfirm.getStartTime().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss")); + String format1 = tSettlementConfirm.getEndTime().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss")); + tSettlementConfirm.setTime(format+"至"+format1); + + + } + pageInfo.setRecords(list); + return null; + } + + @Override + public SettlementTotalVO settlementTotal(String time) { + SettlementTotalVO res = new SettlementTotalVO(); + List<TSettlementConfirm> list1 = tSettlementConfirmMapper.settlementTotal(time); + LocalDateTime parse = LocalDateTime.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + // 减少一个月 + LocalDateTime minus = parse.minusMonths(1); + List<TSettlementConfirm> list2 = tSettlementConfirmMapper.settlementTotal(time); + // 合计 + List<TSettlementConfirm> total = new ArrayList<>(); + + TSettlementConfirm tSettlementConfirm1 = new TSettlementConfirm(); + BigDecimal meteringElectronic = new BigDecimal("0"); + BigDecimal chargingElectronic = new BigDecimal("0"); + BigDecimal lossElectronic = new BigDecimal("0"); + BigDecimal income = new BigDecimal("0"); + BigDecimal venue = new BigDecimal("0"); + BigDecimal metering = new BigDecimal("0"); + BigDecimal clean = new BigDecimal("0"); + BigDecimal maintain = new BigDecimal("0"); + BigDecimal cost = new BigDecimal("0"); + BigDecimal profitMoney = new BigDecimal("0"); + BigDecimal newMoney = new BigDecimal("0"); + BigDecimal newSettlement = new BigDecimal("0"); + BigDecimal supplyElectronic = new BigDecimal("0"); + BigDecimal proportionPartner = new BigDecimal("0"); + BigDecimal proportionMoney = new BigDecimal("0"); + BigDecimal totalElectronic = new BigDecimal("0"); + BigDecimal totalService = new BigDecimal("0"); + BigDecimal servicePartner = new BigDecimal("0"); + BigDecimal serviceMoney = new BigDecimal("0"); + BigDecimal sharingAmount = new BigDecimal("0"); + BigDecimal commissionAmount = new BigDecimal("0"); + BigDecimal electrovalence = new BigDecimal("0"); + BigDecimal serviceCharge = new BigDecimal("0"); + BigDecimal orderCommission = new BigDecimal("0"); + BigDecimal vipDiscount = new BigDecimal("0"); + BigDecimal couponDiscount = new BigDecimal("0"); +// tSettlementConfirm1.setIncomePercentage(); +// tSettlementConfirm1.setTotalPercentage(); + tSettlementConfirm1.setElectronicRefund(0); +// 上月成本合计 + BigDecimal beforeCost= new BigDecimal("0"); + // 上月利润合计 + BigDecimal beforeIncome= new BigDecimal("0"); + for (TSettlementConfirm tSettlementConfirm : list1) { + List<Site> data1 = siteClient.getSiteByIds(Arrays.asList(tSettlementConfirm.getSiteId())).getData(); + if (!data1.isEmpty()){ + tSettlementConfirm.setSiteName(data1.get(0).getName()); + } + meteringElectronic = meteringElectronic.add(tSettlementConfirm.getMeteringElectronic()); + chargingElectronic = chargingElectronic.add(tSettlementConfirm.getChargingElectronic()); + lossElectronic = lossElectronic.add(tSettlementConfirm.getLossElectronic()); + income = income.add(tSettlementConfirm.getIncome()); + venue = venue.add(tSettlementConfirm.getVenue()); + metering = metering.add(tSettlementConfirm.getMetering()); + clean = clean.add(tSettlementConfirm.getClean()); + maintain = maintain.add(tSettlementConfirm.getMaintain()); + cost = cost.add(tSettlementConfirm.getCost()); + profitMoney = profitMoney.add(tSettlementConfirm.getProfitMoney()); + newMoney = newMoney.add(tSettlementConfirm.getNewMoney()); + newSettlement = newSettlement.add(tSettlementConfirm.getNewSettlement()); + supplyElectronic = supplyElectronic.add(tSettlementConfirm.getSupplyElectronic()); + proportionPartner = proportionPartner.add(tSettlementConfirm.getProportionPartner()); + proportionMoney = proportionMoney.add(tSettlementConfirm.getProportionMoney()); + totalElectronic = totalElectronic.add(tSettlementConfirm.getTotalElectronic()); + totalService = totalService.add(tSettlementConfirm.getTotalService()); + servicePartner = servicePartner.add(tSettlementConfirm.getServicePartner()); + serviceMoney = serviceMoney.add(tSettlementConfirm.getServiceMoney()); + sharingAmount = sharingAmount.add(tSettlementConfirm.getSharingAmount()); + commissionAmount = commissionAmount.add(tSettlementConfirm.getCommissionAmount()); + electrovalence = electrovalence.add(tSettlementConfirm.getElectrovalence()); + serviceCharge = serviceCharge.add(tSettlementConfirm.getServiceCharge()); + orderCommission = orderCommission.add(tSettlementConfirm.getOrderCommission()); + vipDiscount = vipDiscount.add(tSettlementConfirm.getVipDiscount()); + couponDiscount = couponDiscount.add(tSettlementConfirm.getCouponDiscount()); + + // 查询结算确认单开始时间和结束时间的单子 + QueryWrapper<TChargingOrder> eq = new QueryWrapper<TChargingOrder>() + .eq("site_id", tSettlementConfirm.getSiteId()) + .eq("recharge_payment_status",2); + switch (tSettlementConfirm.getType()){ + case 1: + eq.between("start_time", tSettlementConfirm.getStartTime(), tSettlementConfirm.getEndTime()); + break; + case 2: + eq.between("end_time", tSettlementConfirm.getStartTime(), tSettlementConfirm.getEndTime()); + break; + } + List<TChargingOrder> tChargingOrders = this.baseMapper.selectList(eq); + Map<String,TChargingOrder> map = new HashMap<>(); + StringBuilder stringBuilder = new StringBuilder(); + for (TChargingOrder tChargingOrder : tChargingOrders) { + stringBuilder.append(tChargingOrder.getCode()).append(","); + } + Long temp = 0L; + if (StringUtils.hasLength(stringBuilder.toString())){ + List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataClient.getOrderInfoByCodes(stringBuilder.substring(0,stringBuilder.length()-1)).getData(); + temp+=data6.stream().mapToLong(UploadRealTimeMonitoringData::getCumulative_charging_time).sum(); + } + List<TChargingPile> data = siteClient.getPileListBySiteId(tSettlementConfirm.getSiteId()).getData(); + // 计算充电桩的功率平均值 + BigDecimal bigDecimal = new BigDecimal("0"); + for (TChargingPile datum : data) { + bigDecimal = bigDecimal.add(datum.getRatedPower()); + } + BigDecimal bigDecimal1 = bigDecimal.divide(new BigDecimal(data.size())).setScale(2, RoundingMode.HALF_DOWN); + + tSettlementConfirm.setIncome(tSettlementConfirm.getElectrovalence().add(tSettlementConfirm.getServiceCharge())); + // todo 计算利用率 该电站充电桩本月利用率: + //利用率=充电量/(桩数量*功率*时间) + + for (TSettlementConfirm settlementConfirm : list2) { + settlementConfirm.setIncome(settlementConfirm.getElectrovalence().add(settlementConfirm.getServiceCharge())); + if (tSettlementConfirm.getSiteId().equals(settlementConfirm.getSiteId())){ + // 电站相同比较收入涨幅跌幅 + BigDecimal subtract = tSettlementConfirm.getIncome().subtract(settlementConfirm.getIncome()).divide(tSettlementConfirm.getIncome()).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100")); + tSettlementConfirm.setIncomePercentage(subtract+"%"); + // 比较总利润 收入合计-成本合计 + BigDecimal subtract1 = tSettlementConfirm.getIncome().subtract(tSettlementConfirm.getCost()); + BigDecimal subtract2 = settlementConfirm.getIncome().subtract(settlementConfirm.getCost()); + tSettlementConfirm.setTotalPercentage(subtract1.subtract(subtract2).divide(subtract2).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"))+"%"); + } + beforeCost = beforeCost.add(settlementConfirm.getCost()); + beforeIncome = beforeIncome.add(settlementConfirm.getIncome()); + + + } + } + TSettlementConfirm tSettlementConfirm = new TSettlementConfirm(); + tSettlementConfirm.setMeteringElectronic(meteringElectronic); + tSettlementConfirm.setChargingElectronic(chargingElectronic); + tSettlementConfirm.setLossElectronic(lossElectronic); + tSettlementConfirm.setIncome(income); + tSettlementConfirm.setVenue(venue); + tSettlementConfirm.setMetering(metering); + tSettlementConfirm.setClean(clean); + tSettlementConfirm.setMaintain(maintain); + tSettlementConfirm.setCost(cost); + tSettlementConfirm.setProfitMoney(profitMoney); + tSettlementConfirm.setNewMoney(newMoney); + tSettlementConfirm.setNewSettlement(newSettlement); + tSettlementConfirm.setSupplyElectronic(supplyElectronic); + tSettlementConfirm.setProportionPartner(proportionPartner); + tSettlementConfirm.setProportionMoney(proportionMoney); + tSettlementConfirm.setTotalElectronic(totalElectronic); + tSettlementConfirm.setTotalService(totalService); + tSettlementConfirm.setServicePartner(servicePartner); + tSettlementConfirm.setServiceMoney(serviceMoney); + tSettlementConfirm.setSharingAmount(sharingAmount); + tSettlementConfirm.setCommissionAmount(commissionAmount); + tSettlementConfirm.setElectrovalence(electrovalence); + tSettlementConfirm.setServiceCharge(serviceCharge); + tSettlementConfirm.setOrderCommission(orderCommission); + tSettlementConfirm.setVipDiscount(vipDiscount); + tSettlementConfirm.setCouponDiscount(couponDiscount); + // 本月 + BigDecimal subtract = income.subtract(beforeIncome).divide(beforeIncome).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100")); + tSettlementConfirm.setIncomePercentage(subtract+"%"); + // 比较总利润 收入合计-成本合计 + BigDecimal subtract1 = income.subtract(cost); + BigDecimal subtract2 = beforeIncome.subtract(beforeCost); + tSettlementConfirm.setTotalPercentage(subtract1.subtract(subtract2).divide(subtract2).setScale(2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100"))+"%"); + tSettlementConfirm.setIncomePercentage(subtract+"%"); + tSettlementConfirm.setElectronicRefund(0); + // 查询上次汇报数据 进行比对涨幅跌幅 + total.add(tSettlementConfirm); + res.setList1(list1); + res.setList2(total); + return res; + } + + public static void main(String[] args) { +// String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss")); +// String format1 = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss")); +// System.err.println(format+"至"+format1); +// LocalDateTime parse = LocalDateTime.parse("2024-01-12 00:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); +// System.err.println(parse.format(DateTimeFormatter.ofPattern("yyyy-dd"))); + } } diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TSettlementConfirmServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TSettlementConfirmServiceImpl.java new file mode 100644 index 0000000..c1f0076 --- /dev/null +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TSettlementConfirmServiceImpl.java @@ -0,0 +1,34 @@ +package com.ruoyi.order.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.core.web.page.PageInfo; +import com.ruoyi.order.api.model.TSettlementConfirm; +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.TSettlementConfirmMapper; +import com.ruoyi.order.mapper.TVipOrderMapper; +import com.ruoyi.order.service.TSettlementConfirmService; +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 javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.List; + +/** + * <p> + * 服务实现类 + * </p> + * + * @author xiaochen + * @since 2024-08-07 + */ +@Service +public class TSettlementConfirmServiceImpl extends ServiceImpl<TSettlementConfirmMapper, TSettlementConfirm> implements TSettlementConfirmService { + +} diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java index e3ba3e6..cb41922 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java @@ -364,7 +364,7 @@ model.setTransaction_id(shoppingOrder.getSerialNumber()); model.setOut_refund_no(shoppingOrderRefund.getRefundCode()); model.setReason("取消订单"); - model.setNotify_url("http://127.0.0.1:9000/order/t-shopping-order/cancelShoppingOrderWxRefund"); + model.setNotify_url("http://221.182.45.100:9000/order/t-shopping-order/cancelShoppingOrderWxRefund"); WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount(); amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue()); amount.setTotal(shoppingOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue()); diff --git a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml index 4db7a40..af8dd8f 100644 --- a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml +++ b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml @@ -778,5 +778,78 @@ score_range </select> - + <select id="chargingList" resultType="com.ruoyi.order.api.vo.ChargingOrderListVO"> + select t1.* from t_charging_order t1 + where 1=1 + <if test="null != req.code and req.code!=''"> + and t1.code LIKE CONCAT('%',#{req.code},'%') + </if> + <if test="null != req.carIds and req.carIds.size()>0" > + and t1.app_user_car_id in + <foreach collection="req.carIds" item="item" index="index" separator="," open="(" close=")"> + #{item} + </foreach> + </if> + <if test="null != req.userIds and req.userIds.size()>0" > + and t1.app_user_id in + <foreach collection="req.userIds" item="item" index="index" separator="," open="(" close=")"> + #{item} + </foreach> + </if> + <if test="req.orderType != null "> + and t1.order_type = #{req.orderType} + </if> + <if test="req.status != null "> + and t1.status = #{status} + </if> + <if test="req.status != null "> + and t1.status = #{req.status} + </if> + <if test="req.siteId != null "> + and t1.site_id = #{req.siteId} + </if> + <if test="startTime1 != null and startTime1!=''"> + and (t1.start_time between #{startTime1} and #{startTime2}) + </if> + <if test="endTime1 != null and endTime1!=''"> + and (t1.end_time between #{endTime1} and #{endTime2}) + </if> + </select> + <select id="chargingList1" resultType="com.ruoyi.order.api.vo.ChargingOrderListVO"> + select t1.* from t_charging_order t1 + where 1=1 + <if test="null != req.code and req.code!=''"> + and t1.code LIKE CONCAT('%',#{req.code},'%') + </if> + <if test="null != req.carIds and req.carIds.size()>0" > + and t1.app_user_car_id in + <foreach collection="req.carIds" item="item" index="index" separator="," open="(" close=")"> + #{item} + </foreach> + </if> + <if test="null != req.userIds and req.userIds.size()>0" > + and t1.app_user_id in + <foreach collection="req.userIds" item="item" index="index" separator="," open="(" close=")"> + #{item} + </foreach> + </if> + <if test="req.orderType != null "> + and t1.order_type = #{req.orderType} + </if> + <if test="req.status != null "> + and t1.status = #{status} + </if> + <if test="req.status != null "> + and t1.status = #{req.status} + </if> + <if test="req.siteId != null "> + and t1.site_id = #{req.siteId} + </if> + <if test="startTime1 != null and startTime1!=''"> + and (t1.start_time between #{startTime1} and #{startTime2}) + </if> + <if test="endTime1 != null and endTime1!=''"> + and (t1.end_time between #{endTime1} and #{endTime2}) + </if> + </select> </mapper> diff --git a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TSettlementConfirmMapper.xml b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TSettlementConfirmMapper.xml new file mode 100644 index 0000000..00179ec --- /dev/null +++ b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TSettlementConfirmMapper.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.ruoyi.order.mapper.TSettlementConfirmMapper"> + <select id="settlementTotal" resultType="com.ruoyi.order.api.model.TSettlementConfirm"> + select t1.* from + t_settlement_confirm t1 + where 1=1 + <if test="time != null and time!='' "> + AND DATE_FORMAT(t1.start_time, '%Y-%m') = DATE_FORMAT(#{time}, '%Y-%m') + </if> + </select> + <select id="settlementList" resultType="com.ruoyi.order.api.model.TSettlementConfirm"> +select t1.* from + t_settlement_confirm t1 +where 1=1 + <if test="req.type != null "> + and t1.type = #{req.type} + </if> + <if test="req.partnerId != null "> + and t1.partnerId = #{req.partnerId} + </if> + <if test="req.type == 1 "> + <if test="req.startTime != null and req.startTime!=''"> + and (t1.start_time between #{req.startTime} and #{req.endTime} + </if> + </if> + <if test="req.siteIds != null and req.siteIds.size() > 0"> + AND t1.site_id IN + <foreach collection="req.siteIds" item="siteId" open="(" separator="," close=")"> + #{siteId} + </foreach> + </if> + <if test="req.type == 2 "> + <if test="req.startTime != null and req.startTime!=''"> + and (t1.end_time between #{req.startTime} and #{req.endTime} + </if> + </if> + </select> +</mapper> diff --git a/ruoyi-service/ruoyi-payment/src/main/resources/bootstrap.yml b/ruoyi-service/ruoyi-payment/src/main/resources/bootstrap.yml index fe9bde5..f72b520 100644 --- a/ruoyi-service/ruoyi-payment/src/main/resources/bootstrap.yml +++ b/ruoyi-service/ruoyi-payment/src/main/resources/bootstrap.yml @@ -24,6 +24,7 @@ namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb username: nacos password: nacos + ip: 192.168.110.85 config: # 配置中心地址 server-addr: 192.168.110.169:8848 diff --git a/ruoyi-service/ruoyi-payment/src/main/resources/cert/apiclient_cert.p12 b/ruoyi-service/ruoyi-payment/src/main/resources/cert/apiclient_cert.p12 new file mode 100644 index 0000000..735b354 --- /dev/null +++ b/ruoyi-service/ruoyi-payment/src/main/resources/cert/apiclient_cert.p12 Binary files differ diff --git a/ruoyi-service/ruoyi-payment/src/main/resources/cert/apiclient_cert.pem b/ruoyi-service/ruoyi-payment/src/main/resources/cert/apiclient_cert.pem new file mode 100644 index 0000000..7420c3f --- /dev/null +++ b/ruoyi-service/ruoyi-payment/src/main/resources/cert/apiclient_cert.pem @@ -0,0 +1,25 @@ +-----BEGIN CERTIFICATE----- +MIIEKzCCAxOgAwIBAgIUIsATxGnBh2MW3lonXTp5a2bosAMwDQYJKoZIhvcNAQEL +BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT +FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg +Q0EwHhcNMjQwOTAzMDYzNDQxWhcNMjkwOTAyMDYzNDQxWjCBhDETMBEGA1UEAwwK +MTY4NDU4NDUxNDEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMTAwLgYDVQQL +DCflm5vlt53mmI7mmJ/mlrDog73mupDnp5HmioDmnInpmZDlhazlj7gxCzAJBgNV +BAYTAkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAOyWeURxCZuskSTY7r6dbxTfu1gRdTd2K2PwZnkFy6LBvYTC3Mrw +NK76azRC+QcQAcXRMmZPyeIMNDiD0JUeB4IegjFWxusLSgjvTlCMFL1W62B78cBa +87y7ld8t+P0FIHAUdhe5B5K3VYS7QT89vJ0yiHyAkIZv5QEsH9Tv935MESdD4xVe +YNQ+2wN4MZgCxfh8B5zPi++TA94lmf0ZZWqLEVhFd2ov2C1XToxtfxdhct0o0OG3 +PJYDpaVyYFDNZpzcz9e2WrSfRJHPB81qWY95LWJslszOfGjV4iYdk4kodIW7xPsD +2/HIJl6/VJPHT6McT1b5wWig8N0vcmkTdMsCAwEAAaOBuTCBtjAJBgNVHRMEAjAA +MAsGA1UdDwQEAwID+DCBmwYDVR0fBIGTMIGQMIGNoIGKoIGHhoGEaHR0cDovL2V2 +Y2EuaXRydXMuY29tLmNuL3B1YmxpYy9pdHJ1c2NybD9DQT0xQkQ0MjIwRTUwREJD +MDRCMDZBRDM5NzU0OTg0NkMwMUMzRThFQkQyJnNnPUhBQ0M0NzFCNjU0MjJFMTJC +MjdBOUQzM0E4N0FEMUNERjU5MjZFMTQwMzcxMA0GCSqGSIb3DQEBCwUAA4IBAQCR +URHWNrcvXLHvo+o/+qNPT/DNGuHiwL+zMRUGVjlTYNG7KQuB6jrByuRa99VW4H/f +6EHvUCn1j85NfyWD3uFD0uhWtnS/kpULVfKDPq27buhozmLndqVK/BgmYk6AW3gP +m4FV1wIy9p3Rmm6WQWWanoXPYIG0TAk5/iTNH/oE1EAzFFITGZxlk2tgv2cTCQam +IJpfrhIILHiXyTtCShYd0Y9Ip5oLm0keHQ6YyNOV2M9DO0fXpZT33VykpVr8oTqJ +zDISrxyDGXV+1dkgoZ1ZqTmojhRt8VYw5LyVC9PLAo2nUnt8XeFcitXa/5wzJA1r +tEymp0l3CDmY3XwQL9py +-----END CERTIFICATE----- diff --git a/ruoyi-service/ruoyi-payment/src/main/resources/cert/apiclient_key.pem b/ruoyi-service/ruoyi-payment/src/main/resources/cert/apiclient_key.pem new file mode 100644 index 0000000..8cab68d --- /dev/null +++ b/ruoyi-service/ruoyi-payment/src/main/resources/cert/apiclient_key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDslnlEcQmbrJEk +2O6+nW8U37tYEXU3ditj8GZ5Bcuiwb2EwtzK8DSu+ms0QvkHEAHF0TJmT8niDDQ4 +g9CVHgeCHoIxVsbrC0oI705QjBS9Vutge/HAWvO8u5XfLfj9BSBwFHYXuQeSt1WE +u0E/PbydMoh8gJCGb+UBLB/U7/d+TBEnQ+MVXmDUPtsDeDGYAsX4fAecz4vvkwPe +JZn9GWVqixFYRXdqL9gtV06MbX8XYXLdKNDhtzyWA6WlcmBQzWac3M/Xtlq0n0SR +zwfNalmPeS1ibJbMznxo1eImHZOJKHSFu8T7A9vxyCZev1STx0+jHE9W+cFooPDd +L3JpE3TLAgMBAAECggEAC80RrXVJ+mboMoNTnVRzBwKF8MWmKCcP0QNbySud1bd+ +QZIKu2Cx8Axzrn6st0p4HCrsLahLNKhRLoR8sgN2cmodKmLetziv77QoHuJt4mfk +g8KK84JV6BMfTauYYN6RmKWcomBLXWkhreY9Qe9NajXsEvHCw8HvFVjjGZcCrFz8 +bG3ULntgqu0UOK/Vue75uzo/6K1ltp7Zjo20OwwYkUef51X+lPtRdoYsny3hw/NR +KzqGr5wjCd+bA2B3oUDpwxotyDuk2JCbdKtqsmabzbLyl+04MkAx3O7XCN+RGeeK +G1H1/YMl+Ddim/1dyBOo4eVAosPEj4sP4Tfzqv8xcQKBgQD44hyEBc71yHDnwmLA +CVgmKmvMa2IR1TmvCo2k+6Dc/KvygaNKZVbcWMeYylAKJmCgLvX8HLFMyNoKGeCf +UTNotx+zQVjizf7S++dSkKEYTwbybZXqSmvWnNDFGzeHHxUjVHcGU2Dki/Uzt9Dh +w7wE0HC+5iGBeFS89OfSwBX9wwKBgQDzWls+dXpXNaSDDWTRqd0pTcpx8D+iWoUr +/qT5QQi8Aclp8TBlU6L+CQ70YTRT/EYKeUivy8WXnzi7BxtswdmASOK1z3/DOFkt +vwdRK3SVkay0vZC7bhJypkwQ7T/ztZiGJFeD4lv6gGwPcPoOdgedZeKTVkP7FB2T +CKK1b0kUWQKBgDenYFcJcXk2pEC/EBP/Qu3t6IMitCBmvOpugrQU7Kjd+5lT8e7N +8Hl/hMqe2v0aDdtkBO+mfuM7ur4tgTQ/FS7iXD1abITzKXuGhvjIjK2B5nzJko98 +qtan5GtfJbCae8CVv7PzayRQQ7mX7ia9/UpaTgvyLCXmgZRrc3eGKqS/AoGBALfw +FAehxFcmtLJZ7VqMih4uLlbwwSh2QzJ9xzSfc3qn3xW0uF/eV9SsBCGzV1oj1M0V +31sBKtjwAHFdbd1GqJ/Od430yR1F+iIZwe4YaoajFWeH4V3KVSdTiytAKJaNLDw4 +O+3zqpItf4AsZNWJYTgXSqsTCU8+ZRw96r4434QBAoGAODEiTnmiMwwiZR12h61o +HMeUi+w7loQkmN6SEmEg0zppvYWOV2LXK9lg/OkGDoSLokUdod/dA60JIG8LEfLM +sGFK/5K+qkTqOPQKlhE7nerqhF4S95lsXy3r2OKv4Cc7mvN8pTZTOIYbEXGrNOvZ +MO5cc2vaWSI6Xm4HoqBe12o= +-----END PRIVATE KEY----- diff --git "a/ruoyi-service/ruoyi-payment/src/main/resources/cert/\350\257\201\344\271\246\344\275\277\347\224\250\350\257\264\346\230\216.txt" "b/ruoyi-service/ruoyi-payment/src/main/resources/cert/\350\257\201\344\271\246\344\275\277\347\224\250\350\257\264\346\230\216.txt" new file mode 100644 index 0000000..9a0aab1 --- /dev/null +++ "b/ruoyi-service/ruoyi-payment/src/main/resources/cert/\350\257\201\344\271\246\344\275\277\347\224\250\350\257\264\346\230\216.txt" @@ -0,0 +1,18 @@ +欢迎使用微信支付! +附件中的三份文件(证书pkcs12格式、证书pem格式、证书密钥pem格式),为接口中强制要求时需携带的证书文件。 +证书属于敏感信息,请妥善保管不要泄露和被他人复制。 +不同开发语言下的证书格式不同,以下为说明指引: + 证书pkcs12格式(apiclient_cert.p12) + 包含了私钥信息的证书文件,为p12(pfx)格式,由微信支付签发给您用来标识和界定您的身份 + 部分安全性要求较高的API需要使用该证书来确认您的调用身份 + windows上可以直接双击导入系统,导入过程中会提示输入证书密码,证书密码默认为您的商户号(如:1900006031) + 证书pem格式(apiclient_cert.pem) + 从apiclient_cert.p12中导出证书部分的文件,为pem格式,请妥善保管不要泄漏和被他人复制 + 部分开发语言和环境,不能直接使用p12文件,而需要使用pem,所以为了方便您使用,已为您直接提供 + 您也可以使用openssl命令来自己导出:openssl pkcs12 -clcerts -nokeys -in apiclient_cert.p12 -out apiclient_cert.pem + 证书密钥pem格式(apiclient_key.pem) + 从apiclient_cert.p12中导出密钥部分的文件,为pem格式 + 部分开发语言和环境,不能直接使用p12文件,而需要使用pem,所以为了方便您使用,已为您直接提供 + 您也可以使用openssl命令来自己导出:openssl pkcs12 -nocerts -in apiclient_cert.p12 -out apiclient_key.pem +备注说明: + 由于绝大部分操作系统已内置了微信支付服务器证书的根CA证书, 2018年3月6日后, 不再提供CA证书文件(rootca.pem)下载 \ No newline at end of file -- Gitblit v1.7.1