mirror of
http://124.126.16.154:8888/singularity/hdk-pay.git
synced 2026-01-15 07:15:06 +08:00
Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3af39e4254 | ||
|
|
8bbc8ed629 | ||
|
|
48e6fafe8e | ||
|
|
874a6f4fa9 | ||
|
|
8ac850fc62 | ||
|
|
8f8f7b08b0 | ||
|
|
203dd34353 | ||
|
|
87b09ef34c | ||
|
|
a59d979076 | ||
|
|
686d835a91 | ||
|
|
65b060e5d3 | ||
|
|
3b12216344 | ||
|
|
7354abb99a | ||
|
|
93f923181c | ||
|
|
fb3327b252 | ||
|
|
975a5ee301 |
56
CHANGELOG.md
56
CHANGELOG.md
@@ -1,4 +1,60 @@
|
||||
# 版本更新日志
|
||||
### [1.9.3](http://124.126.16.154:8888/singularity/hdk-pay/compare/v1.9.2...v1.9.3) (2025-09-19)
|
||||
|
||||
|
||||
### ✨ Features | 新功能
|
||||
|
||||
* **PointType:** 添加 ScanToModel 作为点类型 ([8bbc8ed](http://124.126.16.154:8888/singularity/hdk-pay/commit/8bbc8ed629e5c15e42db0adf758505e531ff3dca))
|
||||
|
||||
### [1.9.2](http://124.126.16.154:8888/singularity/hdk-pay/compare/v1.9.1...v1.9.2) (2025-09-19)
|
||||
|
||||
|
||||
### ✨ Features | 新功能
|
||||
|
||||
* **Account:** 添加新的积分类型 ([874a6f4](http://124.126.16.154:8888/singularity/hdk-pay/commit/874a6f4fa96b09a4c6c652b6d285d4b6631a3c66))
|
||||
|
||||
### [1.9.1](http://124.126.16.154:8888/singularity/hdk-pay/compare/v1.9.0...v1.9.1) (2025-09-17)
|
||||
|
||||
|
||||
### 🐛 Bug Fixes | Bug 修复
|
||||
|
||||
* **account:** 修复初始账户命令和测试 ([8f8f7b0](http://124.126.16.154:8888/singularity/hdk-pay/commit/8f8f7b08b03d9b810bb09ce4b1f15a27cbd43e68))
|
||||
|
||||
## [1.9.0](http://124.126.16.154:8888/singularity/hdk-pay/compare/v1.8.2...v1.9.0) (2025-09-17)
|
||||
|
||||
|
||||
### ✨ Features | 新功能
|
||||
|
||||
* **account:** 添加初始化账户余额功能 ([87b09ef](http://124.126.16.154:8888/singularity/hdk-pay/commit/87b09ef34cd3427816ef2c357406a74975ada8a9))
|
||||
|
||||
### [1.8.2](http://124.126.16.154:8888/singularity/hdk-pay/compare/v1.8.1...v1.8.2) (2025-09-17)
|
||||
|
||||
|
||||
### 🐛 Bug Fixes | Bug 修复
|
||||
|
||||
* **ProductRepo:** 修复产品仓库中的数组为空的处理逻辑 ([686d835](http://124.126.16.154:8888/singularity/hdk-pay/commit/686d835a9130d60768eef37a3c9a67c6526cb418))
|
||||
|
||||
### [1.8.1](http://124.126.16.154:8888/singularity/hdk-pay/compare/v1.8.0...v1.8.1) (2025-09-05)
|
||||
|
||||
|
||||
### ✨ Features | 新功能
|
||||
|
||||
* **PointLog:** 添加获取病人姓名的方法并更新相关代码 ([3b12216](http://124.126.16.154:8888/singularity/hdk-pay/commit/3b1221634419f0ca39359e36c0363602b075b9b8))
|
||||
|
||||
## [1.8.0](http://124.126.16.154:8888/singularity/hdk-pay/compare/v1.7.0...v1.8.0) (2025-09-05)
|
||||
|
||||
|
||||
### ✨ Features | 新功能
|
||||
|
||||
* **invoice:** 添加发票详情查询功能 ([93f9231](http://124.126.16.154:8888/singularity/hdk-pay/commit/93f923181c41ce7e96077f304efe6e980231f1f6))
|
||||
|
||||
## [1.7.0](http://124.126.16.154:8888/singularity/hdk-pay/compare/v1.6.1...v1.7.0) (2025-09-04)
|
||||
|
||||
|
||||
### ✨ Features | 新功能
|
||||
|
||||
* **account:** 增加积分日志详情查询功能并支持发票信息 ([975a5ee](http://124.126.16.154:8888/singularity/hdk-pay/commit/975a5ee30110f27ceba0ef11fba751639189d57b))
|
||||
|
||||
### [1.6.1](http://124.126.16.154:8888/singularity/hdk-pay/compare/v1.6.0...v1.6.1) (2025-09-04)
|
||||
|
||||
|
||||
|
||||
@@ -70,5 +70,5 @@
|
||||
"url": "https://mirrors.aliyun.com/composer/"
|
||||
}
|
||||
},
|
||||
"version": "1.6.1"
|
||||
"version": "1.9.3"
|
||||
}
|
||||
|
||||
40
src/Application/Command/InitialAccountCmd.php
Normal file
40
src/Application/Command/InitialAccountCmd.php
Normal file
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* InitialAccountCmd.php@Pay
|
||||
*
|
||||
* @author 李东云 <Dongyun.Li@LuxCreo.Ai>
|
||||
* Powered by PhpStorm
|
||||
* Created on 2025/9/17
|
||||
*/
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Singularity\HDK\Pay\Application\Command;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Singularity\HDK\Pay\Domain\Account\Enum\PointType;
|
||||
|
||||
final class InitialAccountCmd
|
||||
{
|
||||
public array $pointsBalances;
|
||||
|
||||
public function __construct(
|
||||
public readonly string $uid,
|
||||
) {}
|
||||
|
||||
public function addPointsBalance(
|
||||
PointType $type,
|
||||
float $basic = 0.0,
|
||||
float $bonus = 0.0,
|
||||
?Carbon $expiredAt = null,
|
||||
?string $version = null,
|
||||
): array {
|
||||
return $this->pointsBalances[] = [
|
||||
'type' => $type->value,
|
||||
'basic' => $basic,
|
||||
'bonus' => $bonus,
|
||||
'expired_at' => $expiredAt->toDateTimeString(),
|
||||
'version' => $version,
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
@@ -24,9 +25,17 @@ final class PointLog extends AggregateRoot
|
||||
private readonly string $source,
|
||||
private readonly string $operator,
|
||||
private readonly string $description,
|
||||
private readonly string $patientName,
|
||||
private readonly Carbon $date,
|
||||
private readonly bool $invoiceable,
|
||||
private readonly ?InvoiceRecord $invoiceRecord,
|
||||
) {}
|
||||
|
||||
public function getPatientName(): string
|
||||
{
|
||||
return $this->patientName;
|
||||
}
|
||||
|
||||
public function getDescription(): string
|
||||
{
|
||||
return $this->description;
|
||||
@@ -67,4 +76,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;
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
) {}
|
||||
}
|
||||
@@ -16,11 +16,15 @@ enum PointType: string
|
||||
case EMA = 'ema';
|
||||
|
||||
case FtaiAligner = 'aligner';
|
||||
|
||||
case FtaiRetainer = 'retainer';
|
||||
|
||||
case Aligner4D = 'aligner-4d';
|
||||
|
||||
case NightguardAi = 'nightguard-ai';
|
||||
|
||||
case ScanToModel = 'scan-to-model';
|
||||
|
||||
public static function values(): array
|
||||
{
|
||||
return [
|
||||
@@ -30,6 +34,7 @@ enum PointType: string
|
||||
self::FtaiRetainer->value,
|
||||
self::Aligner4D->value,
|
||||
self::NightguardAi->value,
|
||||
self::ScanToModel->value
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,13 +11,29 @@ declare(strict_types=1);
|
||||
|
||||
namespace Singularity\HDK\Pay\Domain\Account\Repository;
|
||||
|
||||
use Singularity\HDK\Pay\Application\Command\InitialAccountCmd;
|
||||
use Singularity\HDK\Pay\Domain\Account\Aggregate\Account\AccountBalance;
|
||||
use Singularity\HDK\Pay\Domain\Account\Aggregate\Account\PointsBalance;
|
||||
use Singularity\HDK\Pay\Domain\Account\Enum\PointType;
|
||||
|
||||
interface AccountRepoInterface
|
||||
{
|
||||
/**
|
||||
* @param string $uid
|
||||
* @return AccountBalance
|
||||
*/
|
||||
public function getAccount(string $uid): AccountBalance;
|
||||
|
||||
/**
|
||||
* @param string $uid
|
||||
* @param PointType $pointType
|
||||
* @return PointsBalance
|
||||
*/
|
||||
public function getPointBalance(string $uid, PointType $pointType): PointsBalance;
|
||||
|
||||
/**
|
||||
* @param InitialAccountCmd $cmd
|
||||
* @return void
|
||||
*/
|
||||
public function initial(InitialAccountCmd $cmd): void;
|
||||
}
|
||||
@@ -19,4 +19,9 @@ interface PointLogRepoInterface
|
||||
*/
|
||||
public function getList(string $uid): array;
|
||||
|
||||
/**
|
||||
* @param string $caseId
|
||||
* @return PointLog
|
||||
*/
|
||||
public function getDetail(string $caseId): PointLog;
|
||||
}
|
||||
81
src/Domain/Invoice/Aggregate/Invoice/InvoiceInfo.php
Normal file
81
src/Domain/Invoice/Aggregate/Invoice/InvoiceInfo.php
Normal file
@@ -0,0 +1,81 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* InvoiceInfo.php@Pay
|
||||
*
|
||||
* @author 李东云 <Dongyun.Li@LuxCreo.Ai>
|
||||
* Powered by PhpStorm
|
||||
* Created on 2025/9/5
|
||||
*/
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Singularity\HDK\Pay\Domain\Invoice\Aggregate\Invoice;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Singularity\HDK\Pay\Domain\Invoice\Aggregate\Invoice\ValueObject\PointBalance;
|
||||
|
||||
final readonly class InvoiceInfo
|
||||
{
|
||||
public function __construct(
|
||||
private string $invoiceNo,
|
||||
private string $uid,
|
||||
private string $caseId,
|
||||
private Address $address,
|
||||
private InvoiceProduct $product,
|
||||
private PointBalance $balance,
|
||||
private string $receiver,
|
||||
private Carbon $invoiceAt,
|
||||
private Carbon $designedAt,
|
||||
private string $patientName,
|
||||
) {}
|
||||
|
||||
public function getInvoiceNo(): string
|
||||
{
|
||||
return $this->invoiceNo;
|
||||
}
|
||||
|
||||
public function getUid(): string
|
||||
{
|
||||
return $this->uid;
|
||||
}
|
||||
|
||||
public function getCaseId(): string
|
||||
{
|
||||
return $this->caseId;
|
||||
}
|
||||
|
||||
public function getAddress(): Address
|
||||
{
|
||||
return $this->address;
|
||||
}
|
||||
|
||||
public function getProduct(): InvoiceProduct
|
||||
{
|
||||
return $this->product;
|
||||
}
|
||||
|
||||
public function getBalance(): PointBalance
|
||||
{
|
||||
return $this->balance;
|
||||
}
|
||||
|
||||
public function getReceiver(): string
|
||||
{
|
||||
return $this->receiver;
|
||||
}
|
||||
|
||||
public function getInvoiceAt(): Carbon
|
||||
{
|
||||
return $this->invoiceAt;
|
||||
}
|
||||
|
||||
public function getDesignedAt(): Carbon
|
||||
{
|
||||
return $this->designedAt;
|
||||
}
|
||||
|
||||
public function getPatientName(): string
|
||||
{
|
||||
return $this->patientName;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* PointBalance.php@Pay
|
||||
*
|
||||
* @author 李东云 <Dongyun.Li@LuxCreo.Ai>
|
||||
* Powered by PhpStorm
|
||||
* Created on 2025/9/5
|
||||
*/
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Singularity\HDK\Pay\Domain\Invoice\Aggregate\Invoice\ValueObject;
|
||||
|
||||
final readonly class PointBalance {
|
||||
public function __construct(
|
||||
public float $total,
|
||||
public float $cost,
|
||||
public float $remain,
|
||||
) {}
|
||||
}
|
||||
@@ -13,6 +13,7 @@ use GuzzleHttp\Exception\GuzzleException;
|
||||
use Psr\Http\Message\ResponseInterface;
|
||||
use Singularity\HDK\Pay\Application\Command\CreateInvoiceCmd;
|
||||
use Singularity\HDK\Pay\Domain\Invoice\Aggregate\Invoice\Invoice;
|
||||
use Singularity\HDK\Pay\Domain\Invoice\Aggregate\Invoice\InvoiceInfo;
|
||||
|
||||
interface InvoiceRepoInterface
|
||||
{
|
||||
@@ -36,4 +37,10 @@ interface InvoiceRepoInterface
|
||||
* @throws GuzzleException
|
||||
*/
|
||||
public function send(string $invoiceNo): void;
|
||||
|
||||
/**
|
||||
* @param string $invoiceNo
|
||||
* @return InvoiceInfo
|
||||
*/
|
||||
public function findOne(string $invoiceNo): InvoiceInfo;
|
||||
}
|
||||
@@ -13,6 +13,7 @@ namespace Singularity\HDK\Pay\Infrastructure\Repository;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Hyperf\Codec\Json;
|
||||
use Singularity\HDK\Pay\Application\Command\InitialAccountCmd;
|
||||
use Singularity\HDK\Pay\Domain\Account\Aggregate\Account\AccountBalance;
|
||||
use Singularity\HDK\Pay\Domain\Account\Aggregate\Account\PointsBalance;
|
||||
use Singularity\HDK\Pay\Domain\Account\Enum\PointType;
|
||||
@@ -67,4 +68,17 @@ final class AccountBalanceRepo extends AbstractRepo implements AccountRepoInterf
|
||||
expiredAt: isset($result['expired_at']) ? new Carbon($result['expired_at']): null,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function initial(InitialAccountCmd $cmd): void
|
||||
{
|
||||
$uid = $cmd->uid;
|
||||
|
||||
$this->requestService->requestPost(
|
||||
url: "/rpc/v2/account/$uid/balance",
|
||||
data: $cmd->pointsBalances
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -11,12 +11,16 @@ declare(strict_types=1);
|
||||
|
||||
namespace Singularity\HDK\Pay\Infrastructure\Repository;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Hyperf\Codec\Json;
|
||||
use Psr\Http\Message\ResponseInterface;
|
||||
use Singularity\HDK\Core\Exceptions\ValidateException;
|
||||
use Singularity\HDK\Pay\Application\Command\CreateInvoiceCmd;
|
||||
use Singularity\HDK\Pay\Domain\Invoice\Aggregate\Invoice\Address;
|
||||
use Singularity\HDK\Pay\Domain\Invoice\Aggregate\Invoice\Invoice;
|
||||
use Singularity\HDK\Pay\Domain\Invoice\Aggregate\Invoice\InvoiceInfo;
|
||||
use Singularity\HDK\Pay\Domain\Invoice\Aggregate\Invoice\InvoiceProduct;
|
||||
use Singularity\HDK\Pay\Domain\Invoice\Aggregate\Invoice\ValueObject\PointBalance;
|
||||
use Singularity\HDK\Pay\Domain\Invoice\Repository\InvoiceRepoInterface;
|
||||
|
||||
final class InvoiceRepo extends AbstractRepo implements InvoiceRepoInterface
|
||||
@@ -82,4 +86,48 @@ final class InvoiceRepo extends AbstractRepo implements InvoiceRepoInterface
|
||||
|
||||
return $this->requestService->requestGet(url: "/rpc/v2/invoice/invoices/$invoiceNo/pdf");
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function findOne(string $invoiceNo): InvoiceInfo
|
||||
{
|
||||
if (empty($invoiceNo)) {
|
||||
throw new ValidateException(message: 'invoice no is required.');
|
||||
}
|
||||
|
||||
$response = $this->requestService->requestGet(url: "/rpc/v2/invoice/invoices/$invoiceNo");
|
||||
$content = $response->getBody()->getContents();
|
||||
$result = Json::decode($content);
|
||||
|
||||
return new InvoiceInfo(
|
||||
invoiceNo: $result['invoice_no'],
|
||||
uid: $result['uid'],
|
||||
caseId: $result['case_id'],
|
||||
address: new Address(
|
||||
patientName: $result['patient_name'],
|
||||
address: $result['address']['address'],
|
||||
city: $result['address']['city'],
|
||||
state: $result['address']['state'],
|
||||
country: $result['address']['country'],
|
||||
zipCode: $result['address']['zip_code'],
|
||||
),
|
||||
product: new InvoiceProduct(
|
||||
caseId: $result['case_id'],
|
||||
uid: $result['uid'],
|
||||
name: $result['product']['name'],
|
||||
sku: $result['product']['sku'],
|
||||
description: $result['product']['description'],
|
||||
),
|
||||
balance: new PointBalance(
|
||||
total: $result['balance']['total'],
|
||||
cost: $result['balance']['cost'],
|
||||
remain: $result['balance']['remain'],
|
||||
),
|
||||
receiver: $result['receiver'],
|
||||
invoiceAt: new Carbon($result['invoice_at']),
|
||||
designedAt: new Carbon($result['designed_at']),
|
||||
patientName: $result['patient_name'],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
@@ -36,8 +44,46 @@ final class PointLogRepo extends AbstractRepo implements PointLogRepoInterface
|
||||
source: $item['source'],
|
||||
operator: $item['operator'],
|
||||
description: $item['description'],
|
||||
patientName: $item['patient_name'],
|
||||
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'],
|
||||
patientName: $result['patient_name'],
|
||||
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,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -45,7 +45,7 @@ final class ProductRepo extends AbstractRepo implements RechargeProductRepoInter
|
||||
id: $result['one_time']['id'],
|
||||
description: $result['one_time']['name'],
|
||||
unitPrice: new Money(
|
||||
amount:bcmul((string)$result['one_time']['price'], '100'),
|
||||
amount: bcmul((string)$result['one_time']['price'], '100'),
|
||||
currency: new Currency($result['one_time']['currency']),
|
||||
),
|
||||
productType: ProductType::oneTime,
|
||||
@@ -55,20 +55,23 @@ final class ProductRepo extends AbstractRepo implements RechargeProductRepoInter
|
||||
pointBonus: $result['one_time']['point']['bonus'],
|
||||
),
|
||||
),
|
||||
packages: array_map(fn(array $item) => new ProductItem(
|
||||
id: $item['id'],
|
||||
description: $item['name'],
|
||||
unitPrice: new Money(
|
||||
amount: bcmul((string)$item['price'], '100'),
|
||||
currency: new Currency($item['currency']),
|
||||
packages: array_map(
|
||||
fn(array $item) => new ProductItem(
|
||||
id: $item['id'],
|
||||
description: $item['name'],
|
||||
unitPrice: new Money(
|
||||
amount: bcmul((string)$item['price'], '100'),
|
||||
currency: new Currency($item['currency']),
|
||||
),
|
||||
productType: ProductType::pack,
|
||||
effect: new RechargeEffect(
|
||||
pointType: PointType::LuxPoint,
|
||||
pointBasic: $item['point']['number'],
|
||||
pointBonus: $item['point']['bonus'],
|
||||
),
|
||||
),
|
||||
productType: ProductType::pack,
|
||||
effect: new RechargeEffect(
|
||||
pointType: PointType::LuxPoint,
|
||||
pointBasic: $item['point']['number'],
|
||||
pointBonus: $item['point']['bonus'],
|
||||
),
|
||||
), $result['package']),
|
||||
$result['package'] ?? [],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -99,29 +102,35 @@ final class ProductRepo extends AbstractRepo implements RechargeProductRepoInter
|
||||
),
|
||||
)
|
||||
: null,
|
||||
plans: array_map(fn(array $item) => new ProductItem(
|
||||
id: $item['id'],
|
||||
description: $item['name'],
|
||||
unitPrice: new Money(
|
||||
amount: bcmul((string)$item['price'], '100'),
|
||||
currency: new Currency($item['currency']),
|
||||
plans: array_map(
|
||||
fn(array $item) => new ProductItem(
|
||||
id: $item['id'],
|
||||
description: $item['name'],
|
||||
unitPrice: new Money(
|
||||
amount: bcmul((string)$item['price'], '100'),
|
||||
currency: new Currency($item['currency']),
|
||||
),
|
||||
productType: ProductType::plan,
|
||||
),
|
||||
productType: ProductType::plan,
|
||||
), $result['plan']),
|
||||
packages: array_map(fn(array $item) => new ProductItem(
|
||||
id: $item['id'],
|
||||
description: $item['name'],
|
||||
unitPrice: new Money(
|
||||
amount: bcmul((string)$item['price'], '100'),
|
||||
currency: new Currency($item['currency']),
|
||||
$result['plan'] ?? [],
|
||||
),
|
||||
packages: array_map(
|
||||
fn(array $item) => new ProductItem(
|
||||
id: $item['id'],
|
||||
description: $item['name'],
|
||||
unitPrice: new Money(
|
||||
amount: bcmul((string)$item['price'], '100'),
|
||||
currency: new Currency($item['currency']),
|
||||
),
|
||||
productType: ProductType::plan,
|
||||
effect: new RechargeEffect(
|
||||
pointType: $pointType,
|
||||
pointBasic: $item['point']['number'],
|
||||
pointBonus: $item['point']['bonus'],
|
||||
),
|
||||
),
|
||||
productType: ProductType::plan,
|
||||
effect: new RechargeEffect(
|
||||
pointType: $pointType,
|
||||
pointBasic: $item['point']['number'],
|
||||
pointBonus: $item['point']['bonus'],
|
||||
),
|
||||
), $result['package']),
|
||||
$result['package'] ?? [],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -144,7 +153,7 @@ final class ProductRepo extends AbstractRepo implements RechargeProductRepoInter
|
||||
id: $result['one_time']['id'],
|
||||
description: $result['one_time']['name'],
|
||||
unitPrice: new Money(
|
||||
amount:bcmul((string)$result['one_time']['price'], '100'),
|
||||
amount: bcmul((string)$result['one_time']['price'], '100'),
|
||||
currency: new Currency($result['one_time']['currency']),
|
||||
),
|
||||
productType: ProductType::oneTime,
|
||||
@@ -171,20 +180,23 @@ final class ProductRepo extends AbstractRepo implements RechargeProductRepoInter
|
||||
),
|
||||
)
|
||||
: null,
|
||||
plans: array_map(fn(array $item) => new ProductItem(
|
||||
id: $item['id'],
|
||||
description: $item['name'],
|
||||
unitPrice: new Money(
|
||||
amount: bcmul((string)$item['price'], '100'),
|
||||
currency: new Currency($item['currency']),
|
||||
plans: array_map(
|
||||
fn(array $item) => new ProductItem(
|
||||
id: $item['id'],
|
||||
description: $item['name'],
|
||||
unitPrice: new Money(
|
||||
amount: bcmul((string)$item['price'], '100'),
|
||||
currency: new Currency($item['currency']),
|
||||
),
|
||||
productType: ProductType::plan,
|
||||
effect: new RechargeEffect(
|
||||
pointType: PointType::EMA,
|
||||
pointBasic: $item['point']['number'],
|
||||
pointBonus: $item['point']['bonus'],
|
||||
),
|
||||
),
|
||||
productType: ProductType::plan,
|
||||
effect: new RechargeEffect(
|
||||
pointType: PointType::EMA,
|
||||
pointBasic: $item['point']['number'],
|
||||
pointBonus: $item['point']['bonus'],
|
||||
),
|
||||
), $result['plan']),
|
||||
$result['plan'] ?? [],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
53
tests/Feature/Account/InitialAccountBalanceTest.php
Normal file
53
tests/Feature/Account/InitialAccountBalanceTest.php
Normal file
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* InitialAccountBalanceTest.php@Pay
|
||||
*
|
||||
* @author 李东云 <Dongyun.Li@LuxCreo.Ai>
|
||||
* Powered by PhpStorm
|
||||
* Created on 2025/9/17
|
||||
*/
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Singularity\HDK\Pay\Application\Command\InitialAccountCmd;
|
||||
use Singularity\HDK\Pay\Domain\Account\Enum\PointType;
|
||||
|
||||
use Singularity\HDK\Pay\Infrastructure\Repository\AccountBalanceRepo;
|
||||
|
||||
use function Hyperf\Support\make;
|
||||
|
||||
it('should initial account balance', function () {
|
||||
$uid = uniqid('TDD');
|
||||
$data = [
|
||||
[
|
||||
'type' => 'aligner',
|
||||
'basic' => 0,
|
||||
'bonus' => 40,
|
||||
'expired_at' => Carbon::now()->addYear(),
|
||||
'version' => 'trial',
|
||||
],
|
||||
[
|
||||
'type' => 'ema',
|
||||
'basic' => 0,
|
||||
'bonus' => 1,
|
||||
'expired_at' => Carbon::now()->addYear(),
|
||||
'version' => 'Trial',
|
||||
],
|
||||
];
|
||||
|
||||
$cmd = new InitialAccountCmd($uid);
|
||||
foreach ($data as $point_balance) {
|
||||
$cmd->addPointsBalance(
|
||||
type: PointType::from($point_balance['type']),
|
||||
basic: $point_balance['basic'],
|
||||
bonus: $point_balance['bonus'],
|
||||
expiredAt:$point_balance['expired_at'],
|
||||
version: $point_balance['version'],
|
||||
);
|
||||
}
|
||||
|
||||
$repo = make(AccountBalanceRepo::class);
|
||||
$repo->initial($cmd);
|
||||
|
||||
expect(true)->toBeTrue();
|
||||
});
|
||||
@@ -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);
|
||||
});
|
||||
23
tests/Feature/Invoice/QueryInvoiceDetailTest.php
Normal file
23
tests/Feature/Invoice/QueryInvoiceDetailTest.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* QueryInvoiceDetailTest.php@Pay
|
||||
*
|
||||
* @author 李东云 <Dongyun.Li@LuxCreo.Ai>
|
||||
* Powered by PhpStorm
|
||||
* Created on 2025/9/5
|
||||
*/
|
||||
|
||||
use Singularity\HDK\Pay\Domain\Invoice\Aggregate\Invoice\InvoiceInfo;
|
||||
use Singularity\HDK\Pay\Infrastructure\Repository\InvoiceRepo;
|
||||
|
||||
use function Hyperf\Support\make;
|
||||
|
||||
it('should can query invoice detail', function () {
|
||||
$repo = make(InvoiceRepo::class);
|
||||
|
||||
$invoiceNo = '517268';
|
||||
$result = $repo->findOne($invoiceNo);
|
||||
expect($result)
|
||||
->toBeInstanceOf(InvoiceInfo::class);
|
||||
});
|
||||
Reference in New Issue
Block a user