feat(account): 添加积分日志相关功能

- 新增 PointLog 类用于表示积分日志实体
- 添加 PointAction 枚举类,定义积分操作类型
- 实现 PointLogRepoInterface 接口,提供积分日志查询功能
- 在 ConfigProvider 中注册 PointLogRepo
- 编写单元测试以验证积分日志查询功能
This commit is contained in:
李东云
2025-08-27 11:30:48 +08:00
parent f2a51fa1da
commit 38ce644c73
6 changed files with 197 additions and 1 deletions

View File

@@ -7,11 +7,13 @@ namespace Singularity\HDK\Pay;
use Hyperf\Contract\StdoutLoggerInterface;
use Hyperf\Framework\Logger\StdoutLogger;
use Singularity\HDK\Pay\Domain\Account\Repository\AccountRepoInterface;
use Singularity\HDK\Pay\Domain\Account\Repository\PointLogRepoInterface;
use Singularity\HDK\Pay\Domain\Product\Repository\ExchangeRepoInterface;
use Singularity\HDK\Pay\Domain\Product\Repository\RechargeProductRepoInterface;
use Singularity\HDK\Pay\Domain\Transaction\Repository\OrderRepoInterface;
use Singularity\HDK\Pay\Infrastructure\Repository\AccountBalanceRepo;
use Singularity\HDK\Pay\Infrastructure\Repository\OrderRepo;
use Singularity\HDK\Pay\Infrastructure\Repository\PointLogRepo;
use Singularity\HDK\Pay\Infrastructure\Repository\ProductRepo;
/**
@@ -30,11 +32,12 @@ class ConfigProvider
'dependencies' => [
StdoutLoggerInterface::class => StdoutLogger::class,
// Command
// Repo
AccountRepoInterface::class => AccountBalanceRepo::class,
ExchangeRepoInterface::class => ProductRepo::class,
RechargeProductRepoInterface::class => ProductRepo::class,
OrderRepoInterface::class => OrderRepo::class,
PointLogRepoInterface::class => PointLogRepo::class,
],
// 合并到 config/autoload/annotations.php 文件
'annotations' => [

View File

@@ -0,0 +1,70 @@
<?php
/**
* PointLog.php@LuxPay
*
* @author 李东云 <Dongyun.Li@LuxCreo.Ai>
* Powered by PhpStorm
* Created on 2025/8/21
*/
declare(strict_types=1);
namespace Singularity\HDK\Pay\Domain\Account\Aggregate\PointLog;
use Carbon\Carbon;
use Singularity\HDK\Pay\Domain\AggregateRoot;
final class PointLog extends AggregateRoot
{
public function __construct(
private readonly int $id,
private readonly string $caseId,
private readonly string $uid,
private readonly float $credits,
private readonly string $source,
private readonly string $operator,
private readonly string $description,
private readonly Carbon $date,
) {}
public function getDescription(): string
{
return $this->description;
}
public function getSource(): string
{
return $this->source;
}
public function getDate(): Carbon
{
return $this->date;
}
public function getUid(): string
{
return $this->uid;
}
public function getCredits(): float
{
return $this->credits;
}
public function getOperator(): string
{
return $this->operator;
}
public function getCaseId(): ?string
{
return $this->caseId;
}
public function getId(): ?int
{
return $this->id;
}
}

View File

@@ -0,0 +1,35 @@
<?php
/**
* PointAction.php@LuxPay
*
* @author 李东云 <Dongyun.Li@LuxCreo.Ai>
* Powered by PhpStorm
* Created on 2025/8/21
*/
namespace Singularity\HDK\Pay\Domain\Account\Enum;
enum PointAction
{
case Initial;
case Deduct;
case Refund;
case Increase;
case Clear;
public static function tryFrom(string $action): ?PointAction
{
return match (strtolower($action)) {
'initial' => self::Initial,
'deduct' => self::Deduct,
'refund' => self::Refund,
'increase' => self::Increase,
'clear' => self::Clear,
default => null,
};
}
}

View File

@@ -0,0 +1,21 @@
<?php
/**
* PointLogRepoInterface.php@Pay
*
* @author 李东云 <Dongyun.Li@LuxCreo.Ai>
* Powered by PhpStorm
* Created on 2025/8/27
*/
namespace Singularity\HDK\Pay\Domain\Account\Repository;
use Singularity\HDK\Pay\Domain\Account\Aggregate\PointLog\PointLog;
interface PointLogRepoInterface
{
/**
* @param string $uid
* @return PointLog[]
*/
public function getList(string $uid): array;
}

View File

@@ -0,0 +1,42 @@
<?php
/**
* PointLogRepo.php@Pay
*
* @author 李东云 <Dongyun.Li@LuxCreo.Ai>
* Powered by PhpStorm
* Created on 2025/8/27
*/
declare(strict_types=1);
namespace Singularity\HDK\Pay\Infrastructure\Repository;
use Carbon\Carbon;
use Hyperf\Codec\Json;
use Singularity\HDK\Pay\Domain\Account\Aggregate\PointLog\PointLog;
use Singularity\HDK\Pay\Domain\Account\Enum\PointType;
use Singularity\HDK\Pay\Domain\Account\Repository\PointLogRepoInterface;
final class PointLogRepo extends AbstractRepo implements PointLogRepoInterface
{
public function getList(string $uid): array
{
$response = $this->requestService->requestGet(url: "/rpc/v2/account/$uid/logs/points");
$content = $response->getBody()->getContents();
$result = Json::decode($content);
return array_map(function ($item) {
return new PointLog(
id: $item['id'],
caseId: $item['case_id'],
uid: $item['uid'],
credits: $item['credits'],
source: $item['source'],
operator: $item['operator'],
description: $item['description'],
date: new Carbon($item['date']),
);
}, $result);
}
}

View File

@@ -0,0 +1,25 @@
<?php
/**
* QueryPointLogListTest.php@Pay
*
* @author 李东云 <Dongyun.Li@LuxCreo.Ai>
* Powered by PhpStorm
* Created on 2025/8/27
*/
use Singularity\HDK\Pay\Domain\Account\Aggregate\PointLog\PointLog;
use Singularity\HDK\Pay\Infrastructure\Repository\PointLogRepo;
use function Hyperf\Support\make;
it('should can query point log list', function () {
$uid = '61a74db54f387';
$repo = make(PointLogRepo::class);
$list = $repo->getList($uid);
expect($list)
->not->toBeEmpty()
->each
->toBeInstanceOf(PointLog::class);
});