mirror of
https://gitee.com/koogua/course-tencent-cloud.git
synced 2025-06-26 12:23:06 +08:00
Merge branch 'koogua/I3A937' into demo
This commit is contained in:
commit
f1aaaacdaf
@ -39,8 +39,8 @@ class RefundTask extends Task
|
||||
$itemInfo = $task->item_info;
|
||||
|
||||
$refund = $refundRepo->findById($itemInfo['refund']['id']);
|
||||
$trade = $tradeRepo->findById($itemInfo['refund']['trade_id']);
|
||||
$order = $orderRepo->findById($itemInfo['refund']['order_id']);
|
||||
$trade = $tradeRepo->findById($refund->trade_id);
|
||||
$order = $orderRepo->findById($refund->order_id);
|
||||
|
||||
if (!$refund || !$trade || !$order) {
|
||||
$task->status = TaskModel::STATUS_FAILED;
|
||||
|
@ -10,6 +10,7 @@ use App\Repos\Account as AccountRepo;
|
||||
use App\Repos\Order as OrderRepo;
|
||||
use App\Repos\Trade as TradeRepo;
|
||||
use App\Repos\User as UserRepo;
|
||||
use App\Validators\Refund as RefundValidator;
|
||||
use App\Validators\Trade as TradeValidator;
|
||||
|
||||
class Trade extends Service
|
||||
@ -101,10 +102,16 @@ class Trade extends Service
|
||||
|
||||
$validator->checkIfAllowRefund($trade);
|
||||
|
||||
$validator = new RefundValidator();
|
||||
|
||||
$refundAmount = $this->getRefundAmount($trade);
|
||||
|
||||
$validator->checkAmount($trade->amount, $refundAmount);
|
||||
|
||||
$refund = new RefundModel();
|
||||
|
||||
$refund->amount = $refundAmount;
|
||||
$refund->subject = $trade->subject;
|
||||
$refund->amount = $trade->amount;
|
||||
$refund->owner_id = $trade->owner_id;
|
||||
$refund->order_id = $trade->order_id;
|
||||
$refund->trade_id = $trade->id;
|
||||
@ -115,6 +122,19 @@ class Trade extends Service
|
||||
return $refund;
|
||||
}
|
||||
|
||||
protected function getRefundAmount(TradeModel $trade)
|
||||
{
|
||||
$orderRepo = new OrderRepo();
|
||||
|
||||
$order = $orderRepo->findById($trade->order_id);
|
||||
|
||||
$refund = new \App\Services\Refund();
|
||||
|
||||
$preview = $refund->preview($order);
|
||||
|
||||
return $preview['refund_amount'];
|
||||
}
|
||||
|
||||
protected function findOrFail($id)
|
||||
{
|
||||
$validator = new TradeValidator();
|
||||
|
@ -6,6 +6,17 @@
|
||||
<input type="radio" name="enabled" value="0" title="否" {% if alipay.enabled == "0" %}checked="checked"{% endif %}>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">手续费率</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="service_rate" lay-verify="number">
|
||||
{% for value in 1..30 %}
|
||||
{% set selected = (value == alipay.service_rate) ? 'selected="selected"' : '' %}
|
||||
<option value="{{ value }}" {{ selected }}>{{ value }}%</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">App ID</label>
|
||||
<div class="layui-input-block">
|
||||
|
@ -6,6 +6,17 @@
|
||||
<input type="radio" name="enabled" value="0" title="否" {% if wxpay.enabled == "0" %}checked="checked"{% endif %}>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">手续费率</label>
|
||||
<div class="layui-input-block">
|
||||
<select name="service_rate" lay-verify="number">
|
||||
{% for value in 1..30 %}
|
||||
{% set selected = (value == wxpay.service_rate) ? 'selected="selected"' : '' %}
|
||||
<option value="{{ value }}" {{ selected }}>{{ value }}%</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">公众号ID</label>
|
||||
<div class="layui-input-block">
|
||||
|
@ -7,7 +7,7 @@
|
||||
{% set order_pay_url = url({'for':'home.order.pay'},{'sn':order.sn}) %}
|
||||
{% set refund_confirm_url = url({'for':'home.refund.confirm'},{'sn':order.sn}) %}
|
||||
|
||||
<table class="layui-table order-table" lay-size="lg">
|
||||
<table class="layui-table order-table">
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
订单金额:<span class="price">{{ '¥%0.2f'|format(order.amount) }}</span>
|
||||
|
@ -24,16 +24,18 @@
|
||||
{% endif %}
|
||||
{%- endmacro %}
|
||||
|
||||
<table class="layui-table order-table" lay-size="lg">
|
||||
<table class="layui-table order-table">
|
||||
<tr>
|
||||
<td>退款项目</td>
|
||||
<td>退款金额</td>
|
||||
<td>订单金额</td>
|
||||
<td>手续费</td>
|
||||
<td>退款金额</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ item_info(confirm) }}</td>
|
||||
<td><span class="price">{{ '¥%0.2f'|format(confirm.refund_amount) }}</span></td>
|
||||
<td><span class="price">{{ '¥%0.2f'|format(order.amount) }}</span></td>
|
||||
<td><span class="price">{{ '¥%0.2f'|format(confirm.service_fee) }}</span></td>
|
||||
<td><span class="price">{{ '¥%0.2f'|format(confirm.refund_amount) }}</span></td>
|
||||
</tr>
|
||||
</table>
|
||||
<br>
|
||||
|
@ -70,11 +70,7 @@ class RefundCreate extends Service
|
||||
$task = new TaskModel();
|
||||
|
||||
$itemInfo = [
|
||||
'refund' => [
|
||||
'id' => $refund->id,
|
||||
'order_id' => $refund->order_id,
|
||||
'trade_id' => $refund->trade_id,
|
||||
],
|
||||
'refund' => ['id' => $refund->id],
|
||||
];
|
||||
|
||||
$task->item_id = $refund->id;
|
||||
|
@ -3,15 +3,22 @@
|
||||
namespace App\Services;
|
||||
|
||||
use App\Models\Order as OrderModel;
|
||||
use App\Models\Trade as TradeModel;
|
||||
use App\Repos\Course as CourseRepo;
|
||||
use App\Repos\CourseUser as CourseUserRepo;
|
||||
use App\Repos\Order as OrderRepo;
|
||||
|
||||
class Refund extends Service
|
||||
{
|
||||
|
||||
public function preview(OrderModel $order)
|
||||
{
|
||||
$result = [];
|
||||
$result = [
|
||||
'item_type' => 0,
|
||||
'item_info' => [],
|
||||
'refund_amount' => 0.00,
|
||||
'service_fee' => 0.00,
|
||||
];
|
||||
|
||||
switch ($order->item_type) {
|
||||
case OrderModel::ITEM_COURSE:
|
||||
@ -20,6 +27,9 @@ class Refund extends Service
|
||||
case OrderModel::ITEM_PACKAGE:
|
||||
$result = $this->previewPackageRefund($order);
|
||||
break;
|
||||
default:
|
||||
$result = $this->previewOtherRefund($order);
|
||||
break;
|
||||
}
|
||||
|
||||
return $result;
|
||||
@ -31,12 +41,14 @@ class Refund extends Service
|
||||
|
||||
$itemInfo['course']['cover'] = kg_cos_cover_url($itemInfo['course']['cover']);
|
||||
|
||||
$serviceFee = $this->getServiceFee($order);
|
||||
|
||||
$refundPercent = 0.00;
|
||||
$refundAmount = 0.00;
|
||||
|
||||
if ($itemInfo['course']['refund_expiry_time'] > time()) {
|
||||
$refundPercent = $this->getCourseRefundPercent($order->item_id, $order->owner_id);
|
||||
$refundAmount = $order->amount * $refundPercent;
|
||||
$refundAmount = round(($order->amount - $serviceFee) * $refundPercent, 2);
|
||||
}
|
||||
|
||||
$itemInfo['course']['refund_percent'] = $refundPercent;
|
||||
@ -46,6 +58,7 @@ class Refund extends Service
|
||||
'item_type' => $order->item_type,
|
||||
'item_info' => $itemInfo,
|
||||
'refund_amount' => $refundAmount,
|
||||
'service_fee' => $serviceFee,
|
||||
];
|
||||
}
|
||||
|
||||
@ -53,6 +66,8 @@ class Refund extends Service
|
||||
{
|
||||
$itemInfo = $order->item_info;
|
||||
|
||||
$serviceFee = $this->getServiceFee($order);
|
||||
|
||||
$totalMarketPrice = 0.00;
|
||||
|
||||
foreach ($itemInfo['courses'] as $course) {
|
||||
@ -74,7 +89,7 @@ class Refund extends Service
|
||||
if ($course['refund_expiry_time'] > time()) {
|
||||
$pricePercent = round($course['market_price'] / $totalMarketPrice, 4);
|
||||
$refundPercent = $this->getCourseRefundPercent($course['id'], $order->owner_id);
|
||||
$refundAmount = round($order->amount * $pricePercent * $refundPercent, 2);
|
||||
$refundAmount = round(($order->amount - $serviceFee) * $pricePercent * $refundPercent, 2);
|
||||
$totalRefundAmount += $refundAmount;
|
||||
}
|
||||
|
||||
@ -86,9 +101,47 @@ class Refund extends Service
|
||||
'item_type' => $order->item_type,
|
||||
'item_info' => $itemInfo,
|
||||
'refund_amount' => $totalRefundAmount,
|
||||
'service_fee' => $serviceFee,
|
||||
];
|
||||
}
|
||||
|
||||
protected function previewOtherRefund(OrderModel $order)
|
||||
{
|
||||
$serviceFee = $this->getServiceFee($order);
|
||||
|
||||
$refundAmount = round($order->amount - $serviceFee, 2);
|
||||
|
||||
return [
|
||||
'item_type' => $order->item_type,
|
||||
'item_info' => [],
|
||||
'refund_amount' => $refundAmount,
|
||||
'service_fee' => $serviceFee,
|
||||
];
|
||||
}
|
||||
|
||||
protected function getServiceFee(OrderModel $order)
|
||||
{
|
||||
$orderRepo = new OrderRepo();
|
||||
|
||||
$trade = $orderRepo->findLastTrade($order->id);
|
||||
|
||||
$alipay = $this->getSettings('pay.alipay');
|
||||
$wxpay = $this->getSettings('pay.wxpay');
|
||||
|
||||
$serviceRate = 5;
|
||||
|
||||
switch ($trade->channel) {
|
||||
case TradeModel::CHANNEL_ALIPAY:
|
||||
$serviceRate = $alipay['service_rate'] ?: $serviceRate;
|
||||
break;
|
||||
case TradeModel::CHANNEL_WXPAY:
|
||||
$serviceRate = $wxpay['service_rate'] ?: $serviceRate;
|
||||
break;
|
||||
}
|
||||
|
||||
return round($order->amount * $serviceRate / 100, 2);
|
||||
}
|
||||
|
||||
protected function getCourseRefundPercent($courseId, $userId)
|
||||
{
|
||||
$courseRepo = new CourseRepo();
|
||||
|
@ -5,6 +5,7 @@ namespace App\Validators;
|
||||
use App\Exceptions\BadRequest as BadRequestException;
|
||||
use App\Models\Order as OrderModel;
|
||||
use App\Models\Refund as RefundModel;
|
||||
use App\Models\Trade as TradeModel;
|
||||
use App\Repos\Course as CourseRepo;
|
||||
use App\Repos\Order as OrderRepo;
|
||||
use App\Repos\Package as PackageRepo;
|
||||
@ -154,6 +155,12 @@ class Order extends Validator
|
||||
|
||||
$orderRepo = new OrderRepo();
|
||||
|
||||
$trade = $orderRepo->findLastTrade($order->id);
|
||||
|
||||
if ($trade->status != TradeModel::STATUS_FINISHED) {
|
||||
throw new BadRequestException('order.refund_not_allowed');
|
||||
}
|
||||
|
||||
$refund = $orderRepo->findLastRefund($order->id);
|
||||
|
||||
$scopes = [
|
||||
|
39
db/migrations/20210305115507_data_202103051930.php
Normal file
39
db/migrations/20210305115507_data_202103051930.php
Normal file
@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
use Phinx\Migration\AbstractMigration;
|
||||
|
||||
final class Data202103051930 extends AbstractMigration
|
||||
{
|
||||
|
||||
public function up()
|
||||
{
|
||||
$rows = [
|
||||
[
|
||||
'section' => 'pay.alipay',
|
||||
'item_key' => 'service_rate',
|
||||
'item_value' => 5,
|
||||
],
|
||||
[
|
||||
'section' => 'pay.wxpay',
|
||||
'item_key' => 'service_rate',
|
||||
'item_value' => 5,
|
||||
],
|
||||
];
|
||||
|
||||
$this->table('kg_setting')->insert($rows)->save();
|
||||
}
|
||||
|
||||
public function down()
|
||||
{
|
||||
$this->getQueryBuilder()
|
||||
->delete('kg_setting')
|
||||
->where(['section' => 'pay.alipay', 'item_key' => 'service_rate'])
|
||||
->execute();
|
||||
|
||||
$this->getQueryBuilder()
|
||||
->delete('kg_setting')
|
||||
->where(['section' => 'pay.wxpay', 'item_key' => 'service_rate'])
|
||||
->execute();
|
||||
}
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user