diff --git a/pay-mall-app/src/main/resources/application-dev.yml b/pay-mall-app/src/main/resources/application-dev.yml
index 08e4035..8ef3c6c 100644
--- a/pay-mall-app/src/main/resources/application-dev.yml
+++ b/pay-mall-app/src/main/resources/application-dev.yml
@@ -31,9 +31,9 @@ spring:
type: com.zaxxer.hikari.HikariDataSource
# MyBatis 配置【如需使用记得打开】
-#mybatis:
-# mapper-locations: classpath:/mybatis/mapper/*.xml
-# config-location: classpath:/mybatis/config/mybatis-config.xml
+mybatis:
+ mapper-locations: classpath:/mybatis/mapper/*.xml
+ config-location: classpath:/mybatis/config/mybatis-config.xml
# 微信公众号对接
weixin:
diff --git a/pay-mall-app/src/main/resources/mybatis/mapper/frame_case_mapper.xml b/pay-mall-app/src/main/resources/mybatis/mapper/frame_case_mapper.xml
deleted file mode 100644
index 4e14eaf..0000000
--- a/pay-mall-app/src/main/resources/mybatis/mapper/frame_case_mapper.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- INSERT INTO table(a,b,c) VALUES(#{a}, #{b}, #{c})
-
-
-
- UPDATE table SET a = #{a} WHERE b = #{b}
-
-
-
-
-
diff --git a/pay-mall-app/src/main/resources/mybatis/mapper/pay_order_mapper.xml b/pay-mall-app/src/main/resources/mybatis/mapper/pay_order_mapper.xml
new file mode 100644
index 0000000..b0eaf7f
--- /dev/null
+++ b/pay-mall-app/src/main/resources/mybatis/mapper/pay_order_mapper.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ insert into pay_order(user_id, product_id, product_name, order_id, order_time,
+ total_amount, status, create_time, update_time)
+ values(#{userId}, #{productId}, #{productName}, #{orderId}, #{orderTime},
+ #{totalAmount}, #{status}, now(), now())
+
+
+
+
+
diff --git a/pay-mall-app/src/test/java/edu/whut/test/domain/OrderServiceTest.java b/pay-mall-app/src/test/java/edu/whut/test/domain/OrderServiceTest.java
new file mode 100644
index 0000000..45d147c
--- /dev/null
+++ b/pay-mall-app/src/test/java/edu/whut/test/domain/OrderServiceTest.java
@@ -0,0 +1,33 @@
+package edu.whut.test.domain;
+import com.alibaba.fastjson.JSON;
+import edu.whut.domain.order.model.entity.PayOrderEntity;
+import edu.whut.domain.order.model.entity.ShopCartEntity;
+import edu.whut.domain.order.service.IOrderService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import javax.annotation.Resource;
+
+@Slf4j
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@RequiredArgsConstructor
+public class OrderServiceTest {
+
+ private final IOrderService orderService;
+
+ @Test
+ public void test_createOrder() throws Exception {
+ ShopCartEntity shopCartEntity = new ShopCartEntity();
+ shopCartEntity.setUserId("smile01");
+ shopCartEntity.setProductId("10001");
+ PayOrderEntity payOrderEntity = orderService.createOrder(shopCartEntity);
+ log.info("请求参数:{}", JSON.toJSONString(shopCartEntity));
+ log.info("测试结果:{}", JSON.toJSONString(payOrderEntity));
+ }
+
+}
diff --git a/pay-mall-domain/src/main/java/edu/whut/domain/auth/service/WeixinLoginService.java b/pay-mall-domain/src/main/java/edu/whut/domain/auth/service/WeixinLoginService.java
index 55caa51..bfe7956 100644
--- a/pay-mall-domain/src/main/java/edu/whut/domain/auth/service/WeixinLoginService.java
+++ b/pay-mall-domain/src/main/java/edu/whut/domain/auth/service/WeixinLoginService.java
@@ -1,6 +1,7 @@
package edu.whut.domain.auth.service;
import com.google.common.cache.Cache;
import edu.whut.domain.auth.adapter.port.ILoginPort;
+import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -9,12 +10,12 @@ import java.io.IOException;
@Slf4j
@Service
+@RequiredArgsConstructor
public class WeixinLoginService implements ILoginService {
- @Resource
- private ILoginPort loginPort;
- @Resource
- private Cache openidToken;
+ private final ILoginPort loginPort;
+
+ private final Cache openidToken;
/**
* 生成登录二维码的 ticket
diff --git a/pay-mall-domain/src/main/java/edu/whut/domain/order/adapter/port/IProductPort.java b/pay-mall-domain/src/main/java/edu/whut/domain/order/adapter/port/IProductPort.java
new file mode 100644
index 0000000..33bc1a3
--- /dev/null
+++ b/pay-mall-domain/src/main/java/edu/whut/domain/order/adapter/port/IProductPort.java
@@ -0,0 +1,9 @@
+package edu.whut.domain.order.adapter.port;
+
+
+import edu.whut.domain.order.model.entity.ProductEntity;
+
+public interface IProductPort {
+ ProductEntity queryProductByProductId(String productId);
+
+}
diff --git a/pay-mall-domain/src/main/java/edu/whut/domain/order/adapter/repository/IOrderRepository.java b/pay-mall-domain/src/main/java/edu/whut/domain/order/adapter/repository/IOrderRepository.java
new file mode 100644
index 0000000..86a2512
--- /dev/null
+++ b/pay-mall-domain/src/main/java/edu/whut/domain/order/adapter/repository/IOrderRepository.java
@@ -0,0 +1,12 @@
+package edu.whut.domain.order.adapter.repository;
+
+import edu.whut.domain.order.model.aggregate.CreateOrderAggregate;
+import edu.whut.domain.order.model.entity.OrderEntity;
+import edu.whut.domain.order.model.entity.ShopCartEntity;
+
+public interface IOrderRepository {
+ void doSaveOrder(CreateOrderAggregate orderAggregate);
+
+ OrderEntity queryUnPayOrder(ShopCartEntity shopCartEntity);
+
+}
diff --git a/pay-mall-domain/src/main/java/edu/whut/domain/order/model/aggregate/CreateOrderAggregate.java b/pay-mall-domain/src/main/java/edu/whut/domain/order/model/aggregate/CreateOrderAggregate.java
new file mode 100644
index 0000000..e34120a
--- /dev/null
+++ b/pay-mall-domain/src/main/java/edu/whut/domain/order/model/aggregate/CreateOrderAggregate.java
@@ -0,0 +1,35 @@
+package edu.whut.domain.order.model.aggregate;
+import edu.whut.domain.order.model.entity.OrderEntity;
+import edu.whut.domain.order.model.entity.ProductEntity;
+import edu.whut.domain.order.model.valobj.OrderStatusVO;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.RandomStringUtils;
+
+import java.util.Date;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class CreateOrderAggregate {
+
+ private String userId;
+
+ private ProductEntity productEntity;
+
+ private OrderEntity orderEntity;
+
+ public static OrderEntity buildOrderEntity(String productId, String productName){
+ return OrderEntity.builder()
+ .productId(productId)
+ .productName(productName)
+ .orderId(RandomStringUtils.randomNumeric(14))
+ .orderTime(new Date())
+ .orderStatusVO(OrderStatusVO.CREATE)
+ .build();
+ }
+
+}
diff --git a/pay-mall-domain/src/main/java/edu/whut/domain/order/model/entity/OrderEntity.java b/pay-mall-domain/src/main/java/edu/whut/domain/order/model/entity/OrderEntity.java
new file mode 100644
index 0000000..bb3fb2c
--- /dev/null
+++ b/pay-mall-domain/src/main/java/edu/whut/domain/order/model/entity/OrderEntity.java
@@ -0,0 +1,25 @@
+package edu.whut.domain.order.model.entity;
+import edu.whut.domain.order.model.valobj.OrderStatusVO;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class OrderEntity {
+
+ private String productId;
+ private String productName;
+ private String orderId;
+ private Date orderTime;
+ private BigDecimal totalAmount;
+ private OrderStatusVO orderStatusVO;
+ private String payUrl;
+
+}
diff --git a/pay-mall-domain/src/main/java/edu/whut/domain/order/model/entity/PayOrderEntity.java b/pay-mall-domain/src/main/java/edu/whut/domain/order/model/entity/PayOrderEntity.java
new file mode 100644
index 0000000..ded0f1a
--- /dev/null
+++ b/pay-mall-domain/src/main/java/edu/whut/domain/order/model/entity/PayOrderEntity.java
@@ -0,0 +1,19 @@
+package edu.whut.domain.order.model.entity;
+import edu.whut.domain.order.model.valobj.OrderStatusVO;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class PayOrderEntity {
+
+ private String userId;
+ private String orderId;
+ private String payUrl;
+ private OrderStatusVO orderStatus;
+
+}
diff --git a/pay-mall-domain/src/main/java/edu/whut/domain/order/model/entity/ProductEntity.java b/pay-mall-domain/src/main/java/edu/whut/domain/order/model/entity/ProductEntity.java
new file mode 100644
index 0000000..d050ba2
--- /dev/null
+++ b/pay-mall-domain/src/main/java/edu/whut/domain/order/model/entity/ProductEntity.java
@@ -0,0 +1,25 @@
+package edu.whut.domain.order.model.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class ProductEntity {
+
+ /** 商品ID */
+ private String productId;
+ /** 商品名称 */
+ private String productName;
+ /** 商品描述 */
+ private String productDesc;
+ /** 商品价格 */
+ private BigDecimal price;
+
+}
diff --git a/pay-mall-domain/src/main/java/edu/whut/domain/order/model/entity/ShopCartEntity.java b/pay-mall-domain/src/main/java/edu/whut/domain/order/model/entity/ShopCartEntity.java
new file mode 100644
index 0000000..6dd7f1a
--- /dev/null
+++ b/pay-mall-domain/src/main/java/edu/whut/domain/order/model/entity/ShopCartEntity.java
@@ -0,0 +1,18 @@
+package edu.whut.domain.order.model.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class ShopCartEntity {
+
+ private String userId;
+
+ private String productId;
+
+}
diff --git a/pay-mall-domain/src/main/java/edu/whut/domain/order/model/valobj/OrderStatusVO.java b/pay-mall-domain/src/main/java/edu/whut/domain/order/model/valobj/OrderStatusVO.java
new file mode 100644
index 0000000..b5cb8e3
--- /dev/null
+++ b/pay-mall-domain/src/main/java/edu/whut/domain/order/model/valobj/OrderStatusVO.java
@@ -0,0 +1,20 @@
+package edu.whut.domain.order.model.valobj;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum OrderStatusVO {
+
+ CREATE("CREATE", "创建完成 - 如果调单了,也会从创建记录重新发起创建支付单"),
+ PAY_WAIT("PAY_WAIT", "等待支付 - 订单创建完成后,创建支付单"),
+ PAY_SUCCESS("PAY_SUCCESS", "支付成功 - 接收到支付回调消息"),
+ DEAL_DONE("DEAL_DONE", "交易完成 - 商品发货完成"),
+ CLOSE("CLOSE", "超时关单 - 超市未支付"),
+ ;
+
+ private final String code;
+ private final String desc;
+
+}
diff --git a/pay-mall-domain/src/main/java/edu/whut/domain/order/service/AbstractOrderService.java b/pay-mall-domain/src/main/java/edu/whut/domain/order/service/AbstractOrderService.java
new file mode 100644
index 0000000..f6cdbfb
--- /dev/null
+++ b/pay-mall-domain/src/main/java/edu/whut/domain/order/service/AbstractOrderService.java
@@ -0,0 +1,72 @@
+package edu.whut.domain.order.service;
+
+import edu.whut.domain.order.adapter.port.IProductPort;
+import edu.whut.domain.order.adapter.repository.IOrderRepository;
+import edu.whut.domain.order.model.aggregate.CreateOrderAggregate;
+import edu.whut.domain.order.model.entity.OrderEntity;
+import edu.whut.domain.order.model.entity.PayOrderEntity;
+import edu.whut.domain.order.model.entity.ProductEntity;
+import edu.whut.domain.order.model.entity.ShopCartEntity;
+import edu.whut.domain.order.model.valobj.OrderStatusVO;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public abstract class AbstractOrderService implements IOrderService {
+
+ protected final IOrderRepository repository;
+ protected final IProductPort port;
+
+ public AbstractOrderService(IOrderRepository repository, IProductPort port) {
+ this.repository = repository;
+ this.port = port;
+ }
+
+ /**
+ * 创建订单
+ */
+ @Override
+ public PayOrderEntity createOrder(ShopCartEntity shopCartEntity) throws Exception {
+ // 1. 查询当前用户是否存在掉单和未支付订单
+ OrderEntity unpaidOrderEntity = repository.queryUnPayOrder(shopCartEntity);
+
+ // 如果已有订单正在等待支付,直接复用
+ if (null != unpaidOrderEntity && OrderStatusVO.PAY_WAIT.equals(unpaidOrderEntity.getOrderStatusVO())) {
+ log.info("创建订单-存在,已存在未支付订单。userId:{} productId:{} orderId:{}", shopCartEntity.getUserId(), shopCartEntity.getProductId(), unpaidOrderEntity.getOrderId());
+ return PayOrderEntity.builder()
+ .orderId(unpaidOrderEntity.getOrderId())
+ .payUrl(unpaidOrderEntity.getPayUrl())
+ .build();
+ // TODO: 如果存在“已创建未支付”状态
+ } else if (null != unpaidOrderEntity && OrderStatusVO.CREATE.equals(unpaidOrderEntity.getOrderStatusVO())) {
+
+ }
+
+ // 2. 调用产品服务,查询商品详细信息
+ ProductEntity productEntity = port.queryProductByProductId(shopCartEntity.getProductId());
+
+ // 3. 构建基础 OrderEntity(含 orderId、时间等)
+ OrderEntity orderEntity = CreateOrderAggregate.buildOrderEntity(productEntity.getProductId(), productEntity.getProductName());
+
+ // 4. 组装聚合根:聚合中包含用户、商品和待持久化的订单实体
+ CreateOrderAggregate orderAggregate = CreateOrderAggregate.builder()
+ .userId(shopCartEntity.getUserId())
+ .productEntity(productEntity)
+ .orderEntity(orderEntity)
+ .build();
+
+ // 5. 交由子类实现,保存订单聚合
+ this.doSaveOrder(orderAggregate);
+
+ // 6. 返回支付实体
+ return PayOrderEntity.builder()
+ .orderId(orderEntity.getOrderId())
+ .payUrl("暂无")
+ .build();
+ }
+
+ /**
+ * 保存订单
+ */
+ protected abstract void doSaveOrder(CreateOrderAggregate orderAggregate);
+
+}
diff --git a/pay-mall-domain/src/main/java/edu/whut/domain/order/service/IOrderService.java b/pay-mall-domain/src/main/java/edu/whut/domain/order/service/IOrderService.java
new file mode 100644
index 0000000..95ba16d
--- /dev/null
+++ b/pay-mall-domain/src/main/java/edu/whut/domain/order/service/IOrderService.java
@@ -0,0 +1,11 @@
+package edu.whut.domain.order.service;
+
+
+import edu.whut.domain.order.model.entity.PayOrderEntity;
+import edu.whut.domain.order.model.entity.ShopCartEntity;
+
+public interface IOrderService {
+
+ PayOrderEntity createOrder(ShopCartEntity shopCartEntity) throws Exception;
+
+}
diff --git a/pay-mall-domain/src/main/java/edu/whut/domain/order/service/OrderService.java b/pay-mall-domain/src/main/java/edu/whut/domain/order/service/OrderService.java
new file mode 100644
index 0000000..2d0ee41
--- /dev/null
+++ b/pay-mall-domain/src/main/java/edu/whut/domain/order/service/OrderService.java
@@ -0,0 +1,21 @@
+package edu.whut.domain.order.service;
+import edu.whut.domain.order.adapter.port.IProductPort;
+import edu.whut.domain.order.adapter.repository.IOrderRepository;
+import edu.whut.domain.order.model.aggregate.CreateOrderAggregate;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service
+public class OrderService extends AbstractOrderService{
+
+ public OrderService(IOrderRepository repository, IProductPort port) {
+ super(repository, port);
+ }
+
+ @Override
+ protected void doSaveOrder(CreateOrderAggregate orderAggregate) {
+ repository.doSaveOrder(orderAggregate);
+ }
+
+}
diff --git a/pay-mall-domain/src/main/java/edu/whut/domain/xxx/adapter/package-info.java b/pay-mall-domain/src/main/java/edu/whut/domain/xxx/adapter/package-info.java
deleted file mode 100644
index ba422f3..0000000
--- a/pay-mall-domain/src/main/java/edu/whut/domain/xxx/adapter/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * 外部接口适配器层;当需要调用外部接口时,则创建出这一层,并定义接口,之后由基础设施层的 adapter 层具体实现
- */
-package edu.whut.domain.xxx.adapter;
\ No newline at end of file
diff --git a/pay-mall-domain/src/main/java/edu/whut/domain/xxx/adapter/port/package-info.java b/pay-mall-domain/src/main/java/edu/whut/domain/xxx/adapter/port/package-info.java
deleted file mode 100644
index 8f3e273..0000000
--- a/pay-mall-domain/src/main/java/edu/whut/domain/xxx/adapter/port/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * 外部接口适配器层;当需要调用外部接口时,则创建出这一层,并定义接口,之后由基础设施层的 adapter 层具体实现
- */
-package edu.whut.domain.xxx.adapter.port;
\ No newline at end of file
diff --git a/pay-mall-domain/src/main/java/edu/whut/domain/xxx/adapter/repository/package-info.java b/pay-mall-domain/src/main/java/edu/whut/domain/xxx/adapter/repository/package-info.java
deleted file mode 100644
index 4fc83a4..0000000
--- a/pay-mall-domain/src/main/java/edu/whut/domain/xxx/adapter/repository/package-info.java
+++ /dev/null
@@ -1,5 +0,0 @@
-/**
- * 仓储服务
- * 1. 定义仓储接口,之后由基础设施层做具体实现
- */
-package edu.whut.domain.xxx.adapter.repository;
\ No newline at end of file
diff --git a/pay-mall-domain/src/main/java/edu/whut/domain/xxx/model/aggregate/package-info.java b/pay-mall-domain/src/main/java/edu/whut/domain/xxx/model/aggregate/package-info.java
deleted file mode 100644
index d2ee6fb..0000000
--- a/pay-mall-domain/src/main/java/edu/whut/domain/xxx/model/aggregate/package-info.java
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * 聚合对象;
- * 1. 聚合实体和值对象
- * 2. 聚合是聚合的对象,和提供基础处理对象的方法。但不建议在聚合中引入仓储和接口来做过大的逻辑。而这些复杂的操作应该放到service中处理
- * 3. 对象名称 XxxAggregate
- */
-package edu.whut.domain.xxx.model.aggregate;
\ No newline at end of file
diff --git a/pay-mall-domain/src/main/java/edu/whut/domain/xxx/model/entity/package-info.java b/pay-mall-domain/src/main/java/edu/whut/domain/xxx/model/entity/package-info.java
deleted file mode 100644
index a7a8ce5..0000000
--- a/pay-mall-domain/src/main/java/edu/whut/domain/xxx/model/entity/package-info.java
+++ /dev/null
@@ -1,7 +0,0 @@
-/**
- * 实体对象;
- * 1. 一般和数据库持久化对象1v1的关系,但因各自开发系统的不同,也有1vn的可能。
- * 2. 如果是老系统改造,那么旧的库表冗余了太多的字段,可能会有nv1的情况
- * 3. 对象名称 XxxEntity
- */
-package edu.whut.domain.xxx.model.entity;
\ No newline at end of file
diff --git a/pay-mall-domain/src/main/java/edu/whut/domain/xxx/model/valobj/package-info.java b/pay-mall-domain/src/main/java/edu/whut/domain/xxx/model/valobj/package-info.java
deleted file mode 100644
index f34a181..0000000
--- a/pay-mall-domain/src/main/java/edu/whut/domain/xxx/model/valobj/package-info.java
+++ /dev/null
@@ -1,6 +0,0 @@
-/**
- * 值对象;
- * 1. 用于描述对象属性的值,如一个库表中有json后者一个字段多个属性信息的枚举对象
- * 2. 对象名称如;XxxVO
- */
-package edu.whut.domain.xxx.model.valobj;
\ No newline at end of file
diff --git a/pay-mall-domain/src/main/java/edu/whut/domain/xxx/service/package-info.java b/pay-mall-domain/src/main/java/edu/whut/domain/xxx/service/package-info.java
deleted file mode 100644
index a82b91f..0000000
--- a/pay-mall-domain/src/main/java/edu/whut/domain/xxx/service/package-info.java
+++ /dev/null
@@ -1 +0,0 @@
-package edu.whut.domain.xxx.service;
\ No newline at end of file
diff --git a/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/adapter/port/LoginPort.java b/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/adapter/port/LoginPort.java
index 00308e2..4f3ce82 100644
--- a/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/adapter/port/LoginPort.java
+++ b/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/adapter/port/LoginPort.java
@@ -6,6 +6,7 @@ import edu.whut.infrastructure.gateway.dto.WeixinQrCodeRequestDTO;
import edu.whut.infrastructure.gateway.dto.WeixinQrCodeResponseDTO;
import edu.whut.infrastructure.gateway.dto.WeixinTemplateMessageDTO;
import edu.whut.infrastructure.gateway.dto.WeixinTokenResponseDTO;
+import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import retrofit2.Call;
@@ -16,6 +17,7 @@ import java.util.HashMap;
import java.util.Map;
@Service
+@RequiredArgsConstructor
public class LoginPort implements ILoginPort {
@Value("${weixin.config.app-id}")
@@ -25,11 +27,9 @@ public class LoginPort implements ILoginPort {
@Value("${weixin.config.template_id}")
private String template_id;
- @Resource
- private Cache weixinAccessToken;
+ private final Cache weixinAccessToken;
- @Resource
- private IWeixinApiService weixinApiService;
+ private final IWeixinApiService weixinApiService;
/**
* 生成二维码登录凭证 ticket
diff --git a/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/adapter/port/ProductPort.java b/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/adapter/port/ProductPort.java
new file mode 100644
index 0000000..ac6b61e
--- /dev/null
+++ b/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/adapter/port/ProductPort.java
@@ -0,0 +1,29 @@
+package edu.whut.infrastructure.adapter.port;
+
+import edu.whut.domain.order.adapter.port.IProductPort;
+import edu.whut.domain.order.model.entity.ProductEntity;
+import edu.whut.infrastructure.gateway.ProductRPC;
+import edu.whut.infrastructure.gateway.dto.ProductDTO;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ProductPort implements IProductPort {
+
+ private final ProductRPC productRPC;
+
+ public ProductPort(ProductRPC productRPC) {
+ this.productRPC = productRPC;
+ }
+
+ @Override
+ public ProductEntity queryProductByProductId(String productId) {
+ ProductDTO productDTO = productRPC.queryProductByProductId(productId);
+ return ProductEntity.builder()
+ .productId(productDTO.getProductId())
+ .productName(productDTO.getProductName())
+ .productDesc(productDTO.getProductDesc())
+ .price(productDTO.getPrice())
+ .build();
+ }
+
+}
diff --git a/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/adapter/repository/OrderRepository.java b/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/adapter/repository/OrderRepository.java
new file mode 100644
index 0000000..2cdf6d7
--- /dev/null
+++ b/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/adapter/repository/OrderRepository.java
@@ -0,0 +1,62 @@
+package edu.whut.infrastructure.adapter.repository;
+
+import edu.whut.domain.order.adapter.repository.IOrderRepository;
+import edu.whut.domain.order.model.aggregate.CreateOrderAggregate;
+import edu.whut.domain.order.model.entity.OrderEntity;
+import edu.whut.domain.order.model.entity.ProductEntity;
+import edu.whut.domain.order.model.entity.ShopCartEntity;
+import edu.whut.domain.order.model.valobj.OrderStatusVO;
+import edu.whut.infrastructure.dao.IOrderDao;
+import edu.whut.infrastructure.dao.po.PayOrder;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Repository;
+
+import javax.annotation.Resource;
+
+@Repository
+@RequiredArgsConstructor
+public class OrderRepository implements IOrderRepository {
+
+ private final IOrderDao orderDao;
+
+ @Override
+ public void doSaveOrder(CreateOrderAggregate orderAggregate) {
+ String userId = orderAggregate.getUserId();
+ ProductEntity productEntity = orderAggregate.getProductEntity();
+ OrderEntity orderEntity = orderAggregate.getOrderEntity();
+
+ PayOrder order = new PayOrder();
+ order.setUserId(userId);
+ order.setProductId(productEntity.getProductId());
+ order.setProductName(productEntity.getProductName());
+ order.setOrderId(orderEntity.getOrderId());
+ order.setOrderTime(orderEntity.getOrderTime());
+ order.setTotalAmount(productEntity.getPrice());
+ order.setStatus(orderEntity.getOrderStatusVO().getCode());
+
+ orderDao.insert(order);
+ }
+
+ @Override
+ public OrderEntity queryUnPayOrder(ShopCartEntity shopCartEntity) {
+ // 1. 封装参数
+ PayOrder orderReq = new PayOrder();
+ orderReq.setUserId(shopCartEntity.getUserId());
+ orderReq.setProductId(shopCartEntity.getProductId());
+
+ // 2. 查询到订单
+ PayOrder order = orderDao.queryUnPayOrder(orderReq);
+ if (null == order) return null;
+
+ // 3. 返回结果
+ return OrderEntity.builder()
+ .productId(order.getProductId())
+ .productName(order.getProductName())
+ .orderId(order.getOrderId())
+ .orderStatusVO(OrderStatusVO.valueOf(order.getStatus()))
+ .orderTime(order.getOrderTime())
+ .totalAmount(order.getTotalAmount())
+ .payUrl(order.getPayUrl())
+ .build();
+ }
+}
diff --git a/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/dao/IOrderDao.java b/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/dao/IOrderDao.java
new file mode 100644
index 0000000..ea24e9b
--- /dev/null
+++ b/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/dao/IOrderDao.java
@@ -0,0 +1,12 @@
+package edu.whut.infrastructure.dao;
+import edu.whut.infrastructure.dao.po.PayOrder;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface IOrderDao {
+
+ void insert(PayOrder payOrder);
+
+ PayOrder queryUnPayOrder(PayOrder payOrder);
+
+}
diff --git a/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/dao/package-info.java b/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/dao/package-info.java
deleted file mode 100644
index 8e44e5b..0000000
--- a/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/dao/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * DAO 接口;IXxxDao
- */
-package edu.whut.infrastructure.dao;
\ No newline at end of file
diff --git a/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/dao/po/PayOrder.java b/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/dao/po/PayOrder.java
new file mode 100644
index 0000000..0d0002a
--- /dev/null
+++ b/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/dao/po/PayOrder.java
@@ -0,0 +1,30 @@
+package edu.whut.infrastructure.dao.po;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class PayOrder {
+
+ private Long id;
+ private String userId;
+ private String productId;
+ private String productName;
+ private String orderId;
+ private Date orderTime;
+ private BigDecimal totalAmount;
+ private String status;
+ private String payUrl;
+ private Date payTime;
+ private Date createTime;
+ private Date updateTime;
+
+}
diff --git a/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/dao/po/package-info.java b/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/dao/po/package-info.java
deleted file mode 100644
index ddeef77..0000000
--- a/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/dao/po/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * 持久化对象;XxxPO 最后的 PO 是大写,UserPO
- */
-package edu.whut.infrastructure.dao.po;
\ No newline at end of file
diff --git a/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/gateway/ProductRPC.java b/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/gateway/ProductRPC.java
new file mode 100644
index 0000000..069a43e
--- /dev/null
+++ b/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/gateway/ProductRPC.java
@@ -0,0 +1,23 @@
+package edu.whut.infrastructure.gateway;
+
+import edu.whut.infrastructure.gateway.dto.ProductDTO;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+
+@Service
+public class ProductRPC {
+
+ /**
+ * 模拟调用外部商城获取商品信息
+ */
+ public ProductDTO queryProductByProductId(String productId){
+ ProductDTO productVO = new ProductDTO();
+ productVO.setProductId(productId);
+ productVO.setProductName("测试商品");
+ productVO.setProductDesc("这是一个测试商品");
+ productVO.setPrice(new BigDecimal("1.68"));
+ return productVO;
+ }
+
+}
diff --git a/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/gateway/dto/ProductDTO.java b/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/gateway/dto/ProductDTO.java
new file mode 100644
index 0000000..1dd8f6f
--- /dev/null
+++ b/pay-mall-infrastructure/src/main/java/edu/whut/infrastructure/gateway/dto/ProductDTO.java
@@ -0,0 +1,19 @@
+package edu.whut.infrastructure.gateway.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class ProductDTO {
+
+ /** 商品ID */
+ private String productId;
+ /** 商品名称 */
+ private String productName;
+ /** 商品描述 */
+ private String productDesc;
+ /** 商品价格 */
+ private BigDecimal price;
+
+}
diff --git a/pay-mall-trigger/src/main/java/edu/whut/trigger/http/LoginController.java b/pay-mall-trigger/src/main/java/edu/whut/trigger/http/LoginController.java
index 7aed0be..6d09b4d 100644
--- a/pay-mall-trigger/src/main/java/edu/whut/trigger/http/LoginController.java
+++ b/pay-mall-trigger/src/main/java/edu/whut/trigger/http/LoginController.java
@@ -3,6 +3,7 @@ import edu.whut.api.IAuthService;
import edu.whut.api.response.Response;
import edu.whut.domain.auth.service.ILoginService;
import edu.whut.types.common.Constants;
+import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.*;
@@ -13,10 +14,10 @@ import javax.annotation.Resource;
@RestController()
@CrossOrigin("*")
@RequestMapping("/api/v1/login")
+@RequiredArgsConstructor
public class LoginController implements IAuthService {
- @Resource
- private ILoginService loginService;
+ private final ILoginService loginService;
/**
* 生成并返回一个微信扫码登录的凭证(ticket)。