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