feat(account): 增加积分日志详情查询功能并支持发票信息

- 新增 InvoiceRecord 类用于存储发票信息
- 在 PointLog 类中添加发票相关字段和方法
- 在 PointLogRepo 中实现积分日志详情查询接口
- 更新单元测试以覆盖新功能
This commit is contained in:
李东云
2025-09-04 17:25:57 +08:00
parent 580c2f6ca0
commit 975a5ee301
5 changed files with 98 additions and 2 deletions

View File

@@ -12,6 +12,7 @@ declare(strict_types=1);
namespace Singularity\HDK\Pay\Domain\Account\Aggregate\PointLog;
use Carbon\Carbon;
use Singularity\HDK\Pay\Domain\Account\Aggregate\PointLog\ValueObject\InvoiceRecord;
use Singularity\HDK\Pay\Domain\AggregateRoot;
final class PointLog extends AggregateRoot
@@ -25,6 +26,8 @@ final class PointLog extends AggregateRoot
private readonly string $operator,
private readonly string $description,
private readonly Carbon $date,
private readonly bool $invoiceable,
private readonly ?InvoiceRecord $invoiceRecord,
) {}
public function getDescription(): string
@@ -67,4 +70,19 @@ final class PointLog extends AggregateRoot
{
return $this->id;
}
public function getInvoiceNo(): ?string
{
return $this->invoiceRecord?->invoiceNo;
}
public function getInvoiceReceiver(): ?string
{
return $this->invoiceRecord?->receiver;
}
public function getInvoiceable(): bool
{
return $this->invoiceable;
}
}

View File

@@ -0,0 +1,20 @@
<?php
/**
* InvoiceRecord.php@Pay
*
* @author 李东云 <Dongyun.Li@LuxCreo.Ai>
* Powered by PhpStorm
* Created on 2025/9/4
*/
declare(strict_types=1);
namespace Singularity\HDK\Pay\Domain\Account\Aggregate\PointLog\ValueObject;
final class InvoiceRecord
{
public function __construct(
public string $invoiceNo,
public string $receiver,
) {}
}

View File

@@ -19,4 +19,9 @@ interface PointLogRepoInterface
*/
public function getList(string $uid): array;
/**
* @param string $caseId
* @return PointLog
*/
public function getDetail(string $caseId): PointLog;
}

View File

@@ -12,16 +12,24 @@ declare(strict_types=1);
namespace Singularity\HDK\Pay\Infrastructure\Repository;
use Carbon\Carbon;
use GuzzleHttp\Exception\GuzzleException;
use Hyperf\Codec\Json;
use Singularity\HDK\Pay\Domain\Account\Aggregate\PointLog\PointLog;
use Singularity\HDK\Pay\Domain\Account\Aggregate\PointLog\ValueObject\InvoiceRecord;
use Singularity\HDK\Pay\Domain\Account\Enum\PointType;
use Singularity\HDK\Pay\Domain\Account\Repository\PointLogRepoInterface;
final class PointLogRepo extends AbstractRepo implements PointLogRepoInterface
{
/**
* @param string $uid
* @param PointType|null $type
* @return array{}|PointLog[]
* @throws GuzzleException
*/
public function getList(string $uid, ?PointType $type = null): array
{
$type = isset($type) ? $type->value: 'all';
$type = isset($type) ? $type->value : 'all';
$response = $this->requestService->requestGet(url: "/rpc/v2/account/$uid/balance/$type/logs");
$content = $response->getBody()->getContents();
@@ -37,7 +45,43 @@ final class PointLogRepo extends AbstractRepo implements PointLogRepoInterface
operator: $item['operator'],
description: $item['description'],
date: new Carbon($item['date']),
invoiceable: $item['invoiceable'],
invoiceRecord: isset($item['invoice_record'])
? new InvoiceRecord(
invoiceNo: $item['invoice_record']['invoice_no'],
receiver: $item['invoice_record']['receiver'],
)
: null,
);
}, $result);
}
/**
* @inheritDoc
*/
public function getDetail(string $caseId): PointLog
{
$response = $this->requestService->requestGet(url: "/rpc/v2/account/logs/points/$caseId");
$content = $response->getBody()->getContents();
$result = Json::decode($content);
return new PointLog(
id: $result['id'],
caseId: $result['case_id'],
uid: $result['uid'],
credits: $result['credits'],
source: $result['source'],
operator: $result['operator'],
description: $result['description'],
date: new Carbon($result['date']),
invoiceable: $result['invoiceable'],
invoiceRecord: isset($result['invoice_record'])
? new InvoiceRecord(
$result['invoice_record']['invoice_no'],
$result['invoice_record']['receiver'],
)
: null,
);
}
}

View File

@@ -1,7 +1,7 @@
<?php
/**
* QueryPointLogListTest.php@Pay
* QueryPointLogTest.php@Pay
*
* @author 李东云 <Dongyun.Li@LuxCreo.Ai>
* Powered by PhpStorm
@@ -23,3 +23,12 @@ it('should can query point log list', function () {
->each
->toBeInstanceOf(PointLog::class);
});
it('should can query a point log', function () {
$case_id = '68b6ac37a6440';
$repo = make(PointLogRepo::class);
$log = $repo->getDetail($case_id);
expect($log)
->toBeInstanceOf(PointLog::class);
});