1
0
mirror of https://gitee.com/koogua/course-tencent-cloud.git synced 2025-06-26 20:52:44 +08:00

Merge branch 'koogua/I3A937' into demo

This commit is contained in:
koogua 2021-03-07 15:34:25 +08:00
commit f1aaaacdaf
10 changed files with 154 additions and 15 deletions

View File

@ -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;

View File

@ -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();

View File

@ -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">

View File

@ -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">

View File

@ -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>

View File

@ -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>

View File

@ -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;

View File

@ -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();

View File

@ -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 = [

View 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();
}
}