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/AppUserFallbackFactory.java
@@ -64,6 +64,11 @@ } @Override public R<List<TAppUser>> selectByPhoneLike(String phone) { return R.fail("通过手机号模糊查询用户失败:"+throwable.getMessage()); } @Override public R refundPoints(String param) { return R.fail("后台兑换订单退款回退用户积分失败:"+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/AppUserClient.java
@@ -69,6 +69,13 @@ @GetMapping("/t-app-user/user/selectByPhone") R<TAppUser> selectByPhone(@RequestParam("phone") String phone); /** * 通过手机号模糊查询用户 * @param phone * @return */ @GetMapping("/t-app-user/user/selectByPhoneLike") R<List<TAppUser>> selectByPhoneLike(@RequestParam("phone") String phone); /** * 远程调用 积分兑换订单 退款回退积分 * @return */ 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
@@ -76,9 +76,6 @@ @ApiModelProperty(value = "状态(1=未使用,2=已使用)") @TableField("status") private Integer status; @ApiModelProperty(value = "订单id 后台发放的优惠券没有订单id") @TableField("orderId") private Long orderId; @ApiModelProperty(value = "当前领取优惠卷的json记录") @TableField("coupon_json") 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,10 +24,30 @@ public AccountingStrategyDetailClient create(Throwable throwable) { log.error("计费策略调用失败:{}", throwable.getMessage()); return new AccountingStrategyDetailClient(){ @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<TAccountingStrategyDetail> getNowData(Integer accountingStrategyId) { return R.fail("获取当前有效的计费策略明细失败:" + throwable.getMessage()); 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,11 +20,42 @@ public interface AccountingStrategyDetailClient { /** * 获取当前有效的计费策略明细 * @param accountingStrategyId * 通过站点id查询当前时段使用的策略明细 * @param siteId * @return */ @PostMapping("/t-accounting-strategy-detail/getNowData") R<TAccountingStrategyDetail> getNowData(@RequestParam("accountingStrategyId") Integer accountingStrategyId); @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/IntegrationFallbackFactory.java
@@ -48,10 +48,10 @@ return R.fail("读取实时监测数据调用失败:" + throwable.getMessage()); } @Override public R<String> endCharge(EndCharge endCharge) { return R.fail("充电结束调用失败:" + throwable.getMessage()); } // @Override // public R<String> endCharge(EndCharge endCharge) { // return R.fail("充电结束调用失败:" + throwable.getMessage()); // } @Override public R<String> platformConfirmationCharging(PlatformConfirmationCharging platformConfirmationCharging) { 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/IntegrationClient.java
@@ -61,8 +61,8 @@ * @param endCharge 实体对象 * @return */ @PostMapping("/sendMessage/sendMessageendCharge") public R<String> endCharge(@RequestBody EndCharge endCharge); // @PostMapping("/sendMessage/sendMessageendCharge") // public R<String> endCharge(@RequestBody EndCharge endCharge); /** * 运营平台确认启动充电 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
@@ -68,6 +68,21 @@ @Override public void chargeMonitoring(UploadRealTimeMonitoringDataQuery query) { } @Override 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
@@ -9,10 +9,7 @@ import com.ruoyi.order.api.query.TChargingCountQuery; import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -70,4 +67,28 @@ */ @PostMapping(value = "/t-charging-order/chargeMonitoring") void chargeMonitoring(@RequestBody UploadRealTimeMonitoringDataQuery query); /** * 通过流水号查询订单 * @param code * @return */ @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; @@ -185,4 +189,5 @@ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @TableField("pay_time") private LocalDateTime payTime; } 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/java/com/ruoyi/order/api/model/TOrderInvoice.java
@@ -4,6 +4,7 @@ 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 io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -114,6 +115,7 @@ private LocalDateTime createTime; @ApiModelProperty(value = "开票时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @TableField("billing_time") private LocalDateTime billingTime; ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoiceDetail.java
@@ -59,6 +59,14 @@ @ApiModelProperty(value = "增值服务费税率") @TableField("added_service_tariff") private BigDecimal addedServiceTariff; @ApiModelProperty(value = "'电费'") @TableField("electrovalence") private BigDecimal electrovalence; @ApiModelProperty(value = "'服务费'") @TableField("service_charge") private BigDecimal serviceCharge; @ApiModelProperty(value = "'增值服务费'") @TableField("added_service") private BigDecimal addedService; } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/query/TOrderInvoiceQuery.java
New file @@ -0,0 +1,41 @@ package com.ruoyi.order.api.query; import com.ruoyi.common.core.query.TimeRangePageQuery; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @Data @ApiModel(value = "发票管理Query") public class TOrderInvoiceQuery extends TimeRangePageQuery { @ApiModelProperty(value = "开票公司") private String invoicingCompany; @ApiModelProperty(value = "发票类型") private String invoiceType; @ApiModelProperty(value = "抬头类型(1=个人,2=企业)") private Integer invoicingObjectType; @ApiModelProperty(value = "发票种类(1=纸质发票,2=电子发票)") private Integer invoiceMaterial; @ApiModelProperty(value = "开票方式(1=人工,2=自动)") private Integer invoicingMethod; @ApiModelProperty(value = "申请人电话") private String userPhone; @ApiModelProperty(value = "申请人姓名") private String nickName; @ApiModelProperty(value = "公司名称") private String name; @ApiModelProperty(value = "用户id 前端忽略") private List<Long> userIds; } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingBillVO.java
New file @@ -0,0 +1,33 @@ package com.ruoyi.order.api.vo; import com.ruoyi.common.core.web.page.PageInfo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; @Data @ApiModel(value = "ChargingBillVO对象",description = "充电算帐单") public class ChargingBillVO { @ApiModelProperty(value = "充电总度数") private BigDecimal chargingCapacity; @ApiModelProperty(value = "实收金额") private BigDecimal paymentAmount; @ApiModelProperty(value = "订单总金额") private BigDecimal orderAmount; @ApiModelProperty(value = "累计电费") private BigDecimal electrovalence; @ApiModelProperty(value = "累计服务费") private BigDecimal serviceCharge; @ApiModelProperty(value = "订单数量") private Integer orderCount; @ApiModelProperty(value = "平台手续费") private String commissionAmount; @ApiModelProperty(value = "三方平台分佣") private String sharingAmount; @ApiModelProperty(value = "优惠抵扣") private String discount; @ApiModelProperty(value = "列表数据") private PageInfo<ChargingOrderListVO> list; } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingOrderVO.java
@@ -30,10 +30,7 @@ @ApiModelProperty(value = "手机号") private String phone; @ApiModelProperty(value = "累计电费") private BigDecimal electrovalence; @ApiModelProperty(value = "累计服务费") private BigDecimal serviceCharge; @ApiModelProperty(value = "时段数") private Integer count; @ApiModelProperty(value = "1明星充电 2快电 3新电途") ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/TOrderInvoiceVO.java
New file @@ -0,0 +1,31 @@ package com.ruoyi.order.api.vo; import com.ruoyi.order.api.model.TOrderInvoice; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; @Data @ApiModel(value = "发票管理VO") public class TOrderInvoiceVO extends TOrderInvoice { @ApiModelProperty(value = "电费税率") private BigDecimal electricityTariff; @ApiModelProperty(value = "服务费税率") private BigDecimal serviceTariff; @ApiModelProperty(value = "增值服务费税率") private BigDecimal addedServiceTariff; @ApiModelProperty(value = "电费") private BigDecimal electrovalence; @ApiModelProperty(value = "服务费") private BigDecimal serviceCharge; @ApiModelProperty(value = "增值服务费") private BigDecimal addedService; @ApiModelProperty(value = "用户电话") private String userPhone; } 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-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/DateUtils.java
@@ -372,5 +372,16 @@ return LocalTime.parse(time, formatter); } /** * localdatetime转为字符串 * * @param time localdatetime * @return 字符串 */ public static String localDateTimeToString(LocalDateTime time) { DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); return df.format(time); } } 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/TAppUserController.java
@@ -725,6 +725,16 @@ .eq(TAppUser::getPhone,phone) .last("LIMIT 1"))); } /** * 通过手机号模糊查询用户 * @param phone * @return */ @GetMapping("/user/selectByPhoneLike") public R<List<TAppUser>> selectByPhoneLike(@RequestParam("phone") String phone){ return R.ok(appUserService.list(Wrappers.lambdaQuery(TAppUser.class) .eq(TAppUser::getPhone,phone))); } @ApiOperation(value = "签到", tags = {"小程序-个人中心-签到"}) @GetMapping(value = "/user/sign") 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
@@ -92,7 +92,7 @@ public AjaxResult<List<TAccountingStrategyDetailVO>> queryAccountingStrategyDetailByStrategyId(@RequestParam("strategyId") Integer strategyId) { List<TAccountingStrategyDetailVO> list = accountingStrategyDetailService.queryAccountingStrategyDetailByStrategyId(strategyId); list.forEach(detail -> { detail.setTotalPrice(detail.getElectrovalence().add(detail.getElectrovalence())); detail.setTotalPrice(detail.getElectrovalence().add(detail.getServiceCharge())); }); return AjaxResult.ok(list); } @@ -110,6 +110,11 @@ Boolean flag = accountingStrategyDetailService.isStrategy24Hour(dto.getAccountingStrategyDetails()); if(flag){ return AjaxResult.error("计费模板时间设置有误差"); } // 判断同阶段是否价格不一致 Boolean flag1 = accountingStrategyDetailService.isStrategyPriceConsistent(dto.getAccountingStrategyDetails()); if(!flag1){ return AjaxResult.error("同阶段费率值需一致"); } Long userId = SecurityUtils.getLoginUser().getUserid(); dto.setUserId(userId); @@ -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){ @@ -411,5 +421,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,17 +84,96 @@ } /** * 获取当前有效的计费模板 * @param accountingStrategyId * 通过站点id查询当前时段使用的策略明细 * @param siteId * @return */ @PostMapping("/getNowData") public R<TAccountingStrategyDetail> getNowData(@RequestParam("accountingStrategyId") Integer accountingStrategyId){ TAccountingStrategyDetail one = accountingStrategyDetailService.getOne(new LambdaQueryWrapper<TAccountingStrategyDetail>() .eq(TAccountingStrategyDetail::getAccountingStrategyId, accountingStrategyId) @PostMapping("/getDetailBySiteId") public R<TAccountingStrategyDetail> getDetailBySiteId(@RequestParam("siteId") Integer siteId){ Site site = siteService.getById(siteId); 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); } /** * 通过桩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/TChargingGunController.java
@@ -21,6 +21,8 @@ import com.ruoyi.common.log.annotation.Log; import com.ruoyi.common.log.enums.BusinessType; import com.ruoyi.common.log.enums.OperatorType; import com.ruoyi.integration.api.feignClient.IntegrationClient; import com.ruoyi.integration.api.model.EndCharge; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; @@ -51,18 +53,16 @@ @RequestMapping("/t-charging-gun") public class TChargingGunController { private final TChargingGunService chargingGunService; @Autowired private TChargingGunService chargingGunService; @Autowired private IntegrationClient integrationClient; @Resource private TChargingPileService chargingPileService; @Resource private ISiteService siteService; @Autowired public TChargingGunController(TChargingGunService chargingGunService) { this.chargingGunService = chargingGunService; } /** * 查询充电枪列表 */ @@ -132,6 +132,8 @@ @PutMapping(value = "/stopCharging") public AjaxResult<String> stopCharging(@RequestParam("id") Integer id) { // TODO 硬件 结束充电 // EndCharge endCharge = new EndCharge(); // integrationClient.endCharge(endCharge); return AjaxResult.success(); } 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/TAccountingStrategyServiceImpl.java
@@ -1,5 +1,6 @@ package com.ruoyi.chargingPile.service.impl; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.chargingPile.api.model.TAccountingStrategy; import com.ruoyi.chargingPile.api.query.TAccountingStrategyQuery; @@ -12,9 +13,13 @@ import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; /** * <p> @@ -33,6 +38,10 @@ public PageInfo<TAccountingStrategyVO> pageList(TAccountingStrategyQuery query) { PageInfo<TAccountingStrategyVO> pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize()); List<TAccountingStrategyVO> list = this.baseMapper.pageList(query,pageInfo); List<Integer> parentIds = list.stream().map(TAccountingStrategyVO::getId).collect(Collectors.toList()); List<TAccountingStrategy> list1 = this.list(Wrappers.lambdaQuery(TAccountingStrategy.class) .in(TAccountingStrategy::getParentId, parentIds) .in(TAccountingStrategy::getAuditStatus, Arrays.asList(1,2))); for (TAccountingStrategyVO tAccountingStrategyVO : list) { SysUser data = sysUserClient.getSysUser(tAccountingStrategyVO.getUserId()).getData(); tAccountingStrategyVO.setUserName(data.getNickName()); @@ -44,6 +53,13 @@ SysUser two = sysUserClient.getSysUser(tAccountingStrategyVO.getUserId()).getData(); tAccountingStrategyVO.setTwoUserName(two==null?null:two.getNickName()); } // 匹配编辑后的未审核的 List<TAccountingStrategy> accountingStrategies = list1.stream().filter(e -> e.getParentId().equals(tAccountingStrategyVO.getId())) .sorted(Comparator.comparing(TAccountingStrategy::getCreateTime).reversed()).collect(Collectors.toList()); if(!CollectionUtils.isEmpty(accountingStrategies)){ TAccountingStrategy tAccountingStrategy = accountingStrategies.get(0); tAccountingStrategyVO.setAuditStatus(tAccountingStrategy.getAuditStatus()); } } pageInfo.setRecords(list); return pageInfo; 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/TAccountingStrategyMapper.xml
@@ -37,6 +37,7 @@ AND audit_status = #{query.auditStatus} </if> AND site_id IS NULL AND (parent_id IS NULL OR audit_status = 3 OR audit_status = 4) AND del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()} </where> ORDER BY create_time DESC 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/pom.xml
@@ -169,6 +169,10 @@ <groupId>com.ruoyi</groupId> <artifactId>ruoyi-api-order</artifactId> </dependency> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-api-chargingPile</artifactId> </dependency> </dependencies> <build> 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
@@ -15,6 +15,10 @@ */ public static final String PING ="ping"; /** * 充电结束 */ public static final String END_CHARGE = "end_charge"; /** * 计费模型验证请求 */ public static final String BILLING_MODE_VERIFY ="billing_mode_verify"; @@ -85,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
@@ -76,10 +76,10 @@ * @param endCharge 实体对象 * @return */ @PostMapping("/endCharge") public String endCharge(@RequestBody EndCharge endCharge){ return iotMessageProduce.sendMessage(endCharge.getCharging_pile_code(), ServiceIdMenu.END_CHARGE.getKey(),messageUtil.endCharge(endCharge)); } // @PostMapping("/endCharge") // public String endCharge(@RequestBody EndCharge endCharge){ // return iotMessageProduce.sendMessage(endCharge.getCharging_pile_code(), ServiceIdMenu.END_CHARGE.getKey(),messageUtil.endCharge(endCharge)); // } /** * 运营平台确认启动充电 @@ -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
@@ -26,10 +26,10 @@ * 读取实时监测数据 */ READ_REAL_TIME_MONITORING_DATA ("读取实时监测数据","read_real_time_monitoring_data"), /** * 充电结束 */ END_CHARGE ("充电结束","end_charge"), // /** // * 充电结束 // */ // END_CHARGE ("充电结束","end_charge"), /** * 运营平台确认启动充电 */ @@ -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
@@ -44,6 +44,9 @@ case SendTagConstant.PING: sendResult = enhanceProduce.pingMessage(content); break; case SendTagConstant.END_CHARGE: sendResult = enhanceProduce.endChargeMessage(content); break; case SendTagConstant.BILLING_MODE_VERIFY: sendResult = enhanceProduce.billingModeVerifyMessage(content); break; @@ -92,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 @@ -109,10 +109,10 @@ * @param endCharge 实体对象 * @return */ public String endCharge(EndCharge endCharge){ endChargeService.create(endCharge); return getMessageJsonString(endCharge, ServiceIdMenu.END_CHARGE.getValue()); } // public String endCharge(EndCharge endCharge){ // endChargeService.create(endCharge); // return getMessageJsonString(endCharge, ServiceIdMenu.END_CHARGE.getValue()); // } /** * 运营平台确认启动充电 @@ -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/UploadRealTimeMonitoringDataService.java
@@ -17,4 +17,11 @@ List<UploadRealTimeMonitoringData> getDataByOrderCode(String code); List<UploadRealTimeMonitoringData> getDataAll(Set<String> values, Integer page, Integer size); /** * 查询订单最新一条数据 * @param transaction_serial_number * @return */ UploadRealTimeMonitoringData getLastDataById(String transaction_serial_number); } 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/mongodb/service/impl/UploadRealTimeMonitoringDataServiceImpl.java
@@ -73,4 +73,17 @@ return uploadRealTimeMonitoringData; } @Override public UploadRealTimeMonitoringData getLastDataById(String transaction_serial_number) { Query query = new Query(); if (StringUtils.isNotEmpty(transaction_serial_number)){ query.addCriteria(Criteria.where("transaction_serial_number").is(transaction_serial_number)); } // 按照 createdAt 字段降序排序 query.with(Sort.by(Sort.Direction.DESC, "create_time")); // 限制结果只返回一条记录 query.limit(1); return mongoTemplate.findOne(query, UploadRealTimeMonitoringData.class); } } 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,7 +1,15 @@ 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; 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.BillingModeVerifyReplyService; import com.ruoyi.integration.mongodb.service.BillingModeVerifyService; import com.ruoyi.integration.rocket.model.BillingModeVerifyMessage; import com.ruoyi.integration.rocket.util.EnhanceMessageHandler; @@ -24,6 +32,12 @@ @Autowired private BillingModeVerifyService billingModeVerifyService; @Autowired private IotMessageProduce iotMessageProduce; @Autowired private MessageUtil messageUtil; @Autowired private AccountingStrategyDetailClient accountingStrategyDetailClient; @Override protected void handleMessage(BillingModeVerifyMessage message) throws Exception { @@ -34,6 +48,28 @@ BeanUtils.copyProperties(message,billingModeVerify); billingModeVerifyService.create(billingModeVerify); // 业务处理 BillingModeVerifyReply billingModeVerifyReply = new BillingModeVerifyReply(); if(message.getBilling_model_code().equals("0")){ // 首次 billingModeVerifyReply.setCharging_pile_code(billingModeVerify.getCharging_pile_code()); billingModeVerifyReply.setBilling_model_code("0"); billingModeVerifyReply.setBilling_model_result(1); }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
New file @@ -0,0 +1,98 @@ package com.ruoyi.integration.rocket.listener; import com.ruoyi.integration.api.model.EndCharge; import com.ruoyi.integration.api.model.Ping; import com.ruoyi.integration.api.model.Pong; 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.EndChargeService; import com.ruoyi.integration.mongodb.service.PingService; 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 @RocketMQMessageListener( consumerGroup = "enhance_consumer_group", topic = "rocket_enhance", selectorExpression = "*", consumeThreadMax = 5 //默认是64个线程并发消息,配置 consumeThreadMax 参数指定并发消费线程数,避免太大导致资源不够 ) public class EndChargeMessageListener extends EnhanceMessageHandler<EndChargeMessage> implements RocketMQListener<EndChargeMessage> { @Autowired private EndChargeService endChargeService; @Autowired private MessageUtil messageUtil; @Autowired private IotMessageProduce iotMessageProduce; @Resource private ChargingOrderClient chargingOrderClient; @Override protected void handleMessage(EndChargeMessage message) throws Exception { // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试 log.info("充电结束-业务消息处理:{}",message); // 持久化消息 EndCharge endCharge = new EndCharge(); BeanUtils.copyProperties(message,endCharge); endChargeService.create(endCharge); // 业务处理 chargingOrderClient.endCharge(endCharge.getTransaction_serial_number()); } @Override protected void handleMaxRetriesExceeded(EndChargeMessage 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(EndChargeMessage message) { // 此处可做消息过滤 return false; } /** * 监听消费消息,不需要执行业务处理,委派给父类做基础操作,父类做完基础操作后会调用子类的实际处理类型 */ @Override public void onMessage(EndChargeMessage message) { super.dispatchMessage(message); } } 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/listener/UploadRealTimeMonitoringDataMessageListener.java
@@ -1,11 +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.Online; import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData; import com.ruoyi.integration.mongodb.service.UploadRealTimeMonitoringDataService; import com.ruoyi.integration.rocket.model.UploadRealTimeMonitoringDataMessage; import com.ruoyi.integration.rocket.util.EnhanceMessageHandler; import com.ruoyi.order.api.feignClient.ChargingOrderClient; import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; @@ -15,6 +18,9 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Objects; @Slf4j @Component @@ -31,12 +37,10 @@ @Resource private ChargingOrderClient chargingOrderClient; @Resource private AccountingStrategyDetailClient accountingStrategyDetailClient; @Override protected void handleMessage(UploadRealTimeMonitoringDataMessage message) throws Exception { // 此时这里才是最终的业务处理,代码只需要处理资源类关闭异常,其他的可以交给父类重试 @@ -44,11 +48,31 @@ // 持久化消息 UploadRealTimeMonitoringData uploadRealTimeMonitoringData = new UploadRealTimeMonitoringData(); BeanUtils.copyProperties(message,uploadRealTimeMonitoringData); // 查询mogondb上一条数据 UploadRealTimeMonitoringData data = uploadRealTimeMonitoringDataService.getLastDataById(message.getTransaction_serial_number()); // 查询订单 TChargingOrder chargingOrder = chargingOrderClient.getOrderByCode(message.getTransaction_serial_number()).getData(); // 查询当前时间段的计费策略 TAccountingStrategyDetail accountingStrategyDetail = accountingStrategyDetailClient.getDetailBySiteId(chargingOrder.getSiteId()).getData(); uploadRealTimeMonitoringData.setElectrovalence_all(accountingStrategyDetail.getElectrovalence()); uploadRealTimeMonitoringData.setService_charge(accountingStrategyDetail.getServiceCharge()); if (Objects.nonNull(data)) { uploadRealTimeMonitoringData.setLast_time(data.getLast_time()); uploadRealTimeMonitoringData.setPeriod_electric_price(message.getPaid_amount().divide(data.getPaid_amount())); uploadRealTimeMonitoringData.setPeriod_charging_degree(message.getCharging_degree().divide(data.getCharging_degree())); uploadRealTimeMonitoringData.setPeriod_service_price(message.getCharging_degree().multiply(accountingStrategyDetail.getServiceCharge()).setScale(4, RoundingMode.HALF_UP)); }else { log.info("首次上传实时监测数据"); uploadRealTimeMonitoringData.setPeriod_electric_price(message.getPaid_amount()); uploadRealTimeMonitoringData.setPeriod_charging_degree(message.getCharging_degree()); uploadRealTimeMonitoringData.setPeriod_service_price(message.getCharging_degree().multiply(accountingStrategyDetail.getServiceCharge()).setScale(4, RoundingMode.HALF_UP)); } uploadRealTimeMonitoringDataService.create(uploadRealTimeMonitoringData); // 业务处理 UploadRealTimeMonitoringDataQuery query = new UploadRealTimeMonitoringDataQuery(); BeanUtils.copyProperties(uploadRealTimeMonitoringData, query); chargingOrderClient.chargeMonitoring(query); } @Override ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/rocket/model/EndChargeMessage.java
New file @@ -0,0 +1,29 @@ package com.ruoyi.integration.rocket.model; import com.ruoyi.integration.rocket.base.BaseMessage; import lombok.Data; import java.math.BigDecimal; /** * 充电结束 **/ @Data public class EndChargeMessage extends BaseMessage { private String transaction_serial_number; // 交易流水号 private String charging_pile_code; // 桩编码 private String charging_gun_code; // 抢号 private BigDecimal bms_battery_charging_status; // BMS 中止荷电状态 SOC private BigDecimal bms_minimum_battery_voltage; // BMS 动力蓄电池单体最低电压 private BigDecimal bms_maximum_battery_voltage; // BMS 动力蓄电池单体最高电压 private Integer bms_minimum_battery_temperature; // BMS 动力蓄电池最低温度 private Integer bms_maximum_battery_temperature; // BMS 动力蓄电池最高温度 private BigDecimal cumulative_charging_time; // 电桩累计充电时间 private BigDecimal output_energy; // 电桩输出能量 private String charger_code; // 电桩充电机编号 } 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
@@ -48,6 +48,17 @@ message.setSource(SendTagConstant.PING); return rocketMQEnhanceTemplate.send(TOPIC, SendTagConstant.PING, message); } /** * 充电结束 */ public SendResult endChargeMessage(JSONObject jsonObject) { PingMessage message = JSON.parseObject(jsonObject.toJSONString(),PingMessage.class); // 设置业务key message.setKey(UUID.randomUUID().toString()); // 设置消息来源,便于查询 message.setSource(SendTagConstant.END_CHARGE); return rocketMQEnhanceTemplate.send(TOPIC, SendTagConstant.END_CHARGE, message); } /** * 计费模型验证请求 @@ -242,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/pom.xml
@@ -140,6 +140,18 @@ <scope>test</scope> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-spring-boot-starter</artifactId> <version>4.0.0</version> <exclusions> <exclusion> <artifactId>guava</artifactId> <groupId>com.google.guava</groupId> </exclusion> </exclusions> </dependency> </dependencies> <build> 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/ChargingBillController.java
New file @@ -0,0 +1,91 @@ package com.ruoyi.order.controller; import com.ruoyi.account.api.feignClient.AppUserCarClient; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient; import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient; import com.ruoyi.chargingPile.api.feignClient.ParkingLotClient; import com.ruoyi.chargingPile.api.feignClient.SiteClient; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.order.api.vo.ChargingBillVO; import com.ruoyi.order.api.vo.ChargingOrderTimeVO; import com.ruoyi.order.dto.ChargingBillQuery; import com.ruoyi.order.dto.ChargingListQuery; import com.ruoyi.order.service.*; import com.ruoyi.order.vo.ChargingOrderListInfoVO; import com.ruoyi.payment.api.feignClient.AliPaymentClient; import com.ruoyi.payment.api.feignClient.WxPaymentClient; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; /** * <p> * 前端控制器 * </p> * * @author xiaochen * @since 2024-08-07 */ @Api(tags = "充电算帐单") @RestController @RequestMapping("/chargingBill") public class ChargingBillController { @Resource private TChargingOrderService chargingOrderService; @Autowired private TokenService tokenService; @Autowired private TOrderEvaluateService orderEvaluateService; @Resource private WxPaymentClient wxPaymentClient; @Resource private RedisService redisService; @Resource private AliPaymentClient aliPaymentClient; @Resource private TShoppingOrderService shoppingOrderService; @Resource private AppUserClient appUserClient; @Resource private TVipOrderService vipOrderService; @Resource private ParkingLotClient parkingLotClient; @Resource private TChargingOrderRefundService chargingOrderRefundService; @Resource private TShoppingOrderRefundService shoppingOrderRefundService; @Resource private TVipOrderRefundService vipOrderRefundService; @Resource private SiteClient siteClient; @Resource private ChargingPileClient chargingPileClient; @Resource private ChargingGunClient chargingGunClient; @Resource private AppUserCarClient appUserCarClient; @Resource private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService; @ResponseBody @PostMapping(value = "/chargingList") @ApiOperation(value = "充电算帐单列表查询", tags = {"管理后台-充电算账单"}) public AjaxResult<ChargingBillVO> chargingList(@RequestBody ChargingListQuery dto) { return AjaxResult.success(null); } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -1,4 +1,5 @@ package com.ruoyi.order.controller; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.google.common.collect.Lists; import java.math.BigDecimal; @@ -457,7 +458,24 @@ } /** * 远程启动失败后退款回调 * @param request */ @ResponseBody @PostMapping(value = "/chargingOrderStartupFailureWxRefund") public void chargingOrderStartupFailureWxRefund(HttpServletRequest request){ WxRefundNotifyResp data = wxPaymentClient.refundNotify(request).getData(); if(null != data){ String out_refund_no = data.getOut_refund_no(); String refund_id = data.getRefund_id(); String tradeState = data.getTradeState(); String success_time = data.getSuccess_time(); chargingOrderService.chargingOrderStartupFailureWxRefund(out_refund_no, refund_id, tradeState, success_time); } } @@ -627,7 +645,17 @@ public void chargeMonitoring(@RequestBody UploadRealTimeMonitoringDataQuery query){ chargingOrderService.chargeMonitoring(query); } /** * 通过流水号查询订单 * @param code * @return */ @PostMapping(value = "/getOrderByCode/{code}") public R<TChargingOrder> getOrderByCode(@PathVariable("code") String code){ return R.ok(chargingOrderService.getOne(Wrappers.lambdaQuery(TChargingOrder.class) .eq(TChargingOrder::getCode,code))); } @@ -760,4 +788,22 @@ 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/controller/TOrderAppealController.java
@@ -84,6 +84,7 @@ public R manageFeedback(@RequestBody ManageFeedbackDto manageFeedbackDto) { TOrderAppeal byId = orderAppealService.getById(manageFeedbackDto.getId()); byId.setFeedback(manageFeedbackDto.getFeedback()); byId.setStatus(2); orderAppealService.updateById(byId); return R.ok(); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderInvoiceController.java
@@ -1,18 +1,37 @@ package com.ruoyi.order.controller; import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.core.utils.WebUtils; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.log.annotation.Log; import com.ruoyi.common.log.enums.BusinessType; import com.ruoyi.order.api.model.TOrderInvoice; import com.ruoyi.order.api.query.TOrderInvoiceQuery; import com.ruoyi.order.api.vo.TOrderInvoiceVO; import com.ruoyi.order.dto.AddOrderInvoice; import com.ruoyi.order.dto.GetOrderInvoiceList; import com.ruoyi.order.dto.MyOrderInvoiceInfo; import com.ruoyi.order.dto.OrderInvoiceList; import com.ruoyi.order.export.OrderInvoiceExport; import com.ruoyi.order.service.TOrderInvoiceService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.beans.BeanUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * <p> @@ -39,8 +58,68 @@ public AjaxResult addOrderInvoice(@RequestBody AddOrderInvoice addOrderInvoice){ return orderInvoiceService.addOrderInvoice(addOrderInvoice); } @PostMapping("/pageList") @ApiOperation(value = "查询开票分页列表", tags = {"管理后台-发票管理"}) public AjaxResult<PageInfo<TOrderInvoiceVO>> pageList(@RequestBody TOrderInvoiceQuery query){ return AjaxResult.success(orderInvoiceService.pageList(query)); } @GetMapping("/uploadPdf") @ApiOperation(value = "上传发票", tags = {"管理后台-发票管理"}) public AjaxResult<String> uploadPdf(@RequestParam("id") Long id, @RequestParam("invoiceUrl") String invoiceUrl){ TOrderInvoice orderInvoice = orderInvoiceService.getById(id); orderInvoice.setInvoiceUrl(invoiceUrl); orderInvoiceService.updateById(orderInvoice); return AjaxResult.success(); } @PostMapping("/statusCount") @ApiOperation(value = "查询开票状态数量", tags = {"管理后台-发票管理"}) public AjaxResult<Map<String,Integer>> statusCount(@RequestBody TOrderInvoiceQuery query){ return AjaxResult.success(orderInvoiceService.statusCount(query)); } /** * 发票管理导出 */ @ApiOperation(value = "发票管理导出") @Log(title = "发票管理导出", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(@RequestBody TOrderInvoiceQuery query) { List<TOrderInvoiceVO> list = orderInvoiceService.export(query); List<OrderInvoiceExport> orderInvoiceExports = new ArrayList<>(); for (TOrderInvoiceVO orderInvoiceVO : list) { OrderInvoiceExport orderInvoiceExport = new OrderInvoiceExport(); BeanUtils.copyProperties(orderInvoiceVO,orderInvoiceExport); orderInvoiceExport.setBillingTime(DateUtils.localDateTimeToString(orderInvoiceVO.getBillingTime())); orderInvoiceExports.add(orderInvoiceExport); } Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), OrderInvoiceExport.class, orderInvoiceExports); HttpServletResponse response = WebUtils.response(); response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); ServletOutputStream outputStream = null; try { String fileName = URLEncoder.encode("发票导出.xls", "utf-8"); response.setHeader("Content-Disposition", "attachment;filename=" + fileName); response.setContentType("application/vnd.ms-excel;charset=UTF-8"); response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); outputStream = response.getOutputStream(); workbook.write(outputStream); } catch (IOException e) { e.printStackTrace(); } finally { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } @ResponseBody @GetMapping("/getMyOrderInvoiceList") ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ChargingBillQuery.java
New file @@ -0,0 +1,37 @@ package com.ruoyi.order.dto; import com.ruoyi.common.core.web.page.BasePage; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @Data public class ChargingBillQuery extends BasePage { @ApiModelProperty("订单编号") private String code; @ApiModelProperty("电站id") private Integer siteId; @ApiModelProperty("状态(0=未知,1=等待中,2=启动中,3=充电中,4=停止中,5=已结束)") private Integer status; @ApiModelProperty("手机号") private String phone; @ApiModelProperty("车牌号") private String licensePlate; @ApiModelProperty("订单类型(1=充电订单(小程序),2=充电订单(刷卡))") private Integer orderType; @ApiModelProperty("开始时间 2020-01-01 12:00:00 - 2020-01-01 23:00:00") private String startTime; @ApiModelProperty("结束时间 2020-01-01 12:00:00 - 2020-01-01 23:00:00") private String endTime; @ApiModelProperty("用户ids 前端忽略") private List<Long> userIds; @ApiModelProperty("车辆ids 前端忽略") private List<Long> carIds; } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/ChargingListQuery.java
@@ -1,6 +1,7 @@ package com.ruoyi.order.dto; import com.ruoyi.common.core.web.page.BasePage; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -8,31 +9,12 @@ import java.util.List; @Data @ApiModel(value = "充电账单列表查询参数") public class ChargingListQuery extends BasePage { @ApiModelProperty("订单编号") private String code; @ApiModelProperty("电站id") private Integer siteId; @ApiModelProperty("状态(0=未知,1=等待中,2=启动中,3=充电中,4=停止中,5=已结束)") private Integer status; @ApiModelProperty("手机号") private String phone; @ApiModelProperty("车牌号") private String licensePlate; @ApiModelProperty("订单类型(1=充电订单(小程序),2=充电订单(刷卡))") private Integer orderType; @ApiModelProperty("开始时间 2020-01-01 12:00:00 - 2020-01-01 23:00:00") @ApiModelProperty("订单分类 1全站 2各个站点") private String category; @ApiModelProperty("账单周期2020-01-01 - 2020-01-01") private String startTime; @ApiModelProperty("结束时间 2020-01-01 12:00:00 - 2020-01-01 23:00:00") private String endTime; @ApiModelProperty("用户ids 前端忽略") private List<Long> userIds; @ApiModelProperty("车辆ids 前端忽略") private List<Long> carIds; @ApiModelProperty("1已出账 2未出账") private Integer state; } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderDto.java
@@ -1,11 +1,13 @@ package com.ruoyi.order.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.time.LocalDateTime; @Data @ApiModel("支付订单返回Dto") public class PayOrderDto { private String id; @ApiModelProperty("1充电订单2购物订单3vip订单4停车订单") ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/dto/PayOrderQueryDto.java
@@ -1,12 +1,15 @@ package com.ruoyi.order.dto; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.core.web.page.BasePage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.time.LocalDateTime; @Data @ApiModel("支付订单查询dto") public class PayOrderQueryDto extends BasePage { @ApiModelProperty("订单编号") private String code; @@ -18,8 +21,10 @@ private Integer isRefund; @ApiModelProperty("下单时间1") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime1; @ApiModelProperty("下单时间2") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime2; } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/export/OrderInvoiceExport.java
New file @@ -0,0 +1,79 @@ package com.ruoyi.order.export; import cn.afterturn.easypoi.excel.annotation.Excel; import io.swagger.annotations.ApiModel; import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; @Data @ApiModel(value = "导出发票") public class OrderInvoiceExport implements Serializable { @Excel(name = "申请单编号",width = 30) private String code; @Excel(name = "申请日期",width = 30) private String billingTime; @Excel(name = "开票公司",width = 30) private String invoicingCompany; @Excel(name = "发票类型",width = 30) private String invoiceType; @Excel(name = "发票种类",replace = {"纸质发票_1","电子发票_2"},width = 30) private Integer invoiceMaterial; @Excel(name = "开票方式",replace = {"人工_1","自动_2"},width = 30) private Integer invoicingMethod; @Excel(name = "开票总金额",width = 30) private BigDecimal totalAmount; @Excel(name = "服务费",width = 30) private BigDecimal serviceCharge; @Excel(name = "服务费税率",width = 30) private BigDecimal serviceTariff; @Excel(name = "增值服务费",width = 30) private BigDecimal addedService; @Excel(name = "增值服务费税率",width = 30) private BigDecimal addedServiceTariff; // @Excel(name = "开票订单类型",replace = {"充电订单_1","购物订单_2","兑换订单_3","会员订单_4"},width = 30) // private Integer orderType; @Excel(name = "抬头类型",replace = {"个人_1","企业_2"},width = 30) private Integer invoicingObjectType; @Excel(name = "发票抬头",width = 30) private String name; @Excel(name = "开户银行",width = 30) private String depositBank; @Excel(name = "银行账户",width = 30) private String bankAccount; @Excel(name = "公司电话",width = 30) private String companyPhone; @Excel(name = "纳税识别号",width = 30) private String taxIdentificationNumber; @Excel(name = "公司地址",width = 30) private String companyAddress; @Excel(name = "邮箱",width = 30) private String mailbox; @Excel(name = "状态",replace = {"待开票_1","开票中_2","已开票_3"},width = 30) private Integer status; @Excel(name = "用户电话",width = 30) private String userPhone; } 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/mapper/TOrderInvoiceMapper.java
@@ -1,8 +1,15 @@ package com.ruoyi.order.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.order.api.model.TOrderInvoice; import com.ruoyi.order.api.query.TOrderInvoiceQuery; import com.ruoyi.order.api.vo.TOrderInvoiceVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; /** * <p> @@ -15,4 +22,26 @@ @Mapper public interface TOrderInvoiceMapper extends BaseMapper<TOrderInvoice> { /** * 发票分页查询 * @param query * @param pageInfo * @return */ List<TOrderInvoiceVO> pageList(@Param("query") TOrderInvoiceQuery query, @Param("pageInfo")PageInfo<TOrderInvoiceVO> pageInfo); /** * 查询开票状态数量 * @param query * @return */ Map<String, Integer> statusCount(@Param("query")TOrderInvoiceQuery query); /** * 导出 * @param query * @return */ List<TOrderInvoiceVO> export(@Param("query")TOrderInvoiceQuery query); } 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
@@ -17,6 +17,7 @@ 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; @@ -140,4 +141,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/TOrderInvoiceService.java
@@ -2,13 +2,17 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.order.api.model.TOrderInvoice; import com.ruoyi.order.api.query.TOrderInvoiceQuery; import com.ruoyi.order.api.vo.TOrderInvoiceVO; import com.ruoyi.order.dto.AddOrderInvoice; import com.ruoyi.order.dto.GetOrderInvoiceList; import com.ruoyi.order.dto.MyOrderInvoiceInfo; import com.ruoyi.order.dto.OrderInvoiceList; import java.util.List; import java.util.Map; /** * <p> @@ -43,4 +47,26 @@ * @return */ MyOrderInvoiceInfo getMyOrderInvoiceInfo(String id); /** * 查询开票分页列表 * @param query * @return */ PageInfo<TOrderInvoiceVO> pageList(TOrderInvoiceQuery query); /** * 查询开票状态数量 * @param query * @return */ Map<String,Integer> statusCount(TOrderInvoiceQuery query); /** * 发票管理导出 * @param query * @return */ List<TOrderInvoiceVO> export(TOrderInvoiceQuery query); } 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,24 +1,17 @@ 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.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.api.feignClient.AppUserCarClient; import com.ruoyi.account.api.feignClient.AppUserClient; 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; @@ -27,6 +20,7 @@ import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.integration.api.feignClient.ChargingHandshakeClient; import com.ruoyi.integration.api.feignClient.PlatformStartChargingReplyClient; import com.ruoyi.integration.api.feignClient.SendMessageClient; @@ -35,6 +29,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; @@ -44,27 +43,35 @@ import com.ruoyi.order.api.vo.TCharingOrderVO; import com.ruoyi.order.dto.*; import com.ruoyi.order.mapper.TChargingOrderMapper; import com.ruoyi.order.service.TChargingOrderAccountingStrategyService; import com.ruoyi.order.service.TChargingOrderRefundService; import com.ruoyi.order.service.TChargingOrderService; import com.ruoyi.order.service.TOrderEvaluateService; import com.ruoyi.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; import com.ruoyi.payment.api.feignClient.WxPaymentClient; import com.ruoyi.payment.api.model.RefundReq; import com.ruoyi.payment.api.model.RefundResp; import com.ruoyi.payment.api.model.WxPaymentRefundModel; import com.ruoyi.payment.api.vo.*; import com.ruoyi.system.api.domain.SysUser; 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; @@ -86,6 +93,8 @@ @Service public class TChargingOrderServiceImpl extends ServiceImpl<TChargingOrderMapper, TChargingOrder> implements TChargingOrderService { private Logger log = LoggerFactory.getLogger(TChargingOrderServiceImpl.class); @Resource private ChargingGunClient chargingGunClient; @@ -114,7 +123,8 @@ private AliPaymentClient aliPaymentClient; @Resource private AppCouponClient appCouponClient; @Resource private AppUserVipDetailClient appUserVipDetailClient; @@ -139,10 +149,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<>(); @@ -410,6 +444,23 @@ } 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()){ @@ -457,7 +508,6 @@ chargingOrder.setRechargePaymentStatus(2); chargingOrder.setRechargeSerialNumber(transaction_id); chargingOrder.setStatus(2); this.updateById(chargingOrder); //添加安全检测数据到缓存中,每步安全检测完成后需要更新缓存数据 PreChargeCheck preChargeCheck = new PreChargeCheck(); @@ -472,7 +522,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()); //计算能充电的度数 @@ -496,6 +546,8 @@ } } electrovalence = electrovalence.add(discount); chargingOrder.setChargeAmount(electrovalence); this.updateById(chargingOrder); TChargingPile chargingPile = chargingPileClient.getChargingPileById(chargingGun.getChargingPileId()).getData(); @@ -693,6 +745,7 @@ * @return */ @Override @GlobalTransactional(rollbackFor = Exception.class) public AjaxResult stopCharging(String id) { TChargingOrder chargingOrder = this.getById(id); Integer status = chargingOrder.getStatus(); @@ -702,14 +755,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); } } } } } @@ -881,7 +1149,13 @@ public List<Map<String, BigDecimal>> getYearData(List<Long> chargingOrderIds) { return this.baseMapper.getYearData(chargingOrderIds); } @Resource private SysUserClient sysUserClient; @Resource private UserSiteClient userSiteClient; @Resource private RoleSiteClient roleSiteClient; @Override public ChargingOrderTimeVO chargingList(ChargingListQuery dto) { String startTime1 = null; @@ -894,13 +1168,7 @@ startTime1 = split[0]; startTime2 = split[1]; } if (StringUtils.hasLength(dto.getEndTime())){ String[] split = dto.getEndTime().split(" - "); endTime1 = split[0]; endTime2 = split[1]; } ChargingOrderTimeVO chargingOrderTimeVO = new ChargingOrderTimeVO(); PageInfo<ChargingOrderListVO> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize()); List<ChargingOrderListVO> list = this.baseMapper.chargingList(pageInfo,dto,startTime1,startTime2,endTime1,endTime2); @@ -1060,6 +1328,11 @@ } @Override public R payRefund(PayOrderRefundDto payOrderQueryDto) { return null; } @Override public ChargingOrderListInfoVO chargingInfo(String uid) { TChargingOrder chargingOrder= this.getById(uid); @@ -1079,29 +1352,35 @@ } chargingOrderListInfoVO.setEndMode(chargingOrder.getEndMode()); // todo 周一完善 // chargingOrderListInfoVO.setStartSoc(); // chargingOrderListInfoVO.setEndSoc(); // chargingOrderListInfoVO.setChargingCapacity(); // chargingOrderListInfoVO.setSiteId(); // chargingOrderListInfoVO.setChargingPileId(); // chargingOrderListInfoVO.setAppUserId(); // chargingOrderListInfoVO.setAppUserCarId(); // chargingOrderListInfoVO.setChargingGunId(); // chargingOrderListInfoVO.setOrderType(); // chargingOrderListInfoVO.setChargingSecond(); // chargingOrderListInfoVO.setLicensePlate(); // chargingOrderListInfoVO.setPhone(); // chargingOrderListInfoVO.setPaymentAmount(); // chargingOrderListInfoVO.setElectrovalence(); // chargingOrderListInfoVO.setServiceCharge(); // chargingOrderListInfoVO.setStartTime(); // chargingOrderListInfoVO.setEndTime(); // chargingOrderListInfoVO.setId(); // chargingOrderListInfoVO.setUid(); // chargingOrderListInfoVO.setList(); // 获取开始SOC 结束soc List<UploadRealTimeMonitoringData> data6 = uploadRealTimeMonitoringDataClient.getDataByOrderCode(chargingOrder.getCode()).getData(); if (!data6.isEmpty()){ // 第一条数据soc为开始 最后一条数据soc为结束soc chargingOrderListInfoVO.setStartSoc(data6.get(0).getSoc().toString()); chargingOrderListInfoVO.setEndSoc(data6.get(data6.size()-1).getSoc().toString()); chargingOrderListInfoVO.setChargingCapacity(data6.get(data6.size()-1).getCharging_degree()); chargingOrderListInfoVO.setChargingSecond(data6.get(data6.size()-1).getCumulative_charging_time()*60+""); return null; } if (chargingOrder.getAppUserCarId()!=null){ List<TAppUserCar> data3 = appUserCarClient.getCarByIds(Collections.singletonList(chargingOrder.getAppUserCarId())).getData(); if (!data3.isEmpty())chargingOrderListInfoVO.setLicensePlate(data3.get(0).getLicensePlate()); } chargingOrderListInfoVO.setStartTime(chargingOrder.getStartTime()); chargingOrderListInfoVO.setEndTime(chargingOrder.getEndTime()); chargingOrderListInfoVO.setId(chargingOrder.getId()); chargingOrderListInfoVO.setUid(chargingOrder.getId().toString()); chargingOrderListInfoVO.setList(data6); chargingOrderListInfoVO.setCouponDiscountAmount(chargingOrder.getCouponDiscountAmount()); chargingOrderListInfoVO.setVipDiscountAmount(chargingOrder.getVipDiscountAmount()); chargingOrderListInfoVO.setSharingAmount(chargingOrder.getSharingAmount()); chargingOrderListInfoVO.setCommissionAmount(chargingOrder.getCommissionAmount()); // 查询费用明细列表 List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.lambdaQuery() .eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()) .list(); chargingOrderListInfoVO.setList1(list); return chargingOrderListInfoVO; } @@ -1111,7 +1390,166 @@ */ @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
@@ -4,23 +4,25 @@ import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.account.api.model.TAppUser; import com.ruoyi.account.api.model.TAppUserCar; import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient; import com.ruoyi.chargingPile.api.feignClient.SiteClient; import com.ruoyi.chargingPile.api.model.Site; import com.ruoyi.common.core.utils.StringUtils; 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; @@ -30,6 +32,7 @@ import io.seata.spring.annotation.GlobalTransactional; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.math.BigDecimal; @@ -75,7 +78,12 @@ @Resource private CouponClient couponClient; @Resource private AppUserClient appUserClient; @Resource private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService; @@ -117,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)); @@ -125,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(); @@ -228,4 +244,74 @@ } return myOrderInvoiceInfo; } @Override public PageInfo<TOrderInvoiceVO> pageList(TOrderInvoiceQuery query) { // 查询申请用户 List<TAppUser> userList = appUserClient.selectByPhoneLike(query.getUserPhone()).getData(); if(CollectionUtils.isEmpty(userList)){ return new PageInfo<>(); } query.setUserIds(userList.stream().map(TAppUser::getId).collect(Collectors.toList())); PageInfo<TOrderInvoiceVO> pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize()); List<TOrderInvoiceVO> list = this.baseMapper.pageList(query,pageInfo); List<Long> ids = list.stream().map(TOrderInvoiceVO::getId).collect(Collectors.toList()); List<TOrderInvoiceDetail> orderInvoiceDetailList = orderInvoiceDetailService.list(new LambdaQueryWrapper<TOrderInvoiceDetail>() .in(TOrderInvoiceDetail::getOrderInvoiceId, ids)); list.forEach(e->{ e.setServiceTariff(orderInvoiceDetailList.get(0).getServiceTariff()); e.setElectricityTariff(orderInvoiceDetailList.get(0).getElectricityTariff()); e.setAddedServiceTariff(orderInvoiceDetailList.get(0).getAddedServiceTariff()); e.setAddedService(orderInvoiceDetailList.stream().map(TOrderInvoiceDetail::getAddedService).reduce(BigDecimal::add).get()); e.setElectrovalence(orderInvoiceDetailList.stream().map(TOrderInvoiceDetail::getElectrovalence).reduce(BigDecimal::add).get()); e.setServiceCharge(orderInvoiceDetailList.stream().map(TOrderInvoiceDetail::getServiceCharge).reduce(BigDecimal::add).get()); e.setUserPhone(userList.stream().filter(m->m.getId().equals(Long.parseLong(e.getBillingUserId().toString()))).findFirst().get().getPhone()); }); pageInfo.setRecords(list); return pageInfo; } @Override public Map<String, Integer> statusCount(TOrderInvoiceQuery query) { Map<String, Integer> map = new HashMap<>(); List<TAppUser> userList = appUserClient.selectByPhoneLike(query.getUserPhone()).getData(); if(CollectionUtils.isEmpty(userList)){ map.put("notAccepted",0); map.put("processing",0); map.put("finished",0); return map; } query.setUserIds(userList.stream().map(TAppUser::getId).collect(Collectors.toList())); map = this.baseMapper.statusCount(query); return map; } @Override public List<TOrderInvoiceVO> export(TOrderInvoiceQuery query) { // 查询申请用户 List<TAppUser> userList = appUserClient.selectByPhoneLike(query.getUserPhone()).getData(); if(CollectionUtils.isEmpty(userList)){ return new ArrayList<>(); } query.setUserIds(userList.stream().map(TAppUser::getId).collect(Collectors.toList())); PageInfo<TOrderInvoiceVO> pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize()); List<TOrderInvoiceVO> list = this.baseMapper.export(query); List<Long> ids = list.stream().map(TOrderInvoiceVO::getId).collect(Collectors.toList()); List<TOrderInvoiceDetail> orderInvoiceDetailList = orderInvoiceDetailService.list(new LambdaQueryWrapper<TOrderInvoiceDetail>() .in(TOrderInvoiceDetail::getOrderInvoiceId, ids)); list.forEach(e->{ e.setServiceTariff(orderInvoiceDetailList.get(0).getServiceTariff()); e.setElectricityTariff(orderInvoiceDetailList.get(0).getElectricityTariff()); e.setAddedServiceTariff(orderInvoiceDetailList.get(0).getAddedServiceTariff()); e.setAddedService(orderInvoiceDetailList.stream().map(TOrderInvoiceDetail::getAddedService).reduce(BigDecimal::add).get()); e.setElectrovalence(orderInvoiceDetailList.stream().map(TOrderInvoiceDetail::getElectrovalence).reduce(BigDecimal::add).get()); e.setServiceCharge(orderInvoiceDetailList.stream().map(TOrderInvoiceDetail::getServiceCharge).reduce(BigDecimal::add).get()); e.setUserPhone(userList.stream().filter(m->m.getId().equals(Long.parseLong(e.getBillingUserId().toString()))).findFirst().get().getPhone()); }); return list; } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ChargingOrderListInfoVO.java
@@ -2,6 +2,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData; import com.ruoyi.order.api.model.TChargingOrderAccountingStrategy; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -44,7 +45,7 @@ @ApiModelProperty(value = "订单类型(1=充电订单(小程序),2=充电订单(刷卡))") private String orderType; @ApiModelProperty(value = "充电时间 秒") private Long chargingSecond; private String chargingSecond; @ApiModelProperty(value = "车牌号") private String licensePlate; @ApiModelProperty(value = "客户手机号") @@ -65,6 +66,16 @@ private Long id; @ApiModelProperty(value = "订单uid") private String uid; @ApiModelProperty(value = "费用明细-优惠券优惠金额") private BigDecimal couponDiscountAmount; @ApiModelProperty(value = "费用明细-会员优惠金额") private BigDecimal vipDiscountAmount; @ApiModelProperty(value = "费用明细-平台分佣") private BigDecimal sharingAmount; @ApiModelProperty(value = "费用明细-手续费") private BigDecimal commissionAmount; @ApiModelProperty(value = "充电信息") List<UploadRealTimeMonitoringData> list; @ApiModelProperty(value = "费用明细-费用列表") List<TChargingOrderAccountingStrategy> list1; } 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-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
@@ -105,62 +105,75 @@ </select> <select id="payOrderQuery" resultType="com.ruoyi.order.dto.PayOrderDto"> SELECT * FROM (SELECT id, `code`, 1 as type, title, phone, `status`, order_amount, payment_amount , create_time, end_time, pay_time FROM charging_pile_order.t_charging_order UNION ALL SELECT id, `code`, 2 as type, title, phone, `status`, order_amount, payment_amount , create_time, receiving_time as end_time, pay_time FROM charging_pile_order.t_shopping_order UNION ALL SELECT id, `code`, 3 as type, title, phone, payment_status AS `status`, order_amount, payment_amount , create_time, create_time as end_time, pay_time FROM charging_pile_order.t_vip_order UNION ALL SELECT id, `code`, 4 as type, title, phone, `status`, order_amount , order_amount as payment_amount, create_time, out_parking_time as end_time, out_parking_time as pay_time FROM charging_pile_service.t_parking_record ) o id, `code`, 1 as type, title, phone, `status`, order_amount, payment_amount , create_time, end_time, pay_time, refund_status, (payment_amount-refund_amount) as final_amount, del_flag FROM charging_pile_order.t_charging_order UNION ALL SELECT id, `code`, 2 as type, title, phone, `status`, order_amount, payment_amount , create_time, receiving_time as end_time, pay_time, refund_status, (payment_amount-refund_amount) as final_amount, del_flag FROM charging_pile_order.t_shopping_order UNION ALL SELECT id, `code`, 3 as type, title, phone, payment_status AS `status`, order_amount, payment_amount , create_time, create_time as end_time, pay_time, refund_status, (payment_amount-refund_amount) as final_amount, del_flag FROM charging_pile_order.t_vip_order UNION ALL SELECT id, `code`, 4 as type, title, phone, `status`, order_amount , order_amount as payment_amount, create_time, out_parking_time as end_time, out_parking_time as pay_time, null as refund_status, 0 as final_amount, 0 as del_flag FROM charging_pile_service.t_parking_record ) o <where> o.del_flag = 0 <if test="data.code != null and data.code != ''"> AND o.code LIKE CONCAT('%',#{data.code},'%') </if> @@ -170,9 +183,6 @@ <if test="data.type != null"> AND o.type = #{data.type} </if> <if test="data.status != null"> AND o.status = #{data.status} </if> <if test="data.createTime1 != null"> AND o.create_time >= #{data.createTime1} </if> @@ -180,7 +190,7 @@ AND o.create_time <= #{data.createTime2} </if> </where> ORDER BY o.create_time desc </select> <select id="getRefundList" resultType="com.ruoyi.order.api.model.TChargingOrderRefund"> ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceDetailMapper.xml
@@ -12,11 +12,14 @@ <result column="electricity_tariff" property="electricityTariff" /> <result column="service_tariff" property="serviceTariff" /> <result column="added_service_tariff" property="addedServiceTariff" /> <result column="electrovalence" property="electrovalence" /> <result column="service_charge" property="serviceCharge" /> <result column="added_service" property="addedService" /> </resultMap> <!-- 通用查询结果列 --> <sql id="Base_Column_List"> id, order_invoice_id, order_type, order_id, invoice_amount, electricity_tariff, service_tariff, added_service_tariff id, order_invoice_id, order_type, order_id, invoice_amount, electricity_tariff, service_tariff, added_service_tariff,electrovalence,service_charge,added_service </sql> </mapper> ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TOrderInvoiceMapper.xml
@@ -33,5 +33,115 @@ <sql id="Base_Column_List"> id, code, app_user_id, order_type, invoicing_company, invoice_type_id, invoice_type, invoice_material, invoicing_method, invoicing_object_type, name, tax_identification_number, company_address, company_phone, deposit_bank, bank_account, total_amount, invoice_url, mailbox, status, create_time, billing_time, billing_user_id </sql> <select id="pageList" resultType="com.ruoyi.order.api.vo.TOrderInvoiceVO"> select toi.id, toi.code, toi.app_user_id, toi.order_type, toi.invoicing_company, toi.invoice_type_id, toi.invoice_type, toi.invoice_material, toi.invoicing_method, toi.invoicing_object_type, toi.name, toi.tax_identification_number, toi.company_address, toi.company_phone, toi.deposit_bank, toi.bank_account, toi.total_amount, toi.invoice_url, toi.mailbox, toi.status, toi.create_time, toi.billing_time, toi.billing_user_id from t_order_invoice toi <where> <if test="query.invoicingCompany != null and query.invoicingCompany != ''"> AND toi.invoicing_company LIKE concat('%',#{query.invoicingCompany},'%') </if> <if test="query.invoiceType != null and query.invoiceType != ''"> AND toi.invoice_type LIKE concat('%',#{query.invoiceType},'%') </if> <if test="query.invoicingObjectType != null"> AND toi.invoicing_object_type = #{query.invoicingObjectType} </if> <if test="query.invoiceMaterial != null"> AND toi.invoice_material = #{query.invoiceMaterial} </if> <if test="query.invoicingMethod != null"> AND toi.invoicing_method = #{query.invoicingMethod} </if> <if test="query.name != null and query.name != ''"> AND toi.name LIKE concat('%',#{query.name},'%') </if> <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''"> AND toi.billing_time BETWEEN #{query.startTime} AND #{query.endTime} </if> <if test="query.userIds != null and query.userIds.size()>0"> AND toi.billing_user_id IN <foreach collection="query.userIds" close=")" open="(" item="userId" separator=","> #{userId} </foreach> </if> </where> ORDER BY toi.billing_time DESC </select> <select id="statusCount" resultType="java.util.Map"> select COUNT(CASE WHEN status = 1 THEN 1 END) AS `notAccepted`, COUNT(CASE WHEN status = 2 THEN 1 END) AS `processing`, COUNT(CASE WHEN status = 3 THEN 1 END) AS `finished` from t_order_invoice toi <where> <if test="query.invoicingCompany != null and query.invoicingCompany != ''"> AND toi.invoicing_company LIKE concat('%',#{query.invoicingCompany},'%') </if> <if test="query.invoiceType != null and query.invoiceType != ''"> AND toi.invoice_type LIKE concat('%',#{query.invoiceType},'%') </if> <if test="query.invoicingObjectType != null"> AND toi.invoicing_object_type = #{query.invoicingObjectType} </if> <if test="query.invoiceMaterial != null"> AND toi.invoice_material = #{query.invoiceMaterial} </if> <if test="query.invoicingMethod != null"> AND toi.invoicing_method = #{query.invoicingMethod} </if> <if test="query.name != null and query.name != ''"> AND toi.name LIKE concat('%',#{query.name},'%') </if> <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''"> AND toi.billing_time BETWEEN #{query.startTime} AND #{query.endTime} </if> <if test="query.userIds != null and query.userIds.size()>0"> AND toi.billing_user_id IN <foreach collection="query.userIds" close=")" open="(" item="userId" separator=","> #{userId} </foreach> </if> </where> </select> <select id="export" resultType="com.ruoyi.order.api.vo.TOrderInvoiceVO"> select toi.id, toi.code, toi.app_user_id, toi.order_type, toi.invoicing_company, toi.invoice_type_id, toi.invoice_type, toi.invoice_material, toi.invoicing_method, toi.invoicing_object_type, toi.name, toi.tax_identification_number, toi.company_address, toi.company_phone, toi.deposit_bank, toi.bank_account, toi.total_amount, toi.invoice_url, toi.mailbox, toi.status, toi.create_time, toi.billing_time, toi.billing_user_id from t_order_invoice toi <where> <if test="query.invoicingCompany != null and query.invoicingCompany != ''"> AND toi.invoicing_company LIKE concat('%',#{query.invoicingCompany},'%') </if> <if test="query.invoiceType != null and query.invoiceType != ''"> AND toi.invoice_type LIKE concat('%',#{query.invoiceType},'%') </if> <if test="query.invoicingObjectType != null"> AND toi.invoicing_object_type = #{query.invoicingObjectType} </if> <if test="query.invoiceMaterial != null"> AND toi.invoice_material = #{query.invoiceMaterial} </if> <if test="query.invoicingMethod != null"> AND toi.invoicing_method = #{query.invoicingMethod} </if> <if test="query.name != null and query.name != ''"> AND toi.name LIKE concat('%',#{query.name},'%') </if> <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''"> AND toi.billing_time BETWEEN #{query.startTime} AND #{query.endTime} </if> <if test="query.userIds != null and query.userIds.size()>0"> AND toi.billing_user_id IN <foreach collection="query.userIds" close=")" open="(" item="userId" separator=","> #{userId} </foreach> </if> </where> ORDER BY toi.billing_time DESC </select> </mapper> ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java
@@ -194,7 +194,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())));