From 31fe4d3bb4840f09fb8439b3c36bbff18d5a6216 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Wed, 5 Mar 2025 21:12:39 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E9=92=B1=E5=8C=85=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E4=B8=8D=E5=AF=B9=E3=80=81=E7=AC=AC=E4=B8=89?= =?UTF-8?q?=E6=96=B9=E6=89=A3=E6=AC=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../component/PermitAllUrlProperties.java | 2 +- .../PjcloudResourceServerConfiguration.java | 4 + .../api/constant/order/HardOrderTypeEnum.java | 1 + .../constant/third/HardCallbackPayStatus.java | 25 ++++ .../api/dto/third/HardCallbackPayDto.java | 18 +++ .../api/dto/third/HardCallbackRefundDto.java | 7 + .../feign/RemoteHardThirdSelfZyService.java | 9 +- .../hard/api/vo/third/HardCallbackPayVo.java | 20 +++ .../controller/order/HardOrderController.java | 2 +- .../order/HardOrderTotalController.java | 4 +- .../third/HardThirdSelfZyController.java | 23 ++-- .../hard/service/HardThirdSelfZyService.java | 9 +- .../impl/hard/HardThirdSelfZyServiceImpl.java | 81 ++++++++++- .../pjcloud/thirdparty/vo/zy/ZyBaseVo.java | 11 +- .../controller/zy/ThirdZySelfController.java | 9 +- .../mapper/zy/ThirdZyIdDictMapper.java | 8 ++ .../service/impl/ThirdZySelfService.java | 4 +- .../impl/zy/ThirdZyForeignServiceImpl.java | 4 +- .../impl/zy/ThirdZyMerServiceImpl.java | 24 ++-- .../impl/zy/ThirdZySelfServiceImpl.java | 129 ++++++++++++++---- .../impl/zy/ThirdZyStrideServiceImpl.java | 6 +- .../thirdparty/utils/zy/api/ZyApiTool.java | 61 ++++++--- .../service/impl/MchManageServiceImpl.java | 2 +- .../impl/thrid/WalletThirdZyServiceImpl.java | 27 ++-- 24 files changed, 369 insertions(+), 121 deletions(-) create mode 100644 pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/third/HardCallbackPayStatus.java create mode 100644 pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/third/HardCallbackPayDto.java create mode 100644 pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/third/HardCallbackRefundDto.java create mode 100644 pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/third/HardCallbackPayVo.java diff --git a/pjcloud-common/pjcloud-common-security/src/main/java/com/bsd/pjcloud/common/security/component/PermitAllUrlProperties.java b/pjcloud-common/pjcloud-common-security/src/main/java/com/bsd/pjcloud/common/security/component/PermitAllUrlProperties.java index ba3fcc5e6..7c6786b8e 100644 --- a/pjcloud-common/pjcloud-common-security/src/main/java/com/bsd/pjcloud/common/security/component/PermitAllUrlProperties.java +++ b/pjcloud-common/pjcloud-common-security/src/main/java/com/bsd/pjcloud/common/security/component/PermitAllUrlProperties.java @@ -57,7 +57,7 @@ public class PermitAllUrlProperties implements InitializingBean { */ @Getter @Setter - private boolean skipPublicUrl = false; + private boolean skipPublicUrl = true; @Override public void afterPropertiesSet() { diff --git a/pjcloud-common/pjcloud-common-security/src/main/java/com/bsd/pjcloud/common/security/component/PjcloudResourceServerConfiguration.java b/pjcloud-common/pjcloud-common-security/src/main/java/com/bsd/pjcloud/common/security/component/PjcloudResourceServerConfiguration.java index ba84b82e9..1124ea41a 100644 --- a/pjcloud-common/pjcloud-common-security/src/main/java/com/bsd/pjcloud/common/security/component/PjcloudResourceServerConfiguration.java +++ b/pjcloud-common/pjcloud-common-security/src/main/java/com/bsd/pjcloud/common/security/component/PjcloudResourceServerConfiguration.java @@ -27,10 +27,14 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer; +import org.springframework.security.oauth2.server.authorization.OAuth2TokenType; import org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; +import java.util.Arrays; +import java.util.Objects; + /** * @author pjcloud * @date 2022-06-04 diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderTypeEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderTypeEnum.java index 147d06fa9..9a75b51b5 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderTypeEnum.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderTypeEnum.java @@ -17,6 +17,7 @@ public enum HardOrderTypeEnum { RESERVE("2", "线上订餐"), FOREIGN_TICKET("3", "外来人员"), STRIDE_DEPT("4", "跨单位"), + ZY("5", "正元公务餐"), ; private final String type; private final String description; diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/third/HardCallbackPayStatus.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/third/HardCallbackPayStatus.java new file mode 100644 index 000000000..a50fde1f2 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/third/HardCallbackPayStatus.java @@ -0,0 +1,25 @@ +package com.bsd.pjcloud.hard.api.constant.third; + +import cn.hutool.core.util.ObjectUtil; +import com.bsd.pjcloud.hard.api.constant.HardPrintStatusEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +@AllArgsConstructor +@Getter +public enum HardCallbackPayStatus { + SUCCESS("0", "省平台认为流水交易完成,扣费成功"), + REPETITION("0001", "省平台则会每天定时重新发起扣费流程"), + ERROR("0002", "省平台则不再扣费,认为是坏账"), + NOT_SUFFICIENT_FUNDS("0003", "余额不足返回,省平台将会禁止该账户后续交易权限"), + ; + private final String type; + private final String description; + + public static HardCallbackPayStatus valueOfByType(String type) { + if (ObjectUtil.isEmpty(type)) return null; + return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().get(); + } +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/third/HardCallbackPayDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/third/HardCallbackPayDto.java new file mode 100644 index 000000000..4fde3a4e9 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/third/HardCallbackPayDto.java @@ -0,0 +1,18 @@ +package com.bsd.pjcloud.hard.api.dto.third; + +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class HardCallbackPayDto { + + private Long userId; + + private Integer payPrice; + + private LocalDateTime payTime; + + private String orderNo; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/third/HardCallbackRefundDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/third/HardCallbackRefundDto.java new file mode 100644 index 000000000..5877764d5 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/third/HardCallbackRefundDto.java @@ -0,0 +1,7 @@ +package com.bsd.pjcloud.hard.api.dto.third; + +import lombok.Data; + +@Data +public class HardCallbackRefundDto { +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/feign/RemoteHardThirdSelfZyService.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/feign/RemoteHardThirdSelfZyService.java index 5bdd26d0f..50f969fd3 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/feign/RemoteHardThirdSelfZyService.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/feign/RemoteHardThirdSelfZyService.java @@ -1,19 +1,24 @@ package com.bsd.pjcloud.hard.api.feign; import com.bsd.pjcloud.common.core.constant.ServiceNameConstants; +import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.feign.annotation.NoToken; +import com.bsd.pjcloud.hard.api.dto.third.HardCallbackPayDto; +import com.bsd.pjcloud.hard.api.dto.third.HardCallbackRefundDto; +import com.bsd.pjcloud.hard.api.vo.third.HardCallbackPayVo; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; @FeignClient(contextId = "remoteHardThirdSelfZyService", value = ServiceNameConstants.HARDWARE_SERVICE) public interface RemoteHardThirdSelfZyService { @NoToken @PostMapping("/hard-third-callback/pay") - void pay(); + R pay(@RequestBody HardCallbackPayDto dto); @NoToken @PostMapping("/hard-third-callback/refund") - void refund(); + String refund(@RequestBody HardCallbackRefundDto dto); } diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/third/HardCallbackPayVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/third/HardCallbackPayVo.java new file mode 100644 index 000000000..da66e3426 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/third/HardCallbackPayVo.java @@ -0,0 +1,20 @@ +package com.bsd.pjcloud.hard.api.vo.third; + +import com.bsd.pjcloud.hard.api.constant.third.HardCallbackPayStatus; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class HardCallbackPayVo { + + private Long orderId; + + private HardCallbackPayStatus code; + + private LocalDateTime payTime; + + private Long userId; + + private String username; +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderController.java index 11a0cb2da..25590953e 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderController.java @@ -166,7 +166,7 @@ public class HardOrderController { if (ObjectUtil.isNotEmpty(dto.getPayTimeList())) { map.put("timeSpan", " 到 "); map.put("startTime", LocalDateTimeUtil.format(dto.getPayTimeList()[0], DatePattern.NORM_DATETIME_PATTERN)); - map.put("endTime", LocalDateTimeUtil.format(dto.getPayTimeList()[0], DatePattern.NORM_DATETIME_PATTERN)); + map.put("endTime", LocalDateTimeUtil.format(dto.getPayTimeList()[1], DatePattern.NORM_DATETIME_PATTERN)); } if (ObjectUtil.isNotEmpty(excelList)) { BigDecimal totalPriceSum = BigDecimal.ZERO; diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderTotalController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderTotalController.java index a3f511ccd..4902b4f02 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderTotalController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderTotalController.java @@ -85,7 +85,7 @@ public class HardOrderTotalController { if (ObjectUtil.isNotEmpty(dto.getPayTimeList())) { map.put("timeSpan", " 到 "); map.put("startTime", LocalDateTimeUtil.format(dto.getPayTimeList()[0], DatePattern.NORM_DATETIME_PATTERN)); - map.put("endTime", LocalDateTimeUtil.format(dto.getPayTimeList()[0], DatePattern.NORM_DATETIME_PATTERN)); + map.put("endTime", LocalDateTimeUtil.format(dto.getPayTimeList()[1], DatePattern.NORM_DATETIME_PATTERN)); } if (ObjectUtil.isNotEmpty(list)) { BigDecimal priceTotal = BigDecimal.ZERO; @@ -128,7 +128,7 @@ public class HardOrderTotalController { if (ObjectUtil.isNotEmpty(dto.getPayTimeList())) { map.put("timeSpan", " 到 "); map.put("startTime", LocalDateTimeUtil.format(dto.getPayTimeList()[0], DatePattern.NORM_DATETIME_PATTERN)); - map.put("endTime", LocalDateTimeUtil.format(dto.getPayTimeList()[0], DatePattern.NORM_DATETIME_PATTERN)); + map.put("endTime", LocalDateTimeUtil.format(dto.getPayTimeList()[1], DatePattern.NORM_DATETIME_PATTERN)); } if (ObjectUtil.isNotEmpty(list)) { BigDecimal priceTotal = BigDecimal.ZERO; diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/third/HardThirdSelfZyController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/third/HardThirdSelfZyController.java index bc2373b3d..a93563bee 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/third/HardThirdSelfZyController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/third/HardThirdSelfZyController.java @@ -1,22 +1,17 @@ package com.bsd.pjcloud.hard.controller.third; import com.bsd.pjcloud.common.core.util.R; -import com.bsd.pjcloud.common.idempotent.annotation.Idempotent; import com.bsd.pjcloud.common.log.annotation.SysLog; -import com.bsd.pjcloud.common.security.annotation.Inner; +import com.bsd.pjcloud.hard.api.dto.third.HardCallbackPayDto; +import com.bsd.pjcloud.hard.api.dto.third.HardCallbackRefundDto; +import com.bsd.pjcloud.hard.api.vo.third.HardCallbackPayVo; import com.bsd.pjcloud.hard.service.HardThirdSelfZyService; -import com.bsd.pjcloud.wallet.api.vo.MchManageVo; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpHeaders; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.Map; +import org.springframework.web.bind.annotation.*; @RestController @RequiredArgsConstructor @@ -29,20 +24,18 @@ public class HardThirdSelfZyController { /* ************************************* start 远程调用 start ************************************* */ - @Inner(value = false) @PostMapping("/pay") @SysLog("正元支付") @Operation(summary = "正元支付") - public void pay() { - hardThirdSelfZyService.pay(); + public R pay(@RequestBody HardCallbackPayDto dto) { + return R.ok(hardThirdSelfZyService.pay(dto)); } - @Inner(value = false) @PostMapping("/refund") @SysLog("正元退款") @Operation(summary = "正元退款") - public void refund() { - hardThirdSelfZyService.refund(); + public String refund(@RequestBody HardCallbackRefundDto dto) { + return hardThirdSelfZyService.refund(dto); } /* ************************************* end 远程调用 end ************************************* */ diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdSelfZyService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdSelfZyService.java index 02389ddb9..888b0defd 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdSelfZyService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdSelfZyService.java @@ -1,16 +1,19 @@ package com.bsd.pjcloud.hard.service; -import java.util.Map; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.hard.api.dto.third.HardCallbackPayDto; +import com.bsd.pjcloud.hard.api.dto.third.HardCallbackRefundDto; +import com.bsd.pjcloud.hard.api.vo.third.HardCallbackPayVo; public interface HardThirdSelfZyService { /** * 正元支付 */ - void pay(); + HardCallbackPayVo pay(HardCallbackPayDto dto); /** * 正元退款 */ - void refund(); + String refund(HardCallbackRefundDto dto); } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/hard/HardThirdSelfZyServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/hard/HardThirdSelfZyServiceImpl.java index fb1ad47e3..2179b5a2b 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/hard/HardThirdSelfZyServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/hard/HardThirdSelfZyServiceImpl.java @@ -1,11 +1,28 @@ package com.bsd.pjcloud.hard.service.impl.hard; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; +import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum; +import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum; +import com.bsd.pjcloud.hard.api.constant.third.HardCallbackPayStatus; +import com.bsd.pjcloud.hard.api.dto.third.HardCallbackPayDto; +import com.bsd.pjcloud.hard.api.dto.third.HardCallbackRefundDto; +import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity; +import com.bsd.pjcloud.hard.api.vo.third.HardCallbackPayVo; +import com.bsd.pjcloud.hard.service.HardOrderService; import com.bsd.pjcloud.hard.service.HardThirdSelfZyService; +import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; +import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity; +import com.bsd.pjcloud.wallet.api.feign.RemoteWalletService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; +import java.time.LocalDateTime; + @Validated @Slf4j @@ -13,14 +30,70 @@ import org.springframework.validation.annotation.Validated; @Service public class HardThirdSelfZyServiceImpl implements HardThirdSelfZyService { - @Override - public void pay() { + private static final String TAG = "硬件正元回调"; + private final RemoteWalletService remoteWalletService; + + private final HardOrderService hardOrderService; + + /** + * 正元支付 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public HardCallbackPayVo pay(HardCallbackPayDto dto) { + // 钱包 + try { + WalletManageEntity wallet = remoteWalletService.getWallet(dto.getUserId(), WalletTypeEnum.EAT).getData(); + if (ObjectUtil.isEmpty(wallet)) throw new RuntimeException("用户钱包不存在"); + Integer balance = wallet.getBalance(); + int totalPrice = dto.getPayPrice(); + if (balance < totalPrice) { + HardCallbackPayVo res = new HardCallbackPayVo(); + res.setCode(HardCallbackPayStatus.NOT_SUFFICIENT_FUNDS); + return res; + } + String subject = "正元公务餐扣款"; + // 添加硬件订单 + HardOrderEntity orderObj = HardOrderEntity.builder() + .userId(dto.getUserId()) + .parentCarId(null) + .sysType(null) + .orderStatus(HardOrderStatusEnum.PAY.getType()) + .merchantId(null) + .orderType(HardOrderTypeEnum.ZY.getType()) + .payType(HardOrderTypeEnum.RESERVE.getType()) + .orderSourceTypeId(null) + .totalPrice(totalPrice) + .extraPrice(0) + .payPrice(totalPrice) + .isOfflineOrder(YesNoEnum.NO.getCode()) + .productDesc(subject) + .walletId(wallet.getId()) + .build(); + boolean isCreateOrder = hardOrderService.save(orderObj); + if (!isCreateOrder) throw new RuntimeException("创建订单失败"); + hardOrderService.fastReduceBalance(orderObj); + HardCallbackPayVo result = new HardCallbackPayVo(); + result.setCode(HardCallbackPayStatus.SUCCESS); + result.setOrderId(orderObj.getId()); + result.setPayTime(LocalDateTime.now()); + return result; + } catch (Exception e) { + log.error("|{}|意外得错误dto:|{}|", TAG, JSONUtil.toJsonStr(dto), e); + HardCallbackPayVo result = new HardCallbackPayVo(); + result.setCode(HardCallbackPayStatus.REPETITION); + return result; + } } + /** + * 正元退款 + */ @Override - public void refund() { - + @Transactional(rollbackFor = Exception.class) + public String refund(HardCallbackRefundDto dto) { + return "-1"; } } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/ZyBaseVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/ZyBaseVo.java index 6aefe7fa3..bd8877143 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/ZyBaseVo.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/ZyBaseVo.java @@ -1,10 +1,10 @@ package com.bsd.pjcloud.thirdparty.vo.zy; import cn.hutool.core.util.ObjectUtil; -import lombok.AllArgsConstructor; -import lombok.Builder; +import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; -import lombok.NoArgsConstructor; + +import java.util.Map; @Data public class ZyBaseVo { @@ -54,4 +54,9 @@ public class ZyBaseVo { return ObjectUtil.equal(code, ZyBaseVo.successCode); } + @JsonIgnore + public Map getErrorMap() { + return Map.of("code", code, "msg", msg); + } + } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/zy/ThirdZySelfController.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/zy/ThirdZySelfController.java index bd14b03a6..1e7b4393f 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/zy/ThirdZySelfController.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/zy/ThirdZySelfController.java @@ -27,7 +27,7 @@ public class ThirdZySelfController { @Inner(value = false) @GetMapping("/checkSystemStatus") @Operation(summary = "第三方url健康探测", description = "第三方url健康探测") - @Idempotent(expireTime = 10, info = "请勿重复调用") + @Idempotent(expireTime = 3, info = "请勿重复调用") public Map checkSystemStatus() { return zySelfService.checkSystemStatus(); } @@ -35,7 +35,7 @@ public class ThirdZySelfController { @Inner(value = false) @GetMapping("/getToken") @Operation(summary = "第三方提供获取token", description = "第三方提供获取token") - @Idempotent(expireTime = 10, info = "请勿重复调用") + @Idempotent(expireTime = 3, info = "请勿重复调用") public ZySelfGetTokenVo getToken(ZySelfGetTokenDto params) { return zySelfService.getToken(params); } @@ -43,15 +43,14 @@ public class ThirdZySelfController { @Inner(value = false) @PostMapping("/correct") @Operation(summary = "第三方一卡通系统提供冲正接口", description = "第三方一卡通系统提供冲正接口") - public ZySelfCorrectVo correct(ZySelfCorrectDto params, @RequestParam(value = "access_token", required = false) String accessToken) { + public Map correct(ZySelfCorrectDto params, @RequestParam(value = "access_token", required = false) String accessToken) { return zySelfService.correct(params, accessToken); } @Inner(value = false) @PostMapping("/pay") @Operation(summary = "第三方一卡通系统提供扣费接口", description = "第三方一卡通系统提供扣费接口") - @Idempotent(expireTime = 10, info = "请勿重复调用") - public ZySelfPayVo pay(ZySelfPayDto params, @RequestParam(value = "access_token", required = false) String accessToken) { + public Map pay(ZySelfPayDto params, @RequestParam(value = "access_token", required = false) String accessToken) { return zySelfService.pay(params, accessToken); } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/zy/ThirdZyIdDictMapper.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/zy/ThirdZyIdDictMapper.java index b364e483d..de8d2f8fd 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/zy/ThirdZyIdDictMapper.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/zy/ThirdZyIdDictMapper.java @@ -28,4 +28,12 @@ public interface ThirdZyIdDictMapper extends PjcloudBaseMapper wrapper = new LambdaQueryWrapper() + .eq(ObjectUtil.isNotEmpty(zyId), ThirdZyIdDictEntity::getZyId, zyId) + .eq(ThirdZyIdDictEntity::getBizType, type.getType()); + return selectOne(wrapper); + } + } \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ThirdZySelfService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ThirdZySelfService.java index 976e13420..90cc4646b 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ThirdZySelfService.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ThirdZySelfService.java @@ -24,10 +24,10 @@ public interface ThirdZySelfService { /** * 第三方一卡通系统提供冲正接口 */ - ZySelfCorrectVo correct(ZySelfCorrectDto params, String accessToken); + Map correct(ZySelfCorrectDto params, String accessToken); /** * 第三方一卡通系统提供扣费接口 */ - ZySelfPayVo pay(ZySelfPayDto params, String accessToken); + Map pay(ZySelfPayDto params, String accessToken); } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyForeignServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyForeignServiceImpl.java index 2133ee7b9..491cc6792 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyForeignServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyForeignServiceImpl.java @@ -23,9 +23,7 @@ import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.util.Arrays; -import java.util.HashMap; import java.util.Map; -import java.util.concurrent.TimeUnit; @Service @Validated @@ -66,7 +64,7 @@ public class ThirdZyForeignServiceImpl implements ThirdZyForeignService { Map encryptionBody = BeanUtil.beanToMap(dto); entity.setApiUrl(url); entity.setOrgReq(JSONUtil.toJsonStr(encryptionBody)); - Map body = zyApiTool.getEncryptionMap(encryptionBody); + Map body = zyApiTool.getZyEncryptionMap(encryptionBody); entity.setEncipherReq(JSONUtil.toJsonStr(body)); String res = HttpRequest.post(url).form(body).execute().body(); if (ObjectUtil.isEmpty(res)) { diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyMerServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyMerServiceImpl.java index f91db0432..972170600 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyMerServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyMerServiceImpl.java @@ -55,21 +55,18 @@ public class ThirdZyMerServiceImpl implements ThirdZyMerService { // 转换商户id List mchList = dto.stream().map(ZyMerSyncDealerInfoDto::getDealerKeyObj).distinct().toList(); Map mchIdDict = zyApiTool.generateZyId(bizTYpe, mchList); - List> listMap = new ArrayList<>(); for (ZyMerSyncDealerInfoDto v : dto) { v.setEPID(deptDdDict.get(v.getEPID())); v.setDealerKeyObj(mchIdDict.get(v.getDealerKeyObj())); - Map map = zyApiTool.removeEmptyMap(BeanUtil.beanToMap(v)); - if (ObjectUtil.isNotEmpty(map)) listMap.add(map); } String url = zyConfig.getBaseUrl() + ZyApi.Mer.SYNC_DEALER_INFO; try { url = String.format(url, zyApiTool.getToken()); Map encryptionBody = new HashMap<>(); - encryptionBody.put("dealers", listMap); + encryptionBody.put("dealers", dto); entity.setApiUrl(url); entity.setOrgReq(JSONUtil.toJsonStr(encryptionBody)); - Map body = zyApiTool.getEncryptionMap(encryptionBody); + Map body = zyApiTool.getZyEncryptionMap(encryptionBody); entity.setEncipherReq(JSONUtil.toJsonStr(body)); String res = HttpRequest.post(url).form(body).execute().body(); if (ObjectUtil.isEmpty(res)) { @@ -103,23 +100,20 @@ public class ThirdZyMerServiceImpl implements ThirdZyMerService { ThirdZyLogEntity entity = new ThirdZyLogEntity(); entity.setBizType(bizType.getType()); long startTime = System.currentTimeMillis(); - List> listMap = new ArrayList<>(); // 转换zyId List list = dto.stream().map(ZyMerSyncEnterpriseInfoDto::getEPID).distinct().toList(); Map idDict = zyApiTool.generateZyId(bizType, list); for (ZyMerSyncEnterpriseInfoDto v : dto) { v.setEPID(idDict.get(v.getEPID())); - Map map = zyApiTool.removeEmptyMap(BeanUtil.beanToMap(v)); - if (ObjectUtil.isNotEmpty(map)) listMap.add(map); } String url = zyConfig.getBaseUrl() + ZyApi.Mer.SYNC_ENTERPRISE_INFO; try { url = String.format(url, zyApiTool.getToken()); Map encryptionBody = new HashMap<>(); - encryptionBody.put("enterprises", listMap); + encryptionBody.put("enterprises", dto); entity.setApiUrl(url); entity.setOrgReq(JSONUtil.toJsonStr(encryptionBody)); - Map body = zyApiTool.getEncryptionMap(encryptionBody); + Map body = zyApiTool.getZyEncryptionMap(encryptionBody); entity.setEncipherReq(JSONUtil.toJsonStr(body)); String res = HttpRequest.post(url).form(body).execute().body(); if (ObjectUtil.isEmpty(res)) { @@ -164,6 +158,7 @@ public class ThirdZyMerServiceImpl implements ThirdZyMerService { Map roleIdDict = zyApiTool.generateZyId(bizType, roleList); for (ZyMerSyncAccountInfoDto v : dto) { v.setEPID(deptIdDict.get(v.getEPID())); + v.setPerCode(userIdDict.get(v.getPerCode())); v.setAccNum(userIdDict.get(v.getAccNum())); v.setAccClassID(roleIdDict.get(v.getAccClassID())); } @@ -179,7 +174,7 @@ public class ThirdZyMerServiceImpl implements ThirdZyMerService { encryptionBody.put("currentMaxFixId", String.valueOf(maxFixId.getAsLong())); entity.setApiUrl(url); entity.setOrgReq(JSONUtil.toJsonStr(encryptionBody)); - Map body = zyApiTool.getEncryptionMap(encryptionBody, "data", "currentMaxFixId"); + Map body = zyApiTool.getZyEncryptionMap(encryptionBody, "data", "currentMaxFixId"); entity.setEncipherReq(JSONUtil.toJsonStr(body)); String res = HttpRequest.post(url).form(body).execute().body(); if (ObjectUtil.isEmpty(res)) { @@ -219,21 +214,18 @@ public class ThirdZyMerServiceImpl implements ThirdZyMerService { long startTime = System.currentTimeMillis(); String url = zyConfig.getBaseUrl() + ZyApi.Mer.SYNC_ACC_CLASS_INFO; try { - List> listMap = new ArrayList<>(); // 转换zyId List roleList = dto.stream().map(ZyMerSyncAccClassInfoDto::getEPID).distinct().toList(); Map roleIdDict = zyApiTool.generateZyId(bizType, roleList); for (ZyMerSyncAccClassInfoDto v : dto) { v.setEPID(roleIdDict.get(v.getEPID())); - Map map = zyApiTool.removeEmptyMap(BeanUtil.beanToMap(v)); - if (ObjectUtil.isNotEmpty(map)) listMap.add(map); } url = String.format(url, zyApiTool.getToken()); Map encryptionBody = new HashMap<>(); - encryptionBody.put("accClasses", listMap); + encryptionBody.put("accClasses", dto); entity.setApiUrl(url); entity.setOrgReq(JSONUtil.toJsonStr(encryptionBody)); - Map body = zyApiTool.getEncryptionMap(encryptionBody); + Map body = zyApiTool.getZyEncryptionMap(encryptionBody); entity.setEncipherReq(JSONUtil.toJsonStr(body)); String res = HttpRequest.post(url).form(body).execute().body(); if (ObjectUtil.isEmpty(res)) { diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZySelfServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZySelfServiceImpl.java index 346971651..40f970ac9 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZySelfServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZySelfServiceImpl.java @@ -1,21 +1,31 @@ package com.bsd.pjcloud.thirdparty.service.impl.zy; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.codec.Base64; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONUtil; import com.bsd.pjcloud.common.core.constant.CacheConstants; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.hard.api.dto.third.HardCallbackPayDto; import com.bsd.pjcloud.hard.api.feign.RemoteHardThirdSelfZyService; +import com.bsd.pjcloud.hard.api.vo.third.HardCallbackPayVo; import com.bsd.pjcloud.thirdparty.config.ZyConfig; import com.bsd.pjcloud.thirdparty.constant.ThirdZyBizEnumType; import com.bsd.pjcloud.thirdparty.dto.zy.self.ZySelfCorrectDto; import com.bsd.pjcloud.thirdparty.dto.zy.self.ZySelfGetTokenDto; import com.bsd.pjcloud.thirdparty.dto.zy.self.ZySelfPayDto; import com.bsd.pjcloud.thirdparty.dto.zy.self.ZySelfTokenDto; +import com.bsd.pjcloud.thirdparty.entity.zy.ThirdZyIdDictEntity; import com.bsd.pjcloud.thirdparty.entity.zy.ThirdZyLogEntity; +import com.bsd.pjcloud.thirdparty.mapper.zy.ThirdZyIdDictMapper; import com.bsd.pjcloud.thirdparty.service.impl.ThirdZySelfService; import com.bsd.pjcloud.thirdparty.utils.zy.api.ZyApi; +import com.bsd.pjcloud.thirdparty.utils.zy.api.ZyApiTool; import com.bsd.pjcloud.thirdparty.vo.zy.ZyBaseVo; import com.bsd.pjcloud.thirdparty.vo.zy.self.ZySelfCorrectVo; import com.bsd.pjcloud.thirdparty.vo.zy.self.ZySelfGetTokenVo; @@ -29,6 +39,8 @@ import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; +import java.math.BigDecimal; +import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.TimeUnit; @@ -45,9 +57,12 @@ public class ThirdZySelfServiceImpl implements ThirdZySelfService { private final StringRedisTemplate redisTemplate; private final ThirdZyLogServiceImpl thirdZyLogService; + private final ThirdZyIdDictMapper thirdZyIdDictMapper; private final RemoteHardThirdSelfZyService hardCallback; + private final ZyApiTool zyApiTool; + /** * 第三方url健康探测 */ @@ -79,13 +94,13 @@ public class ThirdZySelfServiceImpl implements ThirdZySelfService { * 第三方一卡通系统提供冲正接口 */ @Override - public ZySelfCorrectVo correct(ZySelfCorrectDto params, String accessToken) { + public Map correct(ZySelfCorrectDto params, String accessToken) { ThirdZyBizEnumType bizType = ThirdZyBizEnumType.SELF_CORRECT; ThirdZyLogEntity entity = new ThirdZyLogEntity(); entity.setBizType(bizType.getType()); long startTime = System.currentTimeMillis(); + ZySelfCorrectVo result = new ZySelfCorrectVo(); try { - ZySelfCorrectVo result = new ZySelfCorrectVo(); result.setCode(ZyBaseVo.errorCode); boolean isToken = checkIsToken(accessToken); // 判断token @@ -96,19 +111,19 @@ public class ThirdZySelfServiceImpl implements ThirdZySelfService { throw new RuntimeException(msg); } // 校验加密参数 - boolean isSign = checkSign(params); - if (!isSign) { + String resJson = checkSign(params); + if (ObjectUtil.isEmpty(resJson)) { String msg = "数据加密认证失败!sign值验证失败"; result.setCode(ZyBaseVo.signError); result.setMsg(msg); throw new RuntimeException(msg); } - return null; + return BeanUtil.beanToMap(result); } catch (Exception e) { String error = String.format("|%s||correct|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace())); log.error(error); entity.setError(error); - return null; + return result.getErrorMap(); } finally { long elapsedTime = System.currentTimeMillis() - startTime; entity.setTimeConsuming(Long.toString(elapsedTime)); @@ -120,7 +135,7 @@ public class ThirdZySelfServiceImpl implements ThirdZySelfService { * 第三方一卡通系统提供扣费接口 */ @Override - public ZySelfPayVo pay(ZySelfPayDto params, String accessToken) { + public Map pay(ZySelfPayDto params, String accessToken) { ThirdZyBizEnumType bizType = ThirdZyBizEnumType.SELF_PAY; ThirdZyLogEntity entity = new ThirdZyLogEntity(); entity.setBizType(bizType.getType()); @@ -137,19 +152,57 @@ public class ThirdZySelfServiceImpl implements ThirdZySelfService { throw new RuntimeException(msg); } // 校验加密参数 - boolean isSign = checkSign(params); - if (!isSign) { + String jsonRes = checkSign(params); + if (ObjectUtil.isEmpty(jsonRes)) { String msg = "数据加密认证失败!sign值验证失败"; result.setCode(ZyBaseVo.signError); result.setMsg(msg); throw new RuntimeException(msg); } - return result; + result.setCode(ZyBaseVo.errorCode); + result.setMsg(ZyBaseVo.defaultErrorMsg); + ZySelfPayDto dto = JSONUtil.toBean(jsonRes, ZySelfPayDto.class); + String accNum = dto.getAccNum(); + ThirdZyIdDictEntity userIdDict = thirdZyIdDictMapper.getByZyIds(bizType, accNum); + if (ObjectUtil.isEmpty(userIdDict)) { + throw new RuntimeException("用户id不存在"); + } + String amount = dto.getAmount(); + if (ObjectUtil.isEmpty(amount)) { + throw new RuntimeException("金额转换失败"); + } + int payPrice = new BigDecimal(amount).multiply(BigDecimal.valueOf(100)).intValue(); + String dealTime = dto.getDealTime(); + LocalDateTime payTime = LocalDateTimeUtil.parse(dealTime, DatePattern.NORM_DATETIME_PATTERN); + // 调用硬件接口 + HardCallbackPayDto payDto = new HardCallbackPayDto(); + payDto.setUserId(Long.valueOf(userIdDict.getSelfId())); + payDto.setPayPrice(payPrice); + payDto.setPayTime(payTime); + payDto.setOrderNo(dto.getSerialNum()); + HardCallbackPayVo payRes = hardCallback.pay(payDto).getData(); + result.setCode(payRes.getCode().getType()); + switch (payRes.getCode()) { + case SUCCESS -> { + result.setMsg(ZyBaseVo.selfSuccessMsg); + result.setAccNum(payRes.getUserId().toString()); + result.setAccName(payRes.getUsername()); + result.setPerCode(payRes.getUserId().toString()); + result.setPlatformSerialNum(dto.getSerialNum()); + result.setSerialNum(dto.getSerialNum()); + result.setAmount(amount); + result.setRecDate(LocalDateTimeUtil.format(payRes.getPayTime(), DatePattern.NORM_DATETIME_PATTERN)); + return zyApiTool.getSelfEncryptionMap(BeanUtil.beanToMap(result)); + } + default -> { + return result.getErrorMap(); + } + } } catch (Exception e) { String error = String.format("|%s||pay|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace())); log.error(error); entity.setError(error); - return result; + return result.getErrorMap(); } finally { long elapsedTime = System.currentTimeMillis() - startTime; entity.setTimeConsuming(Long.toString(elapsedTime)); @@ -210,46 +263,62 @@ public class ThirdZySelfServiceImpl implements ThirdZySelfService { log.info("|{}|checkIsToken校验错误,未传入token|{}|", TAG, string); return false; } - Claims claims = Jwts.parser() - .setSigningKey(zyConfig.getSelfAppSecret()) - .parseClaimsJws(string) - .getBody(); - String token = (String) claims.get(zyConfig.getSelfTokenKey()); - String redisKey = CacheConstants.THIRDPARTY_ZY_SELF_TOKEN + token; - String json = redisTemplate.opsForValue().get(redisKey); - if (ObjectUtil.isEmpty(json)) { - log.info("|{}|checkIsToken校验错误token|{}|", TAG, string); + try { + Claims claims = Jwts.parser() + .setSigningKey(zyConfig.getSelfTokenSecret()) + .parseClaimsJws(string) + .getBody(); + String token = (String) claims.get(zyConfig.getSelfTokenKey()); + String redisKey = CacheConstants.THIRDPARTY_ZY_SELF_TOKEN + token; + String json = redisTemplate.opsForValue().get(redisKey); + if (ObjectUtil.isEmpty(json)) { + log.error("|{}|checkIsToken校验错误token|{}|", TAG, string); + return false; + } + log.info("|{}|checkIsToken校验成功info|{}|", TAG, json); + return true; + } catch (Exception e) { + log.error("|{}|checkIsToken意外的错误token|{}|", TAG, string); return false; } - log.info("|{}|checkIsToken校验成功info|{}|", TAG, json); - return true; } /** * 校验参数 */ - private boolean checkSign(Object obj) { - if (ObjectUtil.isEmpty(obj)) return false; + private String checkSign(Object obj) { + if (ObjectUtil.isEmpty(obj)) return null; try { Map map = BeanUtil.beanToMap(obj); - if (ObjectUtil.isEmpty(map)) return false; + if (ObjectUtil.isEmpty(map)) return null; Map paramsMap = new TreeMap<>(map); paramsMap.remove("sign"); String sign = map.getOrDefault("sign", "").toString(); if (ObjectUtil.isEmpty(sign)) { log.error("|{}|checkSign意外的错误,sign为空", sign); - return false; + return null; } if (ObjectUtil.isEmpty(paramsMap)) { log.error("|{}|checkSign意外的错误,paramsMap为空", paramsMap); - return false; + return null; + } + for (Map.Entry entry : paramsMap.entrySet()) { + Object value = entry.getValue(); + if (value instanceof String) { + entry.setValue(Base64.decodeStr((String) value)); + } else { + entry.setValue(Base64.decodeStr(value.toString())); + } + } + String string = zyApiTool.getResultSign(paramsMap); + if (ObjectUtil.equals(sign, string)) { + return JSONUtil.toJsonStr(paramsMap); } - return true; } catch (Exception e) { log.error("|{}|checkSign意外的错误,加密参数|{}|", TAG, JSONUtil.toJsonStr(obj), e); - return false; + return null; } - + return null; } // 生成token diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyStrideServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyStrideServiceImpl.java index e6c76cde9..25e29e95b 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyStrideServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZyStrideServiceImpl.java @@ -51,7 +51,7 @@ public class ThirdZyStrideServiceImpl implements ThirdZyStrideService { encryptionBody.put("dealers", dto); entity.setApiUrl(url); entity.setOrgReq(JSONUtil.toJsonStr(encryptionBody)); - Map body = zyApiTool.getEncryptionMap(encryptionBody); + Map body = zyApiTool.getZyEncryptionMap(encryptionBody); entity.setEncipherReq(JSONUtil.toJsonStr(body)); String res = HttpRequest.post(url).form(body).execute().body(); if (ObjectUtil.isEmpty(res)) { @@ -90,7 +90,7 @@ public class ThirdZyStrideServiceImpl implements ThirdZyStrideService { encryptionBody.put("dealers", dto); entity.setApiUrl(url); entity.setOrgReq(JSONUtil.toJsonStr(encryptionBody)); - Map body = zyApiTool.getEncryptionMap(encryptionBody); + Map body = zyApiTool.getZyEncryptionMap(encryptionBody); entity.setEncipherReq(JSONUtil.toJsonStr(body)); String res = HttpRequest.post(url).form(body).execute().body(); if (ObjectUtil.isEmpty(res)) { @@ -129,7 +129,7 @@ public class ThirdZyStrideServiceImpl implements ThirdZyStrideService { encryptionBody.put("dealers", dto); entity.setApiUrl(url); entity.setOrgReq(JSONUtil.toJsonStr(encryptionBody)); - Map body = zyApiTool.getEncryptionMap(encryptionBody); + Map body = zyApiTool.getZyEncryptionMap(encryptionBody); entity.setEncipherReq(JSONUtil.toJsonStr(body)); String res = HttpRequest.post(url).form(body).execute().body(); if (ObjectUtil.isEmpty(res)) { diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/zy/api/ZyApiTool.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/zy/api/ZyApiTool.java index e4eecedde..0014e5430 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/zy/api/ZyApiTool.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/zy/api/ZyApiTool.java @@ -6,15 +6,12 @@ import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.URLUtil; import cn.hutool.http.HttpRequest; import cn.hutool.json.JSONUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.serializer.SerializerFeature; import com.bsd.pjcloud.common.core.constant.CacheConstants; import com.bsd.pjcloud.thirdparty.config.ZyConfig; import com.bsd.pjcloud.thirdparty.constant.ThirdZyBizEnumType; import com.bsd.pjcloud.thirdparty.entity.zy.ThirdZyIdDictEntity; import com.bsd.pjcloud.thirdparty.mapper.zy.ThirdZyIdDictMapper; import com.bsd.pjcloud.thirdparty.vo.zy.mer.ZyMerGetTokenVo; -import io.undertow.security.idm.DigestAlgorithm; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.StringRedisTemplate; @@ -23,8 +20,6 @@ import org.springframework.validation.annotation.Validated; import org.apache.commons.codec.digest.DigestUtils; import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneOffset; import java.util.*; import java.util.concurrent.TimeUnit; @@ -135,35 +130,59 @@ public class ZyApiTool { return result; } - public Map getEncryptionMap(Map params, String... str) { + /** + * 获取正元传输的数据 + */ + public Map getZyEncryptionMap(Map params, String... str) { Map body = new LinkedHashMap<>(); if (ObjectUtil.isEmpty(str)) return body; for (String v : str) { body.put(v, params.getOrDefault(v, null)); } - prePost(body); + prePost(body, true); return body; } - public Map getEncryptionMap(Map params) { + public Map getZyEncryptionMap(Map params) { Map body = new HashMap<>(); body.put("data", params); - prePost(body); + prePost(body, true); return body; } - public Map removeEmptyMap(Map params) { - if (ObjectUtil.isEmpty(params)) return null; - for (Map.Entry entry : params.entrySet()) { - Object value = entry.getValue(); - if (value == null) { - params.remove(entry.getKey()); - } + /** + * 获取第三方传输的数据 + */ + public Map getSelfEncryptionMap(Map params, String... str) { + Map body = new LinkedHashMap<>(); + if (ObjectUtil.isEmpty(str)) return body; + for (String v : str) { + body.put(v, params.getOrDefault(v, null)); } - return params; + prePost(body, false); + return body; } - private void prePost(Map params) { + public Map getSelfEncryptionMap(Map params) { + Map body = new HashMap<>(); + body.put("data", params); + prePost(body, false); + return body; + } + + public String getResultSign(Map params) { + for (Map.Entry entry : params.entrySet()) { + Object value = entry.getValue(); + if (value instanceof String) { + entry.setValue(Base64.encode((String) value)); + } else { + entry.setValue(Base64.encode(value.toString())); + } + } + return generateSign(params, false); + } + + private void prePost(Map params, boolean isZy) { for (Map.Entry entry : params.entrySet()) { Object value = entry.getValue(); if (value instanceof String) { @@ -173,7 +192,7 @@ public class ZyApiTool { entry.setValue(json); } } - String sign = generateSign(params); + String sign = generateSign(params, isZy); for (Map.Entry entry : params.entrySet()) { Object value = entry.getValue(); if (value instanceof String) { @@ -185,7 +204,7 @@ public class ZyApiTool { params.put("sign", sign); } - private String generateSign(Map params) { + private String generateSign(Map params, boolean isZy) { // 将参数以参数名的字典升序排序 Map sortParams = new TreeMap(params); Set> entrys = sortParams.entrySet(); @@ -193,7 +212,7 @@ public class ZyApiTool { for (Map.Entry entry : entrys) { baseString.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); } - baseString.append("key=").append(zyConfig.getAppId()); + baseString.append("key=").append(isZy ? zyConfig.getAppId() : zyConfig.getSelfAppId()); String signStr = baseString.toString(); String digestHex = DigestUtils.md5Hex(signStr); log.info("|{}|加密前的参数为|{}|加密后的参数为|{}|", TAG, signStr, digestHex); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/MchManageServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/MchManageServiceImpl.java index 5fe05691f..fd51c2e88 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/MchManageServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/MchManageServiceImpl.java @@ -119,12 +119,12 @@ public class MchManageServiceImpl extends ServiceImpl list) { if (ObjectUtil.isEmpty(list)) return; - baseMapper.deleteByIds(list); // 删除缓存 list.forEach(v -> { redisTemplate.opsForValue().getAndDelete(CacheConstants.WALLET_MCH + v); walletThirdZyService.syncAllMch(v, Boolean.TRUE); }); + baseMapper.deleteByIds(list); } @Override diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/thrid/WalletThirdZyServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/thrid/WalletThirdZyServiceImpl.java index 1f0ae696d..d04fcdeab 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/thrid/WalletThirdZyServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/thrid/WalletThirdZyServiceImpl.java @@ -92,8 +92,10 @@ public class WalletThirdZyServiceImpl implements WalletThirdZyService { syncList.add(entity); } try { - ZyMerSyncDealerInfoVo res = thirdZyService.syncDealerInfo(syncList).getData(); - if (ObjectUtil.isEmpty(res)) return; + if (ObjectUtil.isNotEmpty(syncList)) { + ZyMerSyncDealerInfoVo res = thirdZyService.syncDealerInfo(syncList).getData(); + if (ObjectUtil.isEmpty(res)) return; + } } catch (Exception e) { log.error("|{}syncAllMch 调用第三方接口错误|", TAG); } @@ -135,8 +137,10 @@ public class WalletThirdZyServiceImpl implements WalletThirdZyService { syncList.add(entity); } try { - ZyMerSyncEnterpriseInfoVo res = thirdZyService.syncEnterpriseInfoApi(syncList).getData(); - if (ObjectUtil.isEmpty(res)) return; + if (ObjectUtil.isNotEmpty(syncList)) { + ZyMerSyncEnterpriseInfoVo res = thirdZyService.syncEnterpriseInfoApi(syncList).getData(); + if (ObjectUtil.isEmpty(res)) return; + } } catch (Exception e) { log.error("|{}syncAllDept 调用第三方接口错误|", TAG); } @@ -171,8 +175,10 @@ public class WalletThirdZyServiceImpl implements WalletThirdZyService { syncList.add(entity); } try { - ZyMerSyncAccClassInfoVo res = thirdZyService.syncAccClassInfoApi(syncList).getData(); - if (ObjectUtil.isEmpty(res)) return; + if (ObjectUtil.isNotEmpty(syncList)) { + ZyMerSyncAccClassInfoVo res = thirdZyService.syncAccClassInfoApi(syncList).getData(); + if (ObjectUtil.isEmpty(res)) return; + } } catch (Exception e) { log.error("|{}syncAllRole 调用第三方接口错误|", TAG); } @@ -184,7 +190,7 @@ public class WalletThirdZyServiceImpl implements WalletThirdZyService { public void syncAllUser(Long userId) { Page page = new Page(); page.setCurrent(1); - page.setSize(10); + page.setSize(100); // 查询身份信息 List roleList = remoteRoleService.findRolesByCodes(List.of(DEFAULT_USER_ROLE_CODE)).getData(); if (ObjectUtil.isEmpty(roleList)) { @@ -246,14 +252,17 @@ public class WalletThirdZyServiceImpl implements WalletThirdZyService { item.setCardSID(v.getCardNumber()); item.setCardStatus(getCardStatus(v.getStatus())); item.setEPID(mch.getDeptId().toString()); + item.setPerCode(v.getUserId().toString()); item.setAccClassID(roleId.toString()); item.setPhoneNo(v.getUserMobile()); item.setFixId(syncAllMchVersion); syncList.add(item); } try { - ZyMerSyncAccountInfoVo.DataVo res = thirdZyService.syncAccountInfoApi(syncList).getData(); - if (ObjectUtil.isEmpty(res)) return false; + if (ObjectUtil.isNotEmpty(syncList)) { + ZyMerSyncAccountInfoVo.DataVo res = thirdZyService.syncAccountInfoApi(syncList).getData(); + if (ObjectUtil.isEmpty(res)) return false; + } } catch (Exception e) { log.error("|{}syncAllUserGroup 调用第三方接口错误|", TAG); return false; From 96208fd4d0fab12bae9023ddd81de6f70fb8eef1 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Wed, 5 Mar 2025 23:13:05 +0800 Subject: [PATCH 2/4] =?UTF-8?q?feat:=E6=AD=A3=E5=85=83=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E9=80=80=E6=AC=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../third/HardCallbackRefundStatus.java | 16 ++++ .../api/dto/third/HardCallbackRefundDto.java | 8 ++ .../api/entity/order/HardOrderEntity.java | 6 ++ .../feign/RemoteHardThirdSelfZyService.java | 3 +- .../hard/api/vo/third/HardCallbackPayVo.java | 4 +- .../api/vo/third/HardCallbackRefundVo.java | 32 ++++++++ .../third/HardThirdSelfZyController.java | 8 +- .../hard/service/HardAfterSaleService.java | 6 ++ .../hard/service/HardThirdSelfZyService.java | 3 +- .../impl/hard/HardThirdSelfZyServiceImpl.java | 78 +++++++++++++++++-- .../impl/order/HardAfterSaleServiceImpl.java | 2 +- .../controller/zy/ThirdZyLogController.java | 1 + .../mapper/zy/ThirdZyIdDictMapper.java | 8 ++ .../impl/zy/ThirdZySelfServiceImpl.java | 67 +++++++++++++--- .../thirdparty/utils/zy/api/ZyApiTool.java | 14 +--- .../java/com/bsd/pjcloud/admin/ZyTest.java | 78 +++++++++++++++++++ 16 files changed, 299 insertions(+), 35 deletions(-) create mode 100644 pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/third/HardCallbackRefundStatus.java create mode 100644 pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/third/HardCallbackRefundVo.java diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/third/HardCallbackRefundStatus.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/third/HardCallbackRefundStatus.java new file mode 100644 index 000000000..2a6d43f56 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/third/HardCallbackRefundStatus.java @@ -0,0 +1,16 @@ +package com.bsd.pjcloud.hard.api.constant.third; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum HardCallbackRefundStatus { + SUCCESS("0", "省平台认为流水交易完成,扣费成功"), + REPETITION("0001", "省平台则会每天定时重新发起扣费流程"), + ERROR("0002", "省平台则不再扣费,认为是坏账"), + ; + private final String type; + + private final String description; +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/third/HardCallbackRefundDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/third/HardCallbackRefundDto.java index 5877764d5..7ac20cd0f 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/third/HardCallbackRefundDto.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/third/HardCallbackRefundDto.java @@ -4,4 +4,12 @@ import lombok.Data; @Data public class HardCallbackRefundDto { + + private Long orderId; + + /** + * 智慧园区通刷服务平台冲正所产生的平台记录流水号 + */ + private String serialNum; + } diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/order/HardOrderEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/order/HardOrderEntity.java index 226400b72..8fcf4e6ac 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/order/HardOrderEntity.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/order/HardOrderEntity.java @@ -31,6 +31,12 @@ public class HardOrderEntity extends Model { @Schema(description="编号") private Long id; + /** + * 订单编号 + */ + @Schema(description="订单编号 目前正元正在使用") + private String orderNo; + /** * 用户id */ diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/feign/RemoteHardThirdSelfZyService.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/feign/RemoteHardThirdSelfZyService.java index 50f969fd3..5effb67a4 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/feign/RemoteHardThirdSelfZyService.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/feign/RemoteHardThirdSelfZyService.java @@ -6,6 +6,7 @@ import com.bsd.pjcloud.common.feign.annotation.NoToken; import com.bsd.pjcloud.hard.api.dto.third.HardCallbackPayDto; import com.bsd.pjcloud.hard.api.dto.third.HardCallbackRefundDto; import com.bsd.pjcloud.hard.api.vo.third.HardCallbackPayVo; +import com.bsd.pjcloud.hard.api.vo.third.HardCallbackRefundVo; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -19,6 +20,6 @@ public interface RemoteHardThirdSelfZyService { @NoToken @PostMapping("/hard-third-callback/refund") - String refund(@RequestBody HardCallbackRefundDto dto); + R refund(@RequestBody HardCallbackRefundDto dto); } diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/third/HardCallbackPayVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/third/HardCallbackPayVo.java index da66e3426..6837e3976 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/third/HardCallbackPayVo.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/third/HardCallbackPayVo.java @@ -10,11 +10,11 @@ public class HardCallbackPayVo { private Long orderId; - private HardCallbackPayStatus code; - private LocalDateTime payTime; private Long userId; private String username; + + private HardCallbackPayStatus code; } diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/third/HardCallbackRefundVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/third/HardCallbackRefundVo.java new file mode 100644 index 000000000..97f04b186 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/third/HardCallbackRefundVo.java @@ -0,0 +1,32 @@ +package com.bsd.pjcloud.hard.api.vo.third; + +import com.bsd.pjcloud.hard.api.constant.third.HardCallbackRefundStatus; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class HardCallbackRefundVo { + + private Long userId; + + private String username; + + /** + * 退款id + */ + private String refundId; + + /** + * 订单编号 + */ + private String orderNo; + + /** + * 退款时间 + */ + private LocalDateTime refundTime; + + private HardCallbackRefundStatus code; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/third/HardThirdSelfZyController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/third/HardThirdSelfZyController.java index a93563bee..34c7f8cb2 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/third/HardThirdSelfZyController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/third/HardThirdSelfZyController.java @@ -2,9 +2,11 @@ package com.bsd.pjcloud.hard.controller.third; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.common.security.annotation.Inner; import com.bsd.pjcloud.hard.api.dto.third.HardCallbackPayDto; import com.bsd.pjcloud.hard.api.dto.third.HardCallbackRefundDto; import com.bsd.pjcloud.hard.api.vo.third.HardCallbackPayVo; +import com.bsd.pjcloud.hard.api.vo.third.HardCallbackRefundVo; import com.bsd.pjcloud.hard.service.HardThirdSelfZyService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; @@ -24,6 +26,7 @@ public class HardThirdSelfZyController { /* ************************************* start 远程调用 start ************************************* */ + @Inner @PostMapping("/pay") @SysLog("正元支付") @Operation(summary = "正元支付") @@ -31,11 +34,12 @@ public class HardThirdSelfZyController { return R.ok(hardThirdSelfZyService.pay(dto)); } + @Inner @PostMapping("/refund") @SysLog("正元退款") @Operation(summary = "正元退款") - public String refund(@RequestBody HardCallbackRefundDto dto) { - return hardThirdSelfZyService.refund(dto); + public R refund(@RequestBody HardCallbackRefundDto dto) { + return R.ok(hardThirdSelfZyService.refund(dto)); } /* ************************************* end 远程调用 end ************************************* */ diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAfterSaleService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAfterSaleService.java index 908eb2e4a..8e8375fdc 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAfterSaleService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAfterSaleService.java @@ -9,6 +9,7 @@ import com.bsd.pjcloud.hard.api.dto.order.HardDisagreeDto; import com.bsd.pjcloud.hard.api.entity.order.HardAfterSaleEntity; import com.bsd.pjcloud.hard.api.entity.order.HardAfterSaleLogEntity; import com.bsd.pjcloud.hard.api.vo.order.HardAfterSaleVo; +import com.bsd.pjcloud.hard.api.vo.order.HardOrderVo; import java.util.List; @@ -68,6 +69,11 @@ public interface HardAfterSaleService extends IService { */ Boolean disagreeRefund(Long userId, HardDisagreeDto dto); + /** + * 校验订单是否可以退款 + */ + HardOrderVo validateOrderCanRefund(Long orderId); + /** * 后台退款 * diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdSelfZyService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdSelfZyService.java index 888b0defd..c656885be 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdSelfZyService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdSelfZyService.java @@ -4,6 +4,7 @@ import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.hard.api.dto.third.HardCallbackPayDto; import com.bsd.pjcloud.hard.api.dto.third.HardCallbackRefundDto; import com.bsd.pjcloud.hard.api.vo.third.HardCallbackPayVo; +import com.bsd.pjcloud.hard.api.vo.third.HardCallbackRefundVo; public interface HardThirdSelfZyService { @@ -15,5 +16,5 @@ public interface HardThirdSelfZyService { /** * 正元退款 */ - String refund(HardCallbackRefundDto dto); + HardCallbackRefundVo refund(HardCallbackRefundDto dto); } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/hard/HardThirdSelfZyServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/hard/HardThirdSelfZyServiceImpl.java index 2179b5a2b..a3a2dfcc1 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/hard/HardThirdSelfZyServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/hard/HardThirdSelfZyServiceImpl.java @@ -2,14 +2,27 @@ package com.bsd.pjcloud.hard.service.impl.hard; import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONUtil; +import com.bsd.pjcloud.admin.api.dto.UserInfo; +import com.bsd.pjcloud.admin.api.feign.RemoteUserService; import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; +import com.bsd.pjcloud.common.core.util.BeanUtils; import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum; import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum; +import com.bsd.pjcloud.hard.api.constant.refund.HardAfterSaleOperateTypeEnum; +import com.bsd.pjcloud.hard.api.constant.refund.HardSaleStatusEnum; +import com.bsd.pjcloud.hard.api.constant.refund.HardSaleTypeEnum; import com.bsd.pjcloud.hard.api.constant.third.HardCallbackPayStatus; +import com.bsd.pjcloud.hard.api.constant.third.HardCallbackRefundStatus; import com.bsd.pjcloud.hard.api.dto.third.HardCallbackPayDto; import com.bsd.pjcloud.hard.api.dto.third.HardCallbackRefundDto; +import com.bsd.pjcloud.hard.api.entity.order.HardAfterSaleEntity; +import com.bsd.pjcloud.hard.api.entity.order.HardAfterSaleLogEntity; import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity; +import com.bsd.pjcloud.hard.api.vo.order.HardOrderVo; import com.bsd.pjcloud.hard.api.vo.third.HardCallbackPayVo; +import com.bsd.pjcloud.hard.api.vo.third.HardCallbackRefundVo; +import com.bsd.pjcloud.hard.mapper.order.HardAfterSaleLogMapper; +import com.bsd.pjcloud.hard.service.HardAfterSaleService; import com.bsd.pjcloud.hard.service.HardOrderService; import com.bsd.pjcloud.hard.service.HardThirdSelfZyService; import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum; @@ -33,8 +46,11 @@ public class HardThirdSelfZyServiceImpl implements HardThirdSelfZyService { private static final String TAG = "硬件正元回调"; private final RemoteWalletService remoteWalletService; + private final RemoteUserService remoteUserService; private final HardOrderService hardOrderService; + private final HardAfterSaleLogMapper hardAfterSaleLogMapper; + private final HardAfterSaleService hardAfterSaleService; /** * 正元支付 @@ -42,10 +58,13 @@ public class HardThirdSelfZyServiceImpl implements HardThirdSelfZyService { @Override @Transactional(rollbackFor = Exception.class) public HardCallbackPayVo pay(HardCallbackPayDto dto) { - // 钱包 try { + // 钱包 WalletManageEntity wallet = remoteWalletService.getWallet(dto.getUserId(), WalletTypeEnum.EAT).getData(); if (ObjectUtil.isEmpty(wallet)) throw new RuntimeException("用户钱包不存在"); + // 用户 + UserInfo user = remoteUserService.getByUserId(wallet.getUserId()).getData(); + if (ObjectUtil.isEmpty(user)) throw new RuntimeException("用户不存在"); Integer balance = wallet.getBalance(); int totalPrice = dto.getPayPrice(); if (balance < totalPrice) { @@ -53,9 +72,10 @@ public class HardThirdSelfZyServiceImpl implements HardThirdSelfZyService { res.setCode(HardCallbackPayStatus.NOT_SUFFICIENT_FUNDS); return res; } - String subject = "正元公务餐扣款"; + String subject = "正元公务餐物品 * ?"; // 添加硬件订单 HardOrderEntity orderObj = HardOrderEntity.builder() + .orderNo(dto.getOrderNo()) .userId(dto.getUserId()) .parentCarId(null) .sysType(null) @@ -77,10 +97,12 @@ public class HardThirdSelfZyServiceImpl implements HardThirdSelfZyService { HardCallbackPayVo result = new HardCallbackPayVo(); result.setCode(HardCallbackPayStatus.SUCCESS); result.setOrderId(orderObj.getId()); + result.setUserId(user.getSysUser().getUserId()); + result.setUsername(user.getSysUser().getName()); result.setPayTime(LocalDateTime.now()); return result; } catch (Exception e) { - log.error("|{}|意外得错误dto:|{}|", TAG, JSONUtil.toJsonStr(dto), e); + log.error("|{}| pay 意外的错误dto:|{}|", TAG, JSONUtil.toJsonStr(dto), e); HardCallbackPayVo result = new HardCallbackPayVo(); result.setCode(HardCallbackPayStatus.REPETITION); return result; @@ -92,8 +114,54 @@ public class HardThirdSelfZyServiceImpl implements HardThirdSelfZyService { */ @Override @Transactional(rollbackFor = Exception.class) - public String refund(HardCallbackRefundDto dto) { - return "-1"; + public HardCallbackRefundVo refund(HardCallbackRefundDto dto) { + try { + // 校验订单是否可以退款 + HardOrderVo order = hardAfterSaleService.validateOrderCanRefund(dto.getOrderId()); + // 用户 + UserInfo user = remoteUserService.getByUserId(order.getUserId()).getData(); + if (ObjectUtil.isEmpty(user)) throw new RuntimeException("用户不存在"); + // 添加售后订单 + HardAfterSaleEntity saveObj = BeanUtils.toBean(dto, HardAfterSaleEntity.class); + String refundCode = "hard_" + order.getId(); + saveObj.setType(HardSaleTypeEnum.AFTER_SALE.getType()); + saveObj.setStatus(HardSaleStatusEnum.COMPLETE.getStatus()); + saveObj.setNo(refundCode); + saveObj.setOrderId(order.getId()); + saveObj.setRefundPrice(order.getPayPrice()); + saveObj.setUserId(order.getUserId()); + saveObj.setAuditUserId(null); + saveObj.setAuditTime(LocalDateTime.now()); + saveObj.setAuditReason("后台退款"); + hardAfterSaleService.save(saveObj); + // 添加售后进度 + HardAfterSaleLogEntity saveLogObj = HardAfterSaleLogEntity.builder() + .afterSaleId(saveObj.getId()) + .userId(order.getUserId()) + .operateType(HardAfterSaleOperateTypeEnum.ADMIN_REFUND.getType()) + .beforeStatus(order.getOrderStatus()) + .afterStatus(HardSaleStatusEnum.COMPLETE.getStatus()) + .content(HardSaleStatusEnum.COMPLETE.getContent()) + .build(); + hardAfterSaleLogMapper.insert(saveLogObj); + // 执行退款 + hardAfterSaleService.refund(saveObj.getId()); + // 退库存 + hardOrderService.fastenerInventory(order, YesNoEnum.NO); + HardCallbackRefundVo result = new HardCallbackRefundVo(); + result.setCode(HardCallbackRefundStatus.SUCCESS); + result.setRefundId(String.valueOf(saveObj.getId())); + result.setOrderNo(order.getOrderNo()); + result.setUserId(user.getSysUser().getUserId()); + result.setUsername(user.getSysUser().getName()); + result.setRefundTime(LocalDateTime.now()); + return result; + } catch (Exception e) { + log.error("|{}| pay 意外的错误dto:|{}|", TAG, JSONUtil.toJsonStr(dto), e); + HardCallbackRefundVo result = new HardCallbackRefundVo(); + result.setCode(HardCallbackRefundStatus.REPETITION); + return result; + } } } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardAfterSaleServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardAfterSaleServiceImpl.java index fcb2b4489..4e3631129 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardAfterSaleServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardAfterSaleServiceImpl.java @@ -297,7 +297,7 @@ public class HardAfterSaleServiceImpl extends ServiceImpl wrapper = Wrappers.lambdaQuery(); + wrapper.orderByDesc(ThirdZyLogEntity::getCreateTime); return R.ok(thirdZyLogService.page(page, wrapper)); } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/zy/ThirdZyIdDictMapper.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/zy/ThirdZyIdDictMapper.java index de8d2f8fd..0de046018 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/zy/ThirdZyIdDictMapper.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/zy/ThirdZyIdDictMapper.java @@ -20,6 +20,14 @@ public interface ThirdZyIdDictMapper extends PjcloudBaseMapper wrapper = new LambdaQueryWrapper() + .eq(ObjectUtil.isNotEmpty(selfId), ThirdZyIdDictEntity::getSelfId, selfId) + .eq(ThirdZyIdDictEntity::getBizType, type.getType()); + return selectOne(wrapper); + } + default List getByZyIds(ThirdZyBizEnumType type, List zyIds) { if (ObjectUtil.isEmpty(type)) return null; LambdaQueryWrapper wrapper = new LambdaQueryWrapper() diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZySelfServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZySelfServiceImpl.java index 40f970ac9..9ecb7b4cf 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZySelfServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ThirdZySelfServiceImpl.java @@ -8,12 +8,16 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.URLUtil; import cn.hutool.json.JSONUtil; import com.bsd.pjcloud.common.core.constant.CacheConstants; import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.hard.api.constant.third.HardCallbackRefundStatus; import com.bsd.pjcloud.hard.api.dto.third.HardCallbackPayDto; +import com.bsd.pjcloud.hard.api.dto.third.HardCallbackRefundDto; import com.bsd.pjcloud.hard.api.feign.RemoteHardThirdSelfZyService; import com.bsd.pjcloud.hard.api.vo.third.HardCallbackPayVo; +import com.bsd.pjcloud.hard.api.vo.third.HardCallbackRefundVo; import com.bsd.pjcloud.thirdparty.config.ZyConfig; import com.bsd.pjcloud.thirdparty.constant.ThirdZyBizEnumType; import com.bsd.pjcloud.thirdparty.dto.zy.self.ZySelfCorrectDto; @@ -98,6 +102,7 @@ public class ThirdZySelfServiceImpl implements ThirdZySelfService { ThirdZyBizEnumType bizType = ThirdZyBizEnumType.SELF_CORRECT; ThirdZyLogEntity entity = new ThirdZyLogEntity(); entity.setBizType(bizType.getType()); + entity.setApiUrl(ZyApi.Self.CORRECT); long startTime = System.currentTimeMillis(); ZySelfCorrectVo result = new ZySelfCorrectVo(); try { @@ -111,14 +116,45 @@ public class ThirdZySelfServiceImpl implements ThirdZySelfService { throw new RuntimeException(msg); } // 校验加密参数 - String resJson = checkSign(params); - if (ObjectUtil.isEmpty(resJson)) { + String jsonRes = checkSign(params); + if (ObjectUtil.isEmpty(jsonRes)) { String msg = "数据加密认证失败!sign值验证失败"; result.setCode(ZyBaseVo.signError); result.setMsg(msg); throw new RuntimeException(msg); } - return BeanUtil.beanToMap(result); + result.setCode(ZyBaseVo.errorCode); + result.setMsg(ZyBaseVo.defaultErrorMsg); + ZySelfCorrectDto dto = JSONUtil.toBean(jsonRes, ZySelfCorrectDto.class); + entity.setEncipherReq(JSONUtil.toJsonStr(dto)); + // 获取参数 + String correctSerialNum = dto.getCorrectSerialNum(); + Long orderId = Long.parseLong(correctSerialNum); + // 调用硬件接口 + HardCallbackRefundDto refundDto = new HardCallbackRefundDto(); + refundDto.setOrderId(orderId); + refundDto.setSerialNum(dto.getSerialNum()); + HardCallbackRefundVo refundRes = hardCallback.refund(refundDto).getData(); + result.setCode(refundRes.getCode().getType()); + switch (refundRes.getCode()) { + case SUCCESS -> { + ThirdZyIdDictEntity userIdDict = thirdZyIdDictMapper.getBySelfId(ThirdZyBizEnumType.SYNC_ACCOUNT_INFO, String.valueOf(refundRes.getUserId())); + String userZyId = userIdDict.getZyId(); + result.setAccNum(userZyId); + result.setAccName(refundRes.getUsername()); + result.setPerCode(userZyId); + result.setPlatformSerialNum(String.valueOf(refundRes.getRefundId())); + result.setSerialNum(refundRes.getOrderNo()); + result.setRecDate(LocalDateTimeUtil.format(refundRes.getRefundTime(), DatePattern.NORM_DATETIME_PATTERN)); + result.setAmount(dto.getAmount()); + result.setMsg(ZyBaseVo.selfSuccessMsg); + entity.setOrgReq(JSONUtil.toJsonStr(result)); + Map encryptionRes = zyApiTool.getSelfEncryptionMap(BeanUtil.beanToMap(result)); + entity.setEncipherReq(JSONUtil.toJsonStr(encryptionRes)); + return encryptionRes; + } + default -> throw new RuntimeException(); + } } catch (Exception e) { String error = String.format("|%s||correct|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace())); log.error(error); @@ -138,7 +174,9 @@ public class ThirdZySelfServiceImpl implements ThirdZySelfService { public Map pay(ZySelfPayDto params, String accessToken) { ThirdZyBizEnumType bizType = ThirdZyBizEnumType.SELF_PAY; ThirdZyLogEntity entity = new ThirdZyLogEntity(); + entity.setApiUrl(ZyApi.Self.PAY); entity.setBizType(bizType.getType()); + entity.setEncipherReq(JSONUtil.toJsonStr(params)); long startTime = System.currentTimeMillis(); ZySelfPayVo result = new ZySelfPayVo(); try { @@ -162,8 +200,10 @@ public class ThirdZySelfServiceImpl implements ThirdZySelfService { result.setCode(ZyBaseVo.errorCode); result.setMsg(ZyBaseVo.defaultErrorMsg); ZySelfPayDto dto = JSONUtil.toBean(jsonRes, ZySelfPayDto.class); + entity.setEncipherReq(JSONUtil.toJsonStr(dto)); + // 获取参数 String accNum = dto.getAccNum(); - ThirdZyIdDictEntity userIdDict = thirdZyIdDictMapper.getByZyIds(bizType, accNum); + ThirdZyIdDictEntity userIdDict = thirdZyIdDictMapper.getByZyIds(ThirdZyBizEnumType.SYNC_ACCOUNT_INFO, accNum); if (ObjectUtil.isEmpty(userIdDict)) { throw new RuntimeException("用户id不存在"); } @@ -184,7 +224,6 @@ public class ThirdZySelfServiceImpl implements ThirdZySelfService { result.setCode(payRes.getCode().getType()); switch (payRes.getCode()) { case SUCCESS -> { - result.setMsg(ZyBaseVo.selfSuccessMsg); result.setAccNum(payRes.getUserId().toString()); result.setAccName(payRes.getUsername()); result.setPerCode(payRes.getUserId().toString()); @@ -192,11 +231,13 @@ public class ThirdZySelfServiceImpl implements ThirdZySelfService { result.setSerialNum(dto.getSerialNum()); result.setAmount(amount); result.setRecDate(LocalDateTimeUtil.format(payRes.getPayTime(), DatePattern.NORM_DATETIME_PATTERN)); - return zyApiTool.getSelfEncryptionMap(BeanUtil.beanToMap(result)); - } - default -> { - return result.getErrorMap(); + result.setMsg(ZyBaseVo.selfSuccessMsg); + entity.setOrgReq(JSONUtil.toJsonStr(result)); + Map encryptionRes = zyApiTool.getSelfEncryptionMap(BeanUtil.beanToMap(result)); + entity.setEncipherReq(JSONUtil.toJsonStr(encryptionRes)); + return encryptionRes; } + default -> throw new RuntimeException(); } } catch (Exception e) { String error = String.format("|%s||pay|意外的错误error|%s|stack|%s|", TAG, e.getMessage(), Arrays.toString(e.getStackTrace())); @@ -310,8 +351,14 @@ public class ThirdZySelfServiceImpl implements ThirdZySelfService { entry.setValue(Base64.decodeStr(value.toString())); } } - String string = zyApiTool.getResultSign(paramsMap); + String string = zyApiTool.generateSign(paramsMap, false); if (ObjectUtil.equals(sign, string)) { + for (Map.Entry entry : paramsMap.entrySet()) { + Object value = entry.getValue(); + if (value instanceof String) { + entry.setValue(URLUtil.decode((String) value)); + } + } return JSONUtil.toJsonStr(paramsMap); } } catch (Exception e) { diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/zy/api/ZyApiTool.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/zy/api/ZyApiTool.java index 0014e5430..934a0afb4 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/zy/api/ZyApiTool.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/zy/api/ZyApiTool.java @@ -170,18 +170,6 @@ public class ZyApiTool { return body; } - public String getResultSign(Map params) { - for (Map.Entry entry : params.entrySet()) { - Object value = entry.getValue(); - if (value instanceof String) { - entry.setValue(Base64.encode((String) value)); - } else { - entry.setValue(Base64.encode(value.toString())); - } - } - return generateSign(params, false); - } - private void prePost(Map params, boolean isZy) { for (Map.Entry entry : params.entrySet()) { Object value = entry.getValue(); @@ -204,7 +192,7 @@ public class ZyApiTool { params.put("sign", sign); } - private String generateSign(Map params, boolean isZy) { + public String generateSign(Map params, boolean isZy) { // 将参数以参数名的字典升序排序 Map sortParams = new TreeMap(params); Set> entrys = sortParams.entrySet(); diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/test/java/com/bsd/pjcloud/admin/ZyTest.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/test/java/com/bsd/pjcloud/admin/ZyTest.java index 4ed249605..cbff8d7da 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/test/java/com/bsd/pjcloud/admin/ZyTest.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/test/java/com/bsd/pjcloud/admin/ZyTest.java @@ -1,39 +1,56 @@ package com.bsd.pjcloud.admin; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.json.JSONUtil; import com.bsd.pjcloud.thirdparty.ThirdPartyApp; +import com.bsd.pjcloud.thirdparty.config.ZyConfig; +import com.bsd.pjcloud.thirdparty.constant.ThirdZyBizEnumType; import com.bsd.pjcloud.thirdparty.dto.zy.foreign.ZyForeignSyncNativeCardTradeInfoDto; import com.bsd.pjcloud.thirdparty.dto.zy.mer.ZyMerSyncAccClassInfoDto; import com.bsd.pjcloud.thirdparty.dto.zy.mer.ZyMerSyncAccountInfoDto; import com.bsd.pjcloud.thirdparty.dto.zy.mer.ZyMerSyncDealerInfoDto; import com.bsd.pjcloud.thirdparty.dto.zy.mer.ZyMerSyncEnterpriseInfoDto; +import com.bsd.pjcloud.thirdparty.dto.zy.self.ZySelfCorrectDto; +import com.bsd.pjcloud.thirdparty.dto.zy.self.ZySelfGetTokenDto; +import com.bsd.pjcloud.thirdparty.dto.zy.self.ZySelfPayDto; import com.bsd.pjcloud.thirdparty.dto.zy.stride.ZyStrideAuthenticationDto; import com.bsd.pjcloud.thirdparty.dto.zy.stride.ZyStrideConsumptionDto; import com.bsd.pjcloud.thirdparty.dto.zy.stride.ZyStrideCorrectDto; +import com.bsd.pjcloud.thirdparty.entity.zy.ThirdZyIdDictEntity; +import com.bsd.pjcloud.thirdparty.mapper.zy.ThirdZyIdDictMapper; import com.bsd.pjcloud.thirdparty.service.impl.ThirdZyForeignService; import com.bsd.pjcloud.thirdparty.service.impl.ThirdZyMerService; +import com.bsd.pjcloud.thirdparty.service.impl.ThirdZySelfService; import com.bsd.pjcloud.thirdparty.service.impl.ThirdZyStrideService; import com.bsd.pjcloud.thirdparty.utils.zy.api.ZyApiTool; import com.bsd.pjcloud.thirdparty.vo.zy.foreign.ZyForeignGetRegionIdByTokenVo; import com.bsd.pjcloud.thirdparty.vo.zy.foreign.ZyForeignSyncNativeCardTradeInfoVo; import com.bsd.pjcloud.thirdparty.vo.zy.mer.*; +import com.bsd.pjcloud.thirdparty.vo.zy.self.ZySelfGetTokenVo; import com.bsd.pjcloud.thirdparty.vo.zy.stride.ZyStrideAuthenticationVo; import com.bsd.pjcloud.thirdparty.vo.zy.stride.ZyStrideConsumptionVo; import com.bsd.pjcloud.thirdparty.vo.zy.stride.ZyStrideCorrectVo; import jakarta.annotation.Resource; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.util.Base64; import java.util.List; +import java.util.Map; @SpringBootTest(classes = ThirdPartyApp.class) public class ZyTest { @Resource private ZyApiTool zyApiTool; + @Autowired + private ZyConfig zyConfig; @Resource private ThirdZyMerService zyMerService; @@ -41,9 +58,70 @@ public class ZyTest { private ThirdZyForeignService zyForeignService; @Resource private ThirdZyStrideService zyStrideService; + @Resource + private ThirdZySelfService zySelfService; + + @Resource + private ThirdZyIdDictMapper zyIdDictMapper; /************************** start mer start **************************/ + + @Test + public void selfPay() throws Exception { + String dzcUserId = "1875049673022279681"; + String dzcWalletId = "1877309001545244673"; + String date = LocalDateTimeUtil.format(LocalDateTimeUtil.now(), DatePattern.NORM_DATETIME_PATTERN); + ThirdZyIdDictEntity dzcUserDict = zyIdDictMapper.getBySelfId(ThirdZyBizEnumType.SYNC_ACCOUNT_INFO, dzcUserId); + + ZySelfGetTokenDto tokenParams = new ZySelfGetTokenDto(); + tokenParams.setAppid(zyConfig.getSelfAppId()); + tokenParams.setAppsecret(zyConfig.getSelfAppSecret()); + ZySelfGetTokenVo token = zySelfService.getToken(tokenParams); + String accessToken = token.getAccess_token(); + + ZySelfPayDto params = ZySelfPayDto + .builder() + .accNum(dzcUserDict.getZyId()) + .cardAccNum(dzcWalletId) + .amount("10") + .serialNum("01234567890123456789") + .dealTime(date) + .opId("0123456789") + .build(); + Map paramsMap = BeanUtil.beanToMap(params); + Map body = zyApiTool.getSelfEncryptionMap(paramsMap, "accNum", "cardAccNum", "amount", "serialNum", "dealTime", "opId"); + ZySelfPayDto bodyObj = JSONUtil.toBean(JSONUtil.toJsonStr(body), ZySelfPayDto.class); + Map pay = zySelfService.pay(bodyObj, accessToken); + } + + @Test + public void selfRefund() throws Exception { + + String orderId = "1"; + String orderNo = "1"; + + ZySelfGetTokenDto tokenParams = new ZySelfGetTokenDto(); + tokenParams.setAppid(zyConfig.getSelfAppId()); + tokenParams.setAppsecret(zyConfig.getSelfAppSecret()); + ZySelfGetTokenVo token = zySelfService.getToken(tokenParams); + String accessToken = token.getAccess_token(); + + ZySelfCorrectDto params = ZySelfCorrectDto + .builder() + .serialNum(orderNo) + .correctSerialNum(orderId) + .amount("10") + .opId("01234567890123456789") + .build(); + + Map paramsMap = BeanUtil.beanToMap(params); + Map body = zyApiTool.getSelfEncryptionMap(paramsMap, "serialNum", "correctSerialNum", "amount", "opId"); + + ZySelfCorrectDto bodyObj = JSONUtil.toBean(JSONUtil.toJsonStr(body), ZySelfCorrectDto.class); + Map pay = zySelfService.correct(bodyObj, accessToken); + } + /** * 获取token */ From 61f63d61523aa2eb0ef1e13bcdc2829112267a07 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Wed, 5 Mar 2025 23:48:17 +0800 Subject: [PATCH 3/4] =?UTF-8?q?feat:=E6=AD=A3=E5=85=83=E9=80=80=E6=AC=BE?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/constant/order/HardOrderTypeEnum.java | 2 +- .../hard/service/HardAfterSaleService.java | 2 ++ .../impl/hard/HardThirdSelfZyServiceImpl.java | 17 +++++++++++----- .../impl/order/HardAfterSaleServiceImpl.java | 9 ++++++++- .../impl/order/HardOrderServiceImpl.java | 6 ++++-- .../mapper/order/HardOrderMapper.xml | 20 +++++++++++++------ .../java/com/bsd/pjcloud/admin/ZyTest.java | 4 ++-- .../feign/RemoteWalletRechargeService.java | 2 ++ .../recharge/WalletRechargeController.java | 1 + 9 files changed, 46 insertions(+), 17 deletions(-) diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderTypeEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderTypeEnum.java index 9a75b51b5..a9f0a6d98 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderTypeEnum.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/order/HardOrderTypeEnum.java @@ -27,7 +27,7 @@ public enum HardOrderTypeEnum { return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().get(); } - public static final List refundList = List.of(BELOW, RESERVE); + public static final List refundList = List.of(BELOW, RESERVE, FOREIGN_TICKET, ZY); public static final List payList = List.of(BELOW, RESERVE); diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAfterSaleService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAfterSaleService.java index 8e8375fdc..6c61cd715 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAfterSaleService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardAfterSaleService.java @@ -52,6 +52,8 @@ public interface HardAfterSaleService extends IService { */ void refund(Long afterSaleId); + void refund(Long afterSaleId, String prefixStr); + /** * 同意售后 * diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/hard/HardThirdSelfZyServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/hard/HardThirdSelfZyServiceImpl.java index a3a2dfcc1..63709cd1f 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/hard/HardThirdSelfZyServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/hard/HardThirdSelfZyServiceImpl.java @@ -8,6 +8,7 @@ import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.core.util.BeanUtils; import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum; import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum; +import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum; import com.bsd.pjcloud.hard.api.constant.refund.HardAfterSaleOperateTypeEnum; import com.bsd.pjcloud.hard.api.constant.refund.HardSaleStatusEnum; import com.bsd.pjcloud.hard.api.constant.refund.HardSaleTypeEnum; @@ -79,10 +80,10 @@ public class HardThirdSelfZyServiceImpl implements HardThirdSelfZyService { .userId(dto.getUserId()) .parentCarId(null) .sysType(null) - .orderStatus(HardOrderStatusEnum.PAY.getType()) + .orderStatus(HardOrderStatusEnum.CREATE.getType()) .merchantId(null) .orderType(HardOrderTypeEnum.ZY.getType()) - .payType(HardOrderTypeEnum.RESERVE.getType()) + .payType(HardPayTypeEnum.WALLET_CARD.getType()) .orderSourceTypeId(null) .totalPrice(totalPrice) .extraPrice(0) @@ -118,21 +119,27 @@ public class HardThirdSelfZyServiceImpl implements HardThirdSelfZyService { try { // 校验订单是否可以退款 HardOrderVo order = hardAfterSaleService.validateOrderCanRefund(dto.getOrderId()); + if (!ObjectUtil.equals(dto.getSerialNum(), order.getOrderNo())) { + throw new RuntimeException("正元订单号不匹配"); + } // 用户 UserInfo user = remoteUserService.getByUserId(order.getUserId()).getData(); if (ObjectUtil.isEmpty(user)) throw new RuntimeException("用户不存在"); // 添加售后订单 HardAfterSaleEntity saveObj = BeanUtils.toBean(dto, HardAfterSaleEntity.class); - String refundCode = "hard_" + order.getId(); + String refundCode = "zy_" + order.getId(); saveObj.setType(HardSaleTypeEnum.AFTER_SALE.getType()); saveObj.setStatus(HardSaleStatusEnum.COMPLETE.getStatus()); saveObj.setNo(refundCode); + saveObj.setWay("10"); saveObj.setOrderId(order.getId()); saveObj.setRefundPrice(order.getPayPrice()); saveObj.setUserId(order.getUserId()); saveObj.setAuditUserId(null); saveObj.setAuditTime(LocalDateTime.now()); - saveObj.setAuditReason("后台退款"); + saveObj.setApplyReason("正元api退款"); + saveObj.setAuditReason("正元api退款"); + saveObj.setApplyDescription("正元api退款"); hardAfterSaleService.save(saveObj); // 添加售后进度 HardAfterSaleLogEntity saveLogObj = HardAfterSaleLogEntity.builder() @@ -145,7 +152,7 @@ public class HardThirdSelfZyServiceImpl implements HardThirdSelfZyService { .build(); hardAfterSaleLogMapper.insert(saveLogObj); // 执行退款 - hardAfterSaleService.refund(saveObj.getId()); + hardAfterSaleService.refund(saveObj.getId(),"zy"); // 退库存 hardOrderService.fastenerInventory(order, YesNoEnum.NO); HardCallbackRefundVo result = new HardCallbackRefundVo(); diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardAfterSaleServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardAfterSaleServiceImpl.java index 4e3631129..a395f4255 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardAfterSaleServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardAfterSaleServiceImpl.java @@ -209,12 +209,19 @@ public class HardAfterSaleServiceImpl extends ServiceImpl walletRefundResult = walletRechargeService.refund(hardRefundDto); diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java index cc82de11b..68865c76d 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java @@ -351,8 +351,10 @@ public class HardOrderServiceImpl extends ServiceImpl + @@ -39,6 +40,7 @@ select a.id, + a.order_no, a.user_id, a.merchant_id, a.hard_id, @@ -194,13 +196,19 @@ COALESCE(COUNT(0), 0) AS totalNum, COALESCE(SUM(a.pay_price), 0) AS totalMoney, COALESCE(SUM(CASE WHEN YEAR(a.create_time) = YEAR(CURRENT_DATE()) THEN 1 ELSE 0 END), 0) AS totalNumYear, - COALESCE(SUM(CASE WHEN YEAR(a.create_time) = YEAR(CURRENT_DATE()) THEN a.pay_price ELSE 0 END), 0) AS totalMoneyYear, - COALESCE(SUM(CASE WHEN YEAR(a.create_time) = YEAR(CURRENT_DATE()) AND MONTH(a.create_time) = MONTH(CURRENT_DATE()) THEN 1 ELSE 0 END), 0) AS totalNumMonth, - COALESCE(SUM(CASE WHEN YEAR(a.create_time) = YEAR(CURRENT_DATE()) AND MONTH(a.create_time) = MONTH(CURRENT_DATE()) THEN a.pay_price ELSE 0 END), 0) AS totalMoneyMonth, - COALESCE(SUM(CASE WHEN YEAR(a.create_time) = YEAR(CURRENT_DATE()) AND MONTH(a.create_time) = MONTH(CURRENT_DATE()) AND DAY(a.create_time) = DAY(CURRENT_DATE()) THEN 1 ELSE 0 END), 0) AS totalNumDay, - COALESCE(SUM(CASE WHEN YEAR(a.create_time) = YEAR(CURRENT_DATE()) AND MONTH(a.create_time) = MONTH(CURRENT_DATE()) AND DAY(a.create_time) = DAY(CURRENT_DATE()) THEN a.pay_price ELSE 0 END), 0) AS totalMoneyDay + COALESCE(SUM(CASE WHEN YEAR(a.create_time) = YEAR(CURRENT_DATE()) THEN a.pay_price ELSE 0 END), 0) AS + totalMoneyYear, + COALESCE(SUM(CASE WHEN YEAR(a.create_time) = YEAR(CURRENT_DATE()) AND MONTH(a.create_time) = + MONTH(CURRENT_DATE()) THEN 1 ELSE 0 END), 0) AS totalNumMonth, + COALESCE(SUM(CASE WHEN YEAR(a.create_time) = YEAR(CURRENT_DATE()) AND MONTH(a.create_time) = + MONTH(CURRENT_DATE()) THEN a.pay_price ELSE 0 END), 0) AS totalMoneyMonth, + COALESCE(SUM(CASE WHEN YEAR(a.create_time) = YEAR(CURRENT_DATE()) AND MONTH(a.create_time) = + MONTH(CURRENT_DATE()) AND DAY(a.create_time) = DAY(CURRENT_DATE()) THEN 1 ELSE 0 END), 0) AS totalNumDay, + COALESCE(SUM(CASE WHEN YEAR(a.create_time) = YEAR(CURRENT_DATE()) AND MONTH(a.create_time) = + MONTH(CURRENT_DATE()) AND DAY(a.create_time) = DAY(CURRENT_DATE()) THEN a.pay_price ELSE 0 END), 0) AS + totalMoneyDay FROM - hard_order a + hard_order a a.del_flag = 0 diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/test/java/com/bsd/pjcloud/admin/ZyTest.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/test/java/com/bsd/pjcloud/admin/ZyTest.java index cbff8d7da..0fe520c1e 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/test/java/com/bsd/pjcloud/admin/ZyTest.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/test/java/com/bsd/pjcloud/admin/ZyTest.java @@ -98,8 +98,8 @@ public class ZyTest { @Test public void selfRefund() throws Exception { - String orderId = "1"; - String orderNo = "1"; + String orderId = "1897311229083856897"; + String orderNo = "01234567890123456789"; ZySelfGetTokenDto tokenParams = new ZySelfGetTokenDto(); tokenParams.setAppid(zyConfig.getSelfAppId()); diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletRechargeService.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletRechargeService.java index 21d538928..b10df01c7 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletRechargeService.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletRechargeService.java @@ -2,6 +2,7 @@ package com.bsd.pjcloud.wallet.api.feign; import com.bsd.pjcloud.common.core.constant.ServiceNameConstants; import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.feign.annotation.NoToken; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeRefundDto; import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeVo; import org.springframework.cloud.openfeign.FeignClient; @@ -17,6 +18,7 @@ public interface RemoteWalletRechargeService { * @param dto * @return */ + @NoToken @PostMapping("/wallet-recharge/refund") R refund(@RequestBody WalletRechargeRefundDto dto); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeController.java index 1d5d78028..78dec72b1 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeController.java @@ -44,6 +44,7 @@ public class WalletRechargeController { private final WalletRechargeService walletRechargeService; /* ************************************* start 远程调用 start ************************************* */ + @Inner @Operation(summary = "远程调用-退款", description = "远程调用-退款") @PostMapping("/refund") public R refund(@Valid @RequestBody WalletRechargeRefundDto dto) { From de3e27d81972be2b603e0a0ce6a775268f17fddc Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Thu, 6 Mar 2025 10:37:01 +0800 Subject: [PATCH 4/4] =?UTF-8?q?feat:bug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wallet/service/impl/thrid/WalletThirdZyServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/thrid/WalletThirdZyServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/thrid/WalletThirdZyServiceImpl.java index d04fcdeab..830c0bad6 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/thrid/WalletThirdZyServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/thrid/WalletThirdZyServiceImpl.java @@ -251,7 +251,7 @@ public class WalletThirdZyServiceImpl implements WalletThirdZyService { item.setCardAccNum(v.getId()); item.setCardSID(v.getCardNumber()); item.setCardStatus(getCardStatus(v.getStatus())); - item.setEPID(mch.getDeptId().toString()); + item.setEPID(user.getSysUser().getDeptId().toString()); item.setPerCode(v.getUserId().toString()); item.setAccClassID(roleId.toString()); item.setPhoneNo(v.getUserMobile());