params, String body)
- throws Throwable;
-
- @Override
- public final PayRefundRespDTO getRefund(String outTradeNo, String outRefundNo) {
- try {
- return doGetRefund(outTradeNo, outRefundNo);
- } catch (ServiceException ex) { // 业务异常,都是实现类已经翻译,所以直接抛出即可
- throw ex;
- } catch (Throwable ex) {
- log.error("[getRefund][客户端({}) outTradeNo({}) outRefundNo({}) 查询退款单异常]",
- getId(), outTradeNo, outRefundNo, ex);
- throw buildPayException(ex);
- }
- }
-
- protected abstract PayRefundRespDTO doGetRefund(String outTradeNo, String outRefundNo)
- throws Throwable;
-
- // ========== 各种工具方法 ==========
-
- private PayException buildPayException(Throwable ex) {
- if (ex instanceof PayException) {
- return (PayException) ex;
- }
- throw new PayException(ex);
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/NonePayClientConfig.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/NonePayClientConfig.java
deleted file mode 100644
index 3e33d0aa..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/NonePayClientConfig.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.win.framework.pay.core.client.impl;
-
-import com.win.framework.pay.core.client.PayClientConfig;
-import lombok.Data;
-
-import javax.validation.Validator;
-
-/**
- * 无需任何配置 PayClientConfig 实现类
- *
- * @author jason
- */
-@Data
-public class NonePayClientConfig implements PayClientConfig {
-
- /**
- * 配置名称
- *
- * 如果不加任何属性,JsonUtils.parseObject2 解析会报错,所以暂时加个名称
- */
- private String name;
-
- public NonePayClientConfig(){
- this.name = "none-config";
- }
-
- @Override
- public void validate(Validator validator) {
- // 无任何配置不需要校验
- }
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/PayClientFactoryImpl.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/PayClientFactoryImpl.java
deleted file mode 100644
index de63c5ca..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/PayClientFactoryImpl.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package com.win.framework.pay.core.client.impl;
-
-import cn.hutool.core.lang.Assert;
-import cn.hutool.core.util.ReflectUtil;
-import com.win.framework.pay.core.client.PayClient;
-import com.win.framework.pay.core.client.PayClientConfig;
-import com.win.framework.pay.core.client.PayClientFactory;
-import com.win.framework.pay.core.client.impl.alipay.*;
-import com.win.framework.pay.core.client.impl.mock.MockPayClient;
-import com.win.framework.pay.core.client.impl.weixin.*;
-import com.win.framework.pay.core.enums.channel.PayChannelEnum;
-import lombok.extern.slf4j.Slf4j;
-
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-import static com.win.framework.pay.core.enums.channel.PayChannelEnum.*;
-
-/**
- * 支付客户端的工厂实现类
- *
- * @author 芋道源码
- */
-@Slf4j
-public class PayClientFactoryImpl implements PayClientFactory {
-
- /**
- * 支付客户端 Map
- *
- * key:渠道编号
- */
- private final ConcurrentMap> clients = new ConcurrentHashMap<>();
-
- /**
- * 支付客户端 Class Map
- */
- private final Map> clientClass = new ConcurrentHashMap<>();
-
- public PayClientFactoryImpl() {
- // 微信支付客户端
- clientClass.put(WX_PUB, WxPubPayClient.class);
- clientClass.put(WX_LITE, WxLitePayClient.class);
- clientClass.put(WX_APP, WxAppPayClient.class);
- clientClass.put(WX_BAR, WxBarPayClient.class);
- clientClass.put(WX_NATIVE, WxNativePayClient.class);
- // 支付包支付客户端
- clientClass.put(ALIPAY_WAP, AlipayWapPayClient.class);
- clientClass.put(ALIPAY_QR, AlipayQrPayClient.class);
- clientClass.put(ALIPAY_APP, AlipayAppPayClient.class);
- clientClass.put(ALIPAY_PC, AlipayPcPayClient.class);
- clientClass.put(ALIPAY_BAR, AlipayBarPayClient.class);
- // Mock 支付客户端
- clientClass.put(MOCK, MockPayClient.class);
- }
-
- @Override
- public void registerPayClientClass(PayChannelEnum channel, Class> payClientClass) {
- clientClass.put(channel, payClientClass);
- }
-
- @Override
- public PayClient getPayClient(Long channelId) {
- AbstractPayClient> client = clients.get(channelId);
- if (client == null) {
- log.error("[getPayClient][渠道编号({}) 找不到客户端]", channelId);
- }
- return client;
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public void createOrUpdatePayClient(Long channelId, String channelCode,
- Config config) {
- AbstractPayClient client = (AbstractPayClient) clients.get(channelId);
- if (client == null) {
- client = this.createPayClient(channelId, channelCode, config);
- client.init();
- clients.put(client.getId(), client);
- } else {
- client.refresh(config);
- }
- }
-
- @SuppressWarnings("unchecked")
- private AbstractPayClient createPayClient(Long channelId, String channelCode,
- Config config) {
- PayChannelEnum channelEnum = PayChannelEnum.getByCode(channelCode);
- Assert.notNull(channelEnum, String.format("支付渠道(%s) 为空", channelCode));
- Class> payClientClass = clientClass.get(channelEnum);
- Assert.notNull(payClientClass, String.format("支付渠道(%s) Class 为空", channelCode));
- return (AbstractPayClient) ReflectUtil.newInstance(payClientClass, channelId, config);
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AbstractAlipayPayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AbstractAlipayPayClient.java
deleted file mode 100644
index d223ab85..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AbstractAlipayPayClient.java
+++ /dev/null
@@ -1,215 +0,0 @@
-package com.win.framework.pay.core.client.impl.alipay;
-
-import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.date.LocalDateTimeUtil;
-import cn.hutool.core.lang.Assert;
-import cn.hutool.core.map.MapUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.hutool.http.HttpUtil;
-import com.win.framework.common.util.object.ObjectUtils;
-import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO;
-import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
-import com.win.framework.pay.core.client.dto.refund.PayRefundRespDTO;
-import com.win.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO;
-import com.win.framework.pay.core.client.impl.AbstractPayClient;
-import com.win.framework.pay.core.enums.order.PayOrderStatusRespEnum;
-import com.alipay.api.AlipayApiException;
-import com.alipay.api.AlipayConfig;
-import com.alipay.api.AlipayResponse;
-import com.alipay.api.DefaultAlipayClient;
-import com.alipay.api.domain.AlipayTradeFastpayRefundQueryModel;
-import com.alipay.api.domain.AlipayTradeQueryModel;
-import com.alipay.api.domain.AlipayTradeRefundModel;
-import com.alipay.api.internal.util.AlipaySignature;
-import com.alipay.api.request.AlipayTradeFastpayRefundQueryRequest;
-import com.alipay.api.request.AlipayTradeQueryRequest;
-import com.alipay.api.request.AlipayTradeRefundRequest;
-import com.alipay.api.response.AlipayTradeFastpayRefundQueryResponse;
-import com.alipay.api.response.AlipayTradeQueryResponse;
-import com.alipay.api.response.AlipayTradeRefundResponse;
-import lombok.Getter;
-import lombok.SneakyThrows;
-import lombok.extern.slf4j.Slf4j;
-
-import java.nio.charset.StandardCharsets;
-import java.time.LocalDateTime;
-import java.util.Collections;
-import java.util.Map;
-import java.util.Objects;
-import java.util.function.Supplier;
-
-import static cn.hutool.core.date.DatePattern.NORM_DATETIME_FORMATTER;
-
-/**
- * 支付宝抽象类,实现支付宝统一的接口、以及部分实现(退款)
- *
- * @author jason
- */
-@Slf4j
-public abstract class AbstractAlipayPayClient extends AbstractPayClient {
-
- @Getter // 仅用于单测场景
- protected DefaultAlipayClient client;
-
- public AbstractAlipayPayClient(Long channelId, String channelCode, AlipayPayClientConfig config) {
- super(channelId, channelCode, config);
- }
-
- @Override
- @SneakyThrows
- protected void doInit() {
- AlipayConfig alipayConfig = new AlipayConfig();
- BeanUtil.copyProperties(config, alipayConfig, false);
- this.client = new DefaultAlipayClient(alipayConfig);
- }
-
- // ============ 支付相关 ==========
-
- /**
- * 构造支付关闭的 {@link PayOrderRespDTO} 对象
- *
- * @return 支付关闭的 {@link PayOrderRespDTO} 对象
- */
- protected PayOrderRespDTO buildClosedPayOrderRespDTO(PayOrderUnifiedReqDTO reqDTO, AlipayResponse response) {
- Assert.isFalse(response.isSuccess());
- return PayOrderRespDTO.closedOf(response.getSubCode(), response.getSubMsg(),
- reqDTO.getOutTradeNo(), response);
- }
-
- @Override
- public PayOrderRespDTO doParseOrderNotify(Map params, String body) throws Throwable {
- // 1. 校验回调数据
- Map bodyObj = HttpUtil.decodeParamMap(body, StandardCharsets.UTF_8);
- AlipaySignature.rsaCheckV1(bodyObj, config.getAlipayPublicKey(),
- StandardCharsets.UTF_8.name(), config.getSignType());
-
- // 2. 解析订单的状态
- // 额外说明:支付宝不仅仅支付成功会回调,再各种触发支付单数据变化时,都会进行回调,所以这里 status 的解析会写的比较复杂
- Integer status = parseStatus(bodyObj.get("trade_status"));
- // 特殊逻辑: 支付宝没有退款成功的状态,所以,如果有退款金额,我们认为是退款成功
- if (MapUtil.getDouble(bodyObj, "refund_fee", 0D) > 0) {
- status = PayOrderStatusRespEnum.REFUND.getStatus();
- }
- Assert.notNull(status, (Supplier) () -> {
- throw new IllegalArgumentException(StrUtil.format("body({}) 的 trade_status 不正确", body));
- });
- return PayOrderRespDTO.of(status, bodyObj.get("trade_no"), bodyObj.get("seller_id"), parseTime(params.get("gmt_payment")),
- bodyObj.get("out_trade_no"), body);
- }
-
- @Override
- protected PayOrderRespDTO doGetOrder(String outTradeNo) throws Throwable {
- // 1.1 构建 AlipayTradeRefundModel 请求
- AlipayTradeQueryModel model = new AlipayTradeQueryModel();
- model.setOutTradeNo(outTradeNo);
- // 1.2 构建 AlipayTradeQueryRequest 请求
- AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
- request.setBizModel(model);
-
- // 2.1 执行请求
- AlipayTradeQueryResponse response = client.execute(request);
- if (!response.isSuccess()) { // 不成功,例如说订单不存在
- return PayOrderRespDTO.closedOf(response.getSubCode(), response.getSubMsg(),
- outTradeNo, response);
- }
- // 2.2 解析订单的状态
- Integer status = parseStatus(response.getTradeStatus());
- Assert.notNull(status, (Supplier) () -> {
- throw new IllegalArgumentException(StrUtil.format("body({}) 的 trade_status 不正确", response.getBody()));
- });
- return PayOrderRespDTO.of(status, response.getTradeNo(), response.getBuyerUserId(), LocalDateTimeUtil.of(response.getSendPayDate()),
- outTradeNo, response);
- }
-
- private static Integer parseStatus(String tradeStatus) {
- return Objects.equals("WAIT_BUYER_PAY", tradeStatus) ? PayOrderStatusRespEnum.WAITING.getStatus()
- : ObjectUtils.equalsAny(tradeStatus, "TRADE_FINISHED", "TRADE_SUCCESS") ? PayOrderStatusRespEnum.SUCCESS.getStatus()
- : Objects.equals("TRADE_CLOSED", tradeStatus) ? PayOrderStatusRespEnum.CLOSED.getStatus() : null;
- }
-
- // ============ 退款相关 ==========
-
- /**
- * 支付宝统一的退款接口 alipay.trade.refund
- *
- * @param reqDTO 退款请求 request DTO
- * @return 退款请求 Response
- */
- @Override
- protected PayRefundRespDTO doUnifiedRefund(PayRefundUnifiedReqDTO reqDTO) throws AlipayApiException {
- // 1.1 构建 AlipayTradeRefundModel 请求
- AlipayTradeRefundModel model = new AlipayTradeRefundModel();
- model.setOutTradeNo(reqDTO.getOutTradeNo());
- model.setOutRequestNo(reqDTO.getOutRefundNo());
- model.setRefundAmount(formatAmount(reqDTO.getRefundPrice()));
- model.setRefundReason(reqDTO.getReason());
- // 1.2 构建 AlipayTradePayRequest 请求
- AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
- request.setBizModel(model);
-
- // 2.1 执行请求
- AlipayTradeRefundResponse response = client.execute(request);
- if (!response.isSuccess()) {
- return PayRefundRespDTO.failureOf(response.getSubCode(), response.getSubMsg(), reqDTO.getOutRefundNo(), response);
- }
- // 2.2 创建返回结果
- // 支付宝只要退款调用返回 success,就认为退款成功,不需要回调。具体可见 parseNotify 方法的说明。
- // 另外,支付宝没有退款单号,所以不用设置
- return PayRefundRespDTO.successOf(null, LocalDateTimeUtil.of(response.getGmtRefundPay()),
- reqDTO.getOutRefundNo(), response);
- }
-
- @Override
- public PayRefundRespDTO doParseRefundNotify(Map params, String body) {
- // 补充说明:支付宝退款时,没有回调,这点和微信支付是不同的。并且,退款分成部分退款、和全部退款。
- // ① 部分退款:是会有回调,但是它回调的是订单状态的同步回调,不是退款订单的回调
- // ② 全部退款:Wap 支付有订单状态的同步回调,但是 PC/扫码又没有
- // 所以,这里在解析时,即使是退款导致的订单状态同步,我们也忽略不做为“退款同步”,而是订单的回调。
- // 实际上,支付宝退款只要发起成功,就可以认为退款成功,不需要等待回调。
- throw new UnsupportedOperationException("支付宝无退款回调");
- }
-
- @Override
- protected PayRefundRespDTO doGetRefund(String outTradeNo, String outRefundNo) throws AlipayApiException {
- // 1.1 构建 AlipayTradeFastpayRefundQueryModel 请求
- AlipayTradeFastpayRefundQueryModel model = new AlipayTradeFastpayRefundQueryModel();
- model.setOutTradeNo(outTradeNo);
- model.setOutRequestNo(outRefundNo);
- model.setQueryOptions(Collections.singletonList("gmt_refund_pay"));
- // 1.2 构建 AlipayTradeFastpayRefundQueryRequest 请求
- AlipayTradeFastpayRefundQueryRequest request = new AlipayTradeFastpayRefundQueryRequest();
- request.setBizModel(model);
-
- // 2.1 执行请求
- AlipayTradeFastpayRefundQueryResponse response = client.execute(request);
- if (!response.isSuccess()) {
- // 明确不存在的情况,应该就是失败,可进行关闭
- if (ObjectUtils.equalsAny(response.getSubCode(), "TRADE_NOT_EXIST", "ACQ.TRADE_NOT_EXIST")) {
- return PayRefundRespDTO.failureOf(outRefundNo, response);
- }
- // 可能存在“ACQ.SYSTEM_ERROR”系统错误等情况,所以返回 WAIT 继续等待
- return PayRefundRespDTO.waitingOf(null, outRefundNo, response);
- }
- // 2.2 创建返回结果
- if (Objects.equals(response.getRefundStatus(), "REFUND_SUCCESS")) {
- return PayRefundRespDTO.successOf(null, LocalDateTimeUtil.of(response.getGmtRefundPay()),
- outRefundNo, response);
- }
- return PayRefundRespDTO.waitingOf(null, outRefundNo, response);
- }
-
- // ========== 各种工具方法 ==========
-
- protected String formatAmount(Integer amount) {
- return String.valueOf(amount / 100.0);
- }
-
- protected String formatTime(LocalDateTime time) {
- return LocalDateTimeUtil.format(time, NORM_DATETIME_FORMATTER);
- }
-
- protected LocalDateTime parseTime(String str) {
- return LocalDateTimeUtil.parse(str, NORM_DATETIME_FORMATTER);
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayAppPayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayAppPayClient.java
deleted file mode 100644
index 4f22ed2b..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayAppPayClient.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.win.framework.pay.core.client.impl.alipay;
-
-import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO;
-import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
-import com.win.framework.pay.core.enums.channel.PayChannelEnum;
-import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum;
-import com.alipay.api.AlipayApiException;
-import com.alipay.api.domain.AlipayTradeAppPayModel;
-import com.alipay.api.request.AlipayTradeAppPayRequest;
-import com.alipay.api.response.AlipayTradeAppPayResponse;
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 支付宝【App 支付】的 PayClient 实现类
- *
- * 文档:App 支付
- *
- * // TODO 芋艿:未详细测试,因为手头没 App
- *
- * @author 芋道源码
- */
-@Slf4j
-public class AlipayAppPayClient extends AbstractAlipayPayClient {
-
- public AlipayAppPayClient(Long channelId, AlipayPayClientConfig config) {
- super(channelId, PayChannelEnum.ALIPAY_APP.getCode(), config);
- }
-
- @Override
- public PayOrderRespDTO doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) throws AlipayApiException {
- // 1.1 构建 AlipayTradeAppPayModel 请求
- AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
- // ① 通用的参数
- model.setOutTradeNo(reqDTO.getOutTradeNo());
- model.setSubject(reqDTO.getSubject());
- model.setBody(reqDTO.getBody() + "test");
- model.setTotalAmount(formatAmount(reqDTO.getPrice()));
- model.setTimeExpire(formatTime(reqDTO.getExpireTime()));
- model.setProductCode("QUICK_MSECURITY_PAY"); // 销售产品码:无线快捷支付产品
- // ② 个性化的参数【无】
- // ③ 支付宝扫码支付只有一种展示
- String displayMode = PayOrderDisplayModeEnum.APP.getMode();
-
- // 1.2 构建 AlipayTradePrecreateRequest 请求
- AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
- request.setBizModel(model);
- request.setNotifyUrl(reqDTO.getNotifyUrl());
- request.setReturnUrl(reqDTO.getReturnUrl());
-
- // 2.1 执行请求
- AlipayTradeAppPayResponse response = client.sdkExecute(request);
- // 2.2 处理结果
- if (!response.isSuccess()) {
- return buildClosedPayOrderRespDTO(reqDTO, response);
- }
- return PayOrderRespDTO.waitingOf(displayMode, response.getBody(),
- reqDTO.getOutTradeNo(), response);
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayBarPayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayBarPayClient.java
deleted file mode 100644
index 5b281ace..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayBarPayClient.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package com.win.framework.pay.core.client.impl.alipay;
-
-import cn.hutool.core.date.LocalDateTimeUtil;
-import cn.hutool.core.map.MapUtil;
-import cn.hutool.core.util.StrUtil;
-import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO;
-import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
-import com.win.framework.pay.core.enums.channel.PayChannelEnum;
-import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum;
-import com.alipay.api.AlipayApiException;
-import com.alipay.api.domain.AlipayTradePayModel;
-import com.alipay.api.request.AlipayTradePayRequest;
-import com.alipay.api.response.AlipayTradePayResponse;
-import lombok.extern.slf4j.Slf4j;
-
-import java.time.LocalDateTime;
-
-import static com.win.framework.common.exception.enums.GlobalErrorCodeConstants.BAD_REQUEST;
-import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception0;
-
-/**
- * 支付宝【条码支付】的 PayClient 实现类
- *
- * 文档:当面付
- *
- * @author 芋道源码
- */
-@Slf4j
-public class AlipayBarPayClient extends AbstractAlipayPayClient {
-
- public AlipayBarPayClient(Long channelId, AlipayPayClientConfig config) {
- super(channelId, PayChannelEnum.ALIPAY_BAR.getCode(), config);
- }
-
- @Override
- public PayOrderRespDTO doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) throws AlipayApiException {
- String authCode = MapUtil.getStr(reqDTO.getChannelExtras(), "auth_code");
- if (StrUtil.isEmpty(authCode)) {
- throw exception0(BAD_REQUEST.getCode(), "条形码不能为空");
- }
-
- // 1.1 构建 AlipayTradePayModel 请求
- AlipayTradePayModel model = new AlipayTradePayModel();
- // ① 通用的参数
- model.setOutTradeNo(reqDTO.getOutTradeNo());
- model.setSubject(reqDTO.getSubject());
- model.setBody(reqDTO.getBody());
- model.setTotalAmount(formatAmount(reqDTO.getPrice()));
- model.setScene("bar_code"); // 当面付条码支付场景
- // ② 个性化的参数
- model.setAuthCode(authCode);
- // ③ 支付宝条码支付只有一种展示
- String displayMode = PayOrderDisplayModeEnum.BAR_CODE.getMode();
-
- // 1.2 构建 AlipayTradePayRequest 请求
- AlipayTradePayRequest request = new AlipayTradePayRequest();
- request.setBizModel(model);
- request.setNotifyUrl(reqDTO.getNotifyUrl());
- request.setReturnUrl(reqDTO.getReturnUrl());
-
- // 2.1 执行请求
- AlipayTradePayResponse response = client.execute(request);
- // 2.2 处理结果
- if (!response.isSuccess()) {
- return buildClosedPayOrderRespDTO(reqDTO, response);
- }
- if ("10000".equals(response.getCode())) { // 免密支付
- LocalDateTime successTime = LocalDateTimeUtil.of(response.getGmtPayment());
- return PayOrderRespDTO.successOf(response.getTradeNo(), response.getBuyerUserId(), successTime,
- response.getOutTradeNo(), response)
- .setDisplayMode(displayMode).setDisplayContent("");
- }
- // 大额支付,需要用户输入密码,所以返回 waiting。此时,前端一般会进行轮询
- return PayOrderRespDTO.waitingOf(displayMode, "",
- reqDTO.getOutTradeNo(), response);
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayPayClientConfig.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayPayClientConfig.java
deleted file mode 100644
index 3f01fadf..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayPayClientConfig.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package com.win.framework.pay.core.client.impl.alipay;
-
-import com.win.framework.common.util.validation.ValidationUtils;
-import com.win.framework.pay.core.client.PayClientConfig;
-import lombok.Data;
-
-import javax.validation.ConstraintViolation;
-import javax.validation.Validator;
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
-import java.util.Set;
-
-/**
- * 支付宝的 PayClientConfig 实现类
- * 属性主要来自 {@link com.alipay.api.AlipayConfig} 的必要属性
- *
- * @author 芋道源码
- */
-@Data
-public class AlipayPayClientConfig implements PayClientConfig {
-
- /**
- * 公钥类型 - 公钥模式
- */
- public static final Integer MODE_PUBLIC_KEY = 1;
- /**
- * 公钥类型 - 证书模式
- */
- public static final Integer MODE_CERTIFICATE = 2;
-
- /**
- * 签名算法类型 - RSA
- */
- public static final String SIGN_TYPE_DEFAULT = "RSA2";
-
- /**
- * 网关地址
- *
- * 1. 生产环境
- * 2. 沙箱环境
- */
- @NotBlank(message = "网关地址不能为空", groups = {ModePublicKey.class, ModeCertificate.class})
- private String serverUrl;
-
- /**
- * 开放平台上创建的应用的 ID
- */
- @NotBlank(message = "开放平台上创建的应用的 ID不能为空", groups = {ModePublicKey.class, ModeCertificate.class})
- private String appId;
-
- /**
- * 签名算法类型,推荐:RSA2
- *
- * {@link #SIGN_TYPE_DEFAULT}
- */
- @NotBlank(message = "签名算法类型不能为空", groups = {ModePublicKey.class, ModeCertificate.class})
- private String signType;
-
- /**
- * 公钥类型
- * 1. {@link #MODE_PUBLIC_KEY} 情况,privateKey + alipayPublicKey
- * 2. {@link #MODE_CERTIFICATE} 情况,appCertContent + alipayPublicCertContent + rootCertContent
- */
- @NotNull(message = "公钥类型不能为空", groups = {ModePublicKey.class, ModeCertificate.class})
- private Integer mode;
-
- // ========== 公钥模式 ==========
- /**
- * 商户私钥
- */
- @NotBlank(message = "商户私钥不能为空", groups = {ModePublicKey.class})
- private String privateKey;
-
- /**
- * 支付宝公钥字符串
- */
- @NotBlank(message = "支付宝公钥字符串不能为空", groups = {ModePublicKey.class})
- private String alipayPublicKey;
-
- // ========== 证书模式 ==========
- /**
- * 指定商户公钥应用证书内容字符串
- */
- @NotBlank(message = "指定商户公钥应用证书内容不能为空", groups = {ModeCertificate.class})
- private String appCertContent;
- /**
- * 指定支付宝公钥证书内容字符串
- */
- @NotBlank(message = "指定支付宝公钥证书内容不能为空", groups = {ModeCertificate.class})
- private String alipayPublicCertContent;
- /**
- * 指定根证书内容字符串
- */
- @NotBlank(message = "指定根证书内容字符串不能为空", groups = {ModeCertificate.class})
- private String rootCertContent;
-
- public interface ModePublicKey {
- }
-
- public interface ModeCertificate {
- }
-
- @Override
- public void validate(Validator validator) {
- ValidationUtils.validate(validator, this,
- MODE_PUBLIC_KEY.equals(this.getMode()) ? ModePublicKey.class : ModeCertificate.class);
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayPcPayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayPcPayClient.java
deleted file mode 100644
index 4c1566fb..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayPcPayClient.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package com.win.framework.pay.core.client.impl.alipay;
-
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.http.Method;
-import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO;
-import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
-import com.win.framework.pay.core.enums.channel.PayChannelEnum;
-import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum;
-import com.alipay.api.AlipayApiException;
-import com.alipay.api.domain.AlipayTradePagePayModel;
-import com.alipay.api.request.AlipayTradePagePayRequest;
-import com.alipay.api.response.AlipayTradePagePayResponse;
-import lombok.extern.slf4j.Slf4j;
-
-import java.util.Objects;
-
-/**
- * 支付宝【PC 网站】的 PayClient 实现类
- *
- * 文档:电脑网站支付
- *
- * @author XGD
- */
-@Slf4j
-public class AlipayPcPayClient extends AbstractAlipayPayClient {
-
- public AlipayPcPayClient(Long channelId, AlipayPayClientConfig config) {
- super(channelId, PayChannelEnum.ALIPAY_PC.getCode(), config);
- }
-
- @Override
- public PayOrderRespDTO doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) throws AlipayApiException {
- // 1.1 构建 AlipayTradePagePayModel 请求
- AlipayTradePagePayModel model = new AlipayTradePagePayModel();
- // ① 通用的参数
- model.setOutTradeNo(reqDTO.getOutTradeNo());
- model.setSubject(reqDTO.getSubject());
- model.setBody(reqDTO.getBody());
- model.setTotalAmount(formatAmount(reqDTO.getPrice()));
- model.setTimeExpire(formatTime(reqDTO.getExpireTime()));
- model.setProductCode("FAST_INSTANT_TRADE_PAY"); // 销售产品码. 目前 PC 支付场景下仅支持 FAST_INSTANT_TRADE_PAY
- // ② 个性化的参数
- // 如果想弄更多个性化的参数,可参考 https://www.pingxx.com/api/支付渠道 extra 参数说明.html 的 alipay_pc_direct 部分进行拓展
- model.setQrPayMode("2"); // 跳转模式 - 订单码,效果参见:https://help.pingxx.com/article/1137360/
- // ③ 支付宝 PC 支付有两种展示模式:FORM、URL
- String displayMode = ObjectUtil.defaultIfNull(reqDTO.getDisplayMode(),
- PayOrderDisplayModeEnum.URL.getMode());
-
- // 1.2 构建 AlipayTradePagePayRequest 请求
- AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
- request.setBizModel(model);
- request.setNotifyUrl(reqDTO.getNotifyUrl());
- request.setReturnUrl(reqDTO.getReturnUrl());
-
- // 2.1 执行请求
- AlipayTradePagePayResponse response;
- if (Objects.equals(displayMode, PayOrderDisplayModeEnum.FORM.getMode())) {
- response = client.pageExecute(request, Method.POST.name()); // 需要特殊使用 POST 请求
- } else {
- response = client.pageExecute(request, Method.GET.name());
- }
- // 2.2 处理结果
- if (!response.isSuccess()) {
- return buildClosedPayOrderRespDTO(reqDTO, response);
- }
- return PayOrderRespDTO.waitingOf(displayMode, response.getBody(),
- reqDTO.getOutTradeNo(), response);
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayQrPayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayQrPayClient.java
deleted file mode 100644
index bec7da49..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayQrPayClient.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package com.win.framework.pay.core.client.impl.alipay;
-
-import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO;
-import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
-import com.win.framework.pay.core.enums.channel.PayChannelEnum;
-import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum;
-import com.alipay.api.AlipayApiException;
-import com.alipay.api.domain.AlipayTradePrecreateModel;
-import com.alipay.api.request.AlipayTradePrecreateRequest;
-import com.alipay.api.response.AlipayTradePrecreateResponse;
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 支付宝【扫码支付】的 PayClient 实现类
- *
- * 文档:扫码支付
- *
- * @author 芋道源码
- */
-@Slf4j
-public class AlipayQrPayClient extends AbstractAlipayPayClient {
-
- public AlipayQrPayClient(Long channelId, AlipayPayClientConfig config) {
- super(channelId, PayChannelEnum.ALIPAY_QR.getCode(), config);
- }
-
- @Override
- public PayOrderRespDTO doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) throws AlipayApiException {
- // 1.1 构建 AlipayTradePrecreateModel 请求
- AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
- // ① 通用的参数
- model.setOutTradeNo(reqDTO.getOutTradeNo());
- model.setSubject(reqDTO.getSubject());
- model.setBody(reqDTO.getBody());
- model.setTotalAmount(formatAmount(reqDTO.getPrice()));
- model.setProductCode("FACE_TO_FACE_PAYMENT"); // 销售产品码. 目前扫码支付场景下仅支持 FACE_TO_FACE_PAYMENT
- // ② 个性化的参数【无】
- // ③ 支付宝扫码支付只有一种展示,考虑到前端可能希望二维码扫描后,手机打开
- String displayMode = PayOrderDisplayModeEnum.QR_CODE.getMode();
-
- // 1.2 构建 AlipayTradePrecreateRequest 请求
- AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
- request.setBizModel(model);
- request.setNotifyUrl(reqDTO.getNotifyUrl());
- request.setReturnUrl(reqDTO.getReturnUrl());
-
- // 2.1 执行请求
- AlipayTradePrecreateResponse response = client.execute(request);
- // 2.2 处理结果
- if (!response.isSuccess()) {
- return buildClosedPayOrderRespDTO(reqDTO, response);
- }
- return PayOrderRespDTO.waitingOf(displayMode, response.getQrCode(),
- reqDTO.getOutTradeNo(), response);
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayWapPayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayWapPayClient.java
deleted file mode 100644
index a2753d45..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/alipay/AlipayWapPayClient.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package com.win.framework.pay.core.client.impl.alipay;
-
-import cn.hutool.http.Method;
-import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO;
-import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
-import com.win.framework.pay.core.enums.channel.PayChannelEnum;
-import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum;
-import com.alipay.api.AlipayApiException;
-import com.alipay.api.domain.AlipayTradeWapPayModel;
-import com.alipay.api.request.AlipayTradeWapPayRequest;
-import com.alipay.api.response.AlipayTradeWapPayResponse;
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 支付宝【Wap 网站】的 PayClient 实现类
- *
- * 文档:手机网站支付接口
- *
- * @author 芋道源码
- */
-@Slf4j
-public class AlipayWapPayClient extends AbstractAlipayPayClient {
-
- public AlipayWapPayClient(Long channelId, AlipayPayClientConfig config) {
- super(channelId, PayChannelEnum.ALIPAY_WAP.getCode(), config);
- }
-
- @Override
- public PayOrderRespDTO doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) throws AlipayApiException {
- // 1.1 构建 AlipayTradeWapPayModel 请求
- AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
- // ① 通用的参数
- model.setOutTradeNo(reqDTO.getOutTradeNo());
- model.setSubject(reqDTO.getSubject());
- model.setBody(reqDTO.getBody());
- model.setTotalAmount(formatAmount(reqDTO.getPrice()));
- model.setProductCode("QUICK_WAP_PAY"); // 销售产品码. 目前 Wap 支付场景下仅支持 QUICK_WAP_PAY
- // ② 个性化的参数【无】
- // ③ 支付宝 Wap 支付只有一种展示:URL
- String displayMode = PayOrderDisplayModeEnum.URL.getMode();
-
- // 1.2 构建 AlipayTradeWapPayRequest 请求
- AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
- request.setBizModel(model);
- request.setNotifyUrl(reqDTO.getNotifyUrl());
- request.setReturnUrl(reqDTO.getReturnUrl());
- model.setQuitUrl(reqDTO.getReturnUrl());
-
- // 2.1 执行请求
- AlipayTradeWapPayResponse response = client.pageExecute(request, Method.GET.name());
- // 2.2 处理结果
- if (!response.isSuccess()) {
- return buildClosedPayOrderRespDTO(reqDTO, response);
- }
- return PayOrderRespDTO.waitingOf(displayMode, response.getBody(),
- reqDTO.getOutTradeNo(), response);
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/mock/MockPayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/mock/MockPayClient.java
deleted file mode 100644
index 6faf7146..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/mock/MockPayClient.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.win.framework.pay.core.client.impl.mock;
-
-import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO;
-import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
-import com.win.framework.pay.core.client.dto.refund.PayRefundRespDTO;
-import com.win.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO;
-import com.win.framework.pay.core.client.impl.AbstractPayClient;
-import com.win.framework.pay.core.client.impl.NonePayClientConfig;
-import com.win.framework.pay.core.enums.channel.PayChannelEnum;
-
-import java.time.LocalDateTime;
-import java.util.Map;
-
-/**
- * 模拟支付的 PayClient 实现类
- *
- * 模拟支付返回结果都是成功,方便大家日常流畅
- *
- * @author jason
- */
-public class MockPayClient extends AbstractPayClient {
-
- private static final String MOCK_RESP_SUCCESS_DATA = "MOCK_SUCCESS";
-
- public MockPayClient(Long channelId, NonePayClientConfig config) {
- super(channelId, PayChannelEnum.MOCK.getCode(), config);
- }
-
- @Override
- protected void doInit() {
- }
-
- @Override
- protected PayOrderRespDTO doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) {
- return PayOrderRespDTO.successOf("MOCK-P-" + reqDTO.getOutTradeNo(), "", LocalDateTime.now(),
- reqDTO.getOutTradeNo(), MOCK_RESP_SUCCESS_DATA);
- }
-
- @Override
- protected PayOrderRespDTO doGetOrder(String outTradeNo) {
- return PayOrderRespDTO.successOf("MOCK-P-" + outTradeNo, "", LocalDateTime.now(),
- outTradeNo, MOCK_RESP_SUCCESS_DATA);
- }
-
- @Override
- protected PayRefundRespDTO doUnifiedRefund(PayRefundUnifiedReqDTO reqDTO) {
- return PayRefundRespDTO.successOf("MOCK-R-" + reqDTO.getOutRefundNo(), LocalDateTime.now(),
- reqDTO.getOutRefundNo(), MOCK_RESP_SUCCESS_DATA);
- }
-
- @Override
- protected PayRefundRespDTO doGetRefund(String outTradeNo, String outRefundNo) {
- return PayRefundRespDTO.successOf("MOCK-R-" + outRefundNo, LocalDateTime.now(),
- outRefundNo, MOCK_RESP_SUCCESS_DATA);
- }
-
- @Override
- protected PayRefundRespDTO doParseRefundNotify(Map params, String body) {
- throw new UnsupportedOperationException("模拟支付无退款回调");
- }
-
- @Override
- protected PayOrderRespDTO doParseOrderNotify(Map params, String body) {
- throw new UnsupportedOperationException("模拟支付无支付回调");
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/AbstractWxPayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/AbstractWxPayClient.java
deleted file mode 100644
index 5a1e10d9..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/AbstractWxPayClient.java
+++ /dev/null
@@ -1,470 +0,0 @@
-package com.win.framework.pay.core.client.impl.weixin;
-
-import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.codec.Base64;
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.date.LocalDateTimeUtil;
-import cn.hutool.core.date.TemporalAccessorUtil;
-import cn.hutool.core.util.StrUtil;
-import com.win.framework.common.util.io.FileUtils;
-import com.win.framework.common.util.object.ObjectUtils;
-import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO;
-import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
-import com.win.framework.pay.core.client.dto.refund.PayRefundRespDTO;
-import com.win.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO;
-import com.win.framework.pay.core.client.impl.AbstractPayClient;
-import com.win.framework.pay.core.enums.order.PayOrderStatusRespEnum;
-import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
-import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyV3Result;
-import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyResult;
-import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyV3Result;
-import com.github.binarywang.wxpay.bean.request.*;
-import com.github.binarywang.wxpay.bean.result.*;
-import com.github.binarywang.wxpay.config.WxPayConfig;
-import com.github.binarywang.wxpay.exception.WxPayException;
-import com.github.binarywang.wxpay.service.WxPayService;
-import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
-import lombok.extern.slf4j.Slf4j;
-
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.util.Map;
-import java.util.Objects;
-
-import static cn.hutool.core.date.DatePattern.*;
-import static com.win.framework.pay.core.client.impl.weixin.WxPayClientConfig.API_VERSION_V2;
-
-/**
- * 微信支付抽象类,实现微信统一的接口、以及部分实现(退款)
- *
- * @author 遇到源码
- */
-@Slf4j
-public abstract class AbstractWxPayClient extends AbstractPayClient {
-
- protected WxPayService client;
-
- public AbstractWxPayClient(Long channelId, String channelCode, WxPayClientConfig config) {
- super(channelId, channelCode, config);
- }
-
- /**
- * 初始化 client 客户端
- *
- * @param tradeType 交易类型
- */
- protected void doInit(String tradeType) {
- // 创建 config 配置
- WxPayConfig payConfig = new WxPayConfig();
- BeanUtil.copyProperties(config, payConfig, "keyContent", "privateKeyContent", "privateCertContent");
- payConfig.setTradeType(tradeType);
- // weixin-pay-java 无法设置内容,只允许读取文件,所以这里要创建临时文件来解决
- if (Base64.isBase64(config.getKeyContent())) {
- payConfig.setKeyPath(FileUtils.createTempFile(Base64.decode(config.getKeyContent())).getPath());
- }
- if (StrUtil.isNotEmpty(config.getPrivateKeyContent())) {
- payConfig.setPrivateKeyPath(FileUtils.createTempFile(config.getPrivateKeyContent()).getPath());
- }
- if (StrUtil.isNotEmpty(config.getPrivateCertContent())) {
- payConfig.setPrivateCertPath(FileUtils.createTempFile(config.getPrivateCertContent()).getPath());
- }
-
- // 创建 client 客户端
- client = new WxPayServiceImpl();
- client.setConfig(payConfig);
- }
-
- // ============ 支付相关 ==========
-
- @Override
- protected PayOrderRespDTO doUnifiedOrder(PayOrderUnifiedReqDTO reqDTO) throws Exception {
- try {
- switch (config.getApiVersion()) {
- case API_VERSION_V2:
- return doUnifiedOrderV2(reqDTO);
- case WxPayClientConfig.API_VERSION_V3:
- return doUnifiedOrderV3(reqDTO);
- default:
- throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
- }
- } catch (WxPayException e) {
- String errorCode = getErrorCode(e);
- String errorMessage = getErrorMessage(e);
- return PayOrderRespDTO.closedOf(errorCode, errorMessage,
- reqDTO.getOutTradeNo(), e.getXmlString());
- }
- }
-
- /**
- * 【V2】调用支付渠道,统一下单
- *
- * @param reqDTO 下单信息
- * @return 各支付渠道的返回结果
- */
- protected abstract PayOrderRespDTO doUnifiedOrderV2(PayOrderUnifiedReqDTO reqDTO)
- throws Exception;
-
- /**
- * 【V3】调用支付渠道,统一下单
- *
- * @param reqDTO 下单信息
- * @return 各支付渠道的返回结果
- */
- protected abstract PayOrderRespDTO doUnifiedOrderV3(PayOrderUnifiedReqDTO reqDTO)
- throws WxPayException;
-
- /**
- * 【V2】创建微信下单请求
- *
- * @param reqDTO 下信息
- * @return 下单请求
- */
- protected WxPayUnifiedOrderRequest buildPayUnifiedOrderRequestV2(PayOrderUnifiedReqDTO reqDTO) {
- return WxPayUnifiedOrderRequest.newBuilder()
- .outTradeNo(reqDTO.getOutTradeNo())
- .body(reqDTO.getSubject())
- .detail(reqDTO.getBody())
- .totalFee(reqDTO.getPrice()) // 单位分
- .timeExpire(formatDateV2(reqDTO.getExpireTime()))
- .spbillCreateIp(reqDTO.getUserIp())
- .notifyUrl(reqDTO.getNotifyUrl())
- .build();
- }
-
- /**
- * 【V3】创建微信下单请求
- *
- * @param reqDTO 下信息
- * @return 下单请求
- */
- protected WxPayUnifiedOrderV3Request buildPayUnifiedOrderRequestV3(PayOrderUnifiedReqDTO reqDTO) {
- WxPayUnifiedOrderV3Request request = new WxPayUnifiedOrderV3Request();
- request.setOutTradeNo(reqDTO.getOutTradeNo());
- request.setDescription(reqDTO.getSubject());
- request.setAmount(new WxPayUnifiedOrderV3Request.Amount().setTotal(reqDTO.getPrice())); // 单位分
- request.setTimeExpire(formatDateV3(reqDTO.getExpireTime()));
- request.setSceneInfo(new WxPayUnifiedOrderV3Request.SceneInfo().setPayerClientIp(reqDTO.getUserIp()));
- request.setNotifyUrl(reqDTO.getNotifyUrl());
- return request;
- }
-
- @Override
- public PayOrderRespDTO doParseOrderNotify(Map params, String body) throws WxPayException {
- switch (config.getApiVersion()) {
- case API_VERSION_V2:
- return doParseOrderNotifyV2(body);
- case WxPayClientConfig.API_VERSION_V3:
- return doParseOrderNotifyV3(body);
- default:
- throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
- }
- }
-
- private PayOrderRespDTO doParseOrderNotifyV2(String body) throws WxPayException {
- // 1. 解析回调
- WxPayOrderNotifyResult response = client.parseOrderNotifyResult(body);
- // 2. 构建结果
- // V2 微信支付的回调,只有 SUCCESS 支付成功、CLOSED 支付失败两种情况,无需像支付宝一样解析的比较复杂
- Integer status = Objects.equals(response.getResultCode(), "SUCCESS") ?
- PayOrderStatusRespEnum.SUCCESS.getStatus() : PayOrderStatusRespEnum.CLOSED.getStatus();
- return PayOrderRespDTO.of(status, response.getTransactionId(), response.getOpenid(), parseDateV2(response.getTimeEnd()),
- response.getOutTradeNo(), body);
- }
-
- private PayOrderRespDTO doParseOrderNotifyV3(String body) throws WxPayException {
- // 1. 解析回调
- WxPayOrderNotifyV3Result response = client.parseOrderNotifyV3Result(body, null);
- WxPayOrderNotifyV3Result.DecryptNotifyResult result = response.getResult();
- // 2. 构建结果
- Integer status = parseStatus(result.getTradeState());
- String openid = result.getPayer() != null ? result.getPayer().getOpenid() : null;
- return PayOrderRespDTO.of(status, result.getTransactionId(), openid, parseDateV3(result.getSuccessTime()),
- result.getOutTradeNo(), body);
- }
-
- @Override
- protected PayOrderRespDTO doGetOrder(String outTradeNo) throws Throwable {
- try {
- switch (config.getApiVersion()) {
- case API_VERSION_V2:
- return doGetOrderV2(outTradeNo);
- case WxPayClientConfig.API_VERSION_V3:
- return doGetOrderV3(outTradeNo);
- default:
- throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
- }
- } catch (WxPayException e) {
- if (ObjectUtils.equalsAny(e.getErrCode(), "ORDERNOTEXIST", "ORDER_NOT_EXIST")) {
- String errorCode = getErrorCode(e);
- String errorMessage = getErrorMessage(e);
- return PayOrderRespDTO.closedOf(errorCode, errorMessage,
- outTradeNo, e.getXmlString());
- }
- throw e;
- }
- }
-
- private PayOrderRespDTO doGetOrderV2(String outTradeNo) throws WxPayException {
- // 构建 WxPayUnifiedOrderRequest 对象
- WxPayOrderQueryRequest request = WxPayOrderQueryRequest.newBuilder()
- .outTradeNo(outTradeNo).build();
- // 执行请求
- WxPayOrderQueryResult response = client.queryOrder(request);
-
- // 转换结果
- Integer status = parseStatus(response.getTradeState());
- return PayOrderRespDTO.of(status, response.getTransactionId(), response.getOpenid(), parseDateV2(response.getTimeEnd()),
- outTradeNo, response);
- }
-
- private PayOrderRespDTO doGetOrderV3(String outTradeNo) throws WxPayException {
- // 构建 WxPayUnifiedOrderRequest 对象
- WxPayOrderQueryV3Request request = new WxPayOrderQueryV3Request()
- .setOutTradeNo(outTradeNo);
- // 执行请求
- WxPayOrderQueryV3Result response = client.queryOrderV3(request);
-
- // 转换结果
- Integer status = parseStatus(response.getTradeState());
- String openid = response.getPayer() != null ? response.getPayer().getOpenid() : null;
- return PayOrderRespDTO.of(status, response.getTransactionId(), openid, parseDateV3(response.getSuccessTime()),
- outTradeNo, response);
- }
-
- private static Integer parseStatus(String tradeState) {
- switch (tradeState) {
- case "NOTPAY":
- case "USERPAYING": // 支付中,等待用户输入密码(条码支付独有)
- return PayOrderStatusRespEnum.WAITING.getStatus();
- case "SUCCESS":
- return PayOrderStatusRespEnum.SUCCESS.getStatus();
- case "REFUND":
- return PayOrderStatusRespEnum.REFUND.getStatus();
- case "CLOSED":
- case "REVOKED": // 已撤销(刷卡支付独有)
- case "PAYERROR": // 支付失败(其它原因,如银行返回失败)
- return PayOrderStatusRespEnum.CLOSED.getStatus();
- default:
- throw new IllegalArgumentException(StrUtil.format("未知的支付状态({})", tradeState));
- }
- }
-
- // ============ 退款相关 ==========
-
- @Override
- protected PayRefundRespDTO doUnifiedRefund(PayRefundUnifiedReqDTO reqDTO) throws Throwable {
- try {
- switch (config.getApiVersion()) {
- case API_VERSION_V2:
- return doUnifiedRefundV2(reqDTO);
- case WxPayClientConfig.API_VERSION_V3:
- return doUnifiedRefundV3(reqDTO);
- default:
- throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
- }
- } catch (WxPayException e) {
- String errorCode = getErrorCode(e);
- String errorMessage = getErrorMessage(e);
- return PayRefundRespDTO.failureOf(errorCode, errorMessage,
- reqDTO.getOutTradeNo(), e.getXmlString());
- }
- }
-
- private PayRefundRespDTO doUnifiedRefundV2(PayRefundUnifiedReqDTO reqDTO) throws Throwable {
- // 1. 构建 WxPayRefundRequest 请求
- WxPayRefundRequest request = new WxPayRefundRequest()
- .setOutTradeNo(reqDTO.getOutTradeNo())
- .setOutRefundNo(reqDTO.getOutRefundNo())
- .setRefundFee(reqDTO.getRefundPrice())
- .setRefundDesc(reqDTO.getReason())
- .setTotalFee(reqDTO.getPayPrice())
- .setNotifyUrl(reqDTO.getNotifyUrl());
- // 2.1 执行请求
- WxPayRefundResult response = client.refundV2(request);
- // 2.2 创建返回结果
- if (Objects.equals("SUCCESS", response.getResultCode())) { // V2 情况下,不直接返回退款成功,而是等待异步通知
- return PayRefundRespDTO.waitingOf(response.getRefundId(),
- reqDTO.getOutRefundNo(), response);
- }
- return PayRefundRespDTO.failureOf(reqDTO.getOutRefundNo(), response);
- }
-
- private PayRefundRespDTO doUnifiedRefundV3(PayRefundUnifiedReqDTO reqDTO) throws Throwable {
- // 1. 构建 WxPayRefundRequest 请求
- WxPayRefundV3Request request = new WxPayRefundV3Request()
- .setOutTradeNo(reqDTO.getOutTradeNo())
- .setOutRefundNo(reqDTO.getOutRefundNo())
- .setAmount(new WxPayRefundV3Request.Amount().setRefund(reqDTO.getRefundPrice())
- .setTotal(reqDTO.getPayPrice()).setCurrency("CNY"))
- .setReason(reqDTO.getReason())
- .setNotifyUrl(reqDTO.getNotifyUrl());
- // 2.1 执行请求
- WxPayRefundV3Result response = client.refundV3(request);
- // 2.2 创建返回结果
- if (Objects.equals("SUCCESS", response.getStatus())) {
- return PayRefundRespDTO.successOf(response.getRefundId(), parseDateV3(response.getSuccessTime()),
- reqDTO.getOutRefundNo(), response);
- }
- if (Objects.equals("PROCESSING", response.getStatus())) {
- return PayRefundRespDTO.waitingOf(response.getRefundId(),
- reqDTO.getOutRefundNo(), response);
- }
- return PayRefundRespDTO.failureOf(reqDTO.getOutRefundNo(), response);
- }
-
- @Override
- public PayRefundRespDTO doParseRefundNotify(Map params, String body) throws WxPayException {
- switch (config.getApiVersion()) {
- case API_VERSION_V2:
- return doParseRefundNotifyV2(body);
- case WxPayClientConfig.API_VERSION_V3:
- return parseRefundNotifyV3(body);
- default:
- throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
- }
- }
-
- private PayRefundRespDTO doParseRefundNotifyV2(String body) throws WxPayException {
- // 1. 解析回调
- WxPayRefundNotifyResult response = client.parseRefundNotifyResult(body);
- WxPayRefundNotifyResult.ReqInfo result = response.getReqInfo();
- // 2. 构建结果
- if (Objects.equals("SUCCESS", result.getRefundStatus())) {
- return PayRefundRespDTO.successOf(result.getRefundId(), parseDateV2B(result.getSuccessTime()),
- result.getOutRefundNo(), response);
- }
- return PayRefundRespDTO.failureOf(result.getOutRefundNo(), response);
- }
-
- private PayRefundRespDTO parseRefundNotifyV3(String body) throws WxPayException {
- // 1. 解析回调
- WxPayRefundNotifyV3Result response = client.parseRefundNotifyV3Result(body, null);
- WxPayRefundNotifyV3Result.DecryptNotifyResult result = response.getResult();
- // 2. 构建结果
- if (Objects.equals("SUCCESS", result.getRefundStatus())) {
- return PayRefundRespDTO.successOf(result.getRefundId(), parseDateV3(result.getSuccessTime()),
- result.getOutRefundNo(), response);
- }
- return PayRefundRespDTO.failureOf(result.getOutRefundNo(), response);
- }
-
- @Override
- protected PayRefundRespDTO doGetRefund(String outTradeNo, String outRefundNo) throws WxPayException {
- try {
- switch (config.getApiVersion()) {
- case API_VERSION_V2:
- return doGetRefundV2(outTradeNo, outRefundNo);
- case WxPayClientConfig.API_VERSION_V3:
- return doGetRefundV3(outTradeNo, outRefundNo);
- default:
- throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion()));
- }
- } catch (WxPayException e) {
- if (ObjectUtils.equalsAny(e.getErrCode(), "REFUNDNOTEXIST", "RESOURCE_NOT_EXISTS")) {
- String errorCode = getErrorCode(e);
- String errorMessage = getErrorMessage(e);
- return PayRefundRespDTO.failureOf(errorCode, errorMessage,
- outRefundNo, e.getXmlString());
- }
- throw e;
- }
- }
-
- private PayRefundRespDTO doGetRefundV2(String outTradeNo, String outRefundNo) throws WxPayException {
- // 1. 构建 WxPayRefundRequest 请求
- WxPayRefundQueryRequest request = WxPayRefundQueryRequest.newBuilder()
- .outTradeNo(outTradeNo)
- .outRefundNo(outRefundNo)
- .build();
- // 2.1 执行请求
- WxPayRefundQueryResult response = client.refundQuery(request);
- // 2.2 创建返回结果
- if (!Objects.equals("SUCCESS", response.getResultCode())) {
- return PayRefundRespDTO.waitingOf(null,
- outRefundNo, response);
- }
- WxPayRefundQueryResult.RefundRecord refund = CollUtil.findOne(response.getRefundRecords(),
- record -> record.getOutRefundNo().equals(outRefundNo));
- if (refund == null) {
- return PayRefundRespDTO.failureOf(outRefundNo, response);
- }
- switch (refund.getRefundStatus()) {
- case "SUCCESS":
- return PayRefundRespDTO.successOf(refund.getRefundId(), parseDateV2B(refund.getRefundSuccessTime()),
- outRefundNo, response);
- case "PROCESSING":
- return PayRefundRespDTO.waitingOf(refund.getRefundId(),
- outRefundNo, response);
- case "CHANGE": // 退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,资金回流到商户的现金帐号,需要商户人工干预,通过线下或者财付通转账的方式进行退款
- case "FAIL":
- return PayRefundRespDTO.failureOf(outRefundNo, response);
- default:
- throw new IllegalArgumentException(String.format("未知的退款状态(%s)", refund.getRefundStatus()));
- }
- }
-
- private PayRefundRespDTO doGetRefundV3(String outTradeNo, String outRefundNo) throws WxPayException {
- // 1. 构建 WxPayRefundRequest 请求
- WxPayRefundQueryV3Request request = new WxPayRefundQueryV3Request();
- request.setOutRefundNo(outRefundNo);
- // 2.1 执行请求
- WxPayRefundQueryV3Result response = client.refundQueryV3(request);
- // 2.2 创建返回结果
- switch (response.getStatus()) {
- case "SUCCESS":
- return PayRefundRespDTO.successOf(response.getRefundId(), parseDateV3(response.getSuccessTime()),
- outRefundNo, response);
- case "PROCESSING":
- return PayRefundRespDTO.waitingOf(response.getRefundId(),
- outRefundNo, response);
- case "ABNORMAL": // 退款异常
- case "CLOSED":
- return PayRefundRespDTO.failureOf(outRefundNo, response);
- default:
- throw new IllegalArgumentException(String.format("未知的退款状态(%s)", response.getStatus()));
- }
- }
-
- // ========== 各种工具方法 ==========
-
- static String formatDateV2(LocalDateTime time) {
- return TemporalAccessorUtil.format(time.atZone(ZoneId.systemDefault()), PURE_DATETIME_PATTERN);
- }
-
- static LocalDateTime parseDateV2(String time) {
- return LocalDateTimeUtil.parse(time, PURE_DATETIME_PATTERN);
- }
-
- static LocalDateTime parseDateV2B(String time) {
- return LocalDateTimeUtil.parse(time, NORM_DATETIME_PATTERN);
- }
-
- static String formatDateV3(LocalDateTime time) {
- return TemporalAccessorUtil.format(time.atZone(ZoneId.systemDefault()), UTC_WITH_XXX_OFFSET_PATTERN);
- }
-
- static LocalDateTime parseDateV3(String time) {
- return LocalDateTimeUtil.parse(time, UTC_WITH_XXX_OFFSET_PATTERN);
- }
-
- static String getErrorCode(WxPayException e) {
- if (StrUtil.isNotEmpty(e.getErrCode())) {
- return e.getErrCode();
- }
- if (StrUtil.isNotEmpty(e.getCustomErrorMsg())) {
- return "CUSTOM_ERROR";
- }
- return e.getReturnCode();
- }
-
- static String getErrorMessage(WxPayException e) {
- if (StrUtil.isNotEmpty(e.getErrCode())) {
- return e.getErrCodeDes();
- }
- if (StrUtil.isNotEmpty(e.getCustomErrorMsg())) {
- return e.getCustomErrorMsg();
- }
- return e.getReturnMsg();
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxAppPayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxAppPayClient.java
deleted file mode 100644
index 5da51a4a..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxAppPayClient.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package com.win.framework.pay.core.client.impl.weixin;
-
-import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO;
-import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
-import com.win.framework.pay.core.enums.channel.PayChannelEnum;
-import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum;
-import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
-import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
-import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request;
-import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result;
-import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum;
-import com.github.binarywang.wxpay.constant.WxPayConstants;
-import com.github.binarywang.wxpay.exception.WxPayException;
-import lombok.extern.slf4j.Slf4j;
-
-import static com.win.framework.common.util.json.JsonUtils.toJsonString;
-
-/**
- * 微信支付【App 支付】的 PayClient 实现类
- *
- * 文档:App 支付
- *
- * // TODO 芋艿:未详细测试,因为手头没 App
- *
- * @author 芋道源码
- */
-@Slf4j
-public class WxAppPayClient extends AbstractWxPayClient {
-
- public WxAppPayClient(Long channelId, WxPayClientConfig config) {
- super(channelId, PayChannelEnum.WX_APP.getCode(), config);
- }
-
- @Override
- protected void doInit() {
- super.doInit(WxPayConstants.TradeType.APP);
- }
-
- @Override
- protected PayOrderRespDTO doUnifiedOrderV2(PayOrderUnifiedReqDTO reqDTO) throws WxPayException {
- // 构建 WxPayUnifiedOrderRequest 对象
- WxPayUnifiedOrderRequest request = buildPayUnifiedOrderRequestV2(reqDTO);
- // 执行请求
- WxPayMpOrderResult response = client.createOrder(request);
-
- // 转换结果
- return PayOrderRespDTO.waitingOf(PayOrderDisplayModeEnum.APP.getMode(), toJsonString(response),
- reqDTO.getOutTradeNo(), response);
- }
-
- @Override
- protected PayOrderRespDTO doUnifiedOrderV3(PayOrderUnifiedReqDTO reqDTO) throws WxPayException {
- // 构建 WxPayUnifiedOrderV3Request 对象
- WxPayUnifiedOrderV3Request request = buildPayUnifiedOrderRequestV3(reqDTO);
- // 执行请求
- WxPayUnifiedOrderV3Result.AppResult response = client.createOrderV3(TradeTypeEnum.APP, request);
-
- // 转换结果
- return PayOrderRespDTO.waitingOf(PayOrderDisplayModeEnum.APP.getMode(), toJsonString(response),
- reqDTO.getOutTradeNo(), response);
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxBarPayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxBarPayClient.java
deleted file mode 100644
index 7071eb7e..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxBarPayClient.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package com.win.framework.pay.core.client.impl.weixin;
-
-import cn.hutool.core.map.MapUtil;
-import cn.hutool.core.thread.ThreadUtil;
-import cn.hutool.core.util.StrUtil;
-import com.win.framework.common.util.date.LocalDateTimeUtils;
-import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO;
-import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
-import com.win.framework.pay.core.enums.channel.PayChannelEnum;
-import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum;
-import com.github.binarywang.wxpay.bean.request.WxPayMicropayRequest;
-import com.github.binarywang.wxpay.bean.result.WxPayMicropayResult;
-import com.github.binarywang.wxpay.constant.WxPayConstants;
-import com.github.binarywang.wxpay.exception.WxPayException;
-import lombok.extern.slf4j.Slf4j;
-
-import java.time.Duration;
-import java.time.LocalDateTime;
-import java.util.concurrent.TimeUnit;
-
-import static com.win.framework.common.exception.util.ServiceExceptionUtil.invalidParamException;
-import static com.win.framework.common.util.json.JsonUtils.toJsonString;
-
-/**
- * 微信支付【付款码支付】的 PayClient 实现类
- *
- * 文档:付款码支付
- *
- * @author 芋道源码
- */
-@Slf4j
-public class WxBarPayClient extends AbstractWxPayClient {
-
- /**
- * 微信付款码的过期时间
- */
- private static final Duration AUTH_CODE_EXPIRE = Duration.ofMinutes(3);
-
- public WxBarPayClient(Long channelId, WxPayClientConfig config) {
- super(channelId, PayChannelEnum.WX_BAR.getCode(), config);
- }
-
- @Override
- protected void doInit() {
- super.doInit(WxPayConstants.TradeType.MICROPAY);
- }
-
- @Override
- protected PayOrderRespDTO doUnifiedOrderV2(PayOrderUnifiedReqDTO reqDTO) throws WxPayException {
- // 由于付款码需要不断轮询,所以需要在较短的时间完成支付
- LocalDateTime expireTime = LocalDateTimeUtils.addTime(AUTH_CODE_EXPIRE);
- if (expireTime.isAfter(reqDTO.getExpireTime())) {
- expireTime = reqDTO.getExpireTime();
- }
- // 构建 WxPayMicropayRequest 对象
- WxPayMicropayRequest request = WxPayMicropayRequest.newBuilder()
- .outTradeNo(reqDTO.getOutTradeNo())
- .body(reqDTO.getSubject())
- .detail(reqDTO.getBody())
- .totalFee(reqDTO.getPrice()) // 单位分
- .timeExpire(formatDateV2(expireTime))
- .spbillCreateIp(reqDTO.getUserIp())
- .authCode(getAuthCode(reqDTO))
- .build();
- // 执行请求,重试直到失败(过期),或者成功
- WxPayException lastWxPayException = null;
- for (int i = 1; i < Byte.MAX_VALUE; i++) {
- try {
- WxPayMicropayResult response = client.micropay(request);
- // 支付成功,例如说:1)用户输入了密码;2)用户免密支付
- return PayOrderRespDTO.successOf(response.getTransactionId(), response.getOpenid(), parseDateV2(response.getTimeEnd()),
- response.getOutTradeNo(), response)
- .setDisplayMode(PayOrderDisplayModeEnum.BAR_CODE.getMode());
- } catch (WxPayException ex) {
- lastWxPayException = ex;
- // 如果不满足这 3 种任一的,则直接抛出 WxPayException 异常,不仅需处理
- // 1. SYSTEMERROR:接口返回错误:请立即调用被扫订单结果查询API,查询当前订单状态,并根据订单的状态决定下一步的操作。
- // 2. USERPAYING:用户支付中,需要输入密码:等待 5 秒,然后调用被扫订单结果查询 API,查询当前订单的不同状态,决定下一步的操作。
- // 3. BANKERROR:银行系统异常:请立即调用被扫订单结果查询 API,查询当前订单的不同状态,决定下一步的操作。
- if (!StrUtil.equalsAny(ex.getErrCode(), "SYSTEMERROR", "USERPAYING", "BANKERROR")) {
- throw ex;
- }
- // 等待 5 秒,继续下一轮重新发起支付
- log.info("[doUnifiedOrderV2][发起微信 Bar 支付第({})失败,等待下一轮重试,请求({}),响应({})]", i,
- toJsonString(request), ex.getMessage());
- ThreadUtil.sleep(5, TimeUnit.SECONDS);
- }
- }
- throw lastWxPayException;
- }
-
- @Override
- protected PayOrderRespDTO doUnifiedOrderV3(PayOrderUnifiedReqDTO reqDTO) throws WxPayException {
- return doUnifiedOrderV2(reqDTO);
- }
-
- // ========== 各种工具方法 ==========
-
- static String getAuthCode(PayOrderUnifiedReqDTO reqDTO) {
- String authCode = MapUtil.getStr(reqDTO.getChannelExtras(), "authCode");
- if (StrUtil.isEmpty(authCode)) {
- throw invalidParamException("支付请求的 authCode 不能为空!");
- }
- return authCode;
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxLitePayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxLitePayClient.java
deleted file mode 100644
index 0b315f74..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxLitePayClient.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.win.framework.pay.core.client.impl.weixin;
-
-import com.win.framework.pay.core.enums.channel.PayChannelEnum;
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 微信支付【小程序】的 PayClient 实现类
- *
- * 由于公众号和小程序的微信支付逻辑一致,所以直接进行继承
- *
- * 文档:JSAPI 下单>
- *
- * @author zwy
- */
-@Slf4j
-public class WxLitePayClient extends WxPubPayClient {
-
- public WxLitePayClient(Long channelId, WxPayClientConfig config) {
- super(channelId, PayChannelEnum.WX_LITE.getCode(), config);
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxNativePayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxNativePayClient.java
deleted file mode 100644
index 59c3e089..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxNativePayClient.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package com.win.framework.pay.core.client.impl.weixin;
-
-import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO;
-import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
-import com.win.framework.pay.core.enums.channel.PayChannelEnum;
-import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum;
-import com.github.binarywang.wxpay.bean.order.WxPayNativeOrderResult;
-import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
-import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request;
-import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum;
-import com.github.binarywang.wxpay.constant.WxPayConstants;
-import com.github.binarywang.wxpay.exception.WxPayException;
-import lombok.extern.slf4j.Slf4j;
-
-/**
- * 微信支付【Native 二维码】的 PayClient 实现类
- *
- * 文档:Native 下单
- *
- * @author zwy
- */
-@Slf4j
-public class WxNativePayClient extends AbstractWxPayClient {
-
- public WxNativePayClient(Long channelId, WxPayClientConfig config) {
- super(channelId, PayChannelEnum.WX_NATIVE.getCode(), config);
- }
-
- @Override
- protected void doInit() {
- super.doInit(WxPayConstants.TradeType.NATIVE);
- }
-
- @Override
- protected PayOrderRespDTO doUnifiedOrderV2(PayOrderUnifiedReqDTO reqDTO) throws WxPayException {
- // 构建 WxPayUnifiedOrderRequest 对象
- WxPayUnifiedOrderRequest request = buildPayUnifiedOrderRequestV2(reqDTO);
- // 执行请求
- WxPayNativeOrderResult response = client.createOrder(request);
-
- // 转换结果
- return PayOrderRespDTO.waitingOf(PayOrderDisplayModeEnum.QR_CODE.getMode(), response.getCodeUrl(),
- reqDTO.getOutTradeNo(), response);
- }
-
- @Override
- protected PayOrderRespDTO doUnifiedOrderV3(PayOrderUnifiedReqDTO reqDTO) throws WxPayException {
- // 构建 WxPayUnifiedOrderV3Request 对象
- WxPayUnifiedOrderV3Request request = buildPayUnifiedOrderRequestV3(reqDTO);
- // 执行请求
- String response = client.createOrderV3(TradeTypeEnum.NATIVE, request);
-
- // 转换结果
- return PayOrderRespDTO.waitingOf(PayOrderDisplayModeEnum.QR_CODE.getMode(), response,
- reqDTO.getOutTradeNo(), response);
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxPayClientConfig.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxPayClientConfig.java
deleted file mode 100644
index c6d2b93a..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxPayClientConfig.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package com.win.framework.pay.core.client.impl.weixin;
-
-import cn.hutool.core.io.IoUtil;
-import com.win.framework.common.util.validation.ValidationUtils;
-import com.win.framework.pay.core.client.PayClientConfig;
-import lombok.Data;
-
-import javax.validation.Validator;
-import javax.validation.constraints.NotBlank;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-
-/**
- * 微信支付的 PayClientConfig 实现类
- * 属性主要来自 {@link com.github.binarywang.wxpay.config.WxPayConfig} 的必要属性
- *
- * @author 芋道源码
- */
-@Data
-public class WxPayClientConfig implements PayClientConfig {
-
- /**
- * API 版本 - V2
- *
- * V2 协议说明
- */
- public static final String API_VERSION_V2 = "v2";
- /**
- * API 版本 - V3
- *
- * V3 协议说明
- */
- public static final String API_VERSION_V3 = "v3";
-
- /**
- * 公众号或者小程序的 appid
- *
- * 只有公众号或小程序需要该字段
- */
- @NotBlank(message = "APPID 不能为空", groups = {V2.class, V3.class})
- private String appId;
- /**
- * 商户号
- */
- @NotBlank(message = "商户号不能为空", groups = {V2.class, V3.class})
- private String mchId;
- /**
- * API 版本
- */
- @NotBlank(message = "API 版本不能为空", groups = {V2.class, V3.class})
- private String apiVersion;
-
- // ========== V2 版本的参数 ==========
-
- /**
- * 商户密钥
- */
- @NotBlank(message = "商户密钥不能为空", groups = V2.class)
- private String mchKey;
- /**
- * apiclient_cert.p12 证书文件的对应字符串【base64 格式】
- *
- * 为什么采用 base64 格式?因为 p12 读取后是二进制,需要转换成 base64 格式才好传输和存储
- */
- @NotBlank(message = "apiclient_cert.p12 不能为空", groups = V2.class)
- private String keyContent;
-
- // ========== V3 版本的参数 ==========
- /**
- * apiclient_key.pem 证书文件的对应字符串
- */
- @NotBlank(message = "apiclient_key 不能为空", groups = V3.class)
- private String privateKeyContent;
- /**
- * apiclient_cert.pem 证书文件的对应的字符串
- */
- @NotBlank(message = "apiclient_cert 不能为空", groups = V3.class)
- private String privateCertContent;
- /**
- * apiV3 密钥值
- */
- @NotBlank(message = "apiV3 密钥值不能为空", groups = V3.class)
- private String apiV3Key;
-
- /**
- * 分组校验 v2版本
- */
- public interface V2 {
- }
-
- /**
- * 分组校验 v3版本
- */
- public interface V3 {
- }
-
- @Override
- public void validate(Validator validator) {
- ValidationUtils.validate(validator, this,
- API_VERSION_V2.equals(this.getApiVersion()) ? V2.class : V3.class);
- }
-
- public static void main(String[] args) throws FileNotFoundException {
- String path = "/Users/yunai/Downloads/wx_pay/apiclient_cert.p12";
- /// String path = "/Users/yunai/Downloads/wx_pay/apiclient_key.pem";
- /// String path = "/Users/yunai/Downloads/wx_pay/apiclient_cert.pem";
- System.out.println(IoUtil.readUtf8(new FileInputStream(path)));
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxPubPayClient.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxPubPayClient.java
deleted file mode 100644
index 0c4e98fe..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/client/impl/weixin/WxPubPayClient.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package com.win.framework.pay.core.client.impl.weixin;
-
-import cn.hutool.core.map.MapUtil;
-import cn.hutool.core.util.StrUtil;
-import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO;
-import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
-import com.win.framework.pay.core.enums.channel.PayChannelEnum;
-import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum;
-import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
-import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
-import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request;
-import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result;
-import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum;
-import com.github.binarywang.wxpay.constant.WxPayConstants;
-import com.github.binarywang.wxpay.exception.WxPayException;
-import lombok.extern.slf4j.Slf4j;
-
-import static com.win.framework.common.exception.util.ServiceExceptionUtil.invalidParamException;
-import static com.win.framework.common.util.json.JsonUtils.toJsonString;
-
-/**
- * 微信支付(公众号)的 PayClient 实现类
- *
- * 文档:JSAPI 下单>
- *
- * @author 芋道源码
- */
-@Slf4j
-public class WxPubPayClient extends AbstractWxPayClient {
-
- public WxPubPayClient(Long channelId, WxPayClientConfig config) {
- super(channelId, PayChannelEnum.WX_PUB.getCode(), config);
- }
-
- protected WxPubPayClient(Long channelId, String channelCode, WxPayClientConfig config) {
- super(channelId, channelCode, config);
- }
-
- @Override
- protected void doInit() {
- super.doInit(WxPayConstants.TradeType.JSAPI);
- }
-
- @Override
- protected PayOrderRespDTO doUnifiedOrderV2(PayOrderUnifiedReqDTO reqDTO) throws WxPayException {
- // 构建 WxPayUnifiedOrderRequest 对象
- WxPayUnifiedOrderRequest request = buildPayUnifiedOrderRequestV2(reqDTO)
- .setOpenid(getOpenid(reqDTO));
- // 执行请求
- WxPayMpOrderResult response = client.createOrder(request);
-
- // 转换结果
- return PayOrderRespDTO.waitingOf(PayOrderDisplayModeEnum.APP.getMode(), toJsonString(response),
- reqDTO.getOutTradeNo(), response);
- }
-
- @Override
- protected PayOrderRespDTO doUnifiedOrderV3(PayOrderUnifiedReqDTO reqDTO) throws WxPayException {
- // 构建 WxPayUnifiedOrderRequest 对象
- WxPayUnifiedOrderV3Request request = buildPayUnifiedOrderRequestV3(reqDTO)
- .setPayer(new WxPayUnifiedOrderV3Request.Payer().setOpenid(getOpenid(reqDTO)));
- // 执行请求
- WxPayUnifiedOrderV3Result.JsapiResult response = client.createOrderV3(TradeTypeEnum.JSAPI, request);
-
- // 转换结果
- return PayOrderRespDTO.waitingOf(PayOrderDisplayModeEnum.APP.getMode(), toJsonString(response),
- reqDTO.getOutTradeNo(), response);
- }
-
- // ========== 各种工具方法 ==========
-
- static String getOpenid(PayOrderUnifiedReqDTO reqDTO) {
- String openid = MapUtil.getStr(reqDTO.getChannelExtras(), "openid");
- if (StrUtil.isEmpty(openid)) {
- throw invalidParamException("支付请求的 openid 不能为空!");
- }
- return openid;
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/channel/PayChannelEnum.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/channel/PayChannelEnum.java
deleted file mode 100644
index 758fdb56..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/channel/PayChannelEnum.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package com.win.framework.pay.core.enums.channel;
-
-import cn.hutool.core.util.ArrayUtil;
-import com.win.framework.pay.core.client.impl.NonePayClientConfig;
-import com.win.framework.pay.core.client.PayClientConfig;
-import com.win.framework.pay.core.client.impl.alipay.AlipayPayClientConfig;
-import com.win.framework.pay.core.client.impl.weixin.WxPayClientConfig;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-/**
- * 支付渠道的编码的枚举
- *
- * @author 芋道源码
- */
-@Getter
-@AllArgsConstructor
-public enum PayChannelEnum {
-
- WX_PUB("wx_pub", "微信 JSAPI 支付", WxPayClientConfig.class), // 公众号网页
- WX_LITE("wx_lite", "微信小程序支付", WxPayClientConfig.class),
- WX_APP("wx_app", "微信 App 支付", WxPayClientConfig.class),
- WX_NATIVE("wx_native", "微信 Native 支付", WxPayClientConfig.class),
- WX_BAR("wx_bar", "微信付款码支付", WxPayClientConfig.class),
-
- ALIPAY_PC("alipay_pc", "支付宝 PC 网站支付", AlipayPayClientConfig.class),
- ALIPAY_WAP("alipay_wap", "支付宝 Wap 网站支付", AlipayPayClientConfig.class),
- ALIPAY_APP("alipay_app", "支付宝App 支付", AlipayPayClientConfig.class),
- ALIPAY_QR("alipay_qr", "支付宝扫码支付", AlipayPayClientConfig.class),
- ALIPAY_BAR("alipay_bar", "支付宝条码支付", AlipayPayClientConfig.class),
-
- MOCK("mock", "模拟支付", NonePayClientConfig.class),
-
- WALLET("wallet", "钱包支付", NonePayClientConfig.class);
-
- /**
- * 编码
- *
- * 参考 支付渠道属性值
- */
- private final String code;
- /**
- * 名字
- */
- private final String name;
-
- /**
- * 配置类
- */
- private final Class extends PayClientConfig> configClass;
-
- /**
- * 微信支付
- */
- public static final String WECHAT = "WECHAT";
-
- /**
- * 支付宝支付
- */
- public static final String ALIPAY = "ALIPAY";
-
- public static PayChannelEnum getByCode(String code) {
- return ArrayUtil.firstMatch(o -> o.getCode().equals(code), values());
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/order/PayOrderDisplayModeEnum.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/order/PayOrderDisplayModeEnum.java
deleted file mode 100644
index 47e2112a..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/order/PayOrderDisplayModeEnum.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.win.framework.pay.core.enums.order;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-/**
- * 支付 UI 展示模式
- *
- * @author 芋道源码
- */
-@Getter
-@AllArgsConstructor
-public enum PayOrderDisplayModeEnum {
-
- URL("url"), // Redirect 跳转链接的方式
- IFRAME("iframe"), // IFrame 内嵌链接的方式【目前暂时用不到】
- FORM("form"), // HTML 表单提交
- QR_CODE("qr_code"), // 二维码的文字内容
- QR_CODE_URL("qr_code_url"), // 二维码的图片链接
- BAR_CODE("bar_code"), // 条形码
- APP("app"), // 应用:Android、iOS、微信小程序、微信公众号等,需要做自定义处理的
- ;
-
- /**
- * 展示模式
- */
- private final String mode;
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/order/PayOrderStatusRespEnum.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/order/PayOrderStatusRespEnum.java
deleted file mode 100644
index 4ed2cefc..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/order/PayOrderStatusRespEnum.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.win.framework.pay.core.enums.order;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.util.Objects;
-
-/**
- * 渠道的支付状态枚举
- *
- * @author 芋道源码
- */
-@Getter
-@AllArgsConstructor
-public enum PayOrderStatusRespEnum {
-
- WAITING(0, "未支付"),
- SUCCESS(10, "支付成功"),
- REFUND(20, "已退款"),
- CLOSED(30, "支付关闭"),
- ;
-
- private final Integer status;
- private final String name;
-
- /**
- * 判断是否支付成功
- *
- * @param status 状态
- * @return 是否支付成功
- */
- public static boolean isSuccess(Integer status) {
- return Objects.equals(status, SUCCESS.getStatus());
- }
-
- /**
- * 判断是否已退款
- *
- * @param status 状态
- * @return 是否支付成功
- */
- public static boolean isRefund(Integer status) {
- return Objects.equals(status, REFUND.getStatus());
- }
-
- /**
- * 判断是否支付关闭
- *
- * @param status 状态
- * @return 是否支付关闭
- */
- public static boolean isClosed(Integer status) {
- return Objects.equals(status, CLOSED.getStatus());
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/refund/PayRefundStatusRespEnum.java b/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/refund/PayRefundStatusRespEnum.java
deleted file mode 100644
index 4844b7d3..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/main/java/com/win/framework/pay/core/enums/refund/PayRefundStatusRespEnum.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.win.framework.pay.core.enums.refund;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.util.Objects;
-
-/**
- * 渠道的退款状态枚举
- *
- * @author jason
- */
-@Getter
-@AllArgsConstructor
-public enum PayRefundStatusRespEnum {
-
- WAITING(0, "等待退款"),
- SUCCESS(10, "退款成功"),
- FAILURE(20, "退款失败");
-
- private final Integer status;
- private final String name;
-
- public static boolean isSuccess(Integer status) {
- return Objects.equals(status, SUCCESS.getStatus());
- }
-
- public static boolean isFailure(Integer status) {
- return Objects.equals(status, FAILURE.getStatus());
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/win-framework/win-spring-boot-starter-biz-pay/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
deleted file mode 100644
index 5dcd61e3..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
+++ /dev/null
@@ -1 +0,0 @@
-com.win.framework.pay.config.WinPayAutoConfiguration
\ No newline at end of file
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/PayClientFactoryImplIntegrationTest.java b/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/PayClientFactoryImplIntegrationTest.java
deleted file mode 100644
index 4bf6dca3..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/PayClientFactoryImplIntegrationTest.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package com.win.framework.pay.core.client.impl;
-
-import cn.hutool.core.io.IoUtil;
-import cn.hutool.core.util.RandomUtil;
-import com.win.framework.pay.core.client.PayClient;
-import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
-import com.win.framework.pay.core.client.impl.alipay.AlipayPayClientConfig;
-import com.win.framework.pay.core.client.impl.alipay.AlipayQrPayClient;
-import com.win.framework.pay.core.client.impl.alipay.AlipayWapPayClient;
-import com.win.framework.pay.core.client.impl.weixin.WxPayClientConfig;
-import com.win.framework.pay.core.client.impl.weixin.WxPubPayClient;
-import com.win.framework.pay.core.enums.channel.PayChannelEnum;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-
-/**
- * {@link PayClientFactoryImpl} 的集成测试
- *
- * @author 芋道源码
- */
-@Disabled
-public class PayClientFactoryImplIntegrationTest {
-
- private static final String SERVER_URL_SANDBOX = "https://openapi.alipaydev.com/gateway.do";
-
- private final PayClientFactoryImpl payClientFactory = new PayClientFactoryImpl();
-
- /**
- * {@link WxPubPayClient} 的 V2 版本
- */
- @Test
- public void testCreatePayClient_WX_PUB_V2() {
- // 创建配置
- WxPayClientConfig config = new WxPayClientConfig();
- config.setAppId("wx041349c6f39b268b");
- config.setMchId("1545083881");
- config.setApiVersion(WxPayClientConfig.API_VERSION_V2);
- config.setMchKey("0alL64UDQdlCwiKZ73ib7ypaIjMns06p");
- // 创建客户端
- Long channelId = RandomUtil.randomLong();
- payClientFactory.createOrUpdatePayClient(channelId, PayChannelEnum.WX_PUB.getCode(), config);
- PayClient client = payClientFactory.getPayClient(channelId);
- // 发起支付
- PayOrderUnifiedReqDTO reqDTO = buildPayOrderUnifiedReqDTO();
-// CommonResult> result = client.unifiedOrder(reqDTO);
-// System.out.println(result);
- }
-
- /**
- * {@link WxPubPayClient} 的 V3 版本
- */
- @Test
- public void testCreatePayClient_WX_PUB_V3() throws FileNotFoundException {
- // 创建配置
- WxPayClientConfig config = new WxPayClientConfig();
- config.setAppId("wx041349c6f39b268b");
- config.setMchId("1545083881");
- config.setApiVersion(WxPayClientConfig.API_VERSION_V3);
- config.setPrivateKeyContent(IoUtil.readUtf8(new FileInputStream("/Users/yunai/Downloads/wx_pay/apiclient_key.pem")));
- config.setPrivateCertContent(IoUtil.readUtf8(new FileInputStream("/Users/yunai/Downloads/wx_pay/apiclient_cert.pem")));
- config.setApiV3Key("joerVi8y5DJ3o4ttA0o1uH47Xz1u2Ase");
- // 创建客户端
- Long channelId = RandomUtil.randomLong();
- payClientFactory.createOrUpdatePayClient(channelId, PayChannelEnum.WX_PUB.getCode(), config);
- PayClient client = payClientFactory.getPayClient(channelId);
- // 发起支付
- PayOrderUnifiedReqDTO reqDTO = buildPayOrderUnifiedReqDTO();
-// CommonResult> result = client.unifiedOrder(reqDTO);
-// System.out.println(result);
- }
-
- /**
- * {@link AlipayQrPayClient}
- */
- @Test
- @SuppressWarnings("unchecked")
- public void testCreatePayClient_ALIPAY_QR() {
- // 创建配置
- AlipayPayClientConfig config = new AlipayPayClientConfig();
- config.setAppId("2021000118634035");
- config.setServerUrl(SERVER_URL_SANDBOX);
- config.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT);
- config.setPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsEV1cDupwJv890x84qbppUtRIfhaKSwSVN0thCcsDCaAsGR5MZslDkO8NCT9V4r2SVXjyY7eJUZlZd1M0C8T01Tg4UOx5LUbic0O3A1uJMy6V1n9IyYwbAW3AEZhBd5bSbPgrqvmv3NeWSTQT6Anxnllf+2iDH6zyA2fPl7cYyQtbZoDJQFGqr4F+cGh2R6akzRKNoBkAeMYwoY6es2lX8sJxCVPWUmxNUoL3tScwlSpd7Bxw0q9c/X01jMwuQ0+Va358zgFiGERTE6yD01eu40OBDXOYO3z++y+TAYHlQQ2toMO63trepo88X3xV3R44/1DH+k2pAm2IF5ixiLrAgMBAAECggEAPx3SoXcseaD7rmcGcE0p4SMfbsUDdkUSmBBbtfF0GzwnqNLkWa+mgE0rWt9SmXngTQH97vByAYmLPl1s3G82ht1V7Sk7yQMe74lhFllr8eEyTjeVx3dTK1EEM4TwN+936DTXdFsr4TELJEcJJdD0KaxcCcfBLRDs2wnitEFZ9N+GoZybVmY8w0e0MI7PLObUZ2l0X4RurQnfG9ZxjXjC7PkeMVv7cGGylpNFi3BbvkRhdhLPDC2E6wqnr9e7zk+hiENivAezXrtxtwKovzCtnWJ1r0IO14Rh47H509Ic0wFnj+o5YyUL4LdmpL7yaaH6fM7zcSLFjNZPHvZCKPwYcQKBgQDQFho98QvnL8ex4v6cry4VitGpjSXm1qP3vmMQk4rTsn8iPWtcxPjqGEqOQJjdi4Mi0VZKQOLFwlH0kl95wNrD/isJ4O1yeYfX7YAXApzHqYNINzM79HemO3Yx1qLMW3okRFJ9pPRzbQ9qkTpsaegsmyX316zOBhzGRYjKbutTYwKBgQCm7phr9XdFW5Vh+XR90mVs483nrLmMiDKg7YKxSLJ8amiDjzPejCn7i95Hah08P+2MIZLIPbh2VLacczR6ltRRzN5bg5etFuqSgfkuHyxpoDmpjbe08+Q2h8JBYqcC5Nhv1AKU4iOUhVLHo/FBAQliMcGc/J3eiYTFC7EsNx382QKBgClb20doe7cttgFTXswBvaUmfFm45kmla924B7SpvrQpDD/f+VDtDZRp05fGmxuduSjYdtA3aVtpLiTwWu22OUUvZZqHDGruYOO4Hvdz23mL5b4ayqImCwoNU4bAZIc9v18p/UNf3/55NNE3oGcf/bev9rH2OjCQ4nM+Ktwhg8CFAoGACSgvbkShzUkv0ZcIf9ppu+ZnJh1AdGgINvGwaJ8vQ0nm/8h8NOoFZ4oNoGc+wU5Ubops7dUM6FjPR5e+OjdJ4E7Xp7d5O4J1TaIZlCEbo5OpdhaTDDcQvrkFu+Z4eN0qzj+YAKjDAOOrXc4tbr5q0FsgXscwtcNfaBuzFVTUrUkCgYEAwzPnMNhWG3zOWLUs2QFA2GP4Y+J8cpUYfj6pbKKzeLwyG9qBwF1NJpN8m+q9q7V9P2LY+9Lp9e1mGsGeqt5HMEA3P6vIpcqLJLqE/4PBLLRzfccTcmqb1m71+erxTRhHBRkGS+I7dZEb3olQfnS1Y1tpMBxiwYwR3LW4oXuJwj8=");
- config.setAlipayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnq90KnF4dTnlzzmxpujbI05OYqi5WxAS6cL0gnZFv2gK51HExF8v/BaP7P979PhFMgWTqmOOI+Dtno5s+yD09XTY1WkshbLk6i4g2Xlr8fyW9ODnkU88RI2w9UdPhQU4cPPwBNlrsYhKkVK2OxwM3kFqjoBBY0CZoZCsSQ3LDH5WeZqPArlsS6xa2zqJBuuoKjMrdpELl3eXSjP8K54eDJCbeetCZNKWLL3DPahTPB7LZikfYmslb0QUvCgGapD0xkS7eVq70NaL1G57MWABs4tbfWgxike4Daj3EfUrzIVspQxj7w8HEj9WozJPgL88kSJSits0pqD3n5r8HSuseQIDAQAB");
- // 创建客户端
- Long channelId = RandomUtil.randomLong();
- payClientFactory.createOrUpdatePayClient(channelId, PayChannelEnum.ALIPAY_QR.getCode(), config);
- PayClient client = payClientFactory.getPayClient(channelId);
- // 发起支付
- PayOrderUnifiedReqDTO reqDTO = buildPayOrderUnifiedReqDTO();
- reqDTO.setNotifyUrl("http://yunai.natapp1.cc/admin-api/pay/notify/callback/18"); // TODO @tina: 这里改成你的 natapp 回调地址
-// CommonResult result = (CommonResult) client.unifiedOrder(reqDTO);
-// System.out.println(JsonUtils.toJsonString(result));
-// System.out.println(result.getData().getQrCode());
- }
-
- /**
- * {@link AlipayWapPayClient}
- */
- @Test
- public void testCreatePayClient_ALIPAY_WAP() {
- // 创建配置
- AlipayPayClientConfig config = new AlipayPayClientConfig();
- config.setAppId("2021000118634035");
- config.setServerUrl(SERVER_URL_SANDBOX);
- config.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT);
- config.setPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsEV1cDupwJv890x84qbppUtRIfhaKSwSVN0thCcsDCaAsGR5MZslDkO8NCT9V4r2SVXjyY7eJUZlZd1M0C8T01Tg4UOx5LUbic0O3A1uJMy6V1n9IyYwbAW3AEZhBd5bSbPgrqvmv3NeWSTQT6Anxnllf+2iDH6zyA2fPl7cYyQtbZoDJQFGqr4F+cGh2R6akzRKNoBkAeMYwoY6es2lX8sJxCVPWUmxNUoL3tScwlSpd7Bxw0q9c/X01jMwuQ0+Va358zgFiGERTE6yD01eu40OBDXOYO3z++y+TAYHlQQ2toMO63trepo88X3xV3R44/1DH+k2pAm2IF5ixiLrAgMBAAECggEAPx3SoXcseaD7rmcGcE0p4SMfbsUDdkUSmBBbtfF0GzwnqNLkWa+mgE0rWt9SmXngTQH97vByAYmLPl1s3G82ht1V7Sk7yQMe74lhFllr8eEyTjeVx3dTK1EEM4TwN+936DTXdFsr4TELJEcJJdD0KaxcCcfBLRDs2wnitEFZ9N+GoZybVmY8w0e0MI7PLObUZ2l0X4RurQnfG9ZxjXjC7PkeMVv7cGGylpNFi3BbvkRhdhLPDC2E6wqnr9e7zk+hiENivAezXrtxtwKovzCtnWJ1r0IO14Rh47H509Ic0wFnj+o5YyUL4LdmpL7yaaH6fM7zcSLFjNZPHvZCKPwYcQKBgQDQFho98QvnL8ex4v6cry4VitGpjSXm1qP3vmMQk4rTsn8iPWtcxPjqGEqOQJjdi4Mi0VZKQOLFwlH0kl95wNrD/isJ4O1yeYfX7YAXApzHqYNINzM79HemO3Yx1qLMW3okRFJ9pPRzbQ9qkTpsaegsmyX316zOBhzGRYjKbutTYwKBgQCm7phr9XdFW5Vh+XR90mVs483nrLmMiDKg7YKxSLJ8amiDjzPejCn7i95Hah08P+2MIZLIPbh2VLacczR6ltRRzN5bg5etFuqSgfkuHyxpoDmpjbe08+Q2h8JBYqcC5Nhv1AKU4iOUhVLHo/FBAQliMcGc/J3eiYTFC7EsNx382QKBgClb20doe7cttgFTXswBvaUmfFm45kmla924B7SpvrQpDD/f+VDtDZRp05fGmxuduSjYdtA3aVtpLiTwWu22OUUvZZqHDGruYOO4Hvdz23mL5b4ayqImCwoNU4bAZIc9v18p/UNf3/55NNE3oGcf/bev9rH2OjCQ4nM+Ktwhg8CFAoGACSgvbkShzUkv0ZcIf9ppu+ZnJh1AdGgINvGwaJ8vQ0nm/8h8NOoFZ4oNoGc+wU5Ubops7dUM6FjPR5e+OjdJ4E7Xp7d5O4J1TaIZlCEbo5OpdhaTDDcQvrkFu+Z4eN0qzj+YAKjDAOOrXc4tbr5q0FsgXscwtcNfaBuzFVTUrUkCgYEAwzPnMNhWG3zOWLUs2QFA2GP4Y+J8cpUYfj6pbKKzeLwyG9qBwF1NJpN8m+q9q7V9P2LY+9Lp9e1mGsGeqt5HMEA3P6vIpcqLJLqE/4PBLLRzfccTcmqb1m71+erxTRhHBRkGS+I7dZEb3olQfnS1Y1tpMBxiwYwR3LW4oXuJwj8=");
- config.setAlipayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnq90KnF4dTnlzzmxpujbI05OYqi5WxAS6cL0gnZFv2gK51HExF8v/BaP7P979PhFMgWTqmOOI+Dtno5s+yD09XTY1WkshbLk6i4g2Xlr8fyW9ODnkU88RI2w9UdPhQU4cPPwBNlrsYhKkVK2OxwM3kFqjoBBY0CZoZCsSQ3LDH5WeZqPArlsS6xa2zqJBuuoKjMrdpELl3eXSjP8K54eDJCbeetCZNKWLL3DPahTPB7LZikfYmslb0QUvCgGapD0xkS7eVq70NaL1G57MWABs4tbfWgxike4Daj3EfUrzIVspQxj7w8HEj9WozJPgL88kSJSits0pqD3n5r8HSuseQIDAQAB");
- // 创建客户端
- Long channelId = RandomUtil.randomLong();
- payClientFactory.createOrUpdatePayClient(channelId, PayChannelEnum.ALIPAY_WAP.getCode(), config);
- PayClient client = payClientFactory.getPayClient(channelId);
- // 发起支付
- PayOrderUnifiedReqDTO reqDTO = buildPayOrderUnifiedReqDTO();
-// CommonResult> result = client.unifiedOrder(reqDTO);
-// System.out.println(JsonUtils.toJsonString(result));
- }
-
- private static PayOrderUnifiedReqDTO buildPayOrderUnifiedReqDTO() {
- PayOrderUnifiedReqDTO reqDTO = new PayOrderUnifiedReqDTO();
- reqDTO.setPrice(123);
- reqDTO.setSubject("IPhone 13");
- reqDTO.setBody("biubiubiu");
- reqDTO.setOutTradeNo(String.valueOf(System.currentTimeMillis()));
- reqDTO.setUserIp("127.0.0.1");
- reqDTO.setNotifyUrl("http://127.0.0.1:8080");
- return reqDTO;
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AbstractAlipayClientTest.java b/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AbstractAlipayClientTest.java
deleted file mode 100644
index e46a38ab..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AbstractAlipayClientTest.java
+++ /dev/null
@@ -1,221 +0,0 @@
-package com.win.framework.pay.core.client.impl.alipay;
-
-import cn.hutool.core.date.LocalDateTimeUtil;
-import cn.hutool.core.util.RandomUtil;
-import com.win.framework.common.exception.ServiceException;
-import com.win.framework.common.exception.enums.GlobalErrorCodeConstants;
-import com.win.framework.common.exception.util.ServiceExceptionUtil;
-import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
-import com.win.framework.pay.core.client.dto.refund.PayRefundRespDTO;
-import com.win.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO;
-import com.win.framework.pay.core.client.exception.PayException;
-import com.win.framework.pay.core.enums.refund.PayRefundStatusRespEnum;
-import com.win.framework.test.core.ut.BaseMockitoUnitTest;
-import com.alipay.api.AlipayApiException;
-import com.alipay.api.DefaultAlipayClient;
-import com.alipay.api.DefaultSigner;
-import com.alipay.api.domain.AlipayTradeRefundModel;
-import com.alipay.api.request.AlipayTradeRefundRequest;
-import com.alipay.api.response.AlipayTradeRefundResponse;
-import lombok.Setter;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
-import org.mockito.ArgumentMatcher;
-import org.mockito.Mock;
-
-import javax.validation.ConstraintViolationException;
-import java.util.Date;
-
-import static com.win.framework.pay.core.client.impl.alipay.AlipayPayClientConfig.MODE_PUBLIC_KEY;
-import static com.win.framework.test.core.util.RandomUtils.*;
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.argThat;
-import static org.mockito.Mockito.when;
-
-/**
- * 支付宝 Client 的测试基类
- *
- * @author jason
- */
-public abstract class AbstractAlipayClientTest extends BaseMockitoUnitTest {
-
- protected AlipayPayClientConfig config = randomPojo(AlipayPayClientConfig.class, o -> {
- o.setServerUrl(randomURL());
- o.setPrivateKey(randomString());
- o.setMode(MODE_PUBLIC_KEY);
- o.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT);
- o.setAppCertContent("");
- o.setAlipayPublicCertContent("");
- o.setRootCertContent("");
- });
-
- @Mock
- protected DefaultAlipayClient defaultAlipayClient;
-
- @Setter
- private AbstractAlipayPayClient client;
-
- /**
- * 子类需要实现该方法. 设置 client 的具体实现
- */
- @BeforeEach
- public abstract void setUp();
-
- @Test
- @DisplayName("支付宝 Client 初始化")
- public void testDoInit() {
- // 调用
- client.doInit();
- // 断言
- DefaultAlipayClient realClient = client.getClient();
- assertNotSame(defaultAlipayClient, realClient);
- assertInstanceOf(DefaultSigner.class, realClient.getSigner());
- assertEquals(config.getPrivateKey(), ((DefaultSigner) realClient.getSigner()).getPrivateKey());
- }
-
- @Test
- @DisplayName("支付宝 Client 统一退款:成功")
- public void testUnifiedRefund_success() throws AlipayApiException {
- // mock 方法
- String notifyUrl = randomURL();
- Date refundTime = randomDate();
- String outRefundNo = randomString();
- String outTradeNo = randomString();
- Integer refundAmount = randomInteger();
- AlipayTradeRefundResponse response = randomPojo(AlipayTradeRefundResponse.class, o -> {
- o.setSubCode("");
- o.setGmtRefundPay(refundTime);
- });
- when(defaultAlipayClient.execute(argThat((ArgumentMatcher) request -> {
- assertInstanceOf(AlipayTradeRefundModel.class, request.getBizModel());
- AlipayTradeRefundModel bizModel = (AlipayTradeRefundModel) request.getBizModel();
- assertEquals(outRefundNo, bizModel.getOutRequestNo());
- assertEquals(outTradeNo, bizModel.getOutTradeNo());
- assertEquals(String.valueOf(refundAmount / 100.0), bizModel.getRefundAmount());
- return true;
- }))).thenReturn(response);
- // 准备请求参数
- PayRefundUnifiedReqDTO refundReqDTO = randomPojo(PayRefundUnifiedReqDTO.class, o -> {
- o.setOutRefundNo(outRefundNo);
- o.setOutTradeNo(outTradeNo);
- o.setNotifyUrl(notifyUrl);
- o.setRefundPrice(refundAmount);
- });
-
- // 调用
- PayRefundRespDTO resp = client.unifiedRefund(refundReqDTO);
- // 断言
- assertEquals(PayRefundStatusRespEnum.SUCCESS.getStatus(), resp.getStatus());
- assertEquals(outRefundNo, resp.getOutRefundNo());
- assertNull(resp.getChannelRefundNo());
- assertEquals(LocalDateTimeUtil.of(refundTime), resp.getSuccessTime());
- assertSame(response, resp.getRawData());
- assertNull(resp.getChannelErrorCode());
- assertNull(resp.getChannelErrorMsg());
- }
-
- @Test
- @DisplayName("支付宝 Client 统一退款:渠道返回失败")
- public void test_unified_refund_channel_failed() throws AlipayApiException {
- // mock 方法
- String notifyUrl = randomURL();
- String subCode = randomString();
- String subMsg = randomString();
- AlipayTradeRefundResponse response = randomPojo(AlipayTradeRefundResponse.class, o -> {
- o.setSubCode(subCode);
- o.setSubMsg(subMsg);
- });
- when(defaultAlipayClient.execute(argThat((ArgumentMatcher) request -> {
- assertInstanceOf(AlipayTradeRefundModel.class, request.getBizModel());
- return true;
- }))).thenReturn(response);
- // 准备请求参数
- String outRefundNo = randomString();
- String outTradeNo = randomString();
- PayRefundUnifiedReqDTO refundReqDTO = randomPojo(PayRefundUnifiedReqDTO.class, o -> {
- o.setOutRefundNo(outRefundNo);
- o.setOutTradeNo(outTradeNo);
- o.setNotifyUrl(notifyUrl);
- });
-
- // 调用
- PayRefundRespDTO resp = client.unifiedRefund(refundReqDTO);
- // 断言
- assertEquals(PayRefundStatusRespEnum.FAILURE.getStatus(), resp.getStatus());
- assertEquals(outRefundNo, resp.getOutRefundNo());
- assertNull(resp.getChannelRefundNo());
- assertNull(resp.getSuccessTime());
- assertSame(response, resp.getRawData());
- assertEquals(subCode, resp.getChannelErrorCode());
- assertEquals(subMsg, resp.getChannelErrorMsg());
- }
-
- @Test
- @DisplayName("支付宝 Client 统一退款:参数校验不通过")
- public void testUnifiedRefund_paramInvalidate() {
- // 准备请求参数
- String notifyUrl = randomURL();
- PayRefundUnifiedReqDTO refundReqDTO = randomPojo(PayRefundUnifiedReqDTO.class, o -> {
- o.setOutTradeNo("");
- o.setNotifyUrl(notifyUrl);
- });
-
- // 调用,并断言
- assertThrows(ConstraintViolationException.class, () -> client.unifiedRefund(refundReqDTO));
- }
-
- @Test
- @DisplayName("支付宝 Client 统一退款:抛出业务异常")
- public void testUnifiedRefund_throwServiceException() throws AlipayApiException {
- // mock 方法
- when(defaultAlipayClient.execute(argThat((ArgumentMatcher) request -> true)))
- .thenThrow(ServiceExceptionUtil.exception(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR));
- // 准备请求参数
- String notifyUrl = randomURL();
- PayRefundUnifiedReqDTO refundReqDTO = randomPojo(PayRefundUnifiedReqDTO.class, o -> o.setNotifyUrl(notifyUrl));
-
- // 调用,并断言
- assertThrows(ServiceException.class, () -> client.unifiedRefund(refundReqDTO));
- }
-
- @Test
- @DisplayName("支付宝 Client 统一退款:抛出系统异常")
- public void testUnifiedRefund_throwPayException() throws AlipayApiException {
- // mock 方法
- when(defaultAlipayClient.execute(argThat((ArgumentMatcher) request -> true)))
- .thenThrow(new RuntimeException("系统异常"));
- // 准备请求参数
- String notifyUrl = randomURL();
- PayRefundUnifiedReqDTO refundReqDTO = randomPojo(PayRefundUnifiedReqDTO.class, o -> o.setNotifyUrl(notifyUrl));
-
- // 调用,并断言
- assertThrows(PayException.class, () -> client.unifiedRefund(refundReqDTO));
- }
-
- @Test
- @DisplayName("支付宝 Client 统一下单:参数校验不通过")
- public void testUnifiedOrder_paramInvalidate() {
- // 准备请求参数
- String outTradeNo = randomString();
- String notifyUrl = randomURL();
- PayOrderUnifiedReqDTO reqDTO = randomPojo(PayOrderUnifiedReqDTO.class, o -> {
- o.setOutTradeNo(outTradeNo);
- o.setNotifyUrl(notifyUrl);
- });
-
- // 调用,并断言
- assertThrows(ConstraintViolationException.class, () -> client.unifiedOrder(reqDTO));
- }
-
- protected PayOrderUnifiedReqDTO buildOrderUnifiedReqDTO(String notifyUrl, String outTradeNo, Integer price) {
- return randomPojo(PayOrderUnifiedReqDTO.class, o -> {
- o.setOutTradeNo(outTradeNo);
- o.setNotifyUrl(notifyUrl);
- o.setPrice(price);
- o.setSubject(RandomUtil.randomString(32));
- o.setBody(RandomUtil.randomString(32));
- });
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayBarPayClientTest.java b/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayBarPayClientTest.java
deleted file mode 100644
index bf1dc885..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayBarPayClientTest.java
+++ /dev/null
@@ -1,170 +0,0 @@
-package com.win.framework.pay.core.client.impl.alipay;
-
-import cn.hutool.core.date.LocalDateTimeUtil;
-import com.win.framework.common.exception.ServiceException;
-import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO;
-import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
-import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum;
-import com.win.framework.pay.core.enums.order.PayOrderStatusRespEnum;
-import com.alipay.api.AlipayApiException;
-import com.alipay.api.domain.AlipayTradePayModel;
-import com.alipay.api.request.AlipayTradePayRequest;
-import com.alipay.api.response.AlipayTradePayResponse;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
-import org.mockito.ArgumentMatcher;
-import org.mockito.InjectMocks;
-
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-import static com.win.framework.pay.core.enums.order.PayOrderStatusRespEnum.CLOSED;
-import static com.win.framework.pay.core.enums.order.PayOrderStatusRespEnum.WAITING;
-import static com.win.framework.test.core.util.RandomUtils.*;
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.argThat;
-import static org.mockito.Mockito.when;
-
-/**
- * {@link AlipayBarPayClient} 单元测试
- *
- * @author jason
- */
-public class AlipayBarPayClientTest extends AbstractAlipayClientTest {
-
- @InjectMocks
- private AlipayBarPayClient client = new AlipayBarPayClient(randomLongId(), config);
-
- @Override
- @BeforeEach
- public void setUp() {
- setClient(client);
- }
-
- @Test
- @DisplayName("支付宝条码支付:非免密码支付下单成功")
- public void testUnifiedOrder_success() throws AlipayApiException {
- // mock 方法
- String outTradeNo = randomString();
- String notifyUrl = randomURL();
- Integer price = randomInteger();
- String authCode = randomString();
- AlipayTradePayResponse response = randomPojo(AlipayTradePayResponse.class, o -> o.setSubCode(""));
- when(defaultAlipayClient.execute(argThat((ArgumentMatcher) request -> {
- assertInstanceOf(AlipayTradePayModel.class, request.getBizModel());
- assertEquals(notifyUrl, request.getNotifyUrl());
- AlipayTradePayModel model = (AlipayTradePayModel) request.getBizModel();
- assertEquals(outTradeNo, model.getOutTradeNo());
- assertEquals(String.valueOf(price / 100.0), model.getTotalAmount());
- assertEquals(authCode, model.getAuthCode());
- return true;
- }))).thenReturn(response);
- // 准备请求参数
- PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(notifyUrl, outTradeNo, price);
- Map extraParam = new HashMap<>();
- extraParam.put("auth_code", authCode);
- reqDTO.setChannelExtras(extraParam);
-
- // 调用方法
- PayOrderRespDTO resp = client.unifiedOrder(reqDTO);
- // 断言
- assertEquals(WAITING.getStatus(), resp.getStatus());
- assertEquals(outTradeNo, resp.getOutTradeNo());
- assertNull(resp.getChannelOrderNo());
- assertNull(resp.getChannelUserId());
- assertNull(resp.getSuccessTime());
- assertEquals(PayOrderDisplayModeEnum.BAR_CODE.getMode(), resp.getDisplayMode());
- assertEquals("", resp.getDisplayContent());
- assertSame(response, resp.getRawData());
- assertNull(resp.getChannelErrorCode());
- assertNull(resp.getChannelErrorMsg());
- }
-
- @Test
- @DisplayName("支付宝条码支付:免密码支付下单成功")
- public void testUnifiedOrder_code10000Success() throws AlipayApiException {
- // mock 方法
- String outTradeNo = randomString();
- String channelNo = randomString();
- String channelUserId = randomString();
- Date payTime = randomDate();
- AlipayTradePayResponse response = randomPojo(AlipayTradePayResponse.class, o -> {
- o.setSubCode("");
- o.setCode("10000");
- o.setOutTradeNo(outTradeNo);
- o.setTradeNo(channelNo);
- o.setBuyerUserId(channelUserId);
- o.setGmtPayment(payTime);
- });
- when(defaultAlipayClient.execute(argThat((ArgumentMatcher) request -> true)))
- .thenReturn(response);
- // 准备请求参数
- String authCode = randomString();
- PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(randomURL(), outTradeNo, randomInteger());
- Map extraParam = new HashMap<>();
- extraParam.put("auth_code", authCode);
- reqDTO.setChannelExtras(extraParam);
-
- // 下单请求
- PayOrderRespDTO resp = client.unifiedOrder(reqDTO);
- // 断言
- assertEquals(PayOrderStatusRespEnum.SUCCESS.getStatus(), resp.getStatus());
- assertEquals(outTradeNo, resp.getOutTradeNo());
- assertEquals(channelNo, resp.getChannelOrderNo());
- assertEquals(channelUserId, resp.getChannelUserId());
- assertEquals(LocalDateTimeUtil.of(payTime), resp.getSuccessTime());
- assertEquals(PayOrderDisplayModeEnum.BAR_CODE.getMode(), resp.getDisplayMode());
- assertEquals("", resp.getDisplayContent());
- assertSame(response, resp.getRawData());
- assertNull(resp.getChannelErrorCode());
- assertNull(resp.getChannelErrorMsg());
- }
-
- @Test
- @DisplayName("支付宝条码支付:没有传条码")
- public void testUnifiedOrder_emptyAuthCode() {
- // 准备参数
- PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(randomURL(), randomString(), randomInteger());
-
- // 调用,并断言
- assertThrows(ServiceException.class, () -> client.unifiedOrder(reqDTO));
- }
-
- @Test
- @DisplayName("支付宝条码支付:渠道返回失败")
- public void test_unified_order_channel_failed() throws AlipayApiException {
- // mock 方法
- String subCode = randomString();
- String subMsg = randomString();
- AlipayTradePayResponse response = randomPojo(AlipayTradePayResponse.class, o -> {
- o.setSubCode(subCode);
- o.setSubMsg(subMsg);
- });
- when(defaultAlipayClient.execute(argThat((ArgumentMatcher) request -> true)))
- .thenReturn(response);
- // 准备请求参数
- String authCode = randomString();
- String outTradeNo = randomString();
- PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(randomURL(), outTradeNo, randomInteger());
- Map extraParam = new HashMap<>();
- extraParam.put("auth_code", authCode);
- reqDTO.setChannelExtras(extraParam);
-
- // 调用方法
- PayOrderRespDTO resp = client.unifiedOrder(reqDTO);
- // 断言
- assertEquals(CLOSED.getStatus(), resp.getStatus());
- assertEquals(outTradeNo, resp.getOutTradeNo());
- assertNull(resp.getChannelOrderNo());
- assertNull(resp.getChannelUserId());
- assertNull(resp.getSuccessTime());
- assertNull(resp.getDisplayMode());
- assertNull(resp.getDisplayContent());
- assertSame(response, resp.getRawData());
- assertEquals(subCode, resp.getChannelErrorCode());
- assertEquals(subMsg, resp.getChannelErrorMsg());
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayPcPayClientTest.java b/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayPcPayClientTest.java
deleted file mode 100644
index b6d02d38..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayPcPayClientTest.java
+++ /dev/null
@@ -1,131 +0,0 @@
-package com.win.framework.pay.core.client.impl.alipay;
-
-import cn.hutool.http.Method;
-import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO;
-import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
-import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum;
-import com.alipay.api.AlipayApiException;
-import com.alipay.api.request.AlipayTradePagePayRequest;
-import com.alipay.api.response.AlipayTradePagePayResponse;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
-import org.mockito.ArgumentMatcher;
-import org.mockito.InjectMocks;
-
-import static com.win.framework.pay.core.enums.order.PayOrderStatusRespEnum.CLOSED;
-import static com.win.framework.pay.core.enums.order.PayOrderStatusRespEnum.WAITING;
-import static com.win.framework.test.core.util.RandomUtils.*;
-import static org.junit.jupiter.api.Assertions.*;
-import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.mockito.ArgumentMatchers.argThat;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.when;
-
-/**
- * {@link AlipayPcPayClient} 单元测试
- *
- * @author jason
- */
-public class AlipayPcPayClientTest extends AbstractAlipayClientTest {
-
- @InjectMocks
- private AlipayPcPayClient client = new AlipayPcPayClient(randomLongId(), config);
-
- @Override
- @BeforeEach
- public void setUp() {
- setClient(client);
- }
-
- @Test
- @DisplayName("支付宝 PC 网站支付:URL Display Mode 下单成功")
- public void testUnifiedOrder_urlSuccess() throws AlipayApiException {
- // mock 方法
- String notifyUrl = randomURL();
- AlipayTradePagePayResponse response = randomPojo(AlipayTradePagePayResponse.class, o -> o.setSubCode(""));
- when(defaultAlipayClient.pageExecute(argThat((ArgumentMatcher) request -> true),
- eq(Method.GET.name()))).thenReturn(response);
- // 准备请求参数
- String outTradeNo = randomString();
- Integer price = randomInteger();
- PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(notifyUrl, outTradeNo, price);
- reqDTO.setDisplayMode(null);
-
- // 调用
- PayOrderRespDTO resp = client.unifiedOrder(reqDTO);
- // 断言
- assertEquals(WAITING.getStatus(), resp.getStatus());
- assertEquals(outTradeNo, resp.getOutTradeNo());
- assertNull(resp.getChannelOrderNo());
- assertNull(resp.getChannelUserId());
- assertNull(resp.getSuccessTime());
- assertEquals(PayOrderDisplayModeEnum.URL.getMode(), resp.getDisplayMode());
- assertEquals(response.getBody(), resp.getDisplayContent());
- assertSame(response, resp.getRawData());
- assertNull(resp.getChannelErrorCode());
- assertNull(resp.getChannelErrorMsg());
- }
-
- @Test
- @DisplayName("支付宝 PC 网站支付:Form Display Mode 下单成功")
- public void testUnifiedOrder_formSuccess() throws AlipayApiException {
- // mock 方法
- String notifyUrl = randomURL();
- AlipayTradePagePayResponse response = randomPojo(AlipayTradePagePayResponse.class, o -> o.setSubCode(""));
- when(defaultAlipayClient.pageExecute(argThat((ArgumentMatcher) request -> true),
- eq(Method.POST.name()))).thenReturn(response);
- // 准备请求参数
- String outTradeNo = randomString();
- Integer price = randomInteger();
- PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(notifyUrl, outTradeNo, price);
- reqDTO.setDisplayMode(PayOrderDisplayModeEnum.FORM.getMode());
-
- // 调用
- PayOrderRespDTO resp = client.unifiedOrder(reqDTO);
- // 断言
- assertEquals(WAITING.getStatus(), resp.getStatus());
- assertEquals(outTradeNo, resp.getOutTradeNo());
- assertNull(resp.getChannelOrderNo());
- assertNull(resp.getChannelUserId());
- assertNull(resp.getSuccessTime());
- assertEquals(PayOrderDisplayModeEnum.FORM.getMode(), resp.getDisplayMode());
- assertEquals(response.getBody(), resp.getDisplayContent());
- assertSame(response, resp.getRawData());
- assertNull(resp.getChannelErrorCode());
- assertNull(resp.getChannelErrorMsg());
- }
-
- @Test
- @DisplayName("支付宝 PC 网站支付:渠道返回失败")
- public void testUnifiedOrder_channelFailed() throws AlipayApiException {
- // mock 方法
- String subCode = randomString();
- String subMsg = randomString();
- AlipayTradePagePayResponse response = randomPojo(AlipayTradePagePayResponse.class, o -> {
- o.setSubCode(subCode);
- o.setSubMsg(subMsg);
- });
- when(defaultAlipayClient.pageExecute(argThat((ArgumentMatcher) request -> true),
- eq(Method.GET.name()))).thenReturn(response);
- // 准备请求参数
- String outTradeNo = randomString();
- PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(randomURL(), outTradeNo, randomInteger());
- reqDTO.setDisplayMode(PayOrderDisplayModeEnum.URL.getMode());
-
- // 调用
- PayOrderRespDTO resp = client.unifiedOrder(reqDTO);
- // 断言
- assertEquals(CLOSED.getStatus(), resp.getStatus());
- assertEquals(outTradeNo, resp.getOutTradeNo());
- assertNull(resp.getChannelOrderNo());
- assertNull(resp.getChannelUserId());
- assertNull(resp.getSuccessTime());
- assertNull(resp.getDisplayMode());
- assertNull(resp.getDisplayContent());
- assertSame(response, resp.getRawData());
- assertEquals(subCode, resp.getChannelErrorCode());
- assertEquals(subMsg, resp.getChannelErrorMsg());
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayQrPayClientTest.java b/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayQrPayClientTest.java
deleted file mode 100644
index cf6cd303..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayQrPayClientTest.java
+++ /dev/null
@@ -1,147 +0,0 @@
-package com.win.framework.pay.core.client.impl.alipay;
-
-import com.win.framework.common.exception.ServiceException;
-import com.win.framework.common.exception.enums.GlobalErrorCodeConstants;
-import com.win.framework.common.exception.util.ServiceExceptionUtil;
-import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO;
-import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
-import com.win.framework.pay.core.client.exception.PayException;
-import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum;
-import com.alipay.api.AlipayApiException;
-import com.alipay.api.request.AlipayTradePrecreateRequest;
-import com.alipay.api.response.AlipayTradePrecreateResponse;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
-import org.mockito.ArgumentMatcher;
-import org.mockito.InjectMocks;
-
-import static com.win.framework.pay.core.enums.order.PayOrderStatusRespEnum.CLOSED;
-import static com.win.framework.pay.core.enums.order.PayOrderStatusRespEnum.WAITING;
-import static com.win.framework.test.core.util.RandomUtils.*;
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.argThat;
-import static org.mockito.Mockito.when;
-
-/**
- * {@link AlipayQrPayClient} 单元测试
- *
- * @author jason
- */
-public class AlipayQrPayClientTest extends AbstractAlipayClientTest {
-
- @InjectMocks
- private AlipayQrPayClient client = new AlipayQrPayClient(randomLongId(), config);
-
- @BeforeEach
- public void setUp() {
- setClient(client);
- }
-
- @Test
- @DisplayName("支付宝扫描支付:下单成功")
- public void testUnifiedOrder_success() throws AlipayApiException {
- // mock 方法
- String notifyUrl = randomURL();
- String qrCode = randomString();
- Integer price = randomInteger();
- AlipayTradePrecreateResponse response = randomPojo(AlipayTradePrecreateResponse.class, o -> {
- o.setQrCode(qrCode);
- o.setSubCode("");
- });
- when(defaultAlipayClient.execute(argThat((ArgumentMatcher) request -> {
- assertEquals(notifyUrl, request.getNotifyUrl());
- return true;
- }))).thenReturn(response);
- // 准备请求参数
- String outTradeNo = randomString();
- PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(notifyUrl, outTradeNo, price);
-
- // 调用
- PayOrderRespDTO resp = client.unifiedOrder(reqDTO);
- // 断言
- assertEquals(WAITING.getStatus(), resp.getStatus());
- assertEquals(outTradeNo, resp.getOutTradeNo());
- assertNull(resp.getChannelOrderNo());
- assertNull(resp.getChannelUserId());
- assertNull(resp.getSuccessTime());
- assertEquals(PayOrderDisplayModeEnum.QR_CODE.getMode(), resp.getDisplayMode());
- assertEquals(response.getQrCode(), resp.getDisplayContent());
- assertSame(response, resp.getRawData());
- assertNull(resp.getChannelErrorCode());
- assertNull(resp.getChannelErrorMsg());
- }
-
- @Test
- @DisplayName("支付宝扫描支付:渠道返回失败")
- public void testUnifiedOrder_channelFailed() throws AlipayApiException {
- // mock 方法
- String notifyUrl = randomURL();
- String subCode = randomString();
- String subMsg = randomString();
- Integer price = randomInteger();
- AlipayTradePrecreateResponse response = randomPojo(AlipayTradePrecreateResponse.class, o -> {
- o.setSubCode(subCode);
- o.setSubMsg(subMsg);
- });
- // mock
- when(defaultAlipayClient.execute(argThat((ArgumentMatcher) request -> {
- assertEquals(notifyUrl, request.getNotifyUrl());
- return true;
- }))).thenReturn(response);
- // 准备请求参数
- String outTradeNo = randomString();
- PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(notifyUrl, outTradeNo, price);
-
- // 调用
- PayOrderRespDTO resp = client.unifiedOrder(reqDTO);
- // 断言
- assertEquals(CLOSED.getStatus(), resp.getStatus());
- assertEquals(outTradeNo, resp.getOutTradeNo());
- assertNull(resp.getChannelOrderNo());
- assertNull(resp.getChannelUserId());
- assertNull(resp.getSuccessTime());
- assertNull(resp.getDisplayMode());
- assertNull(resp.getDisplayContent());
- assertSame(response, resp.getRawData());
- assertEquals(subCode, resp.getChannelErrorCode());
- assertEquals(subMsg, resp.getChannelErrorMsg());
- }
-
- @Test
- @DisplayName("支付宝扫描支付, 抛出系统异常")
- public void testUnifiedOrder_throwPayException() throws AlipayApiException {
- // mock 方法
- String outTradeNo = randomString();
- String notifyUrl = randomURL();
- Integer price = randomInteger();
- when(defaultAlipayClient.execute(argThat((ArgumentMatcher) request -> {
- assertEquals(notifyUrl, request.getNotifyUrl());
- return true;
- }))).thenThrow(new RuntimeException("系统异常"));
- // 准备请求参数
- PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(notifyUrl, outTradeNo,price);
-
- // 调用,并断言
- assertThrows(PayException.class, () -> client.unifiedOrder(reqDTO));
- }
-
- @Test
- @DisplayName("支付宝 Client 统一下单:抛出业务异常")
- public void testUnifiedOrder_throwServiceException() throws AlipayApiException {
- // mock 方法
- String outTradeNo = randomString();
- String notifyUrl = randomURL();
- Integer price = randomInteger();
- when(defaultAlipayClient.execute(argThat((ArgumentMatcher) request -> {
- assertEquals(notifyUrl, request.getNotifyUrl());
- return true;
- }))).thenThrow(ServiceExceptionUtil.exception(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR));
- // 准备请求参数
- PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(notifyUrl, outTradeNo, price);
-
- // 调用,并断言
- assertThrows(ServiceException.class, () -> client.unifiedOrder(reqDTO));
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayWapPayClientTest.java b/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayWapPayClientTest.java
deleted file mode 100644
index 86855776..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/alipay/AlipayWapPayClientTest.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package com.win.framework.pay.core.client.impl.alipay;
-
-import cn.hutool.http.Method;
-import com.win.framework.pay.core.client.dto.order.PayOrderRespDTO;
-import com.win.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
-import com.win.framework.pay.core.enums.order.PayOrderDisplayModeEnum;
-import com.alipay.api.AlipayApiException;
-import com.alipay.api.domain.AlipayTradeWapPayModel;
-import com.alipay.api.request.AlipayTradeWapPayRequest;
-import com.alipay.api.response.AlipayTradeWapPayResponse;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.DisplayName;
-import org.junit.jupiter.api.Test;
-import org.mockito.ArgumentMatcher;
-import org.mockito.InjectMocks;
-
-import static com.win.framework.pay.core.enums.order.PayOrderStatusRespEnum.CLOSED;
-import static com.win.framework.pay.core.enums.order.PayOrderStatusRespEnum.WAITING;
-import static com.win.framework.test.core.util.RandomUtils.*;
-import static org.junit.jupiter.api.Assertions.*;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.mockito.ArgumentMatchers.argThat;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.when;
-
-/**
- * {@link AlipayWapPayClient} 单元测试
- *
- * @author jason
- */
-public class AlipayWapPayClientTest extends AbstractAlipayClientTest {
-
- /**
- * 支付宝 H5 支付 Client
- */
- @InjectMocks
- private AlipayWapPayClient client = new AlipayWapPayClient(randomLongId(), config);
-
- @BeforeEach
- public void setUp() {
- setClient(client);
- }
-
- @Test
- @DisplayName("支付宝 H5 支付:下单成功")
- public void testUnifiedOrder_success() throws AlipayApiException {
- // mock 方法
- String h5Body = randomString();
- Integer price = randomInteger();
- AlipayTradeWapPayResponse response = randomPojo(AlipayTradeWapPayResponse.class, o -> {
- o.setSubCode("");
- o.setBody(h5Body);
- });
- String notifyUrl = randomURL();
- when(defaultAlipayClient.pageExecute(argThat((ArgumentMatcher) request -> {
- assertInstanceOf(AlipayTradeWapPayModel.class, request.getBizModel());
- AlipayTradeWapPayModel bizModel = (AlipayTradeWapPayModel) request.getBizModel();
- assertEquals(String.valueOf(price / 100.0), bizModel.getTotalAmount());
- assertEquals(notifyUrl, request.getNotifyUrl());
- return true;
- }), eq(Method.GET.name()))).thenReturn(response);
- // 准备请求参数
- String outTradeNo = randomString();
- PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(notifyUrl, outTradeNo, price);
-
- // 调用
- PayOrderRespDTO resp = client.unifiedOrder(reqDTO);
- // 断言
- assertEquals(WAITING.getStatus(), resp.getStatus());
- assertEquals(outTradeNo, resp.getOutTradeNo());
- assertNull(resp.getChannelOrderNo());
- assertNull(resp.getChannelUserId());
- assertNull(resp.getSuccessTime());
- assertEquals(PayOrderDisplayModeEnum.URL.getMode(), resp.getDisplayMode());
- assertEquals(response.getBody(), resp.getDisplayContent());
- assertSame(response, resp.getRawData());
- assertNull(resp.getChannelErrorCode());
- assertNull(resp.getChannelErrorMsg());
- }
-
- @Test
- @DisplayName("支付宝 H5 支付:渠道返回失败")
- public void test_unified_order_channel_failed() throws AlipayApiException {
- // mock 方法
- String subCode = randomString();
- String subMsg = randomString();
- AlipayTradeWapPayResponse response = randomPojo(AlipayTradeWapPayResponse.class, o -> {
- o.setSubCode(subCode);
- o.setSubMsg(subMsg);
- });
- when(defaultAlipayClient.pageExecute(argThat((ArgumentMatcher) request -> true),
- eq(Method.GET.name()))).thenReturn(response);
- String outTradeNo = randomString();
- PayOrderUnifiedReqDTO reqDTO = buildOrderUnifiedReqDTO(randomURL(), outTradeNo, randomInteger());
-
- // 调用
- PayOrderRespDTO resp = client.unifiedOrder(reqDTO);
- // 断言
- assertEquals(CLOSED.getStatus(), resp.getStatus());
- assertEquals(outTradeNo, resp.getOutTradeNo());
- assertNull(resp.getChannelOrderNo());
- assertNull(resp.getChannelUserId());
- assertNull(resp.getSuccessTime());
- assertNull(resp.getDisplayMode());
- assertNull(resp.getDisplayContent());
- assertSame(response, resp.getRawData());
- assertEquals(subCode, resp.getChannelErrorCode());
- assertEquals(subMsg, resp.getChannelErrorMsg());
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/weixin/WxBarPayClientIntegrationTest.java b/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/weixin/WxBarPayClientIntegrationTest.java
deleted file mode 100644
index 40f3263f..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/weixin/WxBarPayClientIntegrationTest.java
+++ /dev/null
@@ -1,123 +0,0 @@
-package com.win.framework.pay.core.client.impl.weixin;
-
-import com.win.framework.common.util.date.LocalDateTimeUtils;
-import com.win.framework.common.util.json.JsonUtils;
-import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyResult;
-import com.github.binarywang.wxpay.bean.request.WxPayMicropayRequest;
-import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
-import com.github.binarywang.wxpay.bean.request.WxPayRefundV3Request;
-import com.github.binarywang.wxpay.bean.result.WxPayMicropayResult;
-import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
-import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result;
-import com.github.binarywang.wxpay.config.WxPayConfig;
-import com.github.binarywang.wxpay.exception.WxPayException;
-import com.github.binarywang.wxpay.service.WxPayService;
-import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-import java.time.Duration;
-
-import static com.win.framework.pay.core.client.impl.weixin.AbstractWxPayClient.formatDateV2;
-
-/**
- * {@link WxBarPayClient} 的集成测试,用于快速调试微信条码支付
- *
- * @author 芋道源码
- */
-@Disabled
-public class WxBarPayClientIntegrationTest {
-
- @Test
- public void testPayV2() throws WxPayException {
- // 创建 config 配置
- WxPayConfig config = buildWxPayConfigV2();
- // 创建 WxPayService 客户端
- WxPayService client = new WxPayServiceImpl();
- client.setConfig(config);
-
- // 执行发起支付
- WxPayMicropayRequest request = WxPayMicropayRequest.newBuilder()
- .outTradeNo(String.valueOf(System.currentTimeMillis()))
- .body("测试支付-body")
- .detail("测试支付-detail")
- .totalFee(1) // 单位分
- .timeExpire(formatDateV2(LocalDateTimeUtils.addTime(Duration.ofMinutes(2))))
- .spbillCreateIp("127.0.0.1")
- .authCode("134298744426278497")
- .build();
- System.out.println("========= request ==========");
- System.out.println(JsonUtils.toJsonPrettyString(request));
- WxPayMicropayResult response = client.micropay(request);
- System.out.println("========= response ==========");
- System.out.println(JsonUtils.toJsonPrettyString(response));
- }
-
- @Test
- public void testParseRefundNotifyV2() throws WxPayException {
- // 创建 config 配置
- WxPayConfig config = buildWxPayConfigV2();
- // 创建 WxPayService 客户端
- WxPayService client = new WxPayServiceImpl();
- client.setConfig(config);
-
- // 执行解析
- String xml = "SUCCESS";
- WxPayRefundNotifyResult response = client.parseRefundNotifyResult(xml);
- System.out.println(response.getReqInfo());
- }
-
- @Test
- public void testRefundV2() throws WxPayException {
- // 创建 config 配置
- WxPayConfig config = buildWxPayConfigV2();
- // 创建 WxPayService 客户端
- WxPayService client = new WxPayServiceImpl();
- client.setConfig(config);
-
- // 执行发起退款
- WxPayRefundRequest request = new WxPayRefundRequest()
- .setOutTradeNo("1689545667276")
- .setOutRefundNo(String.valueOf(System.currentTimeMillis()))
- .setRefundFee(1)
- .setRefundDesc("就是想退了")
- .setTotalFee(1);
- System.out.println("========= request ==========");
- System.out.println(JsonUtils.toJsonPrettyString(request));
- WxPayRefundResult response = client.refund(request);
- System.out.println("========= response ==========");
- System.out.println(JsonUtils.toJsonPrettyString(response));
- }
-
- @Test
- public void testRefundV3() throws WxPayException {
- // 创建 config 配置
- WxPayConfig config = buildWxPayConfigV2();
- // 创建 WxPayService 客户端
- WxPayService client = new WxPayServiceImpl();
- client.setConfig(config);
-
- // 执行发起退款
- WxPayRefundV3Request request = new WxPayRefundV3Request()
- .setOutTradeNo("1689506325635")
- .setOutRefundNo(String.valueOf(System.currentTimeMillis()))
- .setAmount(new WxPayRefundV3Request.Amount().setTotal(1).setRefund(1).setCurrency("CNY"))
- .setReason("就是想退了");
- System.out.println("========= request ==========");
- System.out.println(JsonUtils.toJsonPrettyString(request));
- WxPayRefundV3Result response = client.refundV3(request);
- System.out.println("========= response ==========");
- System.out.println(JsonUtils.toJsonPrettyString(response));
- }
-
- private WxPayConfig buildWxPayConfigV2() {
- WxPayConfig config = new WxPayConfig();
- config.setAppId("wx62056c0d5e8db250");
- config.setMchId("1545083881");
- config.setMchKey("dS1ngeN63JLr3NRbvPH9AJy3MyUxZdim");
-// config.setSignType(WxPayConstants.SignType.MD5);
- config.setKeyPath("/Users/yunai/Downloads/wx_pay/apiclient_cert.p12");
- return config;
- }
-
-}
diff --git a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/weixin/WxNativePayClientIntegrationTest.java b/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/weixin/WxNativePayClientIntegrationTest.java
deleted file mode 100644
index e9354905..00000000
--- a/win-framework/win-spring-boot-starter-biz-pay/src/test/java/com/win/framework/pay/core/client/impl/weixin/WxNativePayClientIntegrationTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package com.win.framework.pay.core.client.impl.weixin;
-
-import com.win.framework.common.util.date.LocalDateTimeUtils;
-import com.win.framework.common.util.json.JsonUtils;
-import com.github.binarywang.wxpay.bean.request.WxPayRefundV3Request;
-import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request;
-import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result;
-import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum;
-import com.github.binarywang.wxpay.config.WxPayConfig;
-import com.github.binarywang.wxpay.exception.WxPayException;
-import com.github.binarywang.wxpay.service.WxPayService;
-import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-import java.time.Duration;
-
-import static com.win.framework.pay.core.client.impl.weixin.AbstractWxPayClient.formatDateV3;
-
-/**
- * {@link WxNativePayClient} 的集成测试,用于快速调试微信扫码支付
- *
- * @author 芋道源码
- */
-@Disabled
-public class WxNativePayClientIntegrationTest {
-
- @Test
- public void testPayV3() throws WxPayException {
- // 创建 config 配置
- WxPayConfig config = buildWxPayConfigV3();
- // 创建 WxPayService 客户端
- WxPayService client = new WxPayServiceImpl();
- client.setConfig(config);
-
- // 执行发起支付
- WxPayUnifiedOrderV3Request request = new WxPayUnifiedOrderV3Request()
- .setOutTradeNo(String.valueOf(System.currentTimeMillis()))
- .setDescription("测试支付-body")
- .setAmount(new WxPayUnifiedOrderV3Request.Amount().setTotal(1)) // 单位分
- .setTimeExpire(formatDateV3(LocalDateTimeUtils.addTime(Duration.ofMinutes(2))))
- .setSceneInfo(new WxPayUnifiedOrderV3Request.SceneInfo().setPayerClientIp("127.0.0.1"))
- .setNotifyUrl("http://127.0.0.1:48080");
- System.out.println("========= request ==========");
- System.out.println(JsonUtils.toJsonPrettyString(request));
- String response = client.createOrderV3(TradeTypeEnum.NATIVE, request);
- System.out.println("========= response ==========");
- System.out.println(JsonUtils.toJsonPrettyString(response));
- }
-
- @Test
- public void testRefundV3() throws WxPayException {
- // 创建 config 配置
- WxPayConfig config = buildWxPayConfigV3();
- // 创建 WxPayService 客户端
- WxPayService client = new WxPayServiceImpl();
- client.setConfig(config);
-
- // 执行发起退款
- WxPayRefundV3Request request = new WxPayRefundV3Request()
- .setOutTradeNo("1689545729695")
- .setOutRefundNo(String.valueOf(System.currentTimeMillis()))
- .setAmount(new WxPayRefundV3Request.Amount().setTotal(1).setRefund(1).setCurrency("CNY"))
- .setReason("就是想退了");
- System.out.println("========= request ==========");
- System.out.println(JsonUtils.toJsonPrettyString(request));
- WxPayRefundV3Result response = client.refundV3(request);
- System.out.println("========= response ==========");
- System.out.println(JsonUtils.toJsonPrettyString(response));
- }
-
- private WxPayConfig buildWxPayConfigV3() {
- WxPayConfig config = new WxPayConfig();
- config.setAppId("wx62056c0d5e8db250");
- config.setMchId("1545083881");
- config.setApiV3Key("459arNsYHl1mgkiO6H9ZH5KkhFXSxaA4");
-// config.setCertSerialNo(serialNo);
- config.setPrivateCertPath("/Users/yunai/Downloads/wx_pay/apiclient_cert.pem");
- config.setPrivateKeyPath("/Users/yunai/Downloads/wx_pay/apiclient_key.pem");
- return config;
- }
-
-}
diff --git a/win-module-mall/pom.xml b/win-module-mall/pom.xml
deleted file mode 100644
index 9e213d44..00000000
--- a/win-module-mall/pom.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
- win
- com.win
- ${revision}
-
- 4.0.0
-
- win-module-mall
- pom
-
- ${project.artifactId}
-
-
- 商城大模块,由 product 商品、promotion 营销、trade 交易等组成
-
-
- win-module-promotion-api
- win-module-promotion-biz
- win-module-product-api
- win-module-product-biz
- win-module-trade-api
- win-module-trade-biz
-
-
-
diff --git a/win-module-mall/win-module-product-api/pom.xml b/win-module-mall/win-module-product-api/pom.xml
deleted file mode 100644
index 63b530c6..00000000
--- a/win-module-mall/win-module-product-api/pom.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
- 4.0.0
-
- com.win
- win-module-mall
- ${revision}
-
-
- win-module-product-api
- jar
-
- ${project.artifactId}
-
- product 模块 API,暴露给其它模块调用
-
-
-
-
- com.win
- win-common
-
-
-
-
- org.springframework.boot
- spring-boot-starter-validation
- true
-
-
-
-
diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/comment/ProductCommentApi.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/comment/ProductCommentApi.java
deleted file mode 100644
index 88459315..00000000
--- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/comment/ProductCommentApi.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.win.module.product.api.comment;
-
-import com.win.module.product.api.comment.dto.ProductCommentCreateReqDTO;
-
-/**
- * 产品评论 API 接口
- *
- * @author HUIHUI
- */
-public interface ProductCommentApi {
-
- /**
- * 创建评论
- *
- * @param createReqDTO 评论参数
- * @return 返回评论创建后的 id
- */
- Long createComment(ProductCommentCreateReqDTO createReqDTO);
-
-}
diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/comment/dto/ProductCommentCreateReqDTO.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/comment/dto/ProductCommentCreateReqDTO.java
deleted file mode 100644
index 127edfeb..00000000
--- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/comment/dto/ProductCommentCreateReqDTO.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package com.win.module.product.api.comment.dto;
-
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * 评论创建请求 DTO
- *
- * @author HUIHUI
- */
-@Data
-public class ProductCommentCreateReqDTO {
-
- /**
- * 商品 SKU 编号
- */
- private Long skuId;
- /**
- * 订单编号
- */
- private Long orderId;
- /**
- * 交易订单项编号
- */
- private Long orderItemId;
-
- /**
- * 评分星级 1-5 分
- */
- private Integer scores;
- /**
- * 描述星级 1-5 分
- */
- private Integer descriptionScores;
- /**
- * 服务星级 1-5 分
- */
- private Integer benefitScores;
- /**
- * 评论内容
- */
- private String content;
- /**
- * 评论图片地址数组,以逗号分隔最多上传 9 张
- */
- private List picUrls;
-
- /**
- * 是否匿名
- */
- private Boolean anonymous;
- /**
- * 评价人
- */
- private Long userId;
-
-
-}
diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/package-info.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/package-info.java
deleted file mode 100644
index fb9263d1..00000000
--- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * 占位
- */
-package com.win.module.product.api;
\ No newline at end of file
diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/property/ProductPropertyValueApi.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/property/ProductPropertyValueApi.java
deleted file mode 100644
index d1d77dd0..00000000
--- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/property/ProductPropertyValueApi.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.win.module.product.api.property;
-
-import com.win.module.product.api.property.dto.ProductPropertyValueDetailRespDTO;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * 商品属性值 API 接口
- *
- * @author 芋道源码
- */
-public interface ProductPropertyValueApi {
-
- /**
- * 根据编号数组,获得属性值列表
- *
- * @param ids 编号数组
- * @return 属性值明细列表
- */
- List getPropertyValueDetailList(Collection ids);
-
-}
diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/property/dto/ProductPropertyValueDetailRespDTO.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/property/dto/ProductPropertyValueDetailRespDTO.java
deleted file mode 100644
index 865689c1..00000000
--- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/property/dto/ProductPropertyValueDetailRespDTO.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.win.module.product.api.property.dto;
-
-import lombok.Data;
-
-/**
- * 商品属性项的明细 Response DTO
- *
- * @author 芋道源码
- */
-@Data
-public class ProductPropertyValueDetailRespDTO {
-
- /**
- * 属性的编号
- */
- private Long propertyId;
-
- /**
- * 属性的名称
- */
- private String propertyName;
-
- /**
- * 属性值的编号
- */
- private Long valueId;
-
- /**
- * 属性值的名称
- */
- private String valueName;
-
-}
diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/sku/ProductSkuApi.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/sku/ProductSkuApi.java
deleted file mode 100644
index 06c0e7c8..00000000
--- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/sku/ProductSkuApi.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.win.module.product.api.sku;
-
-import com.win.module.product.api.sku.dto.ProductSkuRespDTO;
-import com.win.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * 商品 SKU API 接口
- *
- * @author LeeYan9
- * @since 2022-08-26
- */
-public interface ProductSkuApi {
-
- /**
- * 查询 SKU 信息
- *
- * @param id SKU 编号
- * @return SKU 信息
- */
- ProductSkuRespDTO getSku(Long id);
-
- /**
- * 批量查询 SKU 数组
- *
- * @param ids SKU 编号列表
- * @return SKU 数组
- */
- List getSkuList(Collection ids);
-
- /**
- * 批量查询 SKU 数组
- *
- * @param spuIds SPU 编号列表
- * @return SKU 数组
- */
- List getSkuListBySpuId(Collection spuIds);
-
- /**
- * 更新 SKU 库存
- *
- * @param updateStockReqDTO 更新请求
- */
- void updateSkuStock(ProductSkuUpdateStockReqDTO updateStockReqDTO);
-
-}
diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/sku/dto/ProductSkuRespDTO.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/sku/dto/ProductSkuRespDTO.java
deleted file mode 100644
index 7906afe2..00000000
--- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/sku/dto/ProductSkuRespDTO.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package com.win.module.product.api.sku.dto;
-
-import com.win.module.product.api.property.dto.ProductPropertyValueDetailRespDTO;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * 商品 SKU 信息 Response DTO
- *
- * @author LeeYan9
- * @since 2022-08-26
- */
-@Data
-public class ProductSkuRespDTO {
-
- /**
- * 商品 SKU 编号,自增
- */
- private Long id;
- /**
- * SPU 编号
- */
- private Long spuId;
-
- /**
- * 属性数组
- */
- private List properties;
- /**
- * 销售价格,单位:分
- */
- private Integer price;
- /**
- * 市场价,单位:分
- */
- private Integer marketPrice;
- /**
- * 成本价,单位:分
- */
- private Integer costPrice;
- /**
- * SKU 的条形码
- */
- private String barCode;
- /**
- * 图片地址
- */
- private String picUrl;
- /**
- * 库存
- */
- private Integer stock;
- /**
- * 商品重量,单位:kg 千克
- */
- private Double weight;
- /**
- * 商品体积,单位:m^3 平米
- */
- private Double volume;
-
- // TODO @puhui:这 2 字段,需要改下;firstBrokerageRecord、secondBrokerageRecord;和分佣保持一致;
- /**
- * 一级分销的佣金,单位:分
- */
- private Integer subCommissionFirstPrice;
- /**
- * 二级分销的佣金,单位:分
- */
- private Integer subCommissionSecondPrice;
-
-}
diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/sku/dto/ProductSkuUpdateStockReqDTO.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/sku/dto/ProductSkuUpdateStockReqDTO.java
deleted file mode 100644
index f68a32bb..00000000
--- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/sku/dto/ProductSkuUpdateStockReqDTO.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.win.module.product.api.sku.dto;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import javax.validation.constraints.NotNull;
-import java.util.List;
-
-/**
- * 商品 SKU 更新库存 Request DTO
- *
- * @author LeeYan9
- * @since 2022-08-26
- */
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class ProductSkuUpdateStockReqDTO {
-
- /**
- * 商品 SKU
- */
- @NotNull(message = "商品 SKU 不能为空")
- private List- items;
-
- @Data
- public static class Item {
-
- /**
- * 商品 SKU 编号
- */
- @NotNull(message = "商品 SKU 编号不能为空")
- private Long id;
-
- /**
- * 库存变化数量
- *
- * 正数:增加库存
- * 负数:扣减库存
- */
- @NotNull(message = "库存变化数量不能为空")
- private Integer incrCount;
-
- }
-
-}
diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/spu/ProductSpuApi.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/spu/ProductSpuApi.java
deleted file mode 100644
index aab05ad5..00000000
--- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/spu/ProductSpuApi.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.win.module.product.api.spu;
-
-import com.win.module.product.api.spu.dto.ProductSpuRespDTO;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * 商品 SPU API 接口
- *
- * @author LeeYan9
- * @since 2022-08-26
- */
-public interface ProductSpuApi {
-
- /**
- * 批量查询 SPU 数组
- *
- * @param ids SPU 编号列表
- * @return SPU 数组
- */
- List getSpuList(Collection ids);
-
- /**
- * 获得 SPU
- *
- * @return SPU
- */
- ProductSpuRespDTO getSpu(Long id);
-
-}
diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/spu/dto/ProductSpuRespDTO.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/spu/dto/ProductSpuRespDTO.java
deleted file mode 100644
index e6c0d3a1..00000000
--- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/api/spu/dto/ProductSpuRespDTO.java
+++ /dev/null
@@ -1,130 +0,0 @@
-package com.win.module.product.api.spu.dto;
-
-import com.win.module.product.api.sku.dto.ProductSkuRespDTO;
-import com.win.module.product.enums.spu.ProductSpuStatusEnum;
-import lombok.Data;
-
-import java.util.List;
-
-// TODO @LeeYan9: ProductSpuRespDTO
-/**
- * 商品 SPU 信息 Response DTO
- *
- * @author LeeYan9
- * @since 2022-08-26
- */
-@Data
-public class ProductSpuRespDTO {
-
- /**
- * 商品 SPU 编号,自增
- */
- private Long id;
-
- // ========== 基本信息 =========
-
- /**
- * 商品名称
- */
- private String name;
- /**
- * 关键字
- */
- private String keyword;
- /**
- * 商品简介
- */
- private String introduction;
- /**
- * 商品详情
- */
- private String description;
- // TODO @芋艿:是不是要删除
- /**
- * 商品条码(一维码)
- */
- private String barCode;
-
- /**
- * 商品分类编号
- */
- private Long categoryId;
- /**
- * 商品品牌编号
- */
- private Long brandId;
- /**
- * 商品封面图
- */
- private String picUrl;
- /**
- * 商品轮播图
- */
- private List sliderPicUrls;
- /**
- * 商品视频
- */
- private String videoUrl;
-
- /**
- * 排序字段
- */
- private Integer sort;
- /**
- * 商品状态
- *
- * 枚举 {@link ProductSpuStatusEnum}
- */
- private Integer status;
-
- // ========== SKU 相关字段 =========
-
- /**
- * 规格类型
- *
- * false - 单规格
- * true - 多规格
- */
- private Boolean specType;
- /**
- * 商品价格,单位使用:分
- */
- private Integer price;
- /**
- * 市场价,单位使用:分
- */
- private Integer marketPrice;
- /**
- * 成本价,单位使用:分
- */
- private Integer costPrice;
- /**
- * 库存
- */
- private Integer stock;
-
- // ========== 物流相关字段 =========
-
- /**
- * 物流配置模板编号
- *
- * 对应 TradeDeliveryExpressTemplateDO 的 id 编号
- */
- private Long deliveryTemplateId;
-
- // ========== 统计相关字段 =========
-
- /**
- * 商品销量
- */
- private Integer salesCount;
- /**
- * 虚拟销量
- */
- private Integer virtualSalesCount;
- /**
- * 商品点击量
- */
- private Integer clickCount;
-
-}
diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/DictTypeConstants.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/DictTypeConstants.java
deleted file mode 100644
index 1d321fc0..00000000
--- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/DictTypeConstants.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.win.module.product.enums;
-
-/**
- * product 字典类型的枚举类
- *
- * @author HUIHUI
- */
-public interface DictTypeConstants {
-
- String PRODUCT_UNIT = "product_unit"; // 商品单位
- String PRODUCT_SPU_STATUS = "product_spu_status"; // 商品 SPU 状态
-
-}
diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/ErrorCodeConstants.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/ErrorCodeConstants.java
deleted file mode 100644
index 7d90caa4..00000000
--- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/ErrorCodeConstants.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.win.module.product.enums;
-
-import com.win.framework.common.exception.ErrorCode;
-
-/**
- * Product 错误码枚举类
- *
- * product 系统,使用 1-008-000-000 段
- */
-public interface ErrorCodeConstants {
-
- // ========== 商品分类相关 1-008-001-000 ============
- ErrorCode CATEGORY_NOT_EXISTS = new ErrorCode(1_008_001_000, "商品分类不存在");
- ErrorCode CATEGORY_PARENT_NOT_EXISTS = new ErrorCode(1_008_001_001, "父分类不存在");
- ErrorCode CATEGORY_PARENT_NOT_FIRST_LEVEL = new ErrorCode(1_008_001_002, "父分类不能是二级分类");
- ErrorCode CATEGORY_EXISTS_CHILDREN = new ErrorCode(1_008_001_003, "存在子分类,无法删除");
- ErrorCode CATEGORY_DISABLED = new ErrorCode(1_008_001_004, "商品分类({})已禁用,无法使用");
- ErrorCode CATEGORY_HAVE_BIND_SPU = new ErrorCode(1_008_001_005, "类别下存在商品,无法删除");
-
- // ========== 商品品牌相关编号 1-008-002-000 ==========
- ErrorCode BRAND_NOT_EXISTS = new ErrorCode(1_008_002_000, "品牌不存在");
- ErrorCode BRAND_DISABLED = new ErrorCode(1_008_002_001, "品牌已禁用");
- ErrorCode BRAND_NAME_EXISTS = new ErrorCode(1_008_002_002, "品牌名称已存在");
-
- // ========== 商品属性项 1-008-003-000 ==========
- ErrorCode PROPERTY_NOT_EXISTS = new ErrorCode(1_008_003_000, "属性项不存在");
- ErrorCode PROPERTY_EXISTS = new ErrorCode(1_008_003_001, "属性项的名称已存在");
- ErrorCode PROPERTY_DELETE_FAIL_VALUE_EXISTS = new ErrorCode(1_008_003_002, "属性项下存在属性值,无法删除");
-
- // ========== 商品属性值 1-008-004-000 ==========
- ErrorCode PROPERTY_VALUE_NOT_EXISTS = new ErrorCode(1_008_004_000, "属性值不存在");
- ErrorCode PROPERTY_VALUE_EXISTS = new ErrorCode(1_008_004_001, "属性值的名称已存在");
-
- // ========== 商品 SPU 1-008-005-000 ==========
- ErrorCode SPU_NOT_EXISTS = new ErrorCode(1_008_005_000, "商品 SPU 不存在");
- ErrorCode SPU_SAVE_FAIL_CATEGORY_LEVEL_ERROR = new ErrorCode(1_008_005_001, "商品分类不正确,原因:必须使用第二级的商品分类及以下");
- ErrorCode SPU_NOT_ENABLE = new ErrorCode(1_008_005_002, "商品 SPU 不处于上架状态");
- ErrorCode SPU_NOT_RECYCLE = new ErrorCode(1_008_005_003, "商品 SPU 不处于回收站状态");
-
- // ========== 商品 SKU 1-008-006-000 ==========
- ErrorCode SKU_NOT_EXISTS = new ErrorCode(1_008_006_000, "商品 SKU 不存在");
- ErrorCode SKU_PROPERTIES_DUPLICATED = new ErrorCode(1_008_006_001, "商品 SKU 的属性组合存在重复");
- ErrorCode SPU_ATTR_NUMBERS_MUST_BE_EQUALS = new ErrorCode(1_008_006_002, "一个 SPU 下的每个 SKU,其属性项必须一致");
- ErrorCode SPU_SKU_NOT_DUPLICATE = new ErrorCode(1_008_006_003, "一个 SPU 下的每个 SKU,必须不重复");
- ErrorCode SKU_STOCK_NOT_ENOUGH = new ErrorCode(1_008_006_004, "商品 SKU 库存不足");
-
- // ========== 商品 评价 1-008-007-000 ==========
- ErrorCode COMMENT_NOT_EXISTS = new ErrorCode(1_008_007_000, "商品评价不存在");
- ErrorCode COMMENT_ORDER_EXISTS = new ErrorCode(1_008_007_001, "订单的商品评价已存在");
-
- // ========== 商品 收藏 1-008-008-000 ==========
- ErrorCode FAVORITE_EXISTS = new ErrorCode(1_008_008_000, "该商品已经被收藏");
- ErrorCode FAVORITE_NOT_EXISTS = new ErrorCode(1_008_008_001, "商品收藏不存在");
-
-}
diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/ProductConstants.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/ProductConstants.java
deleted file mode 100644
index 7a08c788..00000000
--- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/ProductConstants.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.win.module.product.enums;
-
-/**
- * Product 常量
- *
- * @author HUIHUI
- */
-public interface ProductConstants {
-
- /**
- * 警戒库存 TODO 警戒库存暂时为 10,后期需要使用常量或者数据库配置替换
- */
- int ALERT_STOCK = 10;
-
-}
diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/comment/ProductCommentAuditStatusEnum.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/comment/ProductCommentAuditStatusEnum.java
deleted file mode 100644
index 5b4d515a..00000000
--- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/comment/ProductCommentAuditStatusEnum.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.win.module.product.enums.comment;
-
-import com.win.framework.common.core.IntArrayValuable;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.util.Arrays;
-
-/**
- * 商品评论的审批状态枚举
- *
- * @author 芋道源码
- */
-@Getter
-@AllArgsConstructor
-public enum ProductCommentAuditStatusEnum implements IntArrayValuable {
-
- NONE(1, "待审核"),
- APPROVE(2, "审批通过"),
- REJECT(2, "审批不通过"),;
-
- public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ProductCommentAuditStatusEnum::getStatus).toArray();
-
- /**
- * 审批状态
- */
- private final Integer status;
- /**
- * 状态名
- */
- private final String name;
-
- @Override
- public int[] array() {
- return ARRAYS;
- }
-
-}
diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/comment/ProductCommentScoresEnum.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/comment/ProductCommentScoresEnum.java
deleted file mode 100644
index 62c54f42..00000000
--- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/comment/ProductCommentScoresEnum.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.win.module.product.enums.comment;
-
-import com.win.framework.common.core.IntArrayValuable;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.util.Arrays;
-
-/**
- * 商品评论的星级枚举
- *
- * @author wangzhs
- */
-@Getter
-@AllArgsConstructor
-public enum ProductCommentScoresEnum implements IntArrayValuable {
-
- ONE(1, "1星"),
- TWO(2, "2星"),
- THREE(3, "3星"),
- FOUR(4, "4星"),
- FIVE(5, "5星");
-
- public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ProductCommentScoresEnum::getScores).toArray();
-
- /**
- * 星级
- */
- private final Integer scores;
-
- /**
- * 星级名
- */
- private final String name;
-
- @Override
- public int[] array() {
- return ARRAYS;
- }
-
-}
diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/group/ProductGroupStyleEnum.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/group/ProductGroupStyleEnum.java
deleted file mode 100644
index eb597af0..00000000
--- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/group/ProductGroupStyleEnum.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.win.module.product.enums.group;
-
-import com.win.framework.common.core.IntArrayValuable;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.util.Arrays;
-
-/**
- * 商品分组的样式枚举
- *
- * @author 芋道源码
- */
-@Getter
-@AllArgsConstructor
-public enum ProductGroupStyleEnum implements IntArrayValuable {
-
- ONE(1, "每列一个"),
- TWO(2, "每列两个"),
- THREE(2, "每列三个"),;
-
- public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ProductGroupStyleEnum::getStyle).toArray();
-
- /**
- * 列表样式
- */
- private final Integer style;
- /**
- * 状态名
- */
- private final String name;
-
- @Override
- public int[] array() {
- return ARRAYS;
- }
-
-}
diff --git a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/spu/ProductSpuStatusEnum.java b/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/spu/ProductSpuStatusEnum.java
deleted file mode 100644
index dc83e1ec..00000000
--- a/win-module-mall/win-module-product-api/src/main/java/com/win/module/product/enums/spu/ProductSpuStatusEnum.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.win.module.product.enums.spu;
-
-import com.win.framework.common.core.IntArrayValuable;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.util.Arrays;
-
-/**
- * 商品 SPU 状态
- *
- * @author 芋道源码
- */
-@Getter
-@AllArgsConstructor
-public enum ProductSpuStatusEnum implements IntArrayValuable {
-
- RECYCLE(-1, "回收站"),
- DISABLE(0, "下架"),
- ENABLE(1, "上架");
-
- public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ProductSpuStatusEnum::getStatus).toArray();
-
- /**
- * 状态
- */
- private final Integer status;
- /**
- * 状态名
- */
- private final String name;
-
- @Override
- public int[] array() {
- return ARRAYS;
- }
-
- /**
- * 判断是否处于【上架】状态
- *
- * @param status 状态
- * @return 是否处于【上架】状态
- */
- public static boolean isEnable(Integer status) {
- return ENABLE.getStatus().equals(status);
- }
-
-}
diff --git a/win-module-mall/win-module-product-biz/pom.xml b/win-module-mall/win-module-product-biz/pom.xml
deleted file mode 100644
index 683923e5..00000000
--- a/win-module-mall/win-module-product-biz/pom.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-
-
-
- com.win
- win-module-mall
- ${revision}
-
- 4.0.0
- win-module-product-biz
- jar
-
- ${project.artifactId}
-
- product 模块,主要实现商品相关功能
- 例如:品牌、商品分类、spu、sku等功能。
-
-
-
-
- com.win
- win-module-product-api
- ${revision}
-
-
-
- com.win
- win-module-trade-api
- ${revision}
-
-
- com.win
- win-module-member-api
- ${revision}
-
-
-
-
- com.win
- win-spring-boot-starter-biz-operatelog
-
-
- com.win
- win-spring-boot-starter-biz-dict
-
-
-
-
- com.win
- win-spring-boot-starter-web
-
-
- com.win
- win-spring-boot-starter-security
-
-
-
-
- com.win
- win-spring-boot-starter-mybatis
-
-
-
-
- com.win
- win-spring-boot-starter-test
-
-
-
-
- com.win
- win-spring-boot-starter-excel
-
-
-
-
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/comment/ProductCommentApiImpl.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/comment/ProductCommentApiImpl.java
deleted file mode 100644
index ca916817..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/comment/ProductCommentApiImpl.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.win.module.product.api.comment;
-
-import com.win.module.product.api.comment.dto.ProductCommentCreateReqDTO;
-import com.win.module.product.service.comment.ProductCommentService;
-import org.springframework.stereotype.Service;
-import org.springframework.validation.annotation.Validated;
-
-import javax.annotation.Resource;
-
-/**
- * 商品评论 API 实现类
- *
- * @author HUIHUI
- */
-@Service
-@Validated
-public class ProductCommentApiImpl implements ProductCommentApi {
-
- @Resource
- private ProductCommentService productCommentService;
-
- @Override
- public Long createComment(ProductCommentCreateReqDTO createReqDTO) {
- return productCommentService.createComment(createReqDTO);
- }
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/package-info.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/package-info.java
deleted file mode 100644
index 1712c1c2..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/package-info.java
+++ /dev/null
@@ -1 +0,0 @@
-package com.win.module.product.api;
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/property/ProductPropertyValueApiImpl.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/property/ProductPropertyValueApiImpl.java
deleted file mode 100644
index 123b035b..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/property/ProductPropertyValueApiImpl.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.win.module.product.api.property;
-
-import com.win.module.product.api.property.dto.ProductPropertyValueDetailRespDTO;
-import com.win.module.product.convert.propertyvalue.ProductPropertyValueConvert;
-import com.win.module.product.service.property.ProductPropertyValueService;
-import org.springframework.stereotype.Service;
-import org.springframework.validation.annotation.Validated;
-
-import javax.annotation.Resource;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * 商品属性值 API 实现类
- *
- * @author 芋道源码
- */
-@Service
-@Validated
-public class ProductPropertyValueApiImpl implements ProductPropertyValueApi {
-
- @Resource
- private ProductPropertyValueService productPropertyValueService;
-
- @Override
- public List getPropertyValueDetailList(Collection ids) {
- return ProductPropertyValueConvert.INSTANCE.convertList02(
- productPropertyValueService.getPropertyValueDetailList(ids));
- }
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/sku/ProductSkuApiImpl.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/sku/ProductSkuApiImpl.java
deleted file mode 100644
index fb6004d8..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/sku/ProductSkuApiImpl.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package com.win.module.product.api.sku;
-
-import cn.hutool.core.collection.CollUtil;
-import com.win.module.product.api.sku.dto.ProductSkuRespDTO;
-import com.win.module.product.api.sku.dto.ProductSkuUpdateStockReqDTO;
-import com.win.module.product.convert.sku.ProductSkuConvert;
-import com.win.module.product.dal.dataobject.sku.ProductSkuDO;
-import com.win.module.product.service.sku.ProductSkuService;
-import org.springframework.stereotype.Service;
-import org.springframework.validation.annotation.Validated;
-
-import javax.annotation.Resource;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * 商品 SKU API 实现类
- *
- * @author LeeYan9
- * @since 2022-09-06
- */
-@Service
-@Validated
-public class ProductSkuApiImpl implements ProductSkuApi {
-
- @Resource
- private ProductSkuService productSkuService;
-
- @Override
- public ProductSkuRespDTO getSku(Long id) {
- ProductSkuDO sku = productSkuService.getSku(id);
- return ProductSkuConvert.INSTANCE.convert02(sku);
- }
-
- @Override
- public List getSkuList(Collection ids) {
- if (CollUtil.isEmpty(ids)) {
- return Collections.emptyList();
- }
- List skus = productSkuService.getSkuList(ids);
- return ProductSkuConvert.INSTANCE.convertList04(skus);
- }
-
- @Override
- public List getSkuListBySpuId(Collection spuIds) {
- if (CollUtil.isEmpty(spuIds)) {
- return Collections.emptyList();
- }
- List skus = productSkuService.getSkuListBySpuId(spuIds);
- return ProductSkuConvert.INSTANCE.convertList04(skus);
- }
-
- @Override
- public void updateSkuStock(ProductSkuUpdateStockReqDTO updateStockReqDTO) {
- productSkuService.updateSkuStock(updateStockReqDTO);
- }
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/spu/ProductSpuApiImpl.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/spu/ProductSpuApiImpl.java
deleted file mode 100644
index 79afddc7..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/api/spu/ProductSpuApiImpl.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.win.module.product.api.spu;
-
-import cn.hutool.core.collection.CollectionUtil;
-import com.win.module.product.api.spu.dto.ProductSpuRespDTO;
-import com.win.module.product.convert.spu.ProductSpuConvert;
-import com.win.module.product.dal.dataobject.spu.ProductSpuDO;
-import com.win.module.product.dal.mysql.spu.ProductSpuMapper;
-import com.win.module.product.service.sku.ProductSkuService;
-import com.win.module.product.service.spu.ProductSpuService;
-import org.springframework.stereotype.Service;
-import org.springframework.validation.annotation.Validated;
-
-import javax.annotation.Resource;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * 商品 SPU API 接口实现类
- *
- * @author LeeYan9
- * @since 2022-09-06
- */
-@Service
-@Validated
-public class ProductSpuApiImpl implements ProductSpuApi {
-
- @Resource
- private ProductSpuService spuService;
-
- @Override
- public List getSpuList(Collection ids) {
- if (CollectionUtil.isEmpty(ids)) {
- return Collections.emptyList();
- }
- return ProductSpuConvert.INSTANCE.convertList2(spuService.getSpuList(ids));
- }
-
- @Override
- public ProductSpuRespDTO getSpu(Long id) {
- return ProductSpuConvert.INSTANCE.convert02(spuService.getSpu(id));
- }
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/ProductBrandController.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/ProductBrandController.java
deleted file mode 100644
index 9750cb64..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/ProductBrandController.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package com.win.module.product.controller.admin.brand;
-
-import com.win.framework.common.enums.CommonStatusEnum;
-import com.win.framework.common.pojo.CommonResult;
-import com.win.framework.common.pojo.PageResult;
-import com.win.module.product.controller.admin.brand.vo.*;
-import com.win.module.product.convert.brand.ProductBrandConvert;
-import com.win.module.product.dal.dataobject.brand.ProductBrandDO;
-import com.win.module.product.service.brand.ProductBrandService;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-import javax.validation.Valid;
-import java.util.Comparator;
-import java.util.List;
-
-import static com.win.framework.common.pojo.CommonResult.success;
-
-@Tag(name = "管理后台 - 商品品牌")
-@RestController
-@RequestMapping("/product/brand")
-@Validated
-public class ProductBrandController {
-
- @Resource
- private ProductBrandService brandService;
-
- @PostMapping("/create")
- @Operation(summary = "创建品牌")
- @PreAuthorize("@ss.hasPermission('product:brand:create')")
- public CommonResult createBrand(@Valid @RequestBody ProductBrandCreateReqVO createReqVO) {
- return success(brandService.createBrand(createReqVO));
- }
-
- @PutMapping("/update")
- @Operation(summary = "更新品牌")
- @PreAuthorize("@ss.hasPermission('product:brand:update')")
- public CommonResult updateBrand(@Valid @RequestBody ProductBrandUpdateReqVO updateReqVO) {
- brandService.updateBrand(updateReqVO);
- return success(true);
- }
-
- @DeleteMapping("/delete")
- @Operation(summary = "删除品牌")
- @Parameter(name = "id", description = "编号", required = true, example = "1024")
- @PreAuthorize("@ss.hasPermission('product:brand:delete')")
- public CommonResult deleteBrand(@RequestParam("id") Long id) {
- brandService.deleteBrand(id);
- return success(true);
- }
-
- @GetMapping("/get")
- @Operation(summary = "获得品牌")
- @Parameter(name = "id", description = "编号", required = true, example = "1024")
- @PreAuthorize("@ss.hasPermission('product:brand:query')")
- public CommonResult getBrand(@RequestParam("id") Long id) {
- ProductBrandDO brand = brandService.getBrand(id);
- return success(ProductBrandConvert.INSTANCE.convert(brand));
- }
-
- @GetMapping("/list-all-simple")
- @Operation(summary = "获取品牌精简信息列表", description = "主要用于前端的下拉选项")
- public CommonResult> getSimpleBrandList() {
- // 获取品牌列表,只要开启状态的
- List list = brandService.getBrandListByStatus(CommonStatusEnum.ENABLE.getStatus());
- // 排序后,返回给前端
- return success(ProductBrandConvert.INSTANCE.convertList1(list));
- }
-
- @GetMapping("/page")
- @Operation(summary = "获得品牌分页")
- @PreAuthorize("@ss.hasPermission('product:brand:query')")
- public CommonResult> getBrandPage(@Valid ProductBrandPageReqVO pageVO) {
- PageResult pageResult = brandService.getBrandPage(pageVO);
- return success(ProductBrandConvert.INSTANCE.convertPage(pageResult));
- }
-
- @GetMapping("/list")
- @Operation(summary = "获得品牌列表")
- @PreAuthorize("@ss.hasPermission('product:brand:query')")
- public CommonResult> getBrandList(@Valid ProductBrandListReqVO listVO) {
- List list = brandService.getBrandList(listVO);
- list.sort(Comparator.comparing(ProductBrandDO::getSort));
- return success(ProductBrandConvert.INSTANCE.convertList(list));
- }
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandBaseVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandBaseVO.java
deleted file mode 100644
index 25a741b2..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandBaseVO.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.win.module.product.controller.admin.brand.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import javax.validation.constraints.NotNull;
-
-/**
-* 商品品牌 Base VO,提供给添加、修改、详细的子 VO 使用
-* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
-*/
-@Data
-public class ProductBrandBaseVO {
-
- @Schema(description = "品牌名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "苹果")
- @NotNull(message = "品牌名称不能为空")
- private String name;
-
- @Schema(description = "品牌图片", requiredMode = Schema.RequiredMode.REQUIRED)
- @NotNull(message = "品牌图片不能为空")
- private String picUrl;
-
- @Schema(description = "品牌排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- @NotNull(message = "品牌排序不能为空")
- private Integer sort;
-
- @Schema(description = "品牌描述", example = "描述")
- private String description;
-
- @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
- @NotNull(message = "状态不能为空")
- private Integer status;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandCreateReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandCreateReqVO.java
deleted file mode 100644
index 60b304df..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandCreateReqVO.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.win.module.product.controller.admin.brand.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-@Schema(description = "管理后台 - 商品品牌创建 Request VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class ProductBrandCreateReqVO extends ProductBrandBaseVO {
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandListReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandListReqVO.java
deleted file mode 100644
index ae85112d..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandListReqVO.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.win.module.product.controller.admin.brand.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-@Schema(description = "管理后台 - 商品品牌分页 Request VO")
-@Data
-public class ProductBrandListReqVO {
-
- @Schema(description = "品牌名称", example = "苹果")
- private String name;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandPageReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandPageReqVO.java
deleted file mode 100644
index e5a5d7ef..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandPageReqVO.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.win.module.product.controller.admin.brand.vo;
-
-import com.win.framework.common.pojo.PageParam;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-import org.springframework.format.annotation.DateTimeFormat;
-
-import java.time.LocalDateTime;
-
-import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
-
-@Schema(description = "管理后台 - 商品品牌分页 Request VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class ProductBrandPageReqVO extends PageParam {
-
- @Schema(description = "品牌名称", example = "苹果")
- private String name;
-
- @Schema(description = "状态", example = "0")
- private Integer status;
-
- @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
- @Schema(description = "创建时间")
- private LocalDateTime[] createTime;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandRespVO.java
deleted file mode 100644
index 2a913cea..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandRespVO.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.win.module.product.controller.admin.brand.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-import java.time.LocalDateTime;
-
-@Schema(description = "管理后台 - 品牌 Response VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class ProductBrandRespVO extends ProductBrandBaseVO {
-
- @Schema(description = "品牌编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- private Long id;
-
- @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
- private LocalDateTime createTime;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandSimpleRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandSimpleRespVO.java
deleted file mode 100644
index 2843d3e6..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandSimpleRespVO.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.win.module.product.controller.admin.brand.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Schema(description = "管理后台 - 品牌精简信息 Response VO")
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class ProductBrandSimpleRespVO {
-
- @Schema(description = "品牌编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
- private Long id;
-
- @Schema(description = "品牌名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "苹果")
- private String name;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandUpdateReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandUpdateReqVO.java
deleted file mode 100644
index 9cc3cab0..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/brand/vo/ProductBrandUpdateReqVO.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.win.module.product.controller.admin.brand.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-import javax.validation.constraints.NotNull;
-
-@Schema(description = "管理后台 - 商品品牌更新 Request VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class ProductBrandUpdateReqVO extends ProductBrandBaseVO {
-
- @Schema(description = "品牌编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- @NotNull(message = "品牌编号不能为空")
- private Long id;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/ProductCategoryController.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/ProductCategoryController.java
deleted file mode 100644
index 785f6a11..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/ProductCategoryController.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package com.win.module.product.controller.admin.category;
-
-import com.win.framework.common.pojo.CommonResult;
-import com.win.module.product.controller.admin.category.vo.ProductCategoryCreateReqVO;
-import com.win.module.product.controller.admin.category.vo.ProductCategoryListReqVO;
-import com.win.module.product.controller.admin.category.vo.ProductCategoryRespVO;
-import com.win.module.product.controller.admin.category.vo.ProductCategoryUpdateReqVO;
-import com.win.module.product.convert.category.ProductCategoryConvert;
-import com.win.module.product.dal.dataobject.category.ProductCategoryDO;
-import com.win.module.product.service.category.ProductCategoryService;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-import javax.validation.Valid;
-import java.util.Comparator;
-import java.util.List;
-
-import static com.win.framework.common.pojo.CommonResult.success;
-
-@Tag(name = "管理后台 - 商品分类")
-@RestController
-@RequestMapping("/product/category")
-@Validated
-public class ProductCategoryController {
-
- @Resource
- private ProductCategoryService categoryService;
-
- @PostMapping("/create")
- @Operation(summary = "创建商品分类")
- @PreAuthorize("@ss.hasPermission('product:category:create')")
- public CommonResult createCategory(@Valid @RequestBody ProductCategoryCreateReqVO createReqVO) {
- return success(categoryService.createCategory(createReqVO));
- }
-
- @PutMapping("/update")
- @Operation(summary = "更新商品分类")
- @PreAuthorize("@ss.hasPermission('product:category:update')")
- public CommonResult updateCategory(@Valid @RequestBody ProductCategoryUpdateReqVO updateReqVO) {
- categoryService.updateCategory(updateReqVO);
- return success(true);
- }
-
- @DeleteMapping("/delete")
- @Operation(summary = "删除商品分类")
- @Parameter(name = "id", description = "编号", required = true)
- @PreAuthorize("@ss.hasPermission('product:category:delete')")
- public CommonResult deleteCategory(@RequestParam("id") Long id) {
- categoryService.deleteCategory(id);
- return success(true);
- }
-
- @GetMapping("/get")
- @Operation(summary = "获得商品分类")
- @Parameter(name = "id", description = "编号", required = true, example = "1024")
- @PreAuthorize("@ss.hasPermission('product:category:query')")
- public CommonResult getCategory(@RequestParam("id") Long id) {
- ProductCategoryDO category = categoryService.getCategory(id);
- return success(ProductCategoryConvert.INSTANCE.convert(category));
- }
-
- @GetMapping("/list")
- @Operation(summary = "获得商品分类列表")
- @PreAuthorize("@ss.hasPermission('product:category:query')")
- public CommonResult> getCategoryList(@Valid ProductCategoryListReqVO treeListReqVO) {
- List list = categoryService.getEnableCategoryList(treeListReqVO);
- list.sort(Comparator.comparing(ProductCategoryDO::getSort));
- return success(ProductCategoryConvert.INSTANCE.convertList(list));
- }
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryBaseVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryBaseVO.java
deleted file mode 100644
index e8cdf550..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryBaseVO.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.win.module.product.controller.admin.category.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
-
-/**
-* 商品分类 Base VO,提供给添加、修改、详细的子 VO 使用
-* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
-*/
-@Data
-public class ProductCategoryBaseVO {
-
- @Schema(description = "父分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- @NotNull(message = "父分类编号不能为空")
- private Long parentId;
-
- @Schema(description = "分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "办公文具")
- @NotBlank(message = "分类名称不能为空")
- private String name;
-
- @Schema(description = "移动端分类图", requiredMode = Schema.RequiredMode.REQUIRED)
- @NotBlank(message = "移动端分类图不能为空")
- private String picUrl;
-
- @Schema(description = "PC 端分类图")
- private String bigPicUrl;
-
- @Schema(description = "分类排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- private Integer sort;
-
- @Schema(description = "开启状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
- @NotNull(message = "开启状态不能为空")
- private Integer status;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryCreateReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryCreateReqVO.java
deleted file mode 100644
index 37ed9004..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryCreateReqVO.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.win.module.product.controller.admin.category.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-import javax.validation.constraints.NotBlank;
-
-@Schema(description = "管理后台 - 商品分类创建 Request VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class ProductCategoryCreateReqVO extends ProductCategoryBaseVO {
-
- @Schema(description = "分类描述", example = "描述")
- private String description;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryListReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryListReqVO.java
deleted file mode 100644
index 4d735888..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryListReqVO.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.win.module.product.controller.admin.category.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-@Schema(description = "管理后台 - 商品分类列表查询 Request VO")
-@Data
-public class ProductCategoryListReqVO {
-
- @Schema(description = "分类名称", example = "办公文具")
- private String name;
-
- @Schema(description = "开启状态", example = "0")
- private Integer status;
-
- @Schema(description = "父分类编号", example = "1")
- private Long parentId;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryRespVO.java
deleted file mode 100644
index 8d061f51..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryRespVO.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.win.module.product.controller.admin.category.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-import java.time.LocalDateTime;
-
-@Schema(description = "管理后台 - 商品分类 Response VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class ProductCategoryRespVO extends ProductCategoryBaseVO {
-
- @Schema(description = "分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
- private Long id;
-
- @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
- private LocalDateTime createTime;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryUpdateReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryUpdateReqVO.java
deleted file mode 100644
index 7ef2098c..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/category/vo/ProductCategoryUpdateReqVO.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.win.module.product.controller.admin.category.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-import javax.validation.constraints.NotBlank;
-import javax.validation.constraints.NotNull;
-
-@Schema(description = "管理后台 - 商品分类更新 Request VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class ProductCategoryUpdateReqVO extends ProductCategoryBaseVO {
-
- @Schema(description = "分类编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
- @NotNull(message = "分类编号不能为空")
- private Long id;
-
- @Schema(description = "分类描述", example = "描述")
- private String description;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/ProductCommentController.http b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/ProductCommentController.http
deleted file mode 100644
index e69de29b..00000000
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/ProductCommentController.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/ProductCommentController.java
deleted file mode 100644
index f8db554c..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/ProductCommentController.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package com.win.module.product.controller.admin.comment;
-
-import com.win.framework.common.pojo.CommonResult;
-import com.win.framework.common.pojo.PageResult;
-import com.win.module.product.controller.admin.comment.vo.*;
-import com.win.module.product.convert.comment.ProductCommentConvert;
-import com.win.module.product.dal.dataobject.comment.ProductCommentDO;
-import com.win.module.product.service.comment.ProductCommentService;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-import javax.validation.Valid;
-
-import static com.win.framework.common.pojo.CommonResult.success;
-import static com.win.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
-
-@Tag(name = "管理后台 - 商品评价")
-@RestController
-@RequestMapping("/product/comment")
-@Validated
-public class ProductCommentController {
-
- @Resource
- private ProductCommentService productCommentService;
-
- @GetMapping("/page")
- @Operation(summary = "获得商品评价分页")
- @PreAuthorize("@ss.hasPermission('product:comment:query')")
- public CommonResult> getCommentPage(@Valid ProductCommentPageReqVO pageVO) {
- PageResult pageResult = productCommentService.getCommentPage(pageVO);
- return success(ProductCommentConvert.INSTANCE.convertPage(pageResult));
- }
-
- @PutMapping("/update-visible")
- @Operation(summary = "显示 / 隐藏评论")
- @PreAuthorize("@ss.hasPermission('product:comment:update')")
- public CommonResult updateCommentVisible(@Valid @RequestBody ProductCommentUpdateVisibleReqVO updateReqVO) {
- productCommentService.updateCommentVisible(updateReqVO);
- return success(true);
- }
-
- @PutMapping("/reply")
- @Operation(summary = "商家回复")
- @PreAuthorize("@ss.hasPermission('product:comment:update')")
- public CommonResult commentReply(@Valid @RequestBody ProductCommentReplyReqVO replyVO) {
- productCommentService.replyComment(replyVO, getLoginUserId());
- return success(true);
- }
-
- @PostMapping("/create")
- @Operation(summary = "添加自评")
- @PreAuthorize("@ss.hasPermission('product:comment:update')")
- public CommonResult createComment(@Valid @RequestBody ProductCommentCreateReqVO createReqVO) {
- productCommentService.createComment(createReqVO);
- return success(true);
- }
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentBaseVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentBaseVO.java
deleted file mode 100644
index afaed3a2..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentBaseVO.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package com.win.module.product.controller.admin.comment.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
-import java.util.List;
-
-@Data
-public class ProductCommentBaseVO {
-
- @Schema(description = "评价人", requiredMode = Schema.RequiredMode.REQUIRED, example = "16868")
- private Long userId;
-
- @Schema(description = "评价订单项", requiredMode = Schema.RequiredMode.REQUIRED, example = "19292")
- private Long orderItemId;
-
- @Schema(description = "评价人名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "小姑凉")
- @NotNull(message = "评价人名称不能为空")
- private String userNickname;
-
- @Schema(description = "评价人头像", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xx.png")
- @NotNull(message = "评价人头像不能为空")
- private String userAvatar;
-
- @Schema(description = "商品 SKU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- @NotNull(message = "商品 SKU 编号不能为空")
- private Long skuId;
-
- @Schema(description = "描述星级 1-5 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "5")
- @NotNull(message = "描述星级不能为空")
- private Integer descriptionScores;
-
- @Schema(description = "服务星级 1-5 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "5")
- @NotNull(message = "服务星级分不能为空")
- private Integer benefitScores;
-
- @Schema(description = "评论内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "穿起来非常丝滑凉快")
- @NotNull(message = "评论内容不能为空")
- private String content;
-
- @Schema(description = "评论图片地址数组,以逗号分隔最多上传 9 张", requiredMode = Schema.RequiredMode.REQUIRED, example = "[https://www.iocoder.cn/xx.png]")
- @Size(max = 9, message = "评论图片地址数组长度不能超过 9 张")
- private List picUrls;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentCreateReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentCreateReqVO.java
deleted file mode 100644
index 0e450396..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentCreateReqVO.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.win.module.product.controller.admin.comment.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-@Schema(description = "管理后台 - 商品评价创建 Request VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class ProductCommentCreateReqVO extends ProductCommentBaseVO {
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentPageReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentPageReqVO.java
deleted file mode 100644
index e8abe066..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentPageReqVO.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package com.win.module.product.controller.admin.comment.vo;
-
-import com.win.framework.common.pojo.PageParam;
-import com.win.framework.common.validation.InEnum;
-import com.win.module.product.enums.comment.ProductCommentScoresEnum;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-import org.springframework.format.annotation.DateTimeFormat;
-
-import java.time.LocalDateTime;
-
-import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
-
-@Schema(description = "管理后台 - 商品评价分页 Request VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class ProductCommentPageReqVO extends PageParam {
-
- @Schema(description = "评价人名称", example = "王二狗")
- private String userNickname;
-
- @Schema(description = "交易订单编号", example = "24428")
- private Long orderId;
-
- @Schema(description = "商品SPU编号", example = "29502")
- private Long spuId;
-
- @Schema(description = "商品SPU名称", example = "感冒药")
- private String spuName;
-
- @Schema(description = "评分星级 1-5 分", example = "5")
- @InEnum(ProductCommentScoresEnum.class)
- private Integer scores;
-
- @Schema(description = "商家是否回复", example = "true")
- private Boolean replyStatus;
-
- @Schema(description = "创建时间")
- @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
- private LocalDateTime[] createTime;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentReplyReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentReplyReqVO.java
deleted file mode 100644
index 73982d94..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentReplyReqVO.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.win.module.product.controller.admin.comment.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.ToString;
-
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
-
-@Schema(description = "管理后台 - 商品评价的商家回复 Request VO")
-@Data
-@ToString(callSuper = true)
-public class ProductCommentReplyReqVO {
-
- @Schema(description = "评价编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15721")
- @NotNull(message = "评价编号不能为空")
- private Long id;
-
- @Schema(description = "商家回复内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "谢谢亲")
- @NotEmpty(message = "商家回复内容不能为空")
- private String replyContent;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentRespVO.java
deleted file mode 100644
index db1d5cd1..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentRespVO.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package com.win.module.product.controller.admin.comment.vo;
-
-import com.win.module.product.controller.admin.sku.vo.ProductSkuBaseVO;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-import javax.validation.constraints.NotNull;
-import java.time.LocalDateTime;
-import java.util.List;
-
-@Schema(description = "管理后台 - 商品评价 Response VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class ProductCommentRespVO extends ProductCommentBaseVO {
-
- @Schema(description = "订单项编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24965")
- private Long id;
-
- @Schema(description = "是否匿名", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
- private Boolean anonymous;
-
- @Schema(description = "交易订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24428")
- private Long orderId;
-
- @Schema(description = "是否可见", requiredMode = Schema.RequiredMode.REQUIRED)
- private Boolean visible;
-
- @Schema(description = "商家是否回复", requiredMode = Schema.RequiredMode.REQUIRED)
- private Boolean replyStatus;
-
- @Schema(description = "回复管理员编号", example = "9527")
- private Long replyUserId;
-
- @Schema(description = "商家回复内容", example = "感谢好评哦亲(づ ̄3 ̄)づ╭❤~")
- private String replyContent;
-
- @Schema(description = "商家回复时间", example = "2023-08-08 12:20:55")
- private LocalDateTime replyTime;
-
- @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
- private LocalDateTime createTime;
-
- @Schema(description = "评分星级 1-5 分", requiredMode = Schema.RequiredMode.REQUIRED, example = "5")
- private Integer scores;
-
- @Schema(description = "商品 SPU 编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "清凉丝滑透气小短袖")
- @NotNull(message = "商品 SPU 编号不能为空")
- private Long spuId;
-
- @Schema(description = "商品 SPU 名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
- @NotNull(message = "商品 SPU 名称不能为空")
- private String spuName;
-
- @Schema(description = "商品 SKU 图片地址", example = "https://www.iocoder.cn/win.jpg")
- private String skuPicUrl;
-
- @Schema(description = "商品 SKU 规格值数组")
- private List skuProperties;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentUpdateVisibleReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentUpdateVisibleReqVO.java
deleted file mode 100644
index b7914122..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/comment/vo/ProductCommentUpdateVisibleReqVO.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.win.module.product.controller.admin.comment.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.ToString;
-
-import javax.validation.constraints.NotNull;
-
-@Schema(description = "管理后台 - 商品评价可见修改 Request VO")
-@Data
-@ToString(callSuper = true)
-public class ProductCommentUpdateVisibleReqVO {
-
- @Schema(description = "评价编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15721")
- @NotNull(message = "评价编号不能为空")
- private Long id;
-
- @Schema(description = "是否可见", requiredMode = Schema.RequiredMode.REQUIRED, example = "false")
- @NotNull(message = "是否可见不能为空")
- private Boolean visible;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/ProductPropertyController.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/ProductPropertyController.java
deleted file mode 100644
index adf30dba..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/ProductPropertyController.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package com.win.module.product.controller.admin.property;
-
-import cn.hutool.core.collection.CollUtil;
-import com.win.framework.common.pojo.CommonResult;
-import com.win.framework.common.pojo.PageResult;
-import com.win.module.product.controller.admin.property.vo.property.*;
-import com.win.module.product.convert.property.ProductPropertyConvert;
-import com.win.module.product.dal.dataobject.property.ProductPropertyDO;
-import com.win.module.product.dal.dataobject.property.ProductPropertyValueDO;
-import com.win.module.product.service.property.ProductPropertyService;
-import com.win.module.product.service.property.ProductPropertyValueService;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-import javax.validation.Valid;
-import java.util.Collections;
-import java.util.List;
-
-import static com.win.framework.common.pojo.CommonResult.success;
-import static com.win.framework.common.util.collection.CollectionUtils.convertSet;
-
-@Tag(name = "管理后台 - 商品属性项")
-@RestController
-@RequestMapping("/product/property")
-@Validated
-public class ProductPropertyController {
-
- @Resource
- private ProductPropertyService productPropertyService;
- @Resource
- private ProductPropertyValueService productPropertyValueService;
-
- @PostMapping("/create")
- @Operation(summary = "创建属性项")
- @PreAuthorize("@ss.hasPermission('product:property:create')")
- public CommonResult createProperty(@Valid @RequestBody ProductPropertyCreateReqVO createReqVO) {
- return success(productPropertyService.createProperty(createReqVO));
- }
-
- @PutMapping("/update")
- @Operation(summary = "更新属性项")
- @PreAuthorize("@ss.hasPermission('product:property:update')")
- public CommonResult updateProperty(@Valid @RequestBody ProductPropertyUpdateReqVO updateReqVO) {
- productPropertyService.updateProperty(updateReqVO);
- return success(true);
- }
-
- @DeleteMapping("/delete")
- @Operation(summary = "删除属性项")
- @Parameter(name = "id", description = "编号", required = true)
- @PreAuthorize("@ss.hasPermission('product:property:delete')")
- public CommonResult deleteProperty(@RequestParam("id") Long id) {
- productPropertyService.deleteProperty(id);
- return success(true);
- }
-
- @GetMapping("/get")
- @Operation(summary = "获得属性项")
- @Parameter(name = "id", description = "编号", required = true, example = "1024")
- @PreAuthorize("@ss.hasPermission('product:property:query')")
- public CommonResult getProperty(@RequestParam("id") Long id) {
- return success(ProductPropertyConvert.INSTANCE.convert(productPropertyService.getProperty(id)));
- }
-
- @GetMapping("/list")
- @Operation(summary = "获得属性项列表")
- @PreAuthorize("@ss.hasPermission('product:property:query')")
- public CommonResult> getPropertyList(@Valid ProductPropertyListReqVO listReqVO) {
- return success(ProductPropertyConvert.INSTANCE.convertList(productPropertyService.getPropertyList(listReqVO)));
- }
-
- @GetMapping("/page")
- @Operation(summary = "获得属性项分页")
- @PreAuthorize("@ss.hasPermission('product:property:query')")
- public CommonResult> getPropertyPage(@Valid ProductPropertyPageReqVO pageVO) {
- return success(ProductPropertyConvert.INSTANCE.convertPage(productPropertyService.getPropertyPage(pageVO)));
- }
-
- @PostMapping("/get-value-list")
- @Operation(summary = "获得属性项列表")
- @PreAuthorize("@ss.hasPermission('product:property:query')")
- public CommonResult> getPropertyAndValueList(
- @Valid @RequestBody ProductPropertyListReqVO listReqVO) {
- // 查询属性项
- List keys = productPropertyService.getPropertyList(listReqVO);
- if (CollUtil.isEmpty(keys)) {
- return success(Collections.emptyList());
- }
- // 查询属性值
- List values = productPropertyValueService.getPropertyValueListByPropertyId(
- convertSet(keys, ProductPropertyDO::getId));
- return success(ProductPropertyConvert.INSTANCE.convertList(keys, values));
- }
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/ProductPropertyValueController.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/ProductPropertyValueController.java
deleted file mode 100644
index 5132d0d3..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/ProductPropertyValueController.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package com.win.module.product.controller.admin.property;
-
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.crypto.symmetric.AES;
-import com.win.framework.common.pojo.CommonResult;
-import com.win.framework.common.pojo.PageResult;
-import com.win.module.product.controller.admin.property.vo.value.ProductPropertyValueCreateReqVO;
-import com.win.module.product.controller.admin.property.vo.value.ProductPropertyValuePageReqVO;
-import com.win.module.product.controller.admin.property.vo.value.ProductPropertyValueRespVO;
-import com.win.module.product.controller.admin.property.vo.value.ProductPropertyValueUpdateReqVO;
-import com.win.module.product.convert.propertyvalue.ProductPropertyValueConvert;
-import com.win.module.product.service.property.ProductPropertyValueService;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-import javax.validation.Valid;
-
-import java.util.Arrays;
-import java.util.List;
-
-import static com.win.framework.common.pojo.CommonResult.success;
-
-@Tag(name = "管理后台 - 商品属性值")
-@RestController
-@RequestMapping("/product/property/value")
-@Validated
-public class ProductPropertyValueController {
-
- @Resource
- private ProductPropertyValueService productPropertyValueService;
-
- @PostMapping("/create")
- @Operation(summary = "创建属性值")
- @PreAuthorize("@ss.hasPermission('product:property:create')")
- public CommonResult createPropertyValue(@Valid @RequestBody ProductPropertyValueCreateReqVO createReqVO) {
- return success(productPropertyValueService.createPropertyValue(createReqVO));
- }
-
- @PutMapping("/update")
- @Operation(summary = "更新属性值")
- @PreAuthorize("@ss.hasPermission('product:property:update')")
- public CommonResult updatePropertyValue(@Valid @RequestBody ProductPropertyValueUpdateReqVO updateReqVO) {
- productPropertyValueService.updatePropertyValue(updateReqVO);
- return success(true);
- }
-
- @DeleteMapping("/delete")
- @Operation(summary = "删除属性值")
- @Parameter(name = "id", description = "编号", required = true, example = "1024")
- @PreAuthorize("@ss.hasPermission('product:property:delete')")
- public CommonResult deletePropertyValue(@RequestParam("id") Long id) {
- productPropertyValueService.deletePropertyValue(id);
- return success(true);
- }
-
- @GetMapping("/get")
- @Operation(summary = "获得属性值")
- @Parameter(name = "id", description = "编号", required = true, example = "1024")
- @PreAuthorize("@ss.hasPermission('product:property:query')")
- public CommonResult getPropertyValue(@RequestParam("id") Long id) {
- return success(ProductPropertyValueConvert.INSTANCE.convert(productPropertyValueService.getPropertyValue(id)));
- }
-
- @GetMapping("/page")
- @Operation(summary = "获得属性值分页")
- @PreAuthorize("@ss.hasPermission('product:property:query')")
- public CommonResult> getPropertyValuePage(@Valid ProductPropertyValuePageReqVO pageVO) {
- return success(ProductPropertyValueConvert.INSTANCE.convertPage(productPropertyValueService.getPropertyValuePage(pageVO)));
- }
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyAndValueRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyAndValueRespVO.java
deleted file mode 100644
index a5e6bb23..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyAndValueRespVO.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.win.module.product.controller.admin.property.vo.property;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import java.util.List;
-
-@Schema(description = "管理后台 - 商品属性项 + 属性值 Response VO")
-@Data
-public class ProductPropertyAndValueRespVO {
-
- @Schema(description = "属性项的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
- private Long id;
-
- @Schema(description = "属性项的名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "颜色")
- private String name;
-
- /**
- * 属性值的集合
- */
- private List values;
-
- @Schema(description = "管理后台 - 属性值的简单 Response VO")
- @Data
- public static class Value {
-
- @Schema(description = "属性值的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
- private Long id;
-
- @Schema(description = "属性值的名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "红色")
- private String name;
-
- }
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyBaseVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyBaseVO.java
deleted file mode 100644
index afa37bfa..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyBaseVO.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.win.module.product.controller.admin.property.vo.property;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import javax.validation.constraints.NotBlank;
-
-/**
- * 商品属性项 Base VO,提供给添加、修改、详细的子 VO 使用
- * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
- */
-@Data
-public class ProductPropertyBaseVO {
-
- @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "颜色")
- @NotBlank(message = "名称不能为空")
- private String name;
-
- @Schema(description = "备注", example = "颜色")
- private String remark;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyCreateReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyCreateReqVO.java
deleted file mode 100644
index 83c280eb..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyCreateReqVO.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.win.module.product.controller.admin.property.vo.property;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-@Schema(description = "管理后台 - 属性项创建 Request VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class ProductPropertyCreateReqVO extends ProductPropertyBaseVO {
-
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyListReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyListReqVO.java
deleted file mode 100644
index 1f759ca2..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyListReqVO.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.win.module.product.controller.admin.property.vo.property;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.ToString;
-
-import java.util.List;
-
-@Schema(description = "管理后台 - 属性项 List Request VO")
-@Data
-@ToString(callSuper = true)
-public class ProductPropertyListReqVO {
-
- @Schema(description = "属性名称", example = "颜色")
- private String name;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyPageReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyPageReqVO.java
deleted file mode 100644
index 4a6a83b0..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyPageReqVO.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.win.module.product.controller.admin.property.vo.property;
-
-import com.win.framework.common.pojo.PageParam;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-import org.springframework.format.annotation.DateTimeFormat;
-
-import java.time.LocalDateTime;
-
-import static com.win.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
-
-@Schema(description = "管理后台 - 属性项 Request VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class ProductPropertyPageReqVO extends PageParam {
-
- @Schema(description = "名称", example = "颜色")
- private String name;
-
- @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- private Integer status;
-
- @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
- @Schema(description = "创建时间")
- private LocalDateTime[] createTime;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyRespVO.java
deleted file mode 100644
index d9a6b313..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyRespVO.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.win.module.product.controller.admin.property.vo.property;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-import java.time.LocalDateTime;
-
-@Schema(description = "管理后台 - 属性项 Response VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class ProductPropertyRespVO extends ProductPropertyBaseVO {
-
- @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
- private Long id;
-
- @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
- private LocalDateTime createTime;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyUpdateReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyUpdateReqVO.java
deleted file mode 100644
index f192d8ab..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/property/ProductPropertyUpdateReqVO.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.win.module.product.controller.admin.property.vo.property;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-import javax.validation.constraints.NotNull;
-
-@Schema(description = "管理后台 - 属性项更新 Request VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class ProductPropertyUpdateReqVO extends ProductPropertyBaseVO {
-
- @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- @NotNull(message = "主键不能为空")
- private Long id;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueBaseVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueBaseVO.java
deleted file mode 100644
index a93834f5..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueBaseVO.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.win.module.product.controller.admin.property.vo.value;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
-
-/**
-* 属性值 Base VO,提供给添加、修改、详细的子 VO 使用
-* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
-*/
-@Data
-public class ProductPropertyValueBaseVO {
-
- @Schema(description = "属性项的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
- @NotNull(message = "属性项的编号不能为空")
- private Long propertyId;
-
- @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "红色")
- @NotEmpty(message = "名称名字不能为空")
- private String name;
-
- @Schema(description = "备注", example = "颜色")
- private String remark;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueCreateReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueCreateReqVO.java
deleted file mode 100644
index ffc62dc3..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueCreateReqVO.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.win.module.product.controller.admin.property.vo.value;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-@Schema(description = "管理后台 - 商品属性值创建 Request VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class ProductPropertyValueCreateReqVO extends ProductPropertyValueBaseVO {
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueDetailRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueDetailRespVO.java
deleted file mode 100644
index 9770a2d8..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueDetailRespVO.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.win.module.product.controller.admin.property.vo.value;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-@Schema(description = "管理后台 - 商品属性值的明细 Response VO")
-@Data
-public class ProductPropertyValueDetailRespVO {
-
- @Schema(description = "属性的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- private Long propertyId;
-
- @Schema(description = "属性的名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "颜色")
- private String propertyName;
-
- @Schema(description = "属性值的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
- private Long valueId;
-
- @Schema(description = "属性值的名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "红色")
- private String valueName;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValuePageReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValuePageReqVO.java
deleted file mode 100644
index 1da472d6..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValuePageReqVO.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.win.module.product.controller.admin.property.vo.value;
-
-import com.win.framework.common.pojo.PageParam;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-@Schema(description = "管理后台 - 商品属性值分页 Request VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class ProductPropertyValuePageReqVO extends PageParam {
-
- @Schema(description = "属性项的编号", example = "1024")
- private String propertyId;
-
- @Schema(description = "名称", example = "红色")
- private String name;
-
- @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- private Integer status;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueRespVO.java
deleted file mode 100644
index a7ed3d4b..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueRespVO.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.win.module.product.controller.admin.property.vo.value;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-import java.time.LocalDateTime;
-
-@Schema(description = "管理后台 - 商品属性值 Response VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class ProductPropertyValueRespVO extends ProductPropertyValueBaseVO {
-
- @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
- private Long id;
-
- @Schema(description = "创建时间")
- private LocalDateTime createTime;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueUpdateReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueUpdateReqVO.java
deleted file mode 100644
index 5b0c4f8e..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/property/vo/value/ProductPropertyValueUpdateReqVO.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package com.win.module.product.controller.admin.property.vo.value;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-import javax.validation.constraints.NotNull;
-
-@Schema(description = "管理后台 - 商品属性值更新 Request VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class ProductPropertyValueUpdateReqVO extends ProductPropertyValueBaseVO {
-
- @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
- @NotNull(message = "主键不能为空")
- private Long id;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/ProductSkuController.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/ProductSkuController.java
deleted file mode 100644
index 0f3ef2d6..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/ProductSkuController.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package com.win.module.product.controller.admin.sku;
-
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-@Tag(name = "管理后台 - 商品 SKU")
-@RestController
-@RequestMapping("/product/sku")
-@Validated
-public class ProductSkuController {
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/vo/ProductSkuBaseVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/vo/ProductSkuBaseVO.java
deleted file mode 100644
index 77ab1da0..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/vo/ProductSkuBaseVO.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package com.win.module.product.controller.admin.sku.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
-import java.util.List;
-
-/**
-* 商品 SKU Base VO,提供给添加、修改、详细的子 VO 使用
-* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
-*/
-@Data
-public class ProductSkuBaseVO {
-
- @Schema(description = "商品 SKU 名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "清凉小短袖")
- @NotEmpty(message = "商品 SKU 名字不能为空")
- private String name;
-
- @Schema(description = "销售价格,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1999")
- @NotNull(message = "销售价格,单位:分不能为空")
- private Integer price;
-
- @Schema(description = "市场价", example = "2999")
- private Integer marketPrice;
-
- @Schema(description = "成本价", example = "19")
- private Integer costPrice;
-
- @Schema(description = "条形码", example = "15156165456")
- private String barCode;
-
- @Schema(description = "图片地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/xx.png")
- @NotNull(message = "图片地址不能为空")
- private String picUrl;
-
- @Schema(description = "库存", requiredMode = Schema.RequiredMode.REQUIRED, example = "200")
- @NotNull(message = "库存不能为空")
- private Integer stock;
-
- @Schema(description = "预警预存", example = "10")
- private Integer warnStock;
-
- @Schema(description = "商品重量,单位:kg 千克", example = "1.2")
- private Double weight;
-
- @Schema(description = "商品体积,单位:m^3 平米", example = "2.5")
- private Double volume;
-
- @Schema(description = "一级分销的佣金,单位:分", example = "199")
- private Integer subCommissionFirstPrice;
-
- @Schema(description = "二级分销的佣金,单位:分", example = "19")
- private Integer subCommissionSecondPrice;
-
- @Schema(description = "属性数组")
- private List properties;
-
- @Schema(description = "商品属性")
- @Data
- @NoArgsConstructor
- @AllArgsConstructor
- public static class Property {
-
- @Schema(description = "属性编号", example = "10")
- private Long propertyId;
-
- @Schema(description = "属性名字", example = "颜色")
- private String propertyName;
-
- @Schema(description = "属性值编号", example = "10")
- private Long valueId;
-
- @Schema(description = "属性值名字", example = "红色")
- private String valueName;
-
- }
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/vo/ProductSkuCreateOrUpdateReqVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/vo/ProductSkuCreateOrUpdateReqVO.java
deleted file mode 100644
index 87c7f06a..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/vo/ProductSkuCreateOrUpdateReqVO.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.win.module.product.controller.admin.sku.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-
-import java.util.List;
-
-@Schema(description = "管理后台 - 商品 SKU 创建/更新 Request VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class ProductSkuCreateOrUpdateReqVO extends ProductSkuBaseVO {
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/vo/ProductSkuRespVO.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/vo/ProductSkuRespVO.java
deleted file mode 100644
index 6ee03db1..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/sku/vo/ProductSkuRespVO.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.win.module.product.controller.admin.sku.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
-
-import javax.validation.constraints.NotNull;
-import java.util.List;
-
-@Schema(description = "管理后台 - 商品 SKU Response VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class ProductSkuRespVO extends ProductSkuBaseVO {
-
- @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
- private Long id;
-
-}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/ProductSpuController.http b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/ProductSpuController.http
deleted file mode 100644
index 4ab7b4f7..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/ProductSpuController.http
+++ /dev/null
@@ -1,4 +0,0 @@
-### 获得商品 SPU 明细
-GET {{baseUrl}}/product/spu/get-detail?id=4
-Authorization: Bearer {{token}}
-tenant-id: {{adminTenentId}}
diff --git a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/ProductSpuController.java b/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/ProductSpuController.java
deleted file mode 100644
index 1d8e3732..00000000
--- a/win-module-mall/win-module-product-biz/src/main/java/com/win/module/product/controller/admin/spu/ProductSpuController.java
+++ /dev/null
@@ -1,134 +0,0 @@
-package com.win.module.product.controller.admin.spu;
-
-import com.win.framework.common.pojo.CommonResult;
-import com.win.framework.common.pojo.PageResult;
-import com.win.framework.excel.core.util.ExcelUtils;
-import com.win.framework.operatelog.core.annotations.OperateLog;
-import com.win.module.product.controller.admin.spu.vo.*;
-import com.win.module.product.convert.spu.ProductSpuConvert;
-import com.win.module.product.dal.dataobject.sku.ProductSkuDO;
-import com.win.module.product.dal.dataobject.spu.ProductSpuDO;
-import com.win.module.product.service.sku.ProductSkuService;
-import com.win.module.product.service.spu.ProductSpuService;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-import static com.win.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static com.win.framework.common.pojo.CommonResult.success;
-import static com.win.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
-import static com.win.module.product.enums.ErrorCodeConstants.SPU_NOT_EXISTS;
-
-@Tag(name = "管理后台 - 商品 SPU")
-@RestController
-@RequestMapping("/product/spu")
-@Validated
-public class ProductSpuController {
-
- @Resource
- private ProductSpuService productSpuService;
- @Resource
- private ProductSkuService productSkuService;
-
- @PostMapping("/create")
- @Operation(summary = "创建商品 SPU")
- @PreAuthorize("@ss.hasPermission('product:spu:create')")
- public CommonResult createProductSpu(@Valid @RequestBody ProductSpuCreateReqVO createReqVO) {
- return success(productSpuService.createSpu(createReqVO));
- }
-
- @PutMapping("/update")
- @Operation(summary = "更新商品 SPU")
- @PreAuthorize("@ss.hasPermission('product:spu:update')")
- public CommonResult updateSpu(@Valid @RequestBody ProductSpuUpdateReqVO updateReqVO) {
- productSpuService.updateSpu(updateReqVO);
- return success(true);
- }
-
- @PutMapping("/update-status")
- @Operation(summary = "更新商品 SPU Status")
- @PreAuthorize("@ss.hasPermission('product:spu:update')")
- public CommonResult updateStatus(@Valid @RequestBody ProductSpuUpdateStatusReqVO updateReqVO) {
- productSpuService.updateSpuStatus(updateReqVO);
- return success(true);
- }
-
- @DeleteMapping("/delete")
- @Operation(summary = "删除商品 SPU")
- @Parameter(name = "id", description = "编号", required = true, example = "1024")
- @PreAuthorize("@ss.hasPermission('product:spu:delete')")
- public CommonResult deleteSpu(@RequestParam("id") Long id) {
- productSpuService.deleteSpu(id);
- return success(true);
- }
-
- @GetMapping("/get-detail")
- @Operation(summary = "获得商品 SPU 明细")
- @Parameter(name = "id", description = "编号", required = true, example = "1024")
- @PreAuthorize("@ss.hasPermission('product:spu:query')")
- public CommonResult getSpuDetail(@RequestParam("id") Long id) {
- // 获得商品 SPU
- ProductSpuDO spu = productSpuService.getSpu(id);
- if (spu == null) {
- throw exception(SPU_NOT_EXISTS);
- }
- // 查询商品 SKU
- List skus = productSkuService.getSkuListBySpuId(spu.getId());
- return success(ProductSpuConvert.INSTANCE.convertForSpuDetailRespVO(spu, skus));
- }
-
- @GetMapping("/get-simple-list")
- @Operation(summary = "获得商品 SPU 精简列表")
- @PreAuthorize("@ss.hasPermission('product:spu:query')")
- public CommonResult> getSpuSimpleList() {
- List list = productSpuService.getSpuList();
- return success(ProductSpuConvert.INSTANCE.convertList02(list));
- }
-
- @GetMapping("/list")
- @Operation(summary = "获得商品 SPU 详情列表")
- @Parameter(name = "spuIds", description = "spu 编号列表", required = true, example = "[1,2,3]")
- @PreAuthorize("@ss.hasPermission('product:spu:query')")
- public CommonResult> getSpuList(@RequestParam("spuIds") Collection spuIds) {
- return success(ProductSpuConvert.INSTANCE.convertForSpuDetailRespListVO(
- productSpuService.getSpuList(spuIds), productSkuService.getSkuListBySpuId(spuIds)));
- }
-
- @GetMapping("/page")
- @Operation(summary = "获得商品 SPU 分页")
- @PreAuthorize("@ss.hasPermission('product:spu:query')")
- public CommonResult> getSpuPage(@Valid ProductSpuPageReqVO pageVO) {
- return success(ProductSpuConvert.INSTANCE.convertPage(productSpuService.getSpuPage(pageVO)));
- }
-
- @GetMapping("/get-count")
- @Operation(summary = "获得商品 SPU 分页 tab count")
- @PreAuthorize("@ss.hasPermission('product:spu:query')")
- public CommonResult