ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppCouponFallbackFactory.java
@@ -3,6 +3,7 @@ import com.ruoyi.account.api.dto.GrantCouponDto; import com.ruoyi.account.api.feignClient.AppCouponClient; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.account.api.model.TAppCoupon; import com.ruoyi.account.api.query.ExchangeRecordGoodsQuery; import com.ruoyi.account.api.vo.ExchangeRecordVO; import com.ruoyi.common.core.domain.R; @@ -53,6 +54,11 @@ public R refund(String id) { return R.fail("后台退款 退回优惠券失败:"+throwable.getMessage()); } @Override public R<TAppCoupon> getAppCouponById(Long id) { return R.fail("根据id获取优惠券领取记录失败:" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/InviteUserFallbackFactory.java
New file @@ -0,0 +1,43 @@ package com.ruoyi.account.api.factory; import com.ruoyi.account.api.feignClient.InviteUserClient; import com.ruoyi.account.api.model.TInviteUser; import com.ruoyi.account.api.vo.GetInviteUser; import com.ruoyi.common.core.domain.R; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; /** * * @author ruoyi */ @Component public class InviteUserFallbackFactory implements org.springframework.cloud.openfeign.FallbackFactory<InviteUserClient> { private static final Logger log = LoggerFactory.getLogger(InviteUserFallbackFactory.class); @Override public InviteUserClient create(Throwable throwable) { log.error("邀请用户调用失败:{}", throwable.getMessage()); return new InviteUserClient() { @Override public R<TInviteUser> getInviteUser(GetInviteUser query) { return R.fail("获取用户邀请数据失败:" + throwable.getMessage()); } @Override public void updateInviteUser(TInviteUser query) { R.fail("修改用户邀请数据失败:" + throwable.getMessage()); } @Override public void saveInviteUser(TInviteUser query) { R.fail("添加用户邀请数据失败:" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppCouponClient.java
@@ -3,6 +3,7 @@ import com.ruoyi.account.api.dto.GrantCouponDto; import com.ruoyi.account.api.factory.AppCouponFallbackFactory; import com.ruoyi.account.api.factory.AppUserFallbackFactory; import com.ruoyi.account.api.model.TAppCoupon; import com.ruoyi.account.api.query.ExchangeRecordGoodsQuery; import com.ruoyi.account.api.vo.ExchangeRecordVO; import com.ruoyi.common.core.constant.ServiceNameConstants; @@ -12,6 +13,7 @@ import org.springframework.web.bind.annotation.PathVariable; 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; @@ -46,7 +48,18 @@ * 后台远程调用 给用户发放优惠券 */ @PostMapping("/t-app-coupon/grantCoupon") R grantCoupon(@RequestBody GrantCouponDto dto); R grantCoupon(@RequestBody GrantCouponDto dto); @PostMapping(value = "/t-app-coupon/refund/{id}") R refund(@PathVariable("id") String id); R refund(@PathVariable("id") String id); /** * 根据id获取优惠券领取记录 * @param id * @return */ @PostMapping(value = "/t-app-coupon/getAppCouponById") R<TAppCoupon> getAppCouponById(@RequestParam("id") Long id); } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/InviteUserClient.java
New file @@ -0,0 +1,48 @@ package com.ruoyi.account.api.feignClient; import com.ruoyi.account.api.factory.InviteUserFallbackFactory; import com.ruoyi.account.api.model.TInviteUser; import com.ruoyi.account.api.vo.GetInviteUser; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; /** * @author zhibing.pu * @Date 2024/9/4 17:54 */ @FeignClient(contextId = "InviteUserClient", value = ServiceNameConstants.ACCOUNT_SERVICE, fallbackFactory = InviteUserFallbackFactory.class) public interface InviteUserClient { /** * 获取用户邀请数据 * @param query * @return */ @PostMapping("/t-invite-user/getInviteUser") R<TInviteUser> getInviteUser(@RequestBody GetInviteUser query); /** * 修改用户邀请数据 * @param query * @return */ @PostMapping("/t-invite-user/updateInviteUser") void updateInviteUser(@RequestBody TInviteUser query); /** * 添加用户邀请数据 * @param query * @return */ @PostMapping("/t-invite-user/saveInviteUser") void saveInviteUser(@RequestBody TInviteUser query); } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppCoupon.java
@@ -77,7 +77,6 @@ @TableField("status") private Integer status; @ApiModelProperty(value = "当前领取优惠卷的json记录") @TableField("coupon_json") private String couponJson; ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/GetInviteUser.java
New file @@ -0,0 +1,19 @@ package com.ruoyi.account.api.vo; import lombok.Data; /** * @author zhibing.pu * @Date 2024/9/4 17:58 */ @Data public class GetInviteUser { /** * 用户id */ private Long appUserId; /** * 被邀请用户id */ private Long beInvitedAppUserId; } ruoyi-api/ruoyi-api-account/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -3,4 +3,5 @@ com.ruoyi.account.api.factory.AppUserCarFallbackFactory com.ruoyi.account.api.factory.AppUserIntegralChangeFallbackFactory com.ruoyi.account.api.factory.AppUserAddressFallbackFactory com.ruoyi.account.api.factory.AppUserVipDetailFallbackFactory com.ruoyi.account.api.factory.AppUserVipDetailFallbackFactory com.ruoyi.account.api.factory.InviteUserFallbackFactory ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/dto/CheckChargingStrategyDTO.java
New file @@ -0,0 +1,19 @@ package com.ruoyi.chargingPile.api.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; @Data @ApiModel(value = "校验计费模版是否准确DTO") public class CheckChargingStrategyDTO implements Serializable { @ApiModelProperty(value = "桩编号code") private String code; @ApiModelProperty(value = "计费模型编号 id") private Integer strategyDetailId; } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyDetailFallbackFactory.java
@@ -1,5 +1,6 @@ package com.ruoyi.chargingPile.api.factory; import com.ruoyi.chargingPile.api.dto.CheckChargingStrategyDTO; import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient; import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail; import com.ruoyi.common.core.domain.R; @@ -7,6 +8,8 @@ import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.stereotype.Component; import java.util.List; /** * @author zhibing.pu @@ -21,16 +24,31 @@ public AccountingStrategyDetailClient create(Throwable throwable) { log.error("计费策略调用失败:{}", throwable.getMessage()); return new AccountingStrategyDetailClient(){ @Override public R<TAccountingStrategyDetail> getNowData(Integer accountingStrategyId) { return R.fail("获取当前有效的计费策略明细失败:" + throwable.getMessage()); } @Override public R<TAccountingStrategyDetail> getDetailBySiteId(Integer siteId) { return R.fail("通过站点id查询当前时段使用的策略明细失败:" + throwable.getMessage()); } @Override public R<TAccountingStrategyDetail> getDetailByCode(String code) { return R.fail("通过桩编号查询当前时段使用的策略明细失败:" + throwable.getMessage()); } @Override public R<Boolean> checkChargingStrategy(CheckChargingStrategyDTO dto) { return R.fail("校验充电桩计费模版是否准确失败:" + throwable.getMessage()); } @Override public R<List<TAccountingStrategyDetail>> getListByAccountingStrategyId(Integer id) { throw new RuntimeException("根据计费策略主表id策略明细失败:" + throwable.getMessage()); } @Override public R<List<TAccountingStrategyDetail>> getDetailListByCode(String code) { return R.fail("通过桩编号查询当前使用的策略明细列表失败:" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/AccountingStrategyFallbackFactory.java
New file @@ -0,0 +1,32 @@ package com.ruoyi.chargingPile.api.factory; import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyClient; import com.ruoyi.chargingPile.api.model.TAccountingStrategy; 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 AccountingStrategyFallbackFactory implements FallbackFactory<AccountingStrategyClient> { private static final Logger log = LoggerFactory.getLogger(AccountingStrategyFallbackFactory.class); @Override public AccountingStrategyClient create(Throwable throwable) { log.error("计费策略调用失败:{}", throwable.getMessage()); return new AccountingStrategyClient(){ @Override public R<TAccountingStrategy> getAccountingStrategyById(Integer id) { throw new RuntimeException("根据id查询计费策略失败:" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyClient.java
New file @@ -0,0 +1,25 @@ package com.ruoyi.chargingPile.api.feignClient; import com.ruoyi.chargingPile.api.factory.AccountingStrategyFallbackFactory; import com.ruoyi.chargingPile.api.model.TAccountingStrategy; 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/9/4 15:51 */ @FeignClient(contextId = "AccountingStrategyClient", value = ServiceNameConstants.CHARGINGPILE_SERVICE, fallbackFactory = AccountingStrategyFallbackFactory.class) public interface AccountingStrategyClient { /** * 根据id查询计费策略 * @param id * @return */ @PostMapping("/t-accounting-strategy/getAccountingStrategyById") R<TAccountingStrategy> getAccountingStrategyById(@RequestParam("id") Integer id); } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/AccountingStrategyDetailClient.java
@@ -1,12 +1,16 @@ package com.ruoyi.chargingPile.api.feignClient; import com.ruoyi.chargingPile.api.dto.CheckChargingStrategyDTO; 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.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; /** * @author zhibing.pu @@ -16,13 +20,7 @@ public interface AccountingStrategyDetailClient { /** * 获取当前有效的计费策略明细 * @param accountingStrategyId * @return */ @PostMapping("/t-accounting-strategy-detail/getNowData") R<TAccountingStrategyDetail> getNowData(@RequestParam("accountingStrategyId") Integer accountingStrategyId); /** * 通过站点id查询当前时段使用的策略明细 * @param siteId @@ -30,4 +28,34 @@ */ @PostMapping("/t-accounting-strategy-detail/getDetailBySiteId") R<TAccountingStrategyDetail> getDetailBySiteId(@RequestParam("siteId") Integer siteId); /** * 通过桩编号查询当前时段使用的策略明细 * @param code * @return */ @PostMapping("/t-accounting-strategy-detail/getDetailByCode") R<TAccountingStrategyDetail> getDetailByCode(@RequestParam("code") String code); /** * 校验充电桩计费模版是否准确 * @param * @return */ @PostMapping("/t-accounting-strategy-detail/checkChargingStrategy") R<Boolean> checkChargingStrategy(@RequestBody CheckChargingStrategyDTO dto); /** * 根据计费策略主表id策略明细 * @param id * @return */ @PostMapping("/t-accounting-strategy-detail/getListByAccountingStrategyId") R<List<TAccountingStrategyDetail>> getListByAccountingStrategyId(@RequestParam("id") Integer id); /** * 通过桩编号查询当前使用的策略明细列表 * @param code * @return */ @PostMapping("/t-accounting-strategy-detail/getDetailListByCode") R<List<TAccountingStrategyDetail>> getDetailListByCode(@RequestParam("code") String code); } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TFaultMessage.java
@@ -38,10 +38,16 @@ @ApiModelProperty(value = "站点id") @TableField("site_id") private Integer siteId; @TableField(exist = false) private String siteName; @ApiModelProperty(value = "充电桩id") @TableField("charging_pile_id") private Integer chargingPileId; @TableField(exist = false) private String chargingPileName; @ApiModelProperty(value = "状态(1=离线,2=故障)") @TableField("status") ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TParkingLot.java
@@ -33,6 +33,10 @@ @ApiModelProperty(value = "主键") @TableId(value = "id", type = IdType.AUTO) private Integer id; @ApiModelProperty(value = "类型(1=自营,2=合作)") @TableField("type") private Integer type; @ApiModelProperty(value = "车场名称") @TableField("name") @@ -41,6 +45,14 @@ @ApiModelProperty(value = "第三方停车场编号") @TableField("code") private String code; @ApiModelProperty(value = "停车场标识") @TableField("app_Key") private String appKey; @ApiModelProperty(value = "停车场秘钥") @TableField("secret_Key") private String secretKey; @ApiModelProperty(value = "站点id") @TableField("site_id") ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TRepair.java
@@ -37,10 +37,16 @@ @ApiModelProperty(value = "站点id") @TableField("site_id") private Integer siteId; @TableField(exist = false) private String siteName; @ApiModelProperty(value = "充电桩id") @TableField("charging_pile_id") private Integer chargingPileId; @TableField(exist = false) private String chargingPileName; @ApiModelProperty(value = "报修内容") @TableField("content") ruoyi-api/ruoyi-api-chargingPile/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -2,4 +2,5 @@ com.ruoyi.chargingPile.api.factory.SiteFallbackFactory com.ruoyi.chargingPile.api.factory.ParkingLotFallbackFactory com.ruoyi.chargingPile.api.factory.ChargingGunFallbackFactory com.ruoyi.chargingPile.api.factory.AccountingStrategyDetailFallbackFactory com.ruoyi.chargingPile.api.factory.AccountingStrategyDetailFallbackFactory com.ruoyi.chargingPile.api.factory.AccountingStrategyFallbackFactory ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/PlatformStopChargingReplyFallbackFactory.java
New file @@ -0,0 +1,35 @@ package com.ruoyi.integration.api.factory; import com.ruoyi.common.core.domain.R; import com.ruoyi.integration.api.feignClient.PlatformStopChargingReplyClient; import com.ruoyi.integration.api.feignClient.SendMessageClient; import com.ruoyi.integration.api.model.PlatformStartCharging; import com.ruoyi.integration.api.model.PlatformStopCharging; import com.ruoyi.integration.api.model.PlatformStopChargingReply; import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; /** * 充电桩服务降级处理 * * @author ruoyi */ @Component public class PlatformStopChargingReplyFallbackFactory implements org.springframework.cloud.openfeign.FallbackFactory<PlatformStopChargingReplyClient> { private static final Logger log = LoggerFactory.getLogger(PlatformStopChargingReplyFallbackFactory.class); @Override public PlatformStopChargingReplyClient create(Throwable throwable) { log.error("远程停机命令应答失败:{}", throwable.getMessage()); return new PlatformStopChargingReplyClient() { @Override public R<PlatformStopChargingReply> getPlatformStopChargingReply(GetPlatformStopChargingReply query) { return R.fail("获取远程停机命令应答失败:" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/factory/SendMessageFallbackFactory.java
@@ -5,6 +5,7 @@ import com.ruoyi.integration.api.feignClient.SendMessageClient; import com.ruoyi.integration.api.model.ChargingHandshake; import com.ruoyi.integration.api.model.PlatformStartCharging; import com.ruoyi.integration.api.model.PlatformStopCharging; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; @@ -27,9 +28,14 @@ @Override public void platformStartCharging(PlatformStartCharging platformStartCharging) { public String platformStartCharging(PlatformStartCharging platformStartCharging) { throw new RuntimeException("远程启机失败" + throwable.getMessage()); } @Override public String platformStopCharging(PlatformStopCharging platformStopCharging) { throw new RuntimeException("远程停机失败" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/PlatformStopChargingReplyClient.java
New file @@ -0,0 +1,27 @@ 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.PlatformStopChargingReplyFallbackFactory; import com.ruoyi.integration.api.model.PlatformStopChargingReply; import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; /** * @author zhibing.pu * @Date 2024/9/2 17:05 */ @FeignClient(contextId = "PlatformStopChargingReplyClient", value = ServiceNameConstants.INTEGRATION_SERVICE, fallbackFactory = PlatformStopChargingReplyFallbackFactory.class) public interface PlatformStopChargingReplyClient { /** * 获取远程停机命令应答 * @param query * @return */ @PostMapping("/platformStopChargingReply/getPlatformStopChargingReply") R<PlatformStopChargingReply> getPlatformStopChargingReply(@RequestBody GetPlatformStopChargingReply query); } ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/SendMessageClient.java
@@ -3,6 +3,7 @@ import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.integration.api.factory.SendMessageFallbackFactory; import com.ruoyi.integration.api.model.PlatformStartCharging; import com.ruoyi.integration.api.model.PlatformStopCharging; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -21,5 +22,14 @@ * @return */ @PostMapping("/sendMessage/platformStartCharging") void platformStartCharging(@RequestBody PlatformStartCharging platformStartCharging); String platformStartCharging(@RequestBody PlatformStartCharging platformStartCharging); /** * 远程控制停机 * @param platformStopCharging * @return */ @PostMapping("/sendMessage/platformStopCharging") String platformStopCharging(@RequestBody PlatformStopCharging platformStopCharging); } ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/vo/GetPlatformStopChargingReply.java
New file @@ -0,0 +1,19 @@ package com.ruoyi.integration.api.vo; import lombok.Data; /** * @author zhibing.pu * @Date 2024/9/2 17:00 */ @Data public class GetPlatformStopChargingReply { /** * 充电桩编号 */ private String charging_pile_code; /** * 充电枪编号 */ private String charging_gun_code; } ruoyi-api/ruoyi-api-integration/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -2,4 +2,5 @@ com.ruoyi.integration.api.factory.UploadRealTimeMonitoringDataFallbackFactory com.ruoyi.integration.api.factory.ChargingHandshakeFallbackFactory com.ruoyi.integration.api.factory.SendMessageFallbackFactory com.ruoyi.integration.api.factory.PlatformStartChargingReplyFallbackFactory com.ruoyi.integration.api.factory.PlatformStartChargingReplyFallbackFactory com.ruoyi.integration.api.factory.PlatformStopChargingReplyFallbackFactory ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/AccountingStrategyDetailOrderFallbackFactory.java
New file @@ -0,0 +1,37 @@ package com.ruoyi.order.api.factory; import com.ruoyi.common.core.domain.R; import com.ruoyi.order.api.feignClient.AccountingStrategyDetailOrderClient; import com.ruoyi.order.api.feignClient.ChargingOrderAccountingStrategyClient; import com.ruoyi.order.api.model.AccountingStrategyDetailOrder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.Set; /** * 充电订单服务降级处理 * * @author ruoyi */ @Component public class AccountingStrategyDetailOrderFallbackFactory implements org.springframework.cloud.openfeign.FallbackFactory<AccountingStrategyDetailOrderClient> { private static final Logger log = LoggerFactory.getLogger(AccountingStrategyDetailOrderFallbackFactory.class); @Override public AccountingStrategyDetailOrderClient create(Throwable throwable) { log.error("计费策略调用失败:{}", throwable.getMessage()); return new AccountingStrategyDetailOrderClient() { @Override public R<AccountingStrategyDetailOrder> getNowAccountingStrategyDetailOrder(Long orderId) { return R.fail("根据订单id获取当前有效的策略失败:" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
@@ -80,6 +80,16 @@ public R<TChargingOrder> getOrderByCode(String code) { return R.fail("通过流水号查询订单调用失败:" + throwable.getMessage()); } @Override public void endCharge(String code) { } @Override public void excelEndCharge(String code) { } }; } } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/AccountingStrategyDetailOrderClient.java
New file @@ -0,0 +1,26 @@ package com.ruoyi.order.api.feignClient; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.order.api.factory.AccountingStrategyDetailOrderFallbackFactory; import com.ruoyi.order.api.model.AccountingStrategyDetailOrder; 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/9/4 16:11 */ @FeignClient(contextId = "AccountingStrategyDetailOrderClient", value = ServiceNameConstants.ORDER_SERVICE, fallbackFactory = AccountingStrategyDetailOrderFallbackFactory.class) public interface AccountingStrategyDetailOrderClient { /** * 根据订单id获取当前有效的策略 * @param orderId * @return */ @PostMapping("/accountingStrategyDetailOrder/getNowAccountingStrategyDetailOrder") R<AccountingStrategyDetailOrder> getNowAccountingStrategyDetailOrder(@RequestParam("orderId") Long orderId); } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
@@ -79,4 +79,20 @@ */ @PostMapping(value = "/t-charging-order/getOrderByCode/{code}") R<TChargingOrder> getOrderByCode(@PathVariable("code") String code); /** * 充电解释后处理逻辑 * @param code */ @PostMapping("/t-charging-order/endCharge") void endCharge(@RequestParam("code") String code); /** * 硬件异常结束充电后的处理逻辑 * @param code */ @PostMapping("/t-charging-order/excelEndCharge") void excelEndCharge(@RequestParam("code") String code); } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/AccountingStrategyDetailOrder.java
New file @@ -0,0 +1,53 @@ package com.ruoyi.order.api.model; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; /** * @author zhibing.pu * @Date 2024/9/3 14:00 */ @Data @TableName("t_accounting_strategy_detail_order") public class AccountingStrategyDetailOrder { /** * 主键 */ @TableField(value = "id") private Integer id; @ApiModelProperty(value = "策略id") @TableField("accounting_strategy_id") private Integer accountingStrategyId; @ApiModelProperty(value = "阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)") @TableField("type") private Integer type; @ApiModelProperty(value = "开始时间") @TableField("start_time") private String startTime; @ApiModelProperty(value = "结束时间") @TableField("end_time") private String endTime; @ApiModelProperty(value = "电价") @TableField("electrovalence") private BigDecimal electrovalence; @ApiModelProperty(value = "服务费") @TableField("service_charge") private BigDecimal serviceCharge; @ApiModelProperty(value = "原价服务费") @TableField("cost_service_charge") private BigDecimal costServiceCharge; @ApiModelProperty(value = "充电订单id") @TableField("charging_order_id") private Long chargingOrderId; } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/AccountingStrategyOrder.java
New file @@ -0,0 +1,81 @@ package com.ruoyi.order.api.model; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.core.web.domain.BasePojo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.math.BigDecimal; import java.time.LocalDateTime; /** * @author zhibing.pu * @Date 2024/9/3 14:13 */ @Data @TableName("t_accounting_strategy_order") public class AccountingStrategyOrder extends BasePojo { @ApiModelProperty(value = "主键") @TableField(value = "id") private Integer id; @ApiModelProperty(value = "站点id") @TableField("site_id") private Integer siteId; @ApiModelProperty(value = "申请人id") @TableField("user_id") private Long userId; @ApiModelProperty(value = "策略名称") @TableField("name") private String name; @ApiModelProperty(value = "策略说明") @TableField("description") private String description; @ApiModelProperty(value = "会员折扣") @TableField("discount") private BigDecimal discount; @ApiModelProperty(value = "一级审核用户id") @TableField("first_user_id") private Long firstUserId; @ApiModelProperty(value = "二级审核用户id") @TableField("two_user_id") private Long twoUserId; @ApiModelProperty(value = "一级审核备注") @TableField("first_remark") private String firstRemark; @ApiModelProperty(value = "二级审核备注") @TableField("two_remark") private String twoRemark; @ApiModelProperty(value = "审核状态(1=待审核一级,2=待审核二级,3=审核通过,4=驳回)") @TableField("audit_status") private Integer auditStatus; @ApiModelProperty(value = "一级审核时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @TableField("first_audit_time") private LocalDateTime firstAuditTime; @ApiModelProperty(value = "二级审核时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @TableField("two_audit_time") private LocalDateTime twoAuditTime; @ApiModelProperty(value = "充电订单id") @TableField("charging_order_id") private Long chargingOrderId; } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrder.java
@@ -122,7 +122,11 @@ @ApiModelProperty(value = "充值支付第三方流水号") @TableField("recharge_serial_number") private String rechargeSerialNumber; @ApiModelProperty(value = "充电金额(传给硬件方的金额)") @TableField("charge_amount") private BigDecimal chargeAmount; @ApiModelProperty(value = "剩余金额(用于前端展示)") @TableField("residual_amount") private BigDecimal residualAmount; ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrderAccountingStrategy.java
@@ -11,6 +11,7 @@ import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; /** * <p> @@ -35,6 +36,10 @@ @ApiModelProperty(value = "充电订单id") @TableField("charging_order_id") private Long chargingOrderId; @ApiModelProperty(value = "计费策略明细id") @TableField("accounting_strategy_detail_id") private Integer accountingStrategyDetailId; @ApiModelProperty(value = "阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)") @TableField("type") @@ -71,6 +76,14 @@ @ApiModelProperty(value = "时段服务费") @TableField("period_service_price") private BigDecimal periodServicePrice; @ApiModelProperty(value = "时段原服务费(不含折扣)") @TableField("period_original_service_price") private BigDecimal periodOriginalServicePrice; @ApiModelProperty(value = "首次添加时间") @TableField("create_time") private LocalDateTime createTime; @ApiModelProperty(value = "会员抵扣") @TableField(exist = false) ruoyi-api/ruoyi-api-order/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -1,4 +1,5 @@ com.ruoyi.order.api.factory.ChargingOrderFallbackFactory com.ruoyi.order.api.factory.OrderFallbackFactory com.ruoyi.order.api.factory.ExchangeOrderFallbackFactory com.ruoyi.order.api.factory.ChargingOrderAccountingStrategyFallbackFactory com.ruoyi.order.api.factory.ChargingOrderAccountingStrategyFallbackFactory com.ruoyi.order.api.factory.AccountingStrategyDetailOrderFallbackFactory ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserRoleFallbackFactory.java
New file @@ -0,0 +1,26 @@ package com.ruoyi.system.api.factory; import com.ruoyi.common.core.domain.R; import com.ruoyi.system.api.domain.SysRole; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import com.ruoyi.system.api.feignClient.SysUserRoleClient; import com.ruoyi.system.api.model.*; import org.springframework.stereotype.Component; import java.util.List; @Component public class SysUserRoleFallbackFactory implements org.springframework.cloud.openfeign.FallbackFactory<SysUserRoleClient> { @Override public SysUserRoleClient create(Throwable cause) { return new SysUserRoleClient(){ @Override public R<List<SysUserRoleVo>> getRoleByUserId(Long userId) { return R.fail("根据用户id获取角色失败:" + cause.getMessage()); } }; } } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserRoleClient.java
New file @@ -0,0 +1,28 @@ package com.ruoyi.system.api.feignClient; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.system.api.factory.SysUserRoleFallbackFactory; import com.ruoyi.system.api.model.SysUserRoleVo; 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/9/4 9:49 */ @FeignClient(contextId = "SysUserRoleClient", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = SysUserRoleFallbackFactory.class) public interface SysUserRoleClient { /** * 根据用户id获取角色 * @param userId * @return */ @PostMapping("/userRole/getRoleByUserId") R<List<SysUserRoleVo>> getRoleByUserId(@RequestParam("userId") Long userId); } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/SysUserRoleVo.java
New file @@ -0,0 +1,49 @@ package com.ruoyi.system.api.model; import com.baomidou.mybatisplus.annotation.TableField; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; /** * 用户和角色关联 sys_user_role * * @author ruoyi */ public class SysUserRoleVo { /** 用户ID */ @TableField("user_id") private Long userId; /** 角色ID */ @TableField("role_id") private Long roleId; public Long getUserId() { return userId; } public void setUserId(Long userId) { this.userId = userId; } public Long getRoleId() { return roleId; } public void setRoleId(Long roleId) { this.roleId = roleId; } @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("userId", getUserId()) .append("roleId", getRoleId()) .toString(); } } ruoyi-api/ruoyi-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -4,3 +4,4 @@ com.ruoyi.system.api.factory.SysUserFallbackFactory com.ruoyi.system.api.factory.SysRoleFallbackFactory com.ruoyi.system.api.factory.SysLoginLogFallbackFactory com.ruoyi.system.api.factory.SysUserRoleFallbackFactory ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserRoleController.java
@@ -1,20 +1,19 @@ package com.ruoyi.system.controller; import java.util.ArrayList; import java.util.List; import java.io.IOException; import javax.servlet.http.HttpServletResponse; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.ruoyi.common.core.domain.R; import com.ruoyi.system.api.model.SysUserRoleVo; import com.ruoyi.system.domain.SysUserRole; import com.ruoyi.system.service.ISysUserRoleService; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.*; import com.ruoyi.common.log.annotation.Log; import com.ruoyi.common.log.enums.BusinessType; import com.ruoyi.common.security.annotation.RequiresPermissions; @@ -96,4 +95,22 @@ public AjaxResult remove(@PathVariable Long[] userIds) { return toAjax(sysUserRoleService.deleteSysUserRoleByUserIds(userIds)); } /** * 根据用户id获取角色 * @param userId * @return */ @PostMapping("/getRoleByUserId") public R<List<SysUserRoleVo>> getRoleByUserId(@RequestParam("userId") Long userId){ List<SysUserRole> list = sysUserRoleService.list(new LambdaQueryWrapper<SysUserRole>().eq(SysUserRole::getUserId, userId)); List<SysUserRoleVo> data = new ArrayList<>(); for (SysUserRole sysUserRole : list) { SysUserRoleVo vo = new SysUserRoleVo(); BeanUtils.copyProperties(sysUserRole, vo); data.add(vo); } return R.ok(data); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java
@@ -65,13 +65,18 @@ private TAppUserCarService appUserCarService; @Autowired private TokenService tokenService; @Autowired @Resource private ChargingPileClient chargingPileClient; @Autowired @Resource private ChargingOrderClient chargingOrderClient; @Resource private ChargingGunClient chargingGunClient; @Autowired private TAppUserTagService appUserTagService; @Autowired private TAppUserService appUserService; /** * 后台退款 回退优惠券使用状态 @@ -208,10 +213,7 @@ return R.ok(tAppCouponService.lambdaQuery().le(TAppCoupon::getStartTime, now).ge(TAppCoupon::getEndTime, now).eq(TAppCoupon::getStatus, 1).count()); } @Autowired private TAppUserTagService appUserTagService; @Autowired private TAppUserService appUserService; /** * 后台远程调用 给用户发放优惠券 @@ -275,5 +277,17 @@ return R.ok(); } /** * 根据id获取优惠券领取记录 * @param id * @return */ @PostMapping("/getAppCouponById") public R<TAppCoupon> getAppCouponById(@RequestParam("id") Long id){ TAppCoupon appCoupon = tAppCouponService.getById(id); return R.ok(appCoupon); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TInviteUserController.java
@@ -1,8 +1,17 @@ package com.ruoyi.account.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.account.api.model.TInviteUser; import com.ruoyi.account.api.vo.GetInviteUser; import com.ruoyi.account.service.TInviteUserService; import com.ruoyi.common.core.domain.R; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** * <p> @@ -15,6 +24,43 @@ @RestController @RequestMapping("/t-invite-user") public class TInviteUserController { @Resource private TInviteUserService inviteUserService; /** * 获取用户邀请数据 * @param query * @return */ @PostMapping("/getInviteUser") public R<TInviteUser> getInviteUser(@RequestBody GetInviteUser query){ TInviteUser one = inviteUserService.getOne(new LambdaQueryWrapper<TInviteUser>().eq(TInviteUser::getAppUserId, query.getBeInvitedAppUserId()) .eq(TInviteUser::getBeInvitedAppUserId, query.getBeInvitedAppUserId())); return R.ok(one); } /** * 修改邀请数据 * @param query */ @PostMapping("/updateInviteUser") public void updateInviteUser(@RequestBody TInviteUser query){ inviteUserService.updateById(query); } /** * 添加邀请数据 * @param query */ @PostMapping("/saveInviteUser") public void saveInviteUser(@RequestBody TInviteUser query){ inviteUserService.save(query); } } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
@@ -111,6 +111,11 @@ if(flag){ return AjaxResult.error("计费模板时间设置有误差"); } // 判断同阶段是否价格不一致 Boolean flag1 = accountingStrategyDetailService.isStrategyPriceConsistent(dto.getAccountingStrategyDetails()); if(!flag1){ return AjaxResult.error("同阶段费率值需一致"); } Long userId = SecurityUtils.getLoginUser().getUserid(); dto.setUserId(userId); accountingStrategyService.save(dto); @@ -130,6 +135,11 @@ Boolean flag = accountingStrategyDetailService.isStrategy24Hour(dto.getAccountingStrategyDetails()); if(flag){ return AjaxResult.error("计费模板时间设置有误差"); } // 判断同阶段是否价格不一致 Boolean flag1 = accountingStrategyDetailService.isStrategyPriceConsistent(dto.getAccountingStrategyDetails()); if(!flag1){ return AjaxResult.error("同阶段费率值需一致"); } // 判断修改的计费策略是否为已通过 if(dto.getAuditStatus() == 3 || dto.getAuditStatus() == 4){ @@ -405,5 +415,18 @@ return R.ok(res); } /** * 根据id查询数据 * @param id * @return */ @PostMapping(value = "/getAccountingStrategyById") public R<TAccountingStrategy> getAccountingStrategyById(@RequestParam("id") Integer id) { TAccountingStrategy accountingStrategy = accountingStrategyService.getById(id); return R.ok(accountingStrategy); } } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyDetailController.java
@@ -3,14 +3,17 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.chargingPile.api.dto.CheckChargingStrategyDTO; 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.model.TChargingPile; 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.chargingPile.service.TChargingPileService; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.web.domain.AjaxResult; @@ -36,12 +39,14 @@ public class TAccountingStrategyDetailController { private final ISiteService siteService; private final TChargingPileService chargingPileService; private final TAccountingStrategyService accountingStrategyService; private final TAccountingStrategyDetailService accountingStrategyDetailService; @Autowired public TAccountingStrategyDetailController(ISiteService siteService, TAccountingStrategyService accountingStrategyService, TAccountingStrategyDetailService accountingStrategyDetailService) { public TAccountingStrategyDetailController(ISiteService siteService, TChargingPileService chargingPileService, TAccountingStrategyService accountingStrategyService, TAccountingStrategyDetailService accountingStrategyDetailService) { this.siteService = siteService; this.chargingPileService = chargingPileService; this.accountingStrategyService = accountingStrategyService; this.accountingStrategyDetailService = accountingStrategyDetailService; } @@ -79,24 +84,8 @@ } /** * 获取当前有效的计费模板 * @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); } /** * 获取当前有效的计费模板 * @param accountingStrategyId * @return */ /** * 通过站点id查询当前时段使用的策略明细 * @param siteId @@ -111,5 +100,80 @@ .last(" and DATE_FORMAT(now(), '%H:%i') between start_time and end_time")); return R.ok(one); } /** * 通过桩id查询当前时段使用的策略明细 * @param code 设备编号 * @return */ @PostMapping("/getDetailByCode") public R<TAccountingStrategyDetail> getDetailByPileId(@RequestParam("code") String code){ // 查询桩 TChargingPile chargingPile = chargingPileService.getOne(Wrappers.lambdaQuery(TChargingPile.class) .eq(TChargingPile::getCode,code) .last("LIMIT 1")); if(Objects.isNull(chargingPile)){ return R.fail("未查询到该桩设备"); } Site site = siteService.getById(chargingPile.getSiteId()); TAccountingStrategy accountingStrategy = accountingStrategyService.getById(site.getAccountingStrategyId()); TAccountingStrategyDetail one = accountingStrategyDetailService.getOne(Wrappers.<TAccountingStrategyDetail>lambdaQuery() .eq(TAccountingStrategyDetail::getAccountingStrategyId, accountingStrategy.getId()) .last(" and DATE_FORMAT(now(), '%H:%i') between start_time and end_time")); return R.ok(one); } /** * 校验充电桩计费模版是否准确 * @param * @return */ @PostMapping("/checkChargingStrategy") public R<Boolean> checkChargingStrategy(@RequestBody CheckChargingStrategyDTO dto){ // 查询桩 TChargingPile chargingPile = chargingPileService.getOne(Wrappers.lambdaQuery(TChargingPile.class) .eq(TChargingPile::getCode,dto.getCode()) .last("LIMIT 1")); if(Objects.isNull(chargingPile)){ return R.ok(false); } Site site = siteService.getById(chargingPile.getSiteId()); TAccountingStrategy accountingStrategy = accountingStrategyService.getById(site.getAccountingStrategyId()); TAccountingStrategyDetail one = accountingStrategyDetailService.getOne(Wrappers.<TAccountingStrategyDetail>lambdaQuery() .eq(TAccountingStrategyDetail::getAccountingStrategyId, accountingStrategy.getId()) .last(" and DATE_FORMAT(now(), '%H:%i') between start_time and end_time")); return R.ok(dto.getStrategyDetailId().equals(one.getId())); } /** * 根据计费策略主表id策略明细 * @param id * @return */ @PostMapping("/getListByAccountingStrategyId") public R<List<TAccountingStrategyDetail>> getListByAccountingStrategyId(@RequestParam("id") Integer id){ List<TAccountingStrategyDetail> list = accountingStrategyDetailService.list(new LambdaQueryWrapper<TAccountingStrategyDetail>().eq(TAccountingStrategyDetail::getAccountingStrategyId, id)); return R.ok(list); } /** * 通过桩编号查询当前使用的策略明细列表 * @param code * @return */ @PostMapping("/t-accounting-strategy-detail/getDetailListByCode") public R<List<TAccountingStrategyDetail>> getDetailListByCode(@RequestParam("code") String code){ // 查询桩 TChargingPile chargingPile = chargingPileService.getOne(Wrappers.lambdaQuery(TChargingPile.class) .eq(TChargingPile::getCode,code) .last("LIMIT 1")); if(Objects.isNull(chargingPile)){ return R.fail("未查询到该桩设备"); } Site site = siteService.getById(chargingPile.getSiteId()); TAccountingStrategy accountingStrategy = accountingStrategyService.getById(site.getAccountingStrategyId()); List<TAccountingStrategyDetail> accountingStrategyDetails = accountingStrategyDetailService.list(Wrappers.<TAccountingStrategyDetail>lambdaQuery() .eq(TAccountingStrategyDetail::getAccountingStrategyId, accountingStrategy.getId())); return R.ok(accountingStrategyDetails); } } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TFaultMessageController.java
@@ -6,16 +6,17 @@ import com.ruoyi.chargingPile.service.TChargingPileService; import com.ruoyi.chargingPile.service.TFaultMessageService; 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.log.annotation.Log; import com.ruoyi.common.log.enums.BusinessType; import com.ruoyi.common.log.enums.OperatorType; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.*; import java.util.List; /** * <p> @@ -46,7 +47,40 @@ faultMessageService.add(dto); return AjaxResult.success(); } /** * 获取故障信息列表 * @param siteId * @param basePage * @return */ @ResponseBody @GetMapping("/getFaultMessageList") @ApiOperation(value = "获取故障信息列表数据", tags = {"管理后台-设备监控"}) public AjaxResult<PageInfo<TFaultMessage>> getFaultMessageList(Integer siteId, BasePage basePage){ PageInfo<TFaultMessage> pageInfo = new PageInfo<>(basePage.getPageCurr(), basePage.getPageSize()); List<TFaultMessage> faultMessageList = faultMessageService.getFaultMessageList(pageInfo, siteId); pageInfo.setRecords(faultMessageList); return AjaxResult.success(pageInfo); } @ResponseBody @PostMapping("/addFaultMessage") @ApiOperation(value = "添加故障信息", tags = {"管理后台-设备监控"}) public AjaxResult addFaultMessage(@RequestBody TFaultMessage faultMessage){ faultMessageService.save(faultMessage); return AjaxResult.success(); } @ResponseBody @DeleteMapping("/delFaultMessage/{id}") @ApiOperation(value = "删除故障信息", tags = {"管理后台-设备监控"}) public AjaxResult delFaultMessage(@PathVariable Integer id){ faultMessageService.removeById(id); return AjaxResult.success(); } } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TRepairController.java
@@ -1,8 +1,17 @@ package com.ruoyi.chargingPile.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.chargingPile.api.model.TFaultMessage; import com.ruoyi.chargingPile.api.model.TRepair; import com.ruoyi.chargingPile.service.TRepairService; 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 io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; /** * <p> @@ -16,5 +25,37 @@ @RequestMapping("/t-repair") public class TRepairController { @Resource private TRepairService repairService; @ResponseBody @GetMapping("/getRepairList") @ApiOperation(value = "获取报修记录列表数据", tags = {"管理后台-设备监控"}) public AjaxResult<PageInfo<TRepair>> getRepairList(String name, String siteId, BasePage basePage){ PageInfo<TRepair> pageInfo = new PageInfo<>(basePage.getPageCurr(), basePage.getPageSize()); List<TRepair> repairList = repairService.getRepairList(pageInfo, name, siteId); return AjaxResult.success(repairList); } @ResponseBody @PostMapping("/addRepair") @ApiOperation(value = "添加报修记录", tags = {"管理后台-设备监控"}) public AjaxResult addRepair(@RequestBody TRepair repair){ repairService.save(repair); return AjaxResult.success(); } @ResponseBody @DeleteMapping("/delRepair/{id}") @ApiOperation(value = "删除报修记录", tags = {"管理后台-设备监控"}) public AjaxResult delRepair(@PathVariable Integer id){ repairService.removeById(id); return AjaxResult.success(); } } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TFaultMessageMapper.java
@@ -2,6 +2,10 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.chargingPile.api.model.TFaultMessage; import com.ruoyi.common.core.web.page.PageInfo; import org.apache.ibatis.annotations.Param; import java.util.List; /** * <p> @@ -12,5 +16,12 @@ * @since 2024-08-08 */ public interface TFaultMessageMapper extends BaseMapper<TFaultMessage> { /** * 获取故障信息列表 * @param pageInfo * @param siteId * @return */ List<TFaultMessage> getFaultMessageList(PageInfo<TFaultMessage> pageInfo, @Param("siteId") Integer siteId); } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TRepairMapper.java
@@ -2,6 +2,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.chargingPile.api.model.TRepair; import com.ruoyi.common.core.web.page.PageInfo; import java.util.List; /** * <p> @@ -12,5 +15,15 @@ * @since 2024-08-08 */ public interface TRepairMapper extends BaseMapper<TRepair> { /** * 获取列表数据 * @param pageInfo * @param name * @param siteId * @return */ List<TRepair> getRepairList(PageInfo<TRepair> pageInfo, String name, String siteId); } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TAccountingStrategyDetailService.java
@@ -44,4 +44,12 @@ * @return */ Boolean isStrategy24Hour(List<TAccountingStrategyDetail> accountingStrategyDetails); /** * 判断同阶段是否价格不一致 * @param accountingStrategyDetails * @return */ Boolean isStrategyPriceConsistent(List<TAccountingStrategyDetail> accountingStrategyDetails); } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TFaultMessageService.java
@@ -2,6 +2,9 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.chargingPile.api.model.TFaultMessage; import com.ruoyi.common.core.web.page.PageInfo; import java.util.List; /** * <p> @@ -19,4 +22,13 @@ * @return */ void add(TFaultMessage dto); /** * 获取故障信息列表 * @param pageInfo * @param siteId * @return */ List<TFaultMessage> getFaultMessageList(PageInfo<TFaultMessage> pageInfo, Integer siteId); } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TRepairService.java
@@ -2,6 +2,10 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.chargingPile.api.model.TRepair; import com.ruoyi.common.core.web.page.BasePage; import com.ruoyi.common.core.web.page.PageInfo; import java.util.List; /** * <p> @@ -12,5 +16,12 @@ * @since 2024-08-08 */ public interface TRepairService extends IService<TRepair> { /** * 获取报修记录列表 * @param name * @param siteId * @return */ List<TRepair> getRepairList(PageInfo<TRepair> pageInfo, String name, String siteId); } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/SiteServiceImpl.java
@@ -31,6 +31,8 @@ import com.ruoyi.other.api.feignClient.VipClient; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import com.ruoyi.system.api.feignClient.SysUserRoleClient; import com.ruoyi.system.api.model.SysUserRoleVo; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @@ -68,6 +70,8 @@ private AppUserClient appUserClient; @Resource private VipClient vipClient; @Resource private SysUserRoleClient sysUserRoleClient; @@ -90,8 +94,11 @@ //非管理员需要根据角色和用户配置查询允许的站点数据 if(!SecurityUtils.isAdmin(SecurityUtils.getUserId())){ List<Integer> data = userSiteClient.getSiteIds(sysUser.getUserId()).getData(); List<Integer> data1 = roleSiteClient.getSiteIds(sysUser.getRoleId()).getData(); data.addAll(data1); List<SysUserRoleVo> data2 = sysUserRoleClient.getRoleByUserId(sysUser.getUserId()).getData(); if(data2.size() > 0){ List<Integer> data1 = roleSiteClient.getSiteIds(data2.get(0).getRoleId()).getData(); data.addAll(data1); } ids = new HashSet<>(data); } } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyDetailServiceImpl.java
@@ -24,10 +24,7 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalTime; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Objects; import java.util.*; import java.util.stream.Collectors; /** @@ -146,4 +143,23 @@ return isFirstElementValid || !isTimeContinuous; } @Override public Boolean isStrategyPriceConsistent(List<TAccountingStrategyDetail> accountingStrategyDetails) { Map<Integer, BigDecimal> phaseToServiceFee = new HashMap<>(); for (TAccountingStrategyDetail detail : accountingStrategyDetails) { Integer type = detail.getType(); BigDecimal serviceFee = detail.getServiceCharge(); if (phaseToServiceFee.containsKey(type)) { BigDecimal existingFee = phaseToServiceFee.get(type); if (!existingFee.equals(serviceFee)) { return false; // 发现不一致的服务费 } } else { phaseToServiceFee.put(type, serviceFee); } } return true; // 所有相同阶段的服务费一致 } } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TFaultMessageServiceImpl.java
@@ -11,9 +11,12 @@ import com.ruoyi.chargingPile.service.TChargingPileService; import com.ruoyi.chargingPile.service.TFaultMessageService; import com.ruoyi.common.core.utils.MsgUtil; import com.ruoyi.common.core.web.page.PageInfo; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * <p> @@ -48,4 +51,16 @@ chargingPileNotificationService.saveData(4,dto.getSiteId(),dto.getChargingPileId(),site.getPhone(),"检测到"+siteName+"..."+chargingPile.getNumber()+"号桩设备离线,请及时查看处理!"); this.save(dto); } /** * 获取故障信息列表 * @param pageInfo * @param siteId * @return */ @Override public List<TFaultMessage> getFaultMessageList(PageInfo<TFaultMessage> pageInfo, Integer siteId) { return this.baseMapper.getFaultMessageList(pageInfo, siteId); } } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TRepairServiceImpl.java
@@ -1,10 +1,18 @@ package com.ruoyi.chargingPile.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.chargingPile.api.feignClient.SiteClient; import com.ruoyi.chargingPile.api.model.Site; import com.ruoyi.chargingPile.api.model.TRepair; import com.ruoyi.chargingPile.mapper.TRepairMapper; import com.ruoyi.chargingPile.service.TRepairService; import com.ruoyi.common.core.web.page.BasePage; import com.ruoyi.common.core.web.page.PageInfo; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.Arrays; import java.util.List; /** * <p> @@ -16,5 +24,16 @@ */ @Service public class TRepairServiceImpl extends ServiceImpl<TRepairMapper, TRepair> implements TRepairService { /** * 获取报修记录列表 * @param name * @param siteId * @return */ @Override public List<TRepair> getRepairList(PageInfo<TRepair> pageInfo, String name, String siteId) { return this.baseMapper.getRepairList(pageInfo, name, siteId); } } ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TAccountingStrategyDetailMapper.xml
@@ -20,8 +20,8 @@ </sql> <select id="queryAccountingStrategyDetailByStrategyId" resultType="com.ruoyi.chargingPile.api.vo.TAccountingStrategyDetailVO"> SELECT tasd.id, tasd.accounting_strategy_id, tasd.`type`, tasd.start_time, tasd.end_time, tasd.electrovalence, tasd.service_charge, tasd.cost_service_charge,tas.discount tasd.id, tasd.accounting_strategy_id, tasd.`type`, tasd.start_time, tasd.end_time, ROUND(tasd.electrovalence,4) AS electrovalence, ROUND(tasd.service_charge,4) AS serviceCharge,ROUND(tasd.cost_service_charge,4) AS costServiceCharge,tas.discount FROM t_accounting_strategy_detail tasd LEFT JOIN t_accounting_strategy tas ON tas.id = tasd.accounting_strategy_id <where> ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TFaultMessageMapper.xml
@@ -19,4 +19,20 @@ id, app_user_id, site_id, charging_pile_id, status, down_time, create_time, del_flag </sql> <select id="getFaultMessageList" resultType="com.ruoyi.chargingPile.api.model.TFaultMessage"> select a.*, b.name as chargingPileName, c.name as siteName from t_fault_message a left join t_charging_pile b on (a.charging_pile_id = b.id) left join t_site c on (a.site_id = c.id) where a.del_flag = 0 <if test="null != siteId"> and a.site_id = #{siteId} </if> order by a.create_time desc </select> </mapper> ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TRepairMapper.xml
@@ -19,4 +19,23 @@ id, repairman, site_id, charging_pile_id, content, repair_time, create_time, del_flag </sql> <select id="getRepairList" resultType="com.ruoyi.chargingPile.api.model.TRepair"> select a.*, b.name as chargingPileName, c.name as siteName from t_repair a left join t_charging_pile b on (a.charging_pile_id = b.id) left join t_site c on (a.site_id = c.id) where a.del_flag = 0 <if test="null != name and '' != name"> and a.repairman like CONCAT('%', #{name}, '%') </if> <if test="null != siteId"> and a.site_id = #{siteId} </if> order by a.create_time desc </select> </mapper> ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/controller/PlatformStopChargingReplyController.java
New file @@ -0,0 +1,34 @@ package com.ruoyi.integration.controller; import com.ruoyi.common.core.domain.R; import com.ruoyi.integration.api.model.PlatformStopChargingReply; import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply; import com.ruoyi.integration.mongodb.service.PlatformStopChargingReplyService; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; /** * @author zhibing.pu * @Date 2024/9/2 16:52 */ @RestController @RequestMapping("/platformStopChargingReply") public class PlatformStopChargingReplyController { @Resource private PlatformStopChargingReplyService platformStopChargingReplyService; /** * 获取远程停机命令应答 * @param query * @return */ @PostMapping("/getPlatformStopChargingReply") public R<PlatformStopChargingReply> getPlatformStopChargingReply(@RequestBody GetPlatformStopChargingReply query){ PlatformStopChargingReply platformStopChargingReply = platformStopChargingReplyService.getPlatformStopChargingReply(query); return R.ok(platformStopChargingReply); } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/constant/SendTagConstant.java
@@ -89,7 +89,7 @@ /** * 对时设置应答 */ public static final String TIMING_SETTING_REPLY ="timing_setting_reply"; public static final String TIMING_SETTING ="timing_setting"; /** * 计费模型应答 */ ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/controller/SendMessageController.java
@@ -172,13 +172,13 @@ } /** * 对时设置 * @param timingSetting 实体对象 * 对时设置应答 * @param timingSettingReply 实体对象 * @return */ @PostMapping("/timingSetting") public String timingSetting(@RequestBody TimingSetting timingSetting){ return iotMessageProduce.sendMessage(timingSetting.getCharging_pile_code(), ServiceIdMenu.TIMING_SETTING.getKey(),messageUtil.timingSetting(timingSetting)); @PostMapping("/timingSettingReply") public String timingSettingReply(@RequestBody TimingSettingReply timingSettingReply){ return iotMessageProduce.sendMessage(timingSettingReply.getCharging_pile_code(), ServiceIdMenu.TIMING_SETTING_REPLY.getKey(),messageUtil.timingSettingReply(timingSettingReply)); } /** ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/enums/ServiceIdMenu.java
@@ -67,9 +67,9 @@ */ WORKING_PARAMETER_SETTING ("充电桩工作参数设置","working_parameter_setting"), /** * 对时设置 * 对时设置应答 */ TIMING_SETTING ("对时设置","timing_setting"), TIMING_SETTING_REPLY ("对时设置应答","timing_setting_reply"), /** * 计费模型设置 */ ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/listener/IotMessageListener.java
@@ -95,8 +95,8 @@ case SendTagConstant.WORKING_PARAMETER_SETTING_REPLY: sendResult = enhanceProduce.workingParameterSettingReplyMessage(content); break; case SendTagConstant.TIMING_SETTING_REPLY: sendResult = enhanceProduce.timingSettingReplyMessage(content); case SendTagConstant.TIMING_SETTING: sendResult = enhanceProduce.timingSettingMessage(content); break; case SendTagConstant.SETUP_BILLING_MODEL_REPLY: sendResult = enhanceProduce.setupBillingModelReplyMessage(content); ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/CP56Time2aConverter.java
New file @@ -0,0 +1,39 @@ package com.ruoyi.integration.iotda.utils.tools; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.TimeZone; public class CP56Time2aConverter { public static String convertToCP56Time2a(Date date) { try { DatatypeFactory datatypeFactory = DatatypeFactory.newInstance(); GregorianCalendar calendar = new GregorianCalendar(); calendar.setTime(date); TimeZone timeZone = calendar.getTimeZone(); XMLGregorianCalendar xmlGregorianCalendar = datatypeFactory.newXMLGregorianCalendar( calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH)+1, calendar.get(Calendar.DAY_OF_MONTH), calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), calendar.get(Calendar.SECOND), calendar.get(Calendar.MILLISECOND), (timeZone.getRawOffset() / (60 * 1000))); return xmlGregorianCalendar.toXMLFormat(); } catch (DatatypeConfigurationException e) { throw new RuntimeException("Error creating DatatypeFactory", e); } } public static void main(String[] args) { Date now = new Date(); String cp56Time2a = convertToCP56Time2a(now); System.out.println("CP56Time2a: " + cp56Time2a); } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/MessageUtil.java
@@ -44,7 +44,7 @@ @Autowired private WorkingParameterSettingService workingParameterSettingService; @Autowired private TimingSettingService timingSettingService; private TimingSettingReplyService timingSettingReplyService; @Autowired private SetupBillingModelService setupBillingModelService; @Autowired @@ -205,13 +205,13 @@ } /** * 对时设置 * @param timingSetting 实体对象 * 对时设置应答 * @param timingSettingReply 实体对象 * @return */ public String timingSetting(TimingSetting timingSetting){ timingSettingService.create(timingSetting); return getMessageJsonString(timingSetting, ServiceIdMenu.TIMING_SETTING.getValue()); public String timingSettingReply(TimingSettingReply timingSettingReply){ timingSettingReplyService.create(timingSettingReply); return getMessageJsonString(timingSettingReply, ServiceIdMenu.TIMING_SETTING_REPLY.getValue()); } /** ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/iotda/utils/tools/StrategyUtil.java
New file @@ -0,0 +1,271 @@ package com.ruoyi.integration.iotda.utils.tools; import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail; import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.integration.api.model.AcquisitionBillingModeReply; import lombok.extern.slf4j.Slf4j; import java.io.Serializable; import java.time.LocalTime; import java.util.*; import java.util.stream.Collectors; @Slf4j public class StrategyUtil implements Serializable { /** * 获取计费模版的价格 * @return */ public static Map<Integer, TAccountingStrategyDetail> getStrategyPrice(List<TAccountingStrategyDetail> accountingStrategyDetails) { Map<Integer, TAccountingStrategyDetail> phaseToServiceFee = new HashMap<>(); for (TAccountingStrategyDetail detail : accountingStrategyDetails) { Integer type = detail.getType(); if (!phaseToServiceFee.containsKey(type)) { phaseToServiceFee.put(type, detail); } } return phaseToServiceFee; } /** * 计费模版的价格设置 * @return */ public static void setStrategyPrice(Map<Integer, TAccountingStrategyDetail> accountingStrategyDetails,AcquisitionBillingModeReply acquisitionBillingModeReply) { accountingStrategyDetails.forEach((k,v)->{ switch (k){ case 1: acquisitionBillingModeReply.setSharp_peak_electricity_rate(v.getElectrovalence()); // acquisitionBillingModeReply.setSharp_peak_service_rate(v.getServiceCharge()); break; case 2: acquisitionBillingModeReply.setPeak_electricity_rate(v.getElectrovalence()); // acquisitionBillingModeReply.setPeak_service_rate(v.getServiceCharge()); break; case 3: acquisitionBillingModeReply.setFlat_peak_electricity_rate(v.getElectrovalence()); // acquisitionBillingModeReply.setFlat_peak_service_rate(v.getServiceCharge()); break; default: acquisitionBillingModeReply.setLow_peak_electricity_rate(v.getElectrovalence()); // acquisitionBillingModeReply.setLow_peak_service_rate(v.getServiceCharge()); break; } }); } /** * 计费模版的时段设置 * @return */ public static void setTime(List<TAccountingStrategyDetail> accountingStrategyDetails,AcquisitionBillingModeReply acquisitionBillingModeReply) { LocalTime time = LocalTime.of(0, 15, 0); for (int i = 1; i <= 48; i++) { if(i != 1){ time = time.plusMinutes(30); } accountingStrategyDetails = accountingStrategyDetails.stream().sorted(Comparator.comparing(TAccountingStrategyDetail::getStartTime)).collect(Collectors.toList()); for (TAccountingStrategyDetail accountingStrategyDetail : accountingStrategyDetails) { if(DateUtils.string2LocalTime(accountingStrategyDetail.getStartTime()).isBefore(time) && DateUtils.string2LocalTime(accountingStrategyDetail.getEndTime()).isAfter(time)){ switch (i){ case 1: acquisitionBillingModeReply.setTime1(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 2: acquisitionBillingModeReply.setTime2(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 3: acquisitionBillingModeReply.setTime3(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 4: acquisitionBillingModeReply.setTime4(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 5: acquisitionBillingModeReply.setTime5(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 6: acquisitionBillingModeReply.setTime6(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 7: acquisitionBillingModeReply.setTime7(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 8: acquisitionBillingModeReply.setTime8(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 9: acquisitionBillingModeReply.setTime9(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 10: acquisitionBillingModeReply.setTime10(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 11: acquisitionBillingModeReply.setTime11(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 12: acquisitionBillingModeReply.setTime12(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 13: acquisitionBillingModeReply.setTime13(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 14: acquisitionBillingModeReply.setTime14(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 15: acquisitionBillingModeReply.setTime15(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 16: acquisitionBillingModeReply.setTime16(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 17: acquisitionBillingModeReply.setTime17(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 18: acquisitionBillingModeReply.setTime18(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 19: acquisitionBillingModeReply.setTime19(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 20: acquisitionBillingModeReply.setTime20(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 21: acquisitionBillingModeReply.setTime21(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 22: acquisitionBillingModeReply.setTime22(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 23: acquisitionBillingModeReply.setTime23(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 24: acquisitionBillingModeReply.setTime24(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 25: acquisitionBillingModeReply.setTime25(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 26: acquisitionBillingModeReply.setTime26(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 27: acquisitionBillingModeReply.setTime27(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 28: acquisitionBillingModeReply.setTime28(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 29: acquisitionBillingModeReply.setTime29(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 30: acquisitionBillingModeReply.setTime30(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 31: acquisitionBillingModeReply.setTime31(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 32: acquisitionBillingModeReply.setTime32(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 33: acquisitionBillingModeReply.setTime33(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 34: acquisitionBillingModeReply.setTime34(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 35: acquisitionBillingModeReply.setTime35(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 36: acquisitionBillingModeReply.setTime36(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 37: acquisitionBillingModeReply.setTime37(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 38: acquisitionBillingModeReply.setTime38(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 39: acquisitionBillingModeReply.setTime39(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 40: acquisitionBillingModeReply.setTime40(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 41: acquisitionBillingModeReply.setTime41(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 42: acquisitionBillingModeReply.setTime42(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 43: acquisitionBillingModeReply.setTime43(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 44: acquisitionBillingModeReply.setTime44(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 45: acquisitionBillingModeReply.setTime45(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 46: acquisitionBillingModeReply.setTime46(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 47: acquisitionBillingModeReply.setTime47(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; case 48: acquisitionBillingModeReply.setTime48(accountingStrategyDetail.getType().equals(1)?0 :accountingStrategyDetail.getType().equals(2)?1:accountingStrategyDetail.getType().equals(3)?2:3); break; } } } } } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/PlatformStopChargingReplyService.java
@@ -1,7 +1,15 @@ package com.ruoyi.integration.mongodb.service; import com.ruoyi.integration.api.model.PlatformStopChargingReply; import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply; import com.ruoyi.integration.mongodb.base.BaseService; public interface PlatformStopChargingReplyService extends BaseService<PlatformStopChargingReply> { /** * 根据枪编号获取停机应答 * @return */ PlatformStopChargingReply getPlatformStopChargingReply(GetPlatformStopChargingReply query); } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/mongodb/service/impl/PlatformStopChargingReplyServiceImpl.java
@@ -1,10 +1,13 @@ package com.ruoyi.integration.mongodb.service.impl; import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply; import com.ruoyi.integration.iotda.constant.IotConstant; import com.ruoyi.integration.api.model.PlatformStopChargingReply; import com.ruoyi.integration.mongodb.service.PlatformStopChargingReplyService; 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; @@ -28,4 +31,16 @@ public List<PlatformStopChargingReply> findAll() { return mongoTemplate.findAll(PlatformStopChargingReply.class); } /** * 根据枪编号获取 * @return */ @Override public PlatformStopChargingReply getPlatformStopChargingReply(GetPlatformStopChargingReply query) { List<PlatformStopChargingReply> platformStopChargingReplies = mongoTemplate.find(new Query().addCriteria(Criteria.where("charging_pile_code").is(query.getCharging_pile_code()) .and("charging_gun_code").is(query.getCharging_gun_code())), PlatformStopChargingReply.class); return platformStopChargingReplies.size() > 0 ? platformStopChargingReplies.get(0) : null; } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/AcquisitionBillingModeMessageListener.java
@@ -1,7 +1,14 @@ package com.ruoyi.integration.rocket.listener; import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient; import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail; import com.ruoyi.integration.api.model.AcquisitionBillingMode; import com.ruoyi.integration.api.model.AcquisitionBillingModeReply; import com.ruoyi.integration.api.model.Online; import com.ruoyi.integration.iotda.enums.ServiceIdMenu; import com.ruoyi.integration.iotda.utils.produce.IotMessageProduce; import com.ruoyi.integration.iotda.utils.tools.MessageUtil; import com.ruoyi.integration.iotda.utils.tools.StrategyUtil; import com.ruoyi.integration.mongodb.service.AcquisitionBillingModeService; import com.ruoyi.integration.rocket.model.AcquisitionBillingModeMessage; import com.ruoyi.integration.rocket.util.EnhanceMessageHandler; @@ -11,6 +18,10 @@ import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; import java.util.Objects; @Slf4j @Component @@ -24,7 +35,12 @@ @Autowired private AcquisitionBillingModeService acquisitionBillingModeService; @Autowired private AccountingStrategyDetailClient accountingStrategyDetailClient; @Autowired private IotMessageProduce iotMessageProduce; @Autowired private MessageUtil messageUtil; @Override protected void handleMessage(AcquisitionBillingModeMessage message) throws Exception { // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试 @@ -33,7 +49,15 @@ AcquisitionBillingMode acquisitionBillingMode = new AcquisitionBillingMode(); BeanUtils.copyProperties(message,acquisitionBillingMode); acquisitionBillingModeService.create(acquisitionBillingMode); // 业务处理 // 业务处理 计费模型请求应答 1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段 List<TAccountingStrategyDetail> accountingStrategyDetails = accountingStrategyDetailClient.getDetailListByCode(message.getCharging_pile_code()).getData(); Map<Integer, TAccountingStrategyDetail> strategyPrice = StrategyUtil.getStrategyPrice(accountingStrategyDetails); // 价格设置 AcquisitionBillingModeReply acquisitionBillingModeReply = new AcquisitionBillingModeReply(); StrategyUtil.setStrategyPrice(strategyPrice,acquisitionBillingModeReply); // 时段设置 StrategyUtil.setTime(accountingStrategyDetails,acquisitionBillingModeReply); iotMessageProduce.sendMessage(acquisitionBillingModeReply.getCharging_pile_code(), ServiceIdMenu.ACQUISITION_BILLING_MODE_REPLY.getKey(),messageUtil.acquisitionBillingModeReply(acquisitionBillingModeReply)); } @Override ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/BillingModeVerifyMessageListener.java
@@ -1,5 +1,8 @@ package com.ruoyi.integration.rocket.listener; import com.ruoyi.chargingPile.api.dto.CheckChargingStrategyDTO; import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient; import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail; import com.ruoyi.integration.api.model.AcquisitionBillingMode; import com.ruoyi.integration.api.model.BillingModeVerify; import com.ruoyi.integration.api.model.BillingModeVerifyReply; @@ -33,6 +36,8 @@ private IotMessageProduce iotMessageProduce; @Autowired private MessageUtil messageUtil; @Autowired private AccountingStrategyDetailClient accountingStrategyDetailClient; @Override protected void handleMessage(BillingModeVerifyMessage message) throws Exception { @@ -49,12 +54,22 @@ billingModeVerifyReply.setCharging_pile_code(billingModeVerify.getCharging_pile_code()); billingModeVerifyReply.setBilling_model_code("0"); billingModeVerifyReply.setBilling_model_result(1); iotMessageProduce.sendMessage(billingModeVerifyReply.getCharging_pile_code(), ServiceIdMenu.BILLING_MODE_VERIFY_REPLY.getKey(),messageUtil.billingModeVerifyReply(billingModeVerifyReply)); }else { // 查询桩使用的模版 CheckChargingStrategyDTO dto = new CheckChargingStrategyDTO(); dto.setCode(message.getBilling_model_code()); dto.setStrategyDetailId(Integer.valueOf(message.getBilling_model_code())); Boolean check = accountingStrategyDetailClient.checkChargingStrategy(dto).getData(); // 校验计费模版是否准确 billingModeVerifyReply.setCharging_pile_code(billingModeVerify.getCharging_pile_code()); billingModeVerifyReply.setBilling_model_code(message.getBilling_model_code()); if(check){ billingModeVerifyReply.setBilling_model_result(0); }else { billingModeVerifyReply.setBilling_model_result(1); } } iotMessageProduce.sendMessage(billingModeVerifyReply.getCharging_pile_code(), ServiceIdMenu.BILLING_MODE_VERIFY_REPLY.getKey(),messageUtil.billingModeVerifyReply(billingModeVerifyReply)); } @Override ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/BmsAbortMessageListener.java
@@ -5,12 +5,15 @@ import com.ruoyi.integration.mongodb.service.BmsAbortService; import com.ruoyi.integration.rocket.model.BmsAbortMessage; import com.ruoyi.integration.rocket.util.EnhanceMessageHandler; import com.ruoyi.order.api.feignClient.ChargingOrderClient; 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 +27,12 @@ @Autowired private BmsAbortService bmsAbortService; @Resource private ChargingOrderClient chargingOrderClient; @Override protected void handleMessage(BmsAbortMessage message) throws Exception { // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试 @@ -33,6 +42,7 @@ BeanUtils.copyProperties(message,bmsAbort); bmsAbortService.create(bmsAbort); // 业务处理 chargingOrderClient.excelEndCharge(bmsAbort.getTransaction_serial_number()); } @Override ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/EndChargeMessageListener.java
@@ -11,12 +11,15 @@ import com.ruoyi.integration.rocket.model.EndChargeMessage; import com.ruoyi.integration.rocket.model.PingMessage; import com.ruoyi.integration.rocket.util.EnhanceMessageHandler; import com.ruoyi.order.api.feignClient.ChargingOrderClient; 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 @@ -34,6 +37,12 @@ private MessageUtil messageUtil; @Autowired private IotMessageProduce iotMessageProduce; @Resource private ChargingOrderClient chargingOrderClient; @Override protected void handleMessage(EndChargeMessage message) throws Exception { // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试 @@ -43,6 +52,7 @@ BeanUtils.copyProperties(message,endCharge); endChargeService.create(endCharge); // 业务处理 chargingOrderClient.endCharge(endCharge.getTransaction_serial_number()); } @Override ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/MotorAbortMessageListener.java
@@ -5,12 +5,15 @@ import com.ruoyi.integration.mongodb.service.MotorAbortService; import com.ruoyi.integration.rocket.model.MotorAbortMessage; import com.ruoyi.integration.rocket.util.EnhanceMessageHandler; import com.ruoyi.order.api.feignClient.ChargingOrderClient; 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 +27,13 @@ @Autowired private MotorAbortService motorAbortService; @Resource private ChargingOrderClient chargingOrderClient; @Override protected void handleMessage(MotorAbortMessage message) throws Exception { // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试 @@ -33,6 +43,7 @@ BeanUtils.copyProperties(message,motorAbort); motorAbortService.create(motorAbort); // 业务处理 chargingOrderClient.excelEndCharge(motorAbort.getTransaction_serial_number()); } @Override ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TimingSettingMessageListener.java
New file @@ -0,0 +1,93 @@ package com.ruoyi.integration.rocket.listener; import com.ruoyi.integration.api.model.TimingSetting; import com.ruoyi.integration.api.model.TimingSettingReply; import com.ruoyi.integration.iotda.enums.ServiceIdMenu; import com.ruoyi.integration.iotda.utils.produce.IotMessageProduce; import com.ruoyi.integration.iotda.utils.tools.CP56Time2aConverter; import com.ruoyi.integration.iotda.utils.tools.MessageUtil; import com.ruoyi.integration.mongodb.service.TimingSettingReplyService; import com.ruoyi.integration.mongodb.service.TimingSettingService; import com.ruoyi.integration.rocket.model.TimingSettingMessage; import com.ruoyi.integration.rocket.util.EnhanceMessageHandler; 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 java.util.Date; @Slf4j @Component @RocketMQMessageListener( consumerGroup = "enhance_consumer_group", topic = "rocket_enhance", selectorExpression = "*", consumeThreadMax = 5 //默认是64个线程并发消息,配置 consumeThreadMax 参数指定并发消费线程数,避免太大导致资源不够 ) public class TimingSettingMessageListener extends EnhanceMessageHandler<TimingSettingMessage> implements RocketMQListener<TimingSettingMessage> { @Autowired private TimingSettingService timingSettingService; @Autowired private IotMessageProduce iotMessageProduce; @Autowired private MessageUtil messageUtil; @Override protected void handleMessage(TimingSettingMessage message) throws Exception { // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试 log.info("对时设置-业务消息处理:{}",message); // 持久化消息 TimingSetting timingSetting = new TimingSetting(); BeanUtils.copyProperties(message,timingSetting); timingSettingService.create(timingSetting); // 业务处理 对时设置应答 TimingSettingReply timingSettingReply = new TimingSettingReply(); timingSettingReply.setCharging_pile_code(message.getCharging_pile_code()); timingSettingReply.setCurrent_time(CP56Time2aConverter.convertToCP56Time2a(new Date())); iotMessageProduce.sendMessage(timingSettingReply.getCharging_pile_code(), ServiceIdMenu.TIMING_SETTING_REPLY.getKey(),messageUtil.timingSettingReply(timingSettingReply)); } @Override protected void handleMaxRetriesExceeded(TimingSettingMessage message) { // 当超过指定重试次数消息时此处方法会被调用 // 生产中可以进行回退或其他业务操作 log.error("消息消费失败,请执行后续处理"); } /** * 是否执行重试机制 */ @Override protected boolean isRetry() { return true; } @Override protected boolean throwException() { // 是否抛出异常,false搭配retry自行处理异常 return false; } /** * 若需要处理消息过滤,在父级中进行统一处理,或者在此处实现之后,自行处理 * @param message 待处理消息 * @return true: 本次消息被过滤,false:不过滤 */ @Override protected boolean filter(TimingSettingMessage message) { // 此处可做消息过滤 return false; } /** * 监听消费消息,不需要执行业务处理,委派给父类做基础操作,父类做完基础操作后会调用子类的实际处理类型 */ @Override public void onMessage(TimingSettingMessage message) { super.dispatchMessage(message); } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TimingSettingReplyMessageListener.java
File was deleted ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/listener/TransactionRecordMessageListener.java
@@ -1,7 +1,11 @@ package com.ruoyi.integration.rocket.listener; import com.ruoyi.integration.api.model.ConfirmTransactionRecord; import com.ruoyi.integration.api.model.Online; import com.ruoyi.integration.api.model.TransactionRecord; import com.ruoyi.integration.iotda.enums.ServiceIdMenu; import com.ruoyi.integration.iotda.utils.produce.IotMessageProduce; import com.ruoyi.integration.iotda.utils.tools.MessageUtil; import com.ruoyi.integration.mongodb.service.TransactionRecordService; import com.ruoyi.integration.rocket.model.TransactionRecordMessage; import com.ruoyi.integration.rocket.util.EnhanceMessageHandler; @@ -24,6 +28,10 @@ @Autowired private TransactionRecordService transactionRecordService; @Autowired private IotMessageProduce iotMessageProduce; @Autowired private MessageUtil messageUtil; @Override protected void handleMessage(TransactionRecordMessage message) throws Exception { // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试 @@ -33,6 +41,10 @@ BeanUtils.copyProperties(message,transactionRecord); transactionRecordService.create(transactionRecord); // 业务处理 ConfirmTransactionRecord confirmTransactionRecord = new ConfirmTransactionRecord(); confirmTransactionRecord.setTransaction_serial_number(message.getTransaction_serial_number()); confirmTransactionRecord.setConfirm_result(0); iotMessageProduce.sendMessage(confirmTransactionRecord.getTransaction_serial_number(), ServiceIdMenu.CONFIRM_TRANSACTION_RECORD.getKey(),messageUtil.confirmTransactionRecord(confirmTransactionRecord)); } @Override ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/TimingSettingMessage.java
New file @@ -0,0 +1,17 @@ package com.ruoyi.integration.rocket.model; import com.ruoyi.integration.rocket.base.BaseMessage; import lombok.Data; /** * 对时设置 **/ @Data public class TimingSettingMessage extends BaseMessage { private String charging_pile_code; //桩编码 private String current_time; //当前时间 } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/produce/EnhanceProduce.java
@@ -253,15 +253,15 @@ } /** * 对时设置应答 * 对时设置 */ public SendResult timingSettingReplyMessage(JSONObject jsonObject) { TimingSettingReplyMessage message = JSON.parseObject(jsonObject.toJSONString(),TimingSettingReplyMessage.class); public SendResult timingSettingMessage(JSONObject jsonObject) { TimingSettingMessage message = JSON.parseObject(jsonObject.toJSONString(),TimingSettingMessage.class); // 设置业务key message.setKey(UUID.randomUUID().toString()); // 设置消息来源,便于查询 message.setSource(SendTagConstant.TIMING_SETTING_REPLY); return rocketMQEnhanceTemplate.send(TOPIC, SendTagConstant.TIMING_SETTING_REPLY, message); message.setSource(SendTagConstant.TIMING_SETTING); return rocketMQEnhanceTemplate.send(TOPIC, SendTagConstant.TIMING_SETTING, message); } /** ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/AccountingStrategyDetailOrderController.java
New file @@ -0,0 +1,39 @@ package com.ruoyi.order.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail; import com.ruoyi.common.core.domain.R; import com.ruoyi.order.api.model.AccountingStrategyDetailOrder; import com.ruoyi.order.service.AccountingStrategyDetailOrderService; 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; /** * @author zhibing.pu * @Date 2024/9/4 16:17 */ @RestController @RequestMapping("/accountingStrategyDetailOrder") public class AccountingStrategyDetailOrderController { @Resource private AccountingStrategyDetailOrderService accountingStrategyDetailOrderService; /** * 根据订单id获取当前有效的策略 * @param orderId * @return */ @PostMapping("/getNowAccountingStrategyDetailOrder") public R<AccountingStrategyDetailOrder> getNowAccountingStrategyDetailOrder(@RequestParam("orderId") Long orderId){ AccountingStrategyDetailOrder one = accountingStrategyDetailOrderService.getOne(new LambdaQueryWrapper<AccountingStrategyDetailOrder>() .eq(AccountingStrategyDetailOrder::getChargingOrderId, orderId) .last(" and DATE_FORMAT(now(), '%H:%i') between start_time and end_time")); return R.ok(one); } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -460,7 +460,7 @@ * @param request */ @ResponseBody @PostMapping(value = "/chargingOrderALICallback") @PostMapping(value = "/chargingOrderStartupFailureWxRefund") public void chargingOrderStartupFailureWxRefund(HttpServletRequest request){ WxRefundNotifyResp data = wxPaymentClient.refundNotify(request).getData(); if(null != data){ @@ -784,5 +784,23 @@ return resultList; } /** * 硬件充电结束后的处理逻辑 * @param code */ @PostMapping("/endCharge") public void endCharge(@RequestParam("code") String code){ chargingOrderService.endCharge(code, 2); } /** * 硬件异常结束充电后的处理逻辑 * @param code */ @PostMapping("/excelEndCharge") public void excelEndCharge(@RequestParam("code") String code){ chargingOrderService.excelEndCharge(code); } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/AccountingStrategyDetailOrderMapper.java
New file @@ -0,0 +1,11 @@ package com.ruoyi.order.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.order.api.model.AccountingStrategyDetailOrder; /** * @author zhibing.pu * @Date 2024/9/4 15:42 */ public interface AccountingStrategyDetailOrderMapper extends BaseMapper<AccountingStrategyDetailOrder> { } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/AccountingStrategyOrderMapper.java
New file @@ -0,0 +1,11 @@ package com.ruoyi.order.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.order.api.model.AccountingStrategyOrder; /** * @author zhibing.pu * @Date 2024/9/4 15:37 */ public interface AccountingStrategyOrderMapper extends BaseMapper<AccountingStrategyOrder> { } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/AccountingStrategyDetailOrderService.java
New file @@ -0,0 +1,11 @@ package com.ruoyi.order.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.order.api.model.AccountingStrategyDetailOrder; /** * @author zhibing.pu * @Date 2024/9/4 15:41 */ public interface AccountingStrategyDetailOrderService extends IService<AccountingStrategyDetailOrder> { } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/AccountingStrategyOrderService.java
New file @@ -0,0 +1,11 @@ package com.ruoyi.order.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.order.api.model.AccountingStrategyOrder; /** * @author zhibing.pu * @Date 2024/9/4 15:36 */ public interface AccountingStrategyOrderService extends IService<AccountingStrategyOrder> { } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
@@ -15,6 +15,8 @@ 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 org.springframework.web.bind.annotation.RequestParam; import java.math.BigDecimal; import java.time.LocalDate; @@ -138,4 +140,18 @@ * @param query */ void chargeMonitoring(UploadRealTimeMonitoringDataQuery query); /** * 自动结束充电后的处理逻辑 * @param code */ void endCharge(String code, Integer endMode); /** * 异常结束充电处理逻辑 * @param orderCode */ void excelEndCharge(String orderCode); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/AccountingStrategyDetailOrderServiceImpl.java
New file @@ -0,0 +1,15 @@ package com.ruoyi.order.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.order.api.model.AccountingStrategyDetailOrder; import com.ruoyi.order.mapper.AccountingStrategyDetailOrderMapper; import com.ruoyi.order.service.AccountingStrategyDetailOrderService; import org.springframework.stereotype.Service; /** * @author zhibing.pu * @Date 2024/9/4 15:42 */ @Service public class AccountingStrategyDetailOrderServiceImpl extends ServiceImpl<AccountingStrategyDetailOrderMapper, AccountingStrategyDetailOrder> implements AccountingStrategyDetailOrderService { } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/AccountingStrategyOrderServiceImpl.java
New file @@ -0,0 +1,15 @@ package com.ruoyi.order.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.order.api.model.AccountingStrategyOrder; import com.ruoyi.order.mapper.AccountingStrategyOrderMapper; import com.ruoyi.order.service.AccountingStrategyOrderService; import org.springframework.stereotype.Service; /** * @author zhibing.pu * @Date 2024/9/4 15:36 */ @Service public class AccountingStrategyOrderServiceImpl extends ServiceImpl<AccountingStrategyOrderMapper, AccountingStrategyOrder> implements AccountingStrategyOrderService { } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -1,23 +1,16 @@ package com.ruoyi.order.service.impl; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.api.feignClient.AppUserCarClient; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.account.api.feignClient.AppUserVipDetailClient; import com.ruoyi.account.api.model.TAppUser; import com.ruoyi.account.api.model.TAppUserCar; import com.ruoyi.account.api.model.TAppUserVipDetail; import com.ruoyi.account.api.feignClient.*; import com.ruoyi.account.api.model.*; 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.account.api.vo.GetInviteUser; import com.ruoyi.chargingPile.api.feignClient.*; import com.ruoyi.chargingPile.api.model.*; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.dto.ChargingOrderGroup; import com.ruoyi.common.core.dto.ChargingPercentProvinceDto; @@ -33,6 +26,11 @@ import com.ruoyi.integration.api.model.PlatformStartCharging; import com.ruoyi.integration.api.model.PlatformStartChargingReply; import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData; import com.ruoyi.integration.api.feignClient.*; import com.ruoyi.integration.api.model.*; import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply; import com.ruoyi.order.api.feignClient.AccountingStrategyDetailOrderClient; import com.ruoyi.order.api.feignClient.ChargingOrderAccountingStrategyClient; import com.ruoyi.order.api.model.*; import com.ruoyi.order.api.query.ChargingOrderQuery; import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery; @@ -46,7 +44,12 @@ import com.ruoyi.order.service.TChargingOrderRefundService; import com.ruoyi.order.service.TChargingOrderService; import com.ruoyi.order.service.TOrderEvaluateService; import com.ruoyi.order.service.*; import com.ruoyi.other.api.domain.TCoupon; import com.ruoyi.other.api.domain.TGoods; import com.ruoyi.order.vo.ChargingOrderListInfoVO; import com.ruoyi.other.api.domain.TIntegralRule; import com.ruoyi.other.api.feignClient.IntegralRuleClient; import com.ruoyi.other.api.feignClient.RoleSiteClient; import com.ruoyi.other.api.feignClient.UserSiteClient; import com.ruoyi.payment.api.feignClient.AliPaymentClient; @@ -57,11 +60,18 @@ import com.ruoyi.payment.api.vo.*; import com.ruoyi.system.api.feignClient.SysUserClient; import io.seata.spring.annotation.GlobalTransactional; import io.swagger.annotations.ApiModelProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; @@ -82,6 +92,8 @@ @Service public class TChargingOrderServiceImpl extends ServiceImpl<TChargingOrderMapper, TChargingOrder> implements TChargingOrderService { private Logger log = LoggerFactory.getLogger(TChargingOrderServiceImpl.class); @Resource private ChargingGunClient chargingGunClient; @@ -110,7 +122,8 @@ private AliPaymentClient aliPaymentClient; @Resource private AppCouponClient appCouponClient; @Resource private AppUserVipDetailClient appUserVipDetailClient; @@ -135,10 +148,34 @@ private AccountingStrategyDetailClient accountingStrategyDetailClient; @Resource private AccountingStrategyDetailOrderClient accountingStrategyDetailOrderClient; @Resource private AccountingStrategyClient accountingStrategyClient; @Resource private PlatformStartChargingReplyClient platformStartChargingReplyClient; @Resource private TChargingOrderRefundService chargingOrderRefundService; @Resource private PlatformStopChargingReplyClient platformStopChargingReplyClient; @Resource private AccountingStrategyOrderService accountingStrategyOrderService; @Resource private AccountingStrategyDetailOrderService accountingStrategyDetailOrderService; @Resource private InviteUserClient inviteUserClient; @Resource private AppUserIntegralChangeClient appUserIntegralChangeClient; @Resource private IntegralRuleClient integralRuleClient; //计数器 private Map<String, Integer> counter_map = new HashMap<>(); @@ -403,9 +440,25 @@ chargingOrder.setVipDiscountAmount(discountAmount); } } } this.save(chargingOrder); //添加订单的计费策略 TAccountingStrategy accountingStrategy = accountingStrategyClient.getAccountingStrategyById(tChargingGun.getAccountingStrategyId()).getData(); List<TAccountingStrategyDetail> strategyDetailList = accountingStrategyDetailClient.getListByAccountingStrategyId(tChargingGun.getAccountingStrategyId()).getData(); AccountingStrategyOrder accountingStrategyOrder = new AccountingStrategyOrder(); BeanUtils.copyProperties(accountingStrategy, accountingStrategyOrder); accountingStrategyOrder.setChargingOrderId(chargingOrder.getId()); accountingStrategyOrderService.save(accountingStrategyOrder); List<AccountingStrategyDetailOrder> list1 = new ArrayList<>(); for (TAccountingStrategyDetail tAccountingStrategyDetail : strategyDetailList) { AccountingStrategyDetailOrder accountingStrategyDetailOrder = new AccountingStrategyDetailOrder(); BeanUtils.copyProperties(tAccountingStrategyDetail, accountingStrategyDetailOrder); accountingStrategyDetailOrder.setChargingOrderId(chargingOrder.getId()); list1.add(accountingStrategyDetailOrder); } accountingStrategyDetailOrderService.saveBatch(list1); //会员优惠折扣将其计入增加充电时长(增加总充电金额) //如果充电总金额未使用完,则需要退回费用=(原金额/总金额)*(总金额-实际充电金额) if(1 == addChargingOrder.getPaymentType()){ @@ -453,7 +506,6 @@ chargingOrder.setRechargePaymentStatus(2); chargingOrder.setRechargeSerialNumber(transaction_id); chargingOrder.setStatus(2); this.updateById(chargingOrder); //添加安全检测数据到缓存中,每步安全检测完成后需要更新缓存数据 PreChargeCheck preChargeCheck = new PreChargeCheck(); @@ -468,7 +520,7 @@ BigDecimal rechargeAmount = chargingOrder.getRechargeAmount(); //计算充电金额,会员需要将折扣金额加入到充电总金额中 TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData(); TAccountingStrategyDetail strategyDetail = accountingStrategyDetailClient.getNowData(chargingGun.getAccountingStrategyId()).getData(); AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderClient.getNowAccountingStrategyDetailOrder(chargingOrder.getId()).getData(); //总单价 BigDecimal totalUnitPrice = strategyDetail.getServiceCharge().add(strategyDetail.getElectrovalence()); //计算能充电的度数 @@ -492,6 +544,8 @@ } } electrovalence = electrovalence.add(discount); chargingOrder.setChargeAmount(electrovalence); this.updateById(chargingOrder); TChargingPile chargingPile = chargingPileClient.getChargingPileById(chargingGun.getChargingPileId()).getData(); @@ -689,6 +743,7 @@ * @return */ @Override @GlobalTransactional(rollbackFor = Exception.class) public AjaxResult stopCharging(String id) { TChargingOrder chargingOrder = this.getById(id); Integer status = chargingOrder.getStatus(); @@ -698,14 +753,229 @@ chargingOrder.setStatus(4); chargingOrder.setEndMode(1); this.updateById(chargingOrder); //调用硬件停止充电,停止成功后开始计算费用退款 // todo 待完善 //异步线程处理停机 ExecutorService cachedThreadPool = Executors.newFixedThreadPool(1); cachedThreadPool.execute(()->{ //调用硬件停止充电,停止成功后开始计算费用退款 TChargingPile chargingPile = chargingPileClient.getChargingPileById(chargingOrder.getChargingPileId()).getData(); TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData(); PlatformStopCharging platformStopCharging = new PlatformStopCharging(); platformStopCharging.setCharging_pile_code(chargingPile.getCode()); platformStopCharging.setCharging_gun_code(chargingGun.getCode()); sendMessageClient.platformStopCharging(platformStopCharging); //开始查询停机应答,成功后开始计费费用 for (int i = 0; i < 60; i++) { GetPlatformStopChargingReply query = new GetPlatformStopChargingReply(); query.setCharging_gun_code(chargingGun.getCode()); query.setCharging_pile_code(chargingPile.getCode()); PlatformStopChargingReply reply = platformStopChargingReplyClient.getPlatformStopChargingReply(query).getData(); if(null == reply){ try { Thread.sleep(1000); } catch (InterruptedException e) { throw new RuntimeException(e); } continue; } if(0 == reply.getStop_result()){ String failure_cause = ""; switch (reply.getFailure_cause()){ case 0: failure_cause = "无"; break; case 1: failure_cause = "设备编号不匹配"; break; case 2: failure_cause = "枪未处于充电状态"; break; case 3: failure_cause = "其他"; break; } log.error("停机失败:订单号:{},失败原因:{}", chargingOrder.getCode(), failure_cause); throw new RuntimeException(failure_cause); } //计算费用,处理退款 endCharge(chargingOrder); break; } }); //处理推荐奖励(被推荐首单奖励) TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData(); long count = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId()) .eq(TChargingOrder::getStatus, 5).isNull(TChargingOrder::getEndMode).eq(TChargingOrder::getDelFlag, 0)); if(null != appUser.getInviteUserId() && 1 == count){ TIntegralRule integralRule = integralRuleClient.getSet().getData(); String inviteUsersToEarnPoints = integralRule.getInviteUsersToEarnPoints(); JSONObject jsonObject = JSON.parseObject(inviteUsersToEarnPoints); Integer num1 = jsonObject.getInteger("num1"); GetInviteUser query = new GetInviteUser(); query.setAppUserId(appUser.getInviteUserId()); query.setBeInvitedAppUserId(chargingOrder.getAppUserId()); TInviteUser inviteUser = inviteUserClient.getInviteUser(query).getData(); if(null == inviteUser){ inviteUser = new TInviteUser(); inviteUser.setAppUserId(appUser.getInviteUserId()); inviteUser.setBeInvitedAppUserId(chargingOrder.getAppUserId()); inviteUser.setAward(num1); inviteUser.setCreateTime(LocalDateTime.now()); inviteUserClient.saveInviteUser(inviteUser); }else{ inviteUser.setAward(num1); inviteUserClient.updateInviteUser(inviteUser); } TAppUser appUser1 = appUserClient.getUserById(appUser.getInviteUserId()).getData(); TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange(); String code = Math.random() * 1000 + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")); appUserIntegralChange.setCode(code); appUserIntegralChange.setAppUserId(appUser.getInviteUserId()); appUserIntegralChange.setChangeType(5); appUserIntegralChange.setHistoricalIntegral(appUser1.getPoints()); appUserIntegralChange.setCurrentIntegral(appUser1.getPoints() + num1); appUserIntegralChange.setCreateTime(LocalDateTime.now()); appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange); appUser1.setPoints(appUser1.getPoints() + num1); appUserClient.updateAppUser(appUser1); } return AjaxResult.success(); } /** * 手动结束后的费用计算和退款逻辑 */ @GlobalTransactional(rollbackFor = Exception.class) public void endCharge(TChargingOrder chargingOrder){ //如果使用优惠券需要判断优惠券是否满足使用条件 //根据实际的充电金额计算退款金额 退回费用=(原金额/总金额)*(总金额-实际充电金额) //退款金额=优惠券金额+剩余充电金额 List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId())); BigDecimal total = BigDecimal.ZERO; for (TChargingOrderAccountingStrategy chargingOrderAccountingStrategy : list) { BigDecimal periodElectricPrice = chargingOrderAccountingStrategy.getPeriodElectricPrice(); BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodOriginalServicePrice(); total = total.add(periodElectricPrice).add(periodServicePrice); } BigDecimal rechargeAmount = chargingOrder.getRechargeAmount(); BigDecimal vipDiscountAmount = chargingOrder.getVipDiscountAmount(); BigDecimal decimal = rechargeAmount.add(vipDiscountAmount); //退款金额(已经计算了折扣优惠部分) BigDecimal refundAmount = rechargeAmount.divide(decimal, new MathContext(4, RoundingMode.HALF_EVEN)).multiply(decimal.subtract(total)); BigDecimal payAmount = BigDecimal.valueOf(total.doubleValue()); BigDecimal orderAmount = BigDecimal.valueOf(total.doubleValue()); if(null != chargingOrder.getVipDiscount()){ orderAmount = orderAmount.divide(chargingOrder.getVipDiscount().divide(new BigDecimal(10))); chargingOrder.setOrderAmount(total); } public void endCharge(){ if(chargingOrder.getEndMode() == 2){ chargingOrder.setEndMode(refundAmount.compareTo(BigDecimal.ZERO) > 0 ? 2 : 3); } chargingOrder.setStatus(5); chargingOrder.setPaymentAmount(payAmount); this.updateById(chargingOrder); //计算优惠券 if(null != chargingOrder.getAppCouponId()){ //判断实际充电金额是否满足优惠券使用条件,如果不满足则不适用优惠券。 TAppCoupon appCoupon = appCouponClient.getAppCouponById(chargingOrder.getAppCouponId()).getData(); String couponJson = appCoupon.getCouponJson(); TCoupon tCoupon = JSON.parseObject(couponJson, TCoupon.class); Integer preferentialMode = tCoupon.getPreferentialMode(); if(1 == preferentialMode){ //满减 if(total.compareTo(tCoupon.getMeetTheConditions()) >= 0){ refundAmount = refundAmount.add(tCoupon.getDiscountAmount()); chargingOrder.setCouponDiscountAmount(tCoupon.getDiscountAmount()); payAmount = payAmount.subtract(tCoupon.getDiscountAmount()); }else{ chargingOrder.setAppCouponId(null); chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO); appCouponClient.refund(chargingOrder.getAppCouponId().toString()); } } if(2 == preferentialMode){ //抵扣 if(total.compareTo(tCoupon.getMeetTheConditions()) >= 0){ //折扣金额 BigDecimal divide = total.multiply(new BigDecimal(10).subtract(tCoupon.getDiscount())).divide(new BigDecimal(10)); divide = divide.compareTo(tCoupon.getMaximumDiscountAmount()) > 0 ? tCoupon.getMaximumDiscountAmount() : divide; refundAmount = refundAmount.add(divide); chargingOrder.setCouponDiscountAmount(divide); payAmount = payAmount.subtract(divide); }else{ chargingOrder.setAppCouponId(null); chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO); appCouponClient.refund(chargingOrder.getAppCouponId().toString()); } } } if(null != chargingOrder.getVipDiscount()){ BigDecimal subtract = orderAmount.subtract(total); chargingOrder.setVipDiscountAmount(subtract); payAmount = payAmount.subtract(subtract); } //开始构建退款费用 if(refundAmount.compareTo(BigDecimal.ZERO) > 0){ Integer rechargePaymentType = chargingOrder.getRechargePaymentType(); //构建退款明细 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(refundAmount); chargingOrderRefund.setRefundStatus(1); chargingOrderRefund.setPayType(rechargePaymentType); chargingOrderRefund.setRefundStatus(1); chargingOrderRefund.setCode(chargingOrder.getCode()); chargingOrderRefund.setRefundTitle("充电完成退款"); chargingOrderRefund.setRefundContent("充电完成退款"); chargingOrderRefund.setRefundReason("充电完成退款"); chargingOrderRefund.setRefundRemark("充电完成退款"); chargingOrderRefund.setRefundTotalAmount(refundAmount); 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(refundAmount.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); } } } } } @@ -1060,7 +1330,6 @@ return null; } @Override public ChargingOrderListInfoVO chargingInfo(String uid) { TChargingOrder chargingOrder= this.getById(uid); @@ -1118,6 +1387,165 @@ */ @Override public void chargeMonitoring(UploadRealTimeMonitoringDataQuery query) { // todo 需完善 if(com.ruoyi.common.core.utils.StringUtils.isNotEmpty(query.getCharging_gun_code())){ //获取当前的计费策略 TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, query.getCharging_gun_code())); AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderClient.getNowAccountingStrategyDetailOrder(chargingOrder.getId()).getData(); TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = chargingOrderAccountingStrategyService.getOne(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>() .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()).orderByDesc(TChargingOrderAccountingStrategy::getCreateTime).last(" limit 0, 1")); SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); if(null == chargingOrderAccountingStrategy){ chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy(); chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId()); chargingOrderAccountingStrategy.setAccountingStrategyDetailId(strategyDetail.getId()); chargingOrderAccountingStrategy.setType(strategyDetail.getType()); chargingOrderAccountingStrategy.setStartTime(sdf.format(chargingOrder.getStartTime())); chargingOrderAccountingStrategy.setEndTime(sdf.format(new Date())); chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence()); chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge()); chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge()); BigDecimal charging_degree = query.getCharging_degree(); BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(charging_degree); BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(charging_degree); BigDecimal serviceCharge = originalServicePrice; //计算优惠金额 if(null != chargingOrder.getVipDiscount()){ serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10))); } chargingOrderAccountingStrategy.setChargingCapacity(charging_degree); chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc); chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge); chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice); chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now()); chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy); }else{ if(chargingOrderAccountingStrategy.getAccountingStrategyDetailId().equals(strategyDetail.getId())){ BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodServicePrice(); BigDecimal periodElectricPrice = chargingOrderAccountingStrategy.getPeriodElectricPrice(); BigDecimal periodOriginalServicePrice = chargingOrderAccountingStrategy.getPeriodOriginalServicePrice(); BigDecimal charging_degree = query.getCharging_degree(); BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(charging_degree); BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(charging_degree); BigDecimal serviceCharge = originalServicePrice; //计算优惠金额 if(null != chargingOrder.getVipDiscount()){ serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10))); } periodServicePrice = periodServicePrice.add(serviceCharge); periodOriginalServicePrice = periodOriginalServicePrice.add(originalServicePrice); periodElectricPrice = periodElectricPrice.add(electrovalenc); chargingOrderAccountingStrategy.setPeriodServicePrice(periodServicePrice); chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(periodOriginalServicePrice); chargingOrderAccountingStrategy.setPeriodElectricPrice(periodElectricPrice); chargingOrderAccountingStrategy.setEndTime(sdf.format(new Date())); chargingOrderAccountingStrategyService.updateById(chargingOrderAccountingStrategy); }else{ TChargingOrderAccountingStrategy chargingOrderAccountingStrategy1 = new TChargingOrderAccountingStrategy(); chargingOrderAccountingStrategy1.setChargingOrderId(chargingOrder.getId()); chargingOrderAccountingStrategy1.setAccountingStrategyDetailId(strategyDetail.getId()); chargingOrderAccountingStrategy1.setType(strategyDetail.getType()); chargingOrderAccountingStrategy1.setStartTime(sdf.format(chargingOrderAccountingStrategy.getEndTime())); chargingOrderAccountingStrategy1.setEndTime(sdf.format(new Date())); chargingOrderAccountingStrategy1.setElectrovalence(strategyDetail.getElectrovalence()); chargingOrderAccountingStrategy1.setServiceCharge(strategyDetail.getServiceCharge()); chargingOrderAccountingStrategy1.setCostServiceCharge(strategyDetail.getCostServiceCharge()); BigDecimal charging_degree = query.getCharging_degree(); BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(charging_degree); BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(charging_degree); BigDecimal serviceCharge = originalServicePrice; //计算优惠金额 if(null != chargingOrder.getVipDiscount()){ serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10))); } chargingOrderAccountingStrategy1.setChargingCapacity(charging_degree); chargingOrderAccountingStrategy1.setPeriodElectricPrice(electrovalenc); chargingOrderAccountingStrategy1.setPeriodOriginalServicePrice(originalServicePrice); chargingOrderAccountingStrategy1.setPeriodServicePrice(serviceCharge); chargingOrderAccountingStrategy1.setCreateTime(LocalDateTime.now()); chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy1); } } List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>() .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId())); BigDecimal t = BigDecimal.ZERO; for (TChargingOrderAccountingStrategy coas : list) { t = t.add(coas.getPeriodServicePrice()).add(coas.getPeriodElectricPrice()); } BigDecimal residualAmount = chargingOrder.getRechargeAmount().subtract(t).setScale(2, RoundingMode.HALF_EVEN); chargingOrder.setResidualAmount(residualAmount); BigDecimal divide = query.getOutput_current().multiply(query.getOutput_voltage()).divide(new BigDecimal(1000)); chargingOrder.setChargingPower(divide); this.updateById(chargingOrder); } } /** * 自动结束充电后的处理逻辑 * @param orderCode */ @Override @GlobalTransactional(rollbackFor = Exception.class) public void endCharge(String orderCode, Integer endMode) { TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, orderCode)); Integer status = chargingOrder.getStatus(); if(status == 4 || status == 5){ return; } chargingOrder.setStatus(5); chargingOrder.setEndMode(endMode); this.updateById(chargingOrder); //计算费用,处理退款 endCharge(chargingOrder); //处理推荐奖励(被推荐首单奖励) TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData(); long count = this.count(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserId, chargingOrder.getAppUserId()) .eq(TChargingOrder::getStatus, 5).isNull(TChargingOrder::getEndMode).eq(TChargingOrder::getDelFlag, 0)); if(null != appUser.getInviteUserId() && 1 == count){ TIntegralRule integralRule = integralRuleClient.getSet().getData(); String inviteUsersToEarnPoints = integralRule.getInviteUsersToEarnPoints(); JSONObject jsonObject = JSON.parseObject(inviteUsersToEarnPoints); Integer num1 = jsonObject.getInteger("num1"); GetInviteUser query = new GetInviteUser(); query.setAppUserId(appUser.getInviteUserId()); query.setBeInvitedAppUserId(chargingOrder.getAppUserId()); TInviteUser inviteUser = inviteUserClient.getInviteUser(query).getData(); if(null == inviteUser){ inviteUser = new TInviteUser(); inviteUser.setAppUserId(appUser.getInviteUserId()); inviteUser.setBeInvitedAppUserId(chargingOrder.getAppUserId()); inviteUser.setAward(num1); inviteUser.setCreateTime(LocalDateTime.now()); inviteUserClient.saveInviteUser(inviteUser); }else{ inviteUser.setAward(num1); inviteUserClient.updateInviteUser(inviteUser); } TAppUser appUser1 = appUserClient.getUserById(appUser.getInviteUserId()).getData(); TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange(); String code = Math.random() * 1000 + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")); appUserIntegralChange.setCode(code); appUserIntegralChange.setAppUserId(appUser.getInviteUserId()); appUserIntegralChange.setChangeType(5); appUserIntegralChange.setHistoricalIntegral(appUser1.getPoints()); appUserIntegralChange.setCurrentIntegral(appUser1.getPoints() + num1); appUserIntegralChange.setCreateTime(LocalDateTime.now()); appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange); appUser1.setPoints(appUser1.getPoints() + num1); appUserClient.updateAppUser(appUser1); } } /** * 异常结束充电处理逻辑 * @param orderCode */ @Override public void excelEndCharge(String orderCode) { endCharge(orderCode, 0); } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java
@@ -16,19 +16,13 @@ import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.model.TOrderInvoice; import com.ruoyi.order.api.model.TOrderInvoiceDetail; import com.ruoyi.order.api.model.TShoppingOrder; import com.ruoyi.order.api.model.*; import com.ruoyi.order.api.query.TOrderInvoiceQuery; import com.ruoyi.order.api.vo.TOrderEvaluateVO; import com.ruoyi.order.api.vo.TOrderInvoiceVO; import com.ruoyi.order.dto.*; import com.ruoyi.order.mapper.TOrderInvoiceMapper; import com.ruoyi.order.service.TChargingOrderService; import com.ruoyi.order.service.TOrderInvoiceDetailService; import com.ruoyi.order.service.TOrderInvoiceService; import com.ruoyi.order.service.TShoppingOrderService; import com.ruoyi.order.service.*; import com.ruoyi.other.api.domain.TCoupon; import com.ruoyi.other.api.domain.TGoods; import com.ruoyi.other.api.domain.TInvoiceType; @@ -86,6 +80,9 @@ private CouponClient couponClient; @Resource private AppUserClient appUserClient; @Resource private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService; @@ -128,6 +125,11 @@ //获取开票类型 TInvoiceType invoiceType = invoiceTypeClient.getInvoiceType(addOrderInvoice.getInvoiceTypeId()).getData(); for (Long orderId : orderIds) { List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>() .eq(TChargingOrderAccountingStrategy::getChargingOrderId, orderId)); BigDecimal electrovalence = list.stream().map(TChargingOrderAccountingStrategy::getElectrovalence).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal serviceCharge = list.stream().map(TChargingOrderAccountingStrategy::getServiceCharge).reduce(BigDecimal.ZERO, BigDecimal::add); TOrderInvoiceDetail orderInvoiceDetail = new TOrderInvoiceDetail(); orderInvoiceDetail.setOrderInvoiceId(addOrderInvoice.getId()); orderInvoiceDetail.setInvoiceAmount(map.get(orderId)); @@ -136,6 +138,9 @@ orderInvoiceDetail.setElectricityTariff(invoiceType.getElectricityTariff()); orderInvoiceDetail.setServiceTariff(invoiceType.getServiceTariff()); orderInvoiceDetail.setAddedServiceTariff(invoiceType.getAddedServiceTariff()); orderInvoiceDetail.setElectrovalence(electrovalence); orderInvoiceDetail.setServiceCharge(serviceCharge); orderInvoiceDetail.setAddedService(serviceCharge.multiply(invoiceType.getAddedServiceTariff().divide(new BigDecimal(100)))); orderInvoiceDetailService.save(orderInvoiceDetail); } return AjaxResult.success(); ruoyi-service/ruoyi-order/src/main/resources/bootstrap.yml
@@ -24,6 +24,7 @@ namespace: b5290bc2-e3aa-4988-8a7d-9c07e4e073cb username: nacos password: nacos ip: 192.168.110.85 config: # 配置中心地址 server-addr: 192.168.110.169:8848 ruoyi-service/ruoyi-order/src/main/resources/mapper/order/AccountingStrategyDetailOrderMapper.xml
New file @@ -0,0 +1,17 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.order.mapper.AccountingStrategyDetailOrderMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.ruoyi.order.api.model.AccountingStrategyDetailOrder"> <id column="id" property="id" /> <result column="accounting_strategy_id" property="accountingStrategyId" /> <result column="`type`" property="type" /> <result column="start_time" property="startTime" /> <result column="end_time" property="endTime" /> <result column="electrovalence" property="electrovalence" /> <result column="service_charge" property="serviceCharge" /> <result column="cost_service_charge" property="costServiceCharge" /> </resultMap> </mapper> ruoyi-service/ruoyi-order/src/main/resources/mapper/order/AccountingStrategyOrderMapper.xml
New file @@ -0,0 +1,23 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.order.mapper.AccountingStrategyOrderMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.ruoyi.order.api.model.AccountingStrategyOrder"> <id column="id" property="id" /> <result column="site_id" property="siteId" /> <result column="`name`" property="name" /> <result column="description" property="description" /> <result column="discount" property="discount" /> <result column="first_user_id" property="firstUserId" /> <result column="two_user_id" property="twoUserId" /> <result column="first_remark" property="firstRemark" /> <result column="two_remark" property="twoRemark" /> <result column="audit_status" property="auditStatus" /> <result column="first_audit_time" property="firstAuditTime" /> <result column="two_audit_time" property="twoAuditTime" /> <result column="create_time" property="createTime" /> <result column="del_flag" property="delFlag" /> </resultMap> </mapper> ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java
@@ -191,7 +191,11 @@ total = total.add(vip.getMaximumDeduction().multiply(BigDecimal.valueOf(vip.getDiscountTimes()))); for (VipCouponDto vipCouponDto : vipCouponDtos) { TCoupon tCoupon = vipCouponDto.getTCoupon(); total.add(tCoupon.getMaximumDiscountAmount()); if (tCoupon.getPreferentialMode()==2) { total.add(tCoupon.getMaximumDiscountAmount()); }else { total.add(tCoupon.getDiscountAmount()); } } vipInfoDto.setTotalDiscount(total); vipInfoDto.setTimeAmount(vip.getMaximumDeduction().multiply(BigDecimal.valueOf(vip.getDiscountTimes())));