diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java index aa9922f7f..91d48e57c 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardOrderService.java @@ -121,6 +121,8 @@ public interface HardOrderService extends IService { Integer computeExtraPrice(Integer price, MchManageVo mch, SysUser sysUser); + Integer computeExtraPriceV2(Integer totalPrice, Long mchId, String hourType, Long userId, Long userDeptId); + /** * 核销二维码 */ 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 246cf0248..a9f779af2 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 @@ -34,6 +34,7 @@ import com.bsd.pjcloud.hard.api.dto.order.*; import com.bsd.pjcloud.hard.api.dto.wechat.WechatRefundDto; import com.bsd.pjcloud.hard.api.entity.order.*; import com.bsd.pjcloud.hard.api.utils.HardUtil; +import com.bsd.pjcloud.hard.api.vo.manager.HardManagerVo; import com.bsd.pjcloud.hard.api.vo.order.HardAfterSaleVo; import com.bsd.pjcloud.hard.api.vo.order.HardCarVo; import com.bsd.pjcloud.hard.api.vo.order.HardOrderVo; @@ -46,6 +47,8 @@ import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper; import com.bsd.pjcloud.hard.service.*; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeRefundDto; import com.bsd.pjcloud.wallet.api.feign.RemoteWalletRechargeService; +import com.bsd.pjcloud.wallet.api.feign.RemoteWalletSettingService; +import com.bsd.pjcloud.wallet.api.vo.WalletXfjDiscounts; import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeVo; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -74,14 +77,16 @@ public class HardAfterSaleServiceImpl extends ServiceImpl order.getPayPrice()) { throw new RuntimeException("退款总金额大于支付总金额"); } + // 查询设备信息 + HardManagerVo hardDetail = hardManagerService.getByHardId(order.getHardId()); + if (ObjectUtil.isNotEmpty(hardDetail)) { + orderVo.setHardType(hardDetail.getType()); + } return orderVo; } @@ -559,6 +569,16 @@ public class HardAfterSaleServiceImpl extends ServiceImpl 0) { + int noRefundPrice = order.getPayPrice() - order.getExtraPrice() - refundPrice; + if (noRefundPrice >= 0) { + Integer noRefundExtraPrice = hardOrderService.computeExtraPriceV2(noRefundPrice, order.getMerchantId(), order.getHourType(), order.getUserId(), order.getUserDeptId()); + if (noRefundExtraPrice == 0) { + refundPrice += order.getExtraPrice(); + } + } + } } saveObj.setType(HardSaleTypeEnum.AFTER_SALE.getType()); 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 a4d9d331f..7dcfd8928 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 @@ -94,6 +94,7 @@ import com.bsd.pjcloud.wallet.api.utils.WalletDataUtil; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; import com.bsd.pjcloud.wallet.api.vo.WalletManageVo; import com.bsd.pjcloud.wallet.api.vo.WalletSettingVo; +import com.bsd.pjcloud.wallet.api.vo.WalletXfjDiscounts; import com.bsd.pjcloud.wallet.api.vo.act.ActCancelItemVo; import com.bsd.pjcloud.wallet.api.vo.act.ActComItemVo; import com.bsd.pjcloud.wallet.api.vo.mch.MchPickUpVo; @@ -301,7 +302,9 @@ public class HardOrderServiceImpl extends ServiceImpl discountsList = walletSettingService.remoteGetDiscountsList(String.valueOf(mchId), userId, userDeptId).getData(); + if (ObjectUtil.isEmpty(discountsList)) { + return 0; + } + return discountsList.stream() + .filter(item -> ObjectUtil.equals(item.getHourType(), String.valueOf(hourType))) + .map(item -> item.computedDiscountsExtraPrice(totalPrice)) + .reduce(Integer::sum).orElse(0); + } + @Override @Transactional(rollbackFor = Exception.class) public Boolean handCancelCode(HandCancelCodeDto dto) { diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayOrderBizTypeEnum.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayOrderBizTypeEnum.java new file mode 100644 index 000000000..3e53514a8 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayOrderBizTypeEnum.java @@ -0,0 +1,27 @@ +package com.bsd.pjcloud.thirdparty.constant.pay; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 第三方支付业务类型 + */ +@AllArgsConstructor +@Getter +public enum ThirdPayOrderBizTypeEnum { + + MINI_APP_WALLET_RECHARGE("10", "小程序用户钱包充值"), + ; + + private final String type; + private final String description; + + public static ThirdPayOrderBizTypeEnum 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-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayOrderStatusEnum.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayOrderStatusEnum.java new file mode 100644 index 000000000..85edf5fde --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/constant/pay/ThirdPayOrderStatusEnum.java @@ -0,0 +1,32 @@ +package com.bsd.pjcloud.thirdparty.constant.pay; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 第三方支付订单状态 + */ +@AllArgsConstructor +@Getter +public enum ThirdPayOrderStatusEnum { + PAY_UNPAID("10", "未支付"), + PAY_SUCCESS("20", "支付成功"), + PAY_FAILED("30", "已经支付"), + + REFUNDING("100", "退款中"), + REFUND_SUCCESS("200", "退款成功"), + REFUND_FAILED("300", "退款失败"), + ; + + private final String type; + private final String description; + + public static ThirdPayOrderStatusEnum 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-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/oathmini/ThirdMiniAppPayDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/oathmini/ThirdMiniAppPayDto.java index 266e9ed6e..57dcce412 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/oathmini/ThirdMiniAppPayDto.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/oathmini/ThirdMiniAppPayDto.java @@ -1,6 +1,7 @@ package com.bsd.pjcloud.thirdparty.dto.oathmini; import com.bsd.pjcloud.thirdparty.constant.miniplatform.MiniPlatformTypeEnum; +import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPayOrderBizTypeEnum; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.Data; @@ -8,6 +9,19 @@ import lombok.Data; @Data public class ThirdMiniAppPayDto { + /** + * 充值业务类型 + */ + @NotNull(message = "充值业务类型不能为空") + private ThirdPayOrderBizTypeEnum bizType; + + /** + * 充值业务id + */ + @NotEmpty(message = "充值业务id不能为空") + private String bizId; + + /** * 小程序平台 */ @@ -17,7 +31,6 @@ public class ThirdMiniAppPayDto { /** * 金额(分) */ - @NotNull(message = "金额(分)不能为空") private Integer amount; /** diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/oathmini/pay/wechat/ThirdMiniJsapiPayDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/oathmini/pay/wechat/ThirdMiniJsapiPayDto.java index 5493d3e77..9fd41f9ce 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/oathmini/pay/wechat/ThirdMiniJsapiPayDto.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/oathmini/pay/wechat/ThirdMiniJsapiPayDto.java @@ -1,5 +1,6 @@ package com.bsd.pjcloud.thirdparty.dto.oathmini.pay.wechat; +import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPayOrderBizTypeEnum; import lombok.Data; /** @@ -8,11 +9,26 @@ import lombok.Data; @Data public class ThirdMiniJsapiPayDto { + /** + * 充值业务类型 + */ + private ThirdPayOrderBizTypeEnum bizType; + + /** + * 充值业务id + */ + private String bizId; + /** * 商户订单号 */ private String outTradeNo; + /** + * 用户id + */ + private Long userId; + /** * 用户标识 */ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/ThirdPayOrderDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/ThirdPayOrderDto.java new file mode 100644 index 000000000..1d07f0edd --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/pay/ThirdPayOrderDto.java @@ -0,0 +1,9 @@ +package com.bsd.pjcloud.thirdparty.dto.pay; + +import com.bsd.pjcloud.thirdparty.entity.pay.ThirdPayOrderEntity; +import lombok.Data; + +@Data +public class ThirdPayOrderDto extends ThirdPayOrderEntity { + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/pay/ThirdPayOrderEntity.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/pay/ThirdPayOrderEntity.java new file mode 100755 index 000000000..11c27dbd4 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/entity/pay/ThirdPayOrderEntity.java @@ -0,0 +1,155 @@ +package com.bsd.pjcloud.thirdparty.entity.pay; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.bsd.pjcloud.common.core.util.TenantTable; + +import java.time.LocalDateTime; + +/** + * 第三方支付订单 + */ +@Data +@TenantTable +@TableName("third_pay_order") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "第三方支付订单") +public class ThirdPayOrderEntity extends Model { + + + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private Long id; + + /** + * 支付平台类型 + */ + @Schema(description = "支付平台类型") + private String payPlatformType; + + /** + * 支付类型 + */ + @Schema(description = "支付类型") + private String bizType; + + /** + * 支付相关id + */ + @Schema(description = "支付相关id") + private String bizId; + + /** + * 用户id + */ + @Schema(description = "用户id") + private Long userId; + + /** + * 用户code + */ + @Schema(description = "用户code") + private String userCode; + + /** + * 支付金额(分) + */ + @Schema(description = "支付金额(分)") + private Integer price; + + /** + * 支付状态 + */ + @Schema(description = "支付状态") + private String status; + + /** + * 支付订单号 + */ + @Schema(description = "支付订单号") + private String payNo; + + /** + * 支付时间 + */ + @Schema(description = "支付时间") + private LocalDateTime payTime; + + /** + * 支付返回 + */ + @Schema(description = "支付返回") + private String payRes; + + /** + * 退款订单号 + */ + @Schema(description = "退款订单号") + private String refundNo; + + /** + * 退款时间 + */ + @Schema(description = "退款时间") + private LocalDateTime refundTime; + + /** + * 退款返回 + */ + @Schema(description = "退款返回") + private String refundRes; + + /** + * 订单过期时间 + */ + @Schema(description = "订单过期时间") + private LocalDateTime expireTime; + + /** + * 创建人 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** + * 更新人 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "更新人") + private String updateBy; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "更新时间") + private LocalDateTime updateTime; + + /** + * 删除时间 + */ + @TableLogic + @TableField(fill = FieldFill.INSERT) + @Schema(description = "删除时间") + private String delFlag; + + /** + * tenantId + */ + @Schema(description = "tenantId") + private Long tenantId; +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/oathmini/pay/ThirdMiniAppPayVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/oathmini/pay/ThirdMiniAppPayVo.java new file mode 100644 index 000000000..2bb4a09e0 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/oathmini/pay/ThirdMiniAppPayVo.java @@ -0,0 +1,12 @@ +package com.bsd.pjcloud.thirdparty.vo.oathmini.pay; + +import lombok.Data; + +import java.util.HashMap; + +@Data +public class ThirdMiniAppPayVo { + + private HashMap miniAppPayParams; + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/oathmini/pay/wechat/ThirdMiniJsapiPayVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/oathmini/pay/wechat/ThirdMiniJsapiPayVo.java index 5260fe2d7..15da50334 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/oathmini/pay/wechat/ThirdMiniJsapiPayVo.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/oathmini/pay/wechat/ThirdMiniJsapiPayVo.java @@ -3,6 +3,8 @@ package com.bsd.pjcloud.thirdparty.vo.oathmini.pay.wechat; import cn.hutool.core.util.ObjectUtil; import lombok.Data; +import java.util.HashMap; + /** * JSAPI/小程序下单 */ @@ -37,6 +39,8 @@ public class ThirdMiniJsapiPayVo { private String code_url; + private HashMap miniAppPayParams; + public boolean isHttpSucess() { return ObjectUtil.equals(ThirdMiniWechatQueryVo.SUCCESS, return_code); } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/ThirdPayOrderVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/ThirdPayOrderVo.java new file mode 100644 index 000000000..03d19582e --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/pay/ThirdPayOrderVo.java @@ -0,0 +1,9 @@ +package com.bsd.pjcloud.thirdparty.vo.pay; + +import com.bsd.pjcloud.thirdparty.entity.pay.ThirdPayOrderEntity; +import lombok.Data; + +@Data +public class ThirdPayOrderVo extends ThirdPayOrderEntity { + +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-02/debug.2025-02-28.0.log.gz b/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-02/debug.2025-02-28.0.log.gz new file mode 100644 index 000000000..116bad11d Binary files /dev/null and b/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-02/debug.2025-02-28.0.log.gz differ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-03/debug.2025-03-03.0.log.gz b/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-03/debug.2025-03-03.0.log.gz new file mode 100644 index 000000000..697b20ce1 Binary files /dev/null and b/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-03/debug.2025-03-03.0.log.gz differ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-03/debug.2025-03-04.0.log.gz b/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-03/debug.2025-03-04.0.log.gz new file mode 100644 index 000000000..6a3d6249b Binary files /dev/null and b/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-03/debug.2025-03-04.0.log.gz differ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-05/debug.2025-05-29.0.log.gz b/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-05/debug.2025-05-29.0.log.gz new file mode 100644 index 000000000..94b6ae0e2 Binary files /dev/null and b/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-05/debug.2025-05-29.0.log.gz differ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-05/debug.2025-05-30.0.log.gz b/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-05/debug.2025-05-30.0.log.gz new file mode 100644 index 000000000..c30a7dcb3 Binary files /dev/null and b/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-05/debug.2025-05-30.0.log.gz differ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-06/debug.2025-06-11.0.log.gz b/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-06/debug.2025-06-11.0.log.gz new file mode 100644 index 000000000..2442a689c Binary files /dev/null and b/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-06/debug.2025-06-11.0.log.gz differ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-06/debug.2025-06-18.0.log.gz b/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-06/debug.2025-06-18.0.log.gz new file mode 100644 index 000000000..88808efcf Binary files /dev/null and b/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-06/debug.2025-06-18.0.log.gz differ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-06/debug.2025-06-24.0.log.gz b/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-06/debug.2025-06-24.0.log.gz new file mode 100644 index 000000000..77d9b487e Binary files /dev/null and b/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-06/debug.2025-06-24.0.log.gz differ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-06/debug.2025-06-25.0.log.gz b/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-06/debug.2025-06-25.0.log.gz new file mode 100644 index 000000000..6e23770b2 Binary files /dev/null and b/pjcloud-thirdparty/pjcloud-thirdparty-biz/logs/pjcloud-thirdparty-biz/2025-06/debug.2025-06-25.0.log.gz differ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/MiniAppConfig.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/MiniAppConfig.java index ca47b038b..b29dceac7 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/MiniAppConfig.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/MiniAppConfig.java @@ -46,6 +46,11 @@ public class MiniAppConfig { */ private String apiV2Key; + /** + * 支付成功的回调 + */ + private String payCallbackUrl; + /** * 退款回调地址 */ diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/mini/ThirdMinAppPayCotroller.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/mini/ThirdMinAppPayCotroller.java index ba4109b92..9cb3ad44c 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/mini/ThirdMinAppPayCotroller.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/mini/ThirdMinAppPayCotroller.java @@ -7,15 +7,17 @@ import com.bsd.pjcloud.common.security.util.SecurityUtils; import com.bsd.pjcloud.thirdparty.dto.oathmini.ThirdMiniAppPayDto; import com.bsd.pjcloud.thirdparty.service.ThirdMiniAppService; import com.bsd.pjcloud.thirdparty.vo.oathmini.ThirdMinAppOAth2LoginVo; +import com.bsd.pjcloud.thirdparty.vo.oathmini.pay.ThirdMiniAppPayVo; 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.HttpEntity; import org.springframework.http.HttpHeaders; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Map; @RestController @RequiredArgsConstructor @@ -28,10 +30,25 @@ public class ThirdMinAppPayCotroller { @Operation(summary = "小程序支付") @PostMapping("/app/pay") - @Inner(value = false) - public R miniPay(@RequestBody ThirdMiniAppPayDto dto) { + public R miniPay(@Validated @RequestBody ThirdMiniAppPayDto dto) { PjcloudUser user = SecurityUtils.getUser(); return R.ok(thirdMiniAppService.miniPay(user.getId(), dto)); } + @Operation(summary = "小程序支付回调") + @PostMapping("/app/pay-callback") + @Inner(value = false) + public R miniPayCallback(HttpEntity httpEntity, @RequestHeader Map headers) { + String body = httpEntity.getBody(); + return R.ok(thirdMiniAppService.miniPayCallback(body, headers)); + } + + @Operation(summary = "小程序退款回调") + @PostMapping("/app/refund-callback") + @Inner(value = false) + public R miniRefundCallback(HttpEntity httpEntity, @RequestHeader Map headers) { + String body = httpEntity.getBody(); + return R.ok(thirdMiniAppService.miniRefundCallback(body, headers)); + } + } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdPayOrderController.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdPayOrderController.java new file mode 100755 index 000000000..b161a271b --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/pay/ThirdPayOrderController.java @@ -0,0 +1,100 @@ +package com.bsd.pjcloud.thirdparty.controller.pay; + +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.thirdparty.dto.pay.ThirdPayOrderDto; +import com.bsd.pjcloud.thirdparty.entity.pay.ThirdPayOrderEntity; +import com.bsd.pjcloud.thirdparty.service.ThirdPayOrderService; +import com.bsd.pjcloud.thirdparty.vo.pay.ThirdPayOrderVo; +import org.springframework.security.access.prepost.PreAuthorize; +import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import org.springdoc.core.annotations.ParameterObject; +import org.springframework.http.HttpHeaders; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 第三方支付订单 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/third-pay-order") +@Tag(description = "third-pay-order", name = "第三方支付订单管理") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class ThirdPayOrderController { + + private final ThirdPayOrderService thirdPayOrderService; + + /** + * 分页查询 + */ + @Operation(summary = "分页查询", description = "分页查询") + @GetMapping("/page") + @PreAuthorize("@pms.hasPermission('third_thirdPayOrder_view')") + public R> getThirdPayOrderPage(@ParameterObject Page page, @ParameterObject ThirdPayOrderDto dto) { + return R.ok(thirdPayOrderService.scopePage(page, dto, null)); + } + + /** + * 通过id查询第三方支付订单 + */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/{id}") + @PreAuthorize("@pms.hasPermission('third_thirdPayOrder_view')") + public R getById(@PathVariable("id") Long id) { + return R.ok(thirdPayOrderService.getById(id)); + } + + /** + * 新增第三方支付订单 + */ + @Operation(summary = "新增第三方支付订单", description = "新增第三方支付订单") + @SysLog("新增第三方支付订单") + @PostMapping + @PreAuthorize("@pms.hasPermission('third_thirdPayOrder_add')") + public R save(@RequestBody ThirdPayOrderEntity thirdPayOrder) { + return R.ok(thirdPayOrderService.save(thirdPayOrder)); + } + + /** + * 修改第三方支付订单 + */ + @Operation(summary = "修改第三方支付订单", description = "修改第三方支付订单") + @SysLog("修改第三方支付订单") + @PutMapping + @PreAuthorize("@pms.hasPermission('third_thirdPayOrder_edit')") + public R updateById(@RequestBody ThirdPayOrderEntity thirdPayOrder) { + return R.ok(thirdPayOrderService.updateById(thirdPayOrder)); + } + + /** + * 通过id删除第三方支付订单 + */ + @Operation(summary = "通过id删除第三方支付订单", description = "通过id删除第三方支付订单") + @SysLog("通过id删除第三方支付订单") + @DeleteMapping + @PreAuthorize("@pms.hasPermission('third_thirdPayOrder_del')") + public R removeById(@RequestBody Long[] ids) { + return R.ok(thirdPayOrderService.removeBatchByIds(CollUtil.toList(ids))); + } + + /** + * 导出excel 表格 + */ + @ResponseExcel + @GetMapping("/export") + @PreAuthorize("@pms.hasPermission('third_thirdPayOrder_export')") + public List export(ThirdPayOrderEntity thirdPayOrder, Long[] ids) { + return thirdPayOrderService.list(Wrappers.lambdaQuery(thirdPayOrder).in(ArrayUtil.isNotEmpty(ids), ThirdPayOrderEntity::getId, ids)); + } + +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/pay/ThirdPayOrderMapper.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/pay/ThirdPayOrderMapper.java new file mode 100755 index 000000000..ab280c5e4 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/pay/ThirdPayOrderMapper.java @@ -0,0 +1,17 @@ +package com.bsd.pjcloud.thirdparty.mapper.pay; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.thirdparty.dto.pay.ThirdPayOrderDto; +import com.bsd.pjcloud.thirdparty.entity.pay.ThirdPayOrderEntity; +import com.bsd.pjcloud.thirdparty.vo.pay.ThirdPayOrderVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +@Mapper +public interface ThirdPayOrderMapper extends PjcloudBaseMapper { + + Page scopePage(Page page, @Param("dto") ThirdPayOrderDto dto, DataScope dataScope); + +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdMiniAppService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdMiniAppService.java index d374deb99..c2887ecc9 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdMiniAppService.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdMiniAppService.java @@ -4,6 +4,9 @@ import com.bsd.pjcloud.thirdparty.dto.oathmini.ThirdMiniAppGetUniqueDto; import com.bsd.pjcloud.thirdparty.dto.oathmini.ThirdMiniAppOAth2LoginDto; import com.bsd.pjcloud.thirdparty.dto.oathmini.ThirdMiniAppPayDto; import com.bsd.pjcloud.thirdparty.vo.oathmini.ThirdMinAppOAth2LoginVo; +import com.bsd.pjcloud.thirdparty.vo.oathmini.pay.ThirdMiniAppPayVo; + +import java.util.Map; public interface ThirdMiniAppService { @@ -20,5 +23,15 @@ public interface ThirdMiniAppService { /** * 小程序支付 */ - String miniPay(Long userId, ThirdMiniAppPayDto dto); + ThirdMiniAppPayVo miniPay(Long userId, ThirdMiniAppPayDto dto); + + /** + * 小程序支付回调 + */ + String miniPayCallback(String body, Map headers); + + /** + * 小程序退款回调 + */ + String miniRefundCallback(String body, Map headers); } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPayOrderService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPayOrderService.java new file mode 100755 index 000000000..e32d92e9e --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPayOrderService.java @@ -0,0 +1,14 @@ +package com.bsd.pjcloud.thirdparty.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.thirdparty.dto.pay.ThirdPayOrderDto; +import com.bsd.pjcloud.thirdparty.entity.pay.ThirdPayOrderEntity; +import com.bsd.pjcloud.thirdparty.vo.pay.ThirdPayOrderVo; + +public interface ThirdPayOrderService extends IService { + + Page scopePage(Page page, ThirdPayOrderDto dto, DataScope dataScope); + +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/miniapp/ThirdMiniAppServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/miniapp/ThirdMiniAppServiceImpl.java index 086ef65c8..3ed3ab022 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/miniapp/ThirdMiniAppServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/miniapp/ThirdMiniAppServiceImpl.java @@ -2,6 +2,7 @@ package com.bsd.pjcloud.thirdparty.service.impl.miniapp; import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; import com.bsd.pjcloud.admin.api.dto.UserInfo; import com.bsd.pjcloud.admin.api.dto.UserTokenDTO; import com.bsd.pjcloud.admin.api.feign.RemoteTokenService; @@ -12,6 +13,7 @@ import com.bsd.pjcloud.app.api.dto.AppUserInfo; import com.bsd.pjcloud.app.api.feign.RemoteAppUserService; import com.bsd.pjcloud.thirdparty.constant.miniplatform.MiniPlatformLoginErrorEnum; import com.bsd.pjcloud.thirdparty.constant.miniplatform.MiniPlatformTypeEnum; +import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPayOrderBizTypeEnum; import com.bsd.pjcloud.thirdparty.dto.oathmini.ThirdMiniAppGetUniqueDto; import com.bsd.pjcloud.thirdparty.dto.oathmini.ThirdMiniAppOAth2LoginDto; import com.bsd.pjcloud.thirdparty.dto.oathmini.ThirdMiniAppPayDto; @@ -22,13 +24,19 @@ import com.bsd.pjcloud.thirdparty.service.ThirdMiniAppService; import com.bsd.pjcloud.thirdparty.service.ThirdMiniAppWechatService; import com.bsd.pjcloud.thirdparty.service.ThirdPayLogService; import com.bsd.pjcloud.thirdparty.vo.oathmini.ThirdMinAppOAth2LoginVo; +import com.bsd.pjcloud.thirdparty.vo.oathmini.pay.ThirdMiniAppPayVo; import com.bsd.pjcloud.thirdparty.vo.oathmini.pay.wechat.ThirdMiniJsapiPayVo; +import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargePackageEntity; +import com.bsd.pjcloud.wallet.api.feign.RemoteWalletRechargePackageService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import javax.net.ssl.*; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; import java.util.Map; /** @@ -47,6 +55,7 @@ public class ThirdMiniAppServiceImpl implements ThirdMiniAppService { private final RemoteUserService remoteUserService; private final RemoteTokenService remoteTokenService; private final RemoteAppUserService remoteAppUserService; + private final RemoteWalletRechargePackageService remoteWalletRechargePackageService; /** * 小程序登录 @@ -122,26 +131,77 @@ public class ThirdMiniAppServiceImpl implements ThirdMiniAppService { * 小程序支付 */ @Override - public String miniPay(Long userId, ThirdMiniAppPayDto dto) { - ThirdPayLogEntity log = new ThirdPayLogEntity(); + public ThirdMiniAppPayVo miniPay(Long userId, ThirdMiniAppPayDto dto) { + ThirdMiniAppPayVo result = new ThirdMiniAppPayVo(); + + if (ObjectUtil.equals(dto.getBizType(), ThirdPayOrderBizTypeEnum.MINI_APP_WALLET_RECHARGE)) { + Long bizId = null; + try { + bizId = Long.valueOf(dto.getBizId()); + } catch (Exception e) { + throw new RuntimeException("充值业务id解析错误"); + } + // 查询充值配置 + WalletRechargePackageEntity walletPackage = remoteWalletRechargePackageService.remoteGetById(bizId).getData(); + if (ObjectUtil.isEmpty(walletPackage)) { + throw new RuntimeException("错误的充值配置"); + } + int price = walletPackage.getPayPrice() + walletPackage.getBonusPrice(); + if (price <= 0) { + throw new RuntimeException("错误的充值配置"); + } + dto.setAmount(price); + } + // 不支持的类型 + else { + throw new RuntimeException("不支持的支付类型"); + } try { // 微信小程序 if (ObjectUtil.equals(dto.getMiniPlatformType().getType(), MiniPlatformTypeEnum.WECHAT.getType())) { ThirdMiniJsapiPayDto wechatPayDto = new ThirdMiniJsapiPayDto(); - wechatPayDto.setOutTradeNo(""); + // 当前时间戳+10位随机字符串 + String outTradeNo = LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() + RandomUtil.randomString(10); + wechatPayDto.setOutTradeNo(outTradeNo); + wechatPayDto.setBizId(dto.getBizId()); + wechatPayDto.setBizType(dto.getBizType()); + wechatPayDto.setUserId(userId); wechatPayDto.setOpenid(dto.getOpenId()); wechatPayDto.setAmount(dto.getAmount()); ThirdMiniJsapiPayVo thirdMiniJsapiPayVo = thirdMiniAppWechatService.jsapiPay(wechatPayDto); + if (ObjectUtil.isEmpty(thirdMiniJsapiPayVo)) { + throw new RuntimeException("创建微信支付错误"); + } + result.setMiniAppPayParams(thirdMiniJsapiPayVo.getMiniAppPayParams()); } // 支付宝 else if (ObjectUtil.equals(dto.getMiniPlatformType().getType(), MiniPlatformTypeEnum.ALI_PAY.getType())) { } + // 不支持的支付类型 + else { + throw new RuntimeException("不支持的支付类型"); + } } catch (Exception e) { - } finally { - thirdPayLogService.save(log); } + return result; + } + + + /** + * 小程序支付回调 + */ + @Override + public String miniPayCallback(String body, Map headers) { + return ""; + } + + /** + * 小程序退款回调 + */ + @Override + public String miniRefundCallback(String body, Map headers) { return ""; } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/miniapp/ThirdMiniAppWechatServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/miniapp/ThirdMiniAppWechatServiceImpl.java index 01290c199..13b0a5daa 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/miniapp/ThirdMiniAppWechatServiceImpl.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/miniapp/ThirdMiniAppWechatServiceImpl.java @@ -9,8 +9,12 @@ import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.XmlUtil; import cn.hutool.json.JSONUtil; import com.bsd.pjcloud.thirdparty.config.MiniAppConfig; +import com.bsd.pjcloud.thirdparty.constant.miniplatform.MiniPlatformTypeEnum; +import com.bsd.pjcloud.thirdparty.constant.pay.ThirdPayOrderStatusEnum; import com.bsd.pjcloud.thirdparty.dto.oathmini.pay.wechat.*; +import com.bsd.pjcloud.thirdparty.entity.pay.ThirdPayOrderEntity; import com.bsd.pjcloud.thirdparty.service.ThirdMiniAppWechatService; +import com.bsd.pjcloud.thirdparty.service.ThirdPayOrderService; import com.bsd.pjcloud.thirdparty.utils.miniapp.pay.wechat.ThirdMiniWechantPayConstant; import com.bsd.pjcloud.thirdparty.vo.oathmini.pay.wechat.*; import lombok.RequiredArgsConstructor; @@ -27,6 +31,7 @@ import java.io.FileInputStream; import java.nio.charset.StandardCharsets; import java.security.KeyStore; import java.security.SecureRandom; +import java.time.LocalDateTime; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; @@ -45,6 +50,7 @@ public class ThirdMiniAppWechatServiceImpl implements ThirdMiniAppWechatService private final MiniAppConfig miniAppConfig; private final WxMaService wxMaService; + private final ThirdPayOrderService thirdPayOrderService; /** @@ -53,6 +59,15 @@ public class ThirdMiniAppWechatServiceImpl implements ThirdMiniAppWechatService @Override public ThirdMiniJsapiPayVo jsapiPay(ThirdMiniJsapiPayDto dto) { MiniAppConfig.WechatConfig wechatConfig = miniAppConfig.getWechatConfig(); + + ThirdPayOrderEntity payOrder = new ThirdPayOrderEntity(); + payOrder.setPayPlatformType(MiniPlatformTypeEnum.WECHAT.getType()); + payOrder.setBizId(dto.getBizId()); + payOrder.setBizType(dto.getBizType().getType()); + payOrder.setUserId(dto.getUserId()); + payOrder.setUserCode(dto.getOpenid()); + payOrder.setPrice(dto.getAmount()); + payOrder.setStatus(ThirdPayOrderStatusEnum.PAY_UNPAID.getType()); try { Map params = new HashMap<>(); // 公众账号ID @@ -93,10 +108,35 @@ public class ThirdMiniAppWechatServiceImpl implements ThirdMiniAppWechatService if (!vo.isHttpSucess()) { return null; } + payOrder.setPayTime(LocalDateTime.now()); + payOrder.setPayRes(res); + // 生成小程序 paySign + String nonceStr = RandomUtil.randomString(32); + long timeStamp = System.currentTimeMillis() / 1000; + String payPackage = "prepay_id=" + vo.getPrepay_id(); + String signType = "MD5"; + + String payStr = "appId=" + wechatConfig.getAppId() + "&"; + payStr += "nonceStr=" + nonceStr + "&"; + payStr += "package=" + payPackage + "&"; + payStr += "signType=" + signType + "&"; + payStr += "timeStamp=" + timeStamp + "&"; + payStr += "key=" + wechatConfig.getApiV2Key(); + String paySign = DigestUtils.md5Hex(payStr); + + HashMap miniAppPayParams = new HashMap<>(); + miniAppPayParams.put("timeStamp", timeStamp); + miniAppPayParams.put("nonceStr", nonceStr); + miniAppPayParams.put("package", payPackage); + miniAppPayParams.put("signType", signType); + miniAppPayParams.put("paySign", paySign); + vo.setMiniAppPayParams(miniAppPayParams); return vo; } catch (Exception e) { log.error("|{}|JSAPI/小程序下单,异常", TAG, e); return null; + } finally { + thirdPayOrderService.save(payOrder); } } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdPayOrderServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdPayOrderServiceImpl.java new file mode 100755 index 000000000..b94a9a03d --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/pay/ThirdPayOrderServiceImpl.java @@ -0,0 +1,24 @@ +package com.bsd.pjcloud.thirdparty.service.impl.pay; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.thirdparty.dto.pay.ThirdPayOrderDto; +import com.bsd.pjcloud.thirdparty.entity.pay.ThirdPayOrderEntity; +import com.bsd.pjcloud.thirdparty.mapper.pay.ThirdPayOrderMapper; +import com.bsd.pjcloud.thirdparty.service.ThirdPayOrderService; +import com.bsd.pjcloud.thirdparty.vo.pay.ThirdPayOrderVo; +import org.springframework.stereotype.Service; + +/** + * 第三方支付订单 + */ +@Service +public class ThirdPayOrderServiceImpl extends ServiceImpl implements ThirdPayOrderService { + + @Override + public Page scopePage(Page page, ThirdPayOrderDto dto, DataScope dataScope) { + return baseMapper.scopePage(page, dto, dataScope); + } + +} \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml index 12bb2ca8c..a1250c208 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml @@ -181,8 +181,9 @@ mini-platform: app-secret: a6b0d036b229117595687a7c1705d332 merchant-id: 1106210589 api-v2-key: qr0w9WkAu6GG3uuxPjDT7bcdIVoBr0rw - merchant-serial-path: /Users/dengzhangchen/Desktop/backups/pay/cert/apiclient_cert.p12 - refund-callback-url: https://rj4jv5rwqs.by.takin.cc/hard/hard-wechant-pay/callback/refund + merchant-serial-path: /Users/dengzhangchen/Desktop/backups/pay/third_cert/apiclient_cert.p12 + pay-callback-url: https://rj4jv5rwqs.by.takin.cc/third/third-mini-app-pay/app/pay-callback + refund-callback-url: https://rj4jv5rwqs.by.takin.cc/hard/hard-wechant-pay/app/refund-callback spbill-create-ip: 59.202.170.152 base-url: https://api.mch.weixin.qq.com ali-pay-config: diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdPayOrderMapper.xml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdPayOrderMapper.xml new file mode 100755 index 000000000..ffe43be79 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/mapper/ThirdPayOrderMapper.xml @@ -0,0 +1,46 @@ + + + + + + + select a.id, + a.pay_platform_type, + a.biz_type, + a.biz_id, + a.user_id, + a.user_code, + a.price, + a.status, + a.pay_no, + a.pay_time, + a.pay_res, + a.refund_no, + a.refund_time, + a.refund_res, + a.expire_time, + a.create_time, + a.update_time, + a.create_by, + a.update_by, + a.del_flag, + a.tenant_id + + + + a.del_flag = '0' + + + + + + + + \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletXfjDiscountsEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletXfjDiscountsEnum.java new file mode 100644 index 000000000..fd5a700ab --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletXfjDiscountsEnum.java @@ -0,0 +1,34 @@ +package com.bsd.pjcloud.wallet.api.constant; + +import cn.hutool.core.util.ObjectUtil; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * 钱包的unique code + */ +@Getter +@AllArgsConstructor +public enum WalletXfjDiscountsEnum { + + JZ_DISCOUNT("1", "9折优惠"), + ; + + private final String code; + + private final String desc; + + public static WalletXfjDiscountsEnum valueOfByCode(String code) { + if (ObjectUtil.isEmpty(code)) return null; + return Arrays.stream(values()).filter(v -> ObjectUtil.equals(code, v.getCode())).findFirst().get(); + } + + public static WalletXfjDiscountsEnum descOf(String description) { + return Arrays.stream(WalletXfjDiscountsEnum.values()) + .filter(v -> ObjectUtil.equal(v.getDesc(), description)) + .findFirst().get(); + } + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletSettingEntity.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletSettingEntity.java index 4148c909e..dbc167fcf 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletSettingEntity.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/entity/WalletSettingEntity.java @@ -4,8 +4,7 @@ import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.extension.activerecord.Model; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; +import lombok.*; import com.bsd.pjcloud.common.core.util.TenantTable; import java.math.BigDecimal; @@ -20,7 +19,7 @@ import java.util.List; */ @Data @TenantTable -@TableName("wallet_setting") +@TableName(value = "wallet_setting", autoResultMap = true) @EqualsAndHashCode(callSuper = true) @Schema(description = "支付设置") public class WalletSettingEntity extends Model { @@ -91,6 +90,36 @@ public class WalletSettingEntity extends Model { */ private Long topupUserId; + /** + * 在编消默认费机优惠规则 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List zbDefaultXfjDiscounts; + + /** + * 在编消特殊费机优惠规则 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List zbSpecialXfjDiscounts; + + /** + * 非在编消默认费机优惠规则 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List fzbDefaultXfjDiscounts; + + /** + * 非在编消特殊费机优惠规则 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List fzbSpecialXfjDiscounts; + + /** + * 特殊消费机列表 + */ + @TableField(typeHandler = JacksonTypeHandler.class) + private List specialXfjIdList; + /** * 创建人 */ @@ -132,4 +161,41 @@ public class WalletSettingEntity extends Model { */ @Schema(description = "租户ID") private Long tenantId; + + /** + * 消费机优惠规则 + */ + @Data + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class WalletXfjDiscounts { + + /** + * 时间类型 + */ + private String hourType; + + /** + * 基础金额(分),超过了这个基数`extraPer`就生效 + */ + private int basePrice; + + /** + * 额外多收的百分比(1.5,10块就是15块) + */ + private double extraPer; + + /** + * 特色菜是否额外收费 + */ + private String specialDishEnable; + + /** + * 是否开启 + */ + private String enable; + + } + } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletRechargePackageService.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletRechargePackageService.java new file mode 100644 index 000000000..1a6ca9eaf --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletRechargePackageService.java @@ -0,0 +1,16 @@ +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.wallet.api.entity.recharge.WalletRechargePackageEntity; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +@FeignClient(contextId = "remoteWalletRechargePackageService", value = ServiceNameConstants.WALLET_SERVICE) +public interface RemoteWalletRechargePackageService { + + @GetMapping("/wallet-recharge-package/remote/{id}") + R remoteGetById(@PathVariable("id") Long id); + +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletSettingService.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletSettingService.java index 33fc2c898..8c3e09189 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletSettingService.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/feign/RemoteWalletSettingService.java @@ -4,17 +4,23 @@ 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.vo.WalletSettingVo; +import com.bsd.pjcloud.wallet.api.vo.WalletXfjDiscounts; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; @FeignClient(contextId = "remoteWalletSettingService", value = ServiceNameConstants.WALLET_SERVICE) public interface RemoteWalletSettingService { /** * 获取支付配置 - * - * @return */ @NoToken @GetMapping("/wallet-setting/get-setting") R get(); + + @NoToken + @GetMapping("/wallet-setting/remote/get-discounts-list") + R> remoteGetDiscountsList(@RequestParam String hardId, @RequestParam Long userId, @RequestParam(required = false) Long userDeptId); } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletXfjDiscounts.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletXfjDiscounts.java new file mode 100644 index 000000000..6cb983fe9 --- /dev/null +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/WalletXfjDiscounts.java @@ -0,0 +1,52 @@ +package com.bsd.pjcloud.wallet.api.vo; + +import cn.hutool.core.util.ObjectUtil; +import com.bsd.pjcloud.wallet.api.constant.WalletXfjDiscountsEnum; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 消费机优惠 + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class WalletXfjDiscounts { + + /** + * 消费机优惠活动名称 + */ + private String name; + + /** + * 用餐时间段类型 + */ + private String hourType; + + /** + * 消费机优惠活动名称 + * + * @see WalletXfjDiscountsEnum + */ + private String type; + + /** + * 基础金额(分),超过了这个基数`extraPer`就生效 + */ + private int basePrice; + + /** + * 消费机优惠活动名称 + */ + private Double extraPer; + + public int computedDiscountsExtraPrice(int totalPrice) { + if (totalPrice <= basePrice) return 0; + double rate = ObjectUtil.isEmpty(extraPer) ? 1.0 : extraPer; + if (rate == 1.0) return 0; + return (int) Math.round(totalPrice * (rate - 1)); + } +} diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports b/pjcloud-wallet/pjcloud-wallet-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports index d05cc336d..d98cea5d5 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports @@ -6,6 +6,7 @@ com.bsd.pjcloud.wallet.api.feign.RemoteCodeUseService com.bsd.pjcloud.wallet.api.feign.RemoteWalletRechargeService com.bsd.pjcloud.wallet.api.feign.RemoteWalletRuleTransactionService com.bsd.pjcloud.wallet.api.feign.RemoteMchService +com.bsd.pjcloud.wallet.api.feign.RemoteWalletRechargePackageService com.bsd.pjcloud.wallet.api.feign.RemoteWalletSettingService com.bsd.pjcloud.wallet.api.feign.RemoteWalletThirdZyService com.bsd.pjcloud.wallet.api.feign.RemoteWalletTransactionService diff --git a/pjcloud-wallet/pjcloud-wallet-biz/logs/pjcloud-wallet-biz/2025-06/debug.2025-06-05.0.log.gz b/pjcloud-wallet/pjcloud-wallet-biz/logs/pjcloud-wallet-biz/2025-06/debug.2025-06-05.0.log.gz new file mode 100644 index 000000000..f3b11e8d3 Binary files /dev/null and b/pjcloud-wallet/pjcloud-wallet-biz/logs/pjcloud-wallet-biz/2025-06/debug.2025-06-05.0.log.gz differ diff --git a/pjcloud-wallet/pjcloud-wallet-biz/logs/pjcloud-wallet-biz/2025-06/debug.2025-06-06.0.log.gz b/pjcloud-wallet/pjcloud-wallet-biz/logs/pjcloud-wallet-biz/2025-06/debug.2025-06-06.0.log.gz new file mode 100644 index 000000000..113f52a63 Binary files /dev/null and b/pjcloud-wallet/pjcloud-wallet-biz/logs/pjcloud-wallet-biz/2025-06/debug.2025-06-06.0.log.gz differ diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletSettingController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletSettingController.java index abe089500..dba38ef99 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletSettingController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/WalletSettingController.java @@ -5,6 +5,7 @@ import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.annotation.Inner; import com.bsd.pjcloud.wallet.api.dto.WalletSettingDto; import com.bsd.pjcloud.wallet.api.vo.WalletSettingVo; +import com.bsd.pjcloud.wallet.api.vo.WalletXfjDiscounts; import com.bsd.pjcloud.wallet.service.WalletSettingService; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import org.springframework.http.HttpHeaders; @@ -14,6 +15,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; +import java.util.List; + /** * 支付设置 * @@ -30,11 +33,19 @@ public class WalletSettingController { private final WalletSettingService walletSettingService; /* ************************************* start 远程调用 start ************************************* */ + @Inner @GetMapping("/get-setting") public R get() { return R.ok(walletSettingService.getSetting()); } + + @Inner + @GetMapping("/remote/get-discounts-list") + public R> remoteGetDiscountsList(@RequestParam String hardId, @RequestParam Long userId) { + return R.ok(walletSettingService.androidGetDiscountsList(hardId, userId)); + } + /* ************************************* end 远程调用 end ************************************* */ /* ************************************* start app start ************************************* */ @@ -45,6 +56,11 @@ public class WalletSettingController { /* ************************************* end app end ************************************* */ /* ************************************* start android start ************************************* */ + @GetMapping("/ad/get-discounts-list") + public R> androidGetDiscountsList(@RequestParam String hardId, @RequestParam Long userId) { + return R.ok(walletSettingService.androidGetDiscountsList(hardId, userId)); + } + @GetMapping("/ad/get-setting") public R androidGet() { return R.ok(walletSettingService.getSetting()); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargePackageController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargePackageController.java index ce59a3604..94dfe8a03 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargePackageController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargePackageController.java @@ -37,6 +37,14 @@ public class WalletRechargePackageController { private final WalletRechargePackageService walletRechargePackageService; + /* ************************************* start remote start ************************************* */ + @Operation(summary = "通过id查询", description = "通过id查询") + @GetMapping("/remote/{id}") + public R remoteGetById(@PathVariable("id") Long id) { + return R.ok(walletRechargePackageService.getById(id)); + } + /* ************************************* end remote end ************************************* */ + /* ************************************* start app start ************************************* */ @Operation(summary = "查询全部", description = "查询全部") @GetMapping("/app/list") diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletSettingService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletSettingService.java index f8382fa18..f29ff36c6 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletSettingService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletSettingService.java @@ -4,9 +4,17 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.bsd.pjcloud.wallet.api.dto.WalletSettingDto; import com.bsd.pjcloud.wallet.api.entity.WalletSettingEntity; import com.bsd.pjcloud.wallet.api.vo.WalletSettingVo; +import com.bsd.pjcloud.wallet.api.vo.WalletXfjDiscounts; + +import java.util.List; public interface WalletSettingService extends IService { + /** + * 获取消费机优惠列表 + */ + List androidGetDiscountsList(String hardId, Long userId); + WalletSettingVo getSetting(); void edit(WalletSettingDto dto); diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletSettingServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletSettingServiceImpl.java index 7347045ee..b199ccaf5 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletSettingServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/WalletSettingServiceImpl.java @@ -3,12 +3,20 @@ package com.bsd.pjcloud.wallet.service.impl; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.bsd.pjcloud.admin.api.dto.UserInfo; +import com.bsd.pjcloud.admin.api.entity.SysUser; +import com.bsd.pjcloud.admin.api.feign.RemoteUserService; +import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.core.util.BeanUtils; +import com.bsd.pjcloud.wallet.api.constant.WalletXfjDiscountsEnum; import com.bsd.pjcloud.wallet.api.dto.WalletSettingDto; import com.bsd.pjcloud.wallet.api.entity.WalletSettingEntity; +import com.bsd.pjcloud.wallet.api.vo.MchManageVo; import com.bsd.pjcloud.wallet.api.vo.WalletSettingVo; +import com.bsd.pjcloud.wallet.api.vo.WalletXfjDiscounts; import com.bsd.pjcloud.wallet.mapper.WalletSettingMapper; +import com.bsd.pjcloud.wallet.service.MchManageService; import com.bsd.pjcloud.wallet.service.MchRuleJoinService; import com.bsd.pjcloud.wallet.service.WalletRuleJoinService; import com.bsd.pjcloud.wallet.service.WalletSettingService; @@ -19,12 +27,11 @@ import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; /** * 支付设置 - * - * @author dzc - * @date 2025-01-06 10:52:31 */ @Validated @Slf4j @@ -32,6 +39,69 @@ import java.math.BigDecimal; @Service public class WalletSettingServiceImpl extends ServiceImpl implements WalletSettingService { + private final MchManageService mchManageService; + + private final RemoteUserService remoteUserService; + + /** + * 获取消费机优惠列表 + */ + @Override + public List androidGetDiscountsList(String hardId, Long userId) { + List discountsList = new ArrayList<>(); + UserInfo userInfo = remoteUserService.getInnerByUserId(userId).getData(); + if (ObjectUtil.isEmpty(userInfo) || ObjectUtil.isEmpty(userInfo.getSysUser())) { + return List.of(); + } + WalletSettingVo setting = getSetting(); + if (ObjectUtil.isEmpty(setting)) { + return List.of(); + } + SysUser sysUser = userInfo.getSysUser(); + + // 在自营食堂 + MchManageVo userMch = mchManageService.getFirstMchByDeptId(sysUser.getDeptId(), List.of(MerchantTypeEnum.CANTEEN)); + boolean isSelfCatering = ObjectUtil.isNotEmpty(userMch); + + List list = new ArrayList<>(); + // 特殊食堂(二楼食堂) + if (ObjectUtil.isNotEmpty(setting.getSpecialXfjIdList()) && setting.getSpecialXfjIdList().contains(hardId)) { + // 自营食堂下用户 + if (isSelfCatering) { + list = setting.getZbSpecialXfjDiscounts(); + } + // 不在自营食堂下用户 + else { + list = setting.getFzbSpecialXfjDiscounts(); + } + } + // 默认食堂 + else { + // 自营食堂下用户 + if (isSelfCatering) { + list = setting.getZbDefaultXfjDiscounts(); + } + // 不在自营食堂下用户 + else { + list = setting.getFzbDefaultXfjDiscounts(); + } + } + if (ObjectUtil.isNotEmpty(list)) { + discountsList.addAll( + list.stream().map(item -> { + WalletXfjDiscounts entity = new WalletXfjDiscounts(); + entity.setName("食堂差异化就餐收费管理办法"); + entity.setHourType(item.getHourType()); + entity.setType(WalletXfjDiscountsEnum.JZ_DISCOUNT.getCode()); + entity.setExtraPer(item.getExtraPer()); + entity.setBasePrice(item.getBasePrice()); + return entity; + }).toList() + ); + } + return discountsList; + } + @Override // @Cacheable(value = CacheConstants.WALLET_SETTING_DETAIL) public WalletSettingVo getSetting() { diff --git a/test.png b/test.png new file mode 100644 index 000000000..55fe840c9 Binary files /dev/null and b/test.png differ diff --git a/test.xml b/test.xml new file mode 100644 index 000000000..e69de29bb