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)。