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()); } }; } } 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); } 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()); } }; } } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ParkingRecordFallbackFactory.java
New file @@ -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) { } }; } } 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()); } }; } } 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); } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ParkingRecordClient.java
New file @@ -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); } 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); } 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; } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/query/ParkingRecordQuery.java
New file @@ -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; } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/GetParkingRecord.java
New file @@ -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; } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/TParkingRecordPageInfoVO.java
New file @@ -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; } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/TParkingRecordVO.java
New file @@ -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; } 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 com.ruoyi.chargingPile.api.factory.AccountingStrategyFallbackFactory com.ruoyi.chargingPile.api.factory.ParkingRecordFallbackFactory 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()); 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 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/dto/SettlementConfirmAdd.java
New file @@ -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; } 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()); } }; } } 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()); } }; } 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); } 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); } 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; } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TSettlementConfirm.java
New file @@ -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; } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/SettlementListQuery.java
New file @@ -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; } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/AccountListVO.java
New file @@ -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; } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/AccountVO.java
New file @@ -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; } 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; } 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 = "累计服务费") 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; } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/GetChargingOrderByLicensePlate.java
New file @@ -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; } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/SettlementTotalVO.java
New file @@ -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; } 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); 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(); 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) { 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); } } 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); } 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); } } } 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); } 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 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) 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); } } 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); } } 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); } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/export/TParkingRecordExport.java
New file @@ -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; } 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> { 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); } 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); } 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); } 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); } 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); } 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; } } 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> 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> ruoyi-service/ruoyi-chargingPile/src/main/resources/template/账户结算账单.xlsxBinary files differ
ruoyi-service/ruoyi-chargingPile/src/main/resources/template/运营商名称1-充电桩名称1-结算对账单明细-结算月份1.xlsxBinary files differ
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/controller/CouponController.java
New file @@ -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(); } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/controller/ParkingOrderController.java
New file @@ -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(); } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/BaseResponse.java
New file @@ -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; } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/CloudParkingOrder.java
New file @@ -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; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/CloudParkingSpace.java
New file @@ -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; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/GetCouponReq.java
New file @@ -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; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/GetCouponResp.java
New file @@ -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; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/OfflineParkingOrder.java
New file @@ -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; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/OfflineParkingResponse.java
New file @@ -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; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/OfflineParkingSpace.java
New file @@ -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; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/Parameter.java
New file @@ -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; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/UsedCoupon.java
New file @@ -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; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/server/CouponService.java
New file @@ -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); } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/server/ParkingOrderService.java
New file @@ -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){ } } 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); } /** 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; 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; 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) { 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); } } 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); } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/TChargingOrderExport.java
New file @@ -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; } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TSettlementConfirmMapper.java
New file @@ -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); } 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); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TSettlementConfirmService.java
New file @@ -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> { } 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()); 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"))); } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TSettlementConfirmServiceImpl.java
New file @@ -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 { } 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()); 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> ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TSettlementConfirmMapper.xml
New file @@ -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> 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 ruoyi-service/ruoyi-payment/src/main/resources/cert/apiclient_cert.p12Binary files differ
ruoyi-service/ruoyi-payment/src/main/resources/cert/apiclient_cert.pem
New file @@ -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----- ruoyi-service/ruoyi-payment/src/main/resources/cert/apiclient_key.pem
New file @@ -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----- ruoyi-service/ruoyi-payment/src/main/resources/cert/证书使用说明.txt
New file @@ -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)下载