From 1814adc30e0c3801c11bfb270a666ebd9348d115 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E4=B8=9C=E4=BA=91?= Date: Mon, 18 Aug 2025 16:57:14 +0800 Subject: [PATCH] =?UTF-8?q?feat(product):=20=E5=A2=9E=E5=8A=A0=20EMA=20?= =?UTF-8?q?=E4=BA=A7=E5=93=81=E6=9F=A5=E8=AF=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除了未使用的 ProductItem 引用 - 修改了 findEmaProduct 方法的参数,从 currentVersion 改为 uid - 更新了 findEmaProduct 方法的实现,使用 uid 参数进行查询 - 重构了 RechargeProduct 对象的构建方式,提高了代码可读性 - 更新了单元测试,增加了 EMA 产品查询的测试用例 --- .../RechargeProductRepoInterface.php | 17 +---- src/Infrastructure/Repository/ProductRepo.php | 74 +++++++++++++------ tests/Feature/Product/QueryProductsTest.php | 22 +++++- 3 files changed, 74 insertions(+), 39 deletions(-) diff --git a/src/Domain/Product/Repository/RechargeProductRepoInterface.php b/src/Domain/Product/Repository/RechargeProductRepoInterface.php index 990d90a..210baa5 100644 --- a/src/Domain/Product/Repository/RechargeProductRepoInterface.php +++ b/src/Domain/Product/Repository/RechargeProductRepoInterface.php @@ -9,7 +9,6 @@ namespace Singularity\HDK\Pay\Domain\Product\Repository; -use Singularity\HDK\Pay\Domain\Product\Aggregate\Entities\ProductItem; use Singularity\HDK\Pay\Domain\Product\Aggregate\RechargeProduct; interface RechargeProductRepoInterface @@ -20,20 +19,8 @@ interface RechargeProductRepoInterface public function findLuxPointProduct(): RechargeProduct; /** - * @param string $currentVersion + * @param string $uid * @return RechargeProduct */ - public function findEmaProduct(string $currentVersion): RechargeProduct; - - /** - * @param int $id - * @return ProductItem - */ - public function findProductItem(int $id): ProductItem; - - /** - * @param int[] $idList - * @return ProductItem[] - */ - public function selectProductList(array $idList): array; + public function findEmaProduct(string $uid): RechargeProduct; } \ No newline at end of file diff --git a/src/Infrastructure/Repository/ProductRepo.php b/src/Infrastructure/Repository/ProductRepo.php index 98bb4fc..3fb6df6 100644 --- a/src/Infrastructure/Repository/ProductRepo.php +++ b/src/Infrastructure/Repository/ProductRepo.php @@ -31,7 +31,7 @@ final class ProductRepo extends AbstractRepo implements RechargeProductRepoInter public function findLuxPointProduct(): RechargeProduct { $response = $this->requestService->requestGet( - url: "/rpc/v2/products/lux-point", + url: '/rpc/v2/products/lux-point', options: [ 'headers' => $this->headerBuilder(), ], @@ -75,10 +75,11 @@ final class ProductRepo extends AbstractRepo implements RechargeProductRepoInter /** * @inheritDoc */ - public function findEmaProduct(string $currentVersion, - ): RechargeProduct { + public function findEmaProduct(string $uid): RechargeProduct + { $response = $this->requestService->requestGet( - url: "/rpc/v2/products/ema", + url: '/rpc/v2/products/ema', + params: ['uid' => $uid], options: [ 'headers' => $this->headerBuilder(), ], @@ -88,28 +89,55 @@ final class ProductRepo extends AbstractRepo implements RechargeProductRepoInter $result = Json::decode($content); return new RechargeProduct( - oneTime: $result['one_time'], - renew: $result['renew'], - plans: $result['plan'], + oneTime: isset($result['one_time']) + ? new ProductItem( + id: $result['one_time']['id'], + description: $result['one_time']['name'], + unitPrice: new Money( + amount: $result['one_time']['price'], + currency: new Currency($result['one_time']['currency']), + ), + productType: ProductType::oneTime, + effect: new RechargeEffect( + pointType: PointType::EMA, + pointBasic: $result['one_time']['point']['number'], + pointBonus: $result['one_time']['point']['bonus'], + ), + ) + : null, + renew: isset($result['renew']) + ? new ProductItem( + id: $result['renew']['id'], + description: $result['renew']['name'], + unitPrice: new Money( + amount: $result['renew']['price'], + currency: new Currency($result['renew']['currency']), + ), + productType: ProductType::renew, + effect: new RechargeEffect( + pointType: PointType::EMA, + pointBasic: $result['renew']['point']['number'], + pointBonus: $result['renew']['point']['bonus'], + ), + ) + : null, + plans: array_map(fn(array $item) => new ProductItem( + id: $item['id'], + description: $item['name'], + unitPrice: new Money( + amount: $item['price'], + currency: new Currency($item['currency']), + ), + productType: ProductType::plan, + effect: new RechargeEffect( + pointType: PointType::LuxPoint, + pointBasic: $item['point']['number'], + pointBonus: $item['point']['bonus'], + ), + ), $result['plan']), ); } - /** - * @inheritDoc - */ - public function findProductItem(int $id): ProductItem - { - // TODO: Implement findProductItem() method. - } - - /** - * @inheritDoc - */ - public function selectProductList(array $idList): array - { - // TODO: Implement selectProductList() method. - } - /** * @param PointType $source * @param PointType $target diff --git a/tests/Feature/Product/QueryProductsTest.php b/tests/Feature/Product/QueryProductsTest.php index 980da73..d83038a 100644 --- a/tests/Feature/Product/QueryProductsTest.php +++ b/tests/Feature/Product/QueryProductsTest.php @@ -8,6 +8,7 @@ * Created on 2025/8/18 */ +use Pest\Expectation; use Singularity\HDK\Pay\Domain\Product\Aggregate\Entities\ProductItem; use Singularity\HDK\Pay\Domain\Product\Aggregate\RechargeProduct; use Singularity\HDK\Pay\Infrastructure\Repository\ProductRepo; @@ -18,9 +19,28 @@ it('should can query LuxPoint products', function () { $repo = make(ProductRepo::class); $products = $repo->findLuxPointProduct(); - var_dump($products); expect($products) ->toBeInstanceOf(RechargeProduct::class) ->and($products->getOneTime())->toBeInstanceOf(ProductItem::class) ->and($products->getPackages())->each->toBeInstanceOf(ProductItem::class); +}); + +it('should can query EMA products', function () { + $repo = make(ProductRepo::class); + + $uid = 'cn3321'; + $products = $repo->findEmaProduct($uid); + expect($products) + ->toBeInstanceOf(RechargeProduct::class) + ->when( + $products->getOneTime() !== null, + fn(Expectation $expectation) => $expectation + ->and($products->getOneTime())->toBeInstanceOf(ProductItem::class), + ) + ->when( + $products->getRenew() !== null, + fn(Expectation $expectation) => $expectation + ->and($products->getRenew())->toBeInstanceOf(ProductItem::class), + ) + ->and($products->getPlans())->each->toBeInstanceOf(ProductItem::class); })->only();