1
0
mirror of https://gitee.com/koogua/course-tencent-cloud.git synced 2025-06-25 04:07:17 +08:00

Merge branch 'koogua/v1.2.8' into demo

This commit is contained in:
koogua 2021-03-09 11:09:42 +08:00
commit 840a85ff2b
21 changed files with 283 additions and 120 deletions

View File

@ -1,3 +1,17 @@
### [v1.2.8](https://gitee.com/koogua/course-tencent-cloud/releases/v1.2.8)(2021-03-08)
### 更新
- 数据库迁移脚本整理
- 数据表软删除字段整理
- 微信公众号路由整理
- 退款增加手续费逻辑
- 课程增加不支持退款逻辑
- 会员价格和期限可通过后台配置
- 修复IM通知中字段重命名导致的问题
- 修复购买会员会员标识未改变的问题
- 会员中心订单列表样式调整
### [v1.2.7](https://gitee.com/koogua/course-tencent-cloud/releases/v1.2.7)(2021-02-26)
### 新增

View File

@ -3,6 +3,7 @@
namespace App\Http\Admin\Controllers;
use App\Http\Admin\Services\Trade as TradeService;
use Phalcon\Mvc\View;
/**
* @RoutePrefix("/admin/trade")
@ -70,25 +71,26 @@ class TradeController extends Controller
}
/**
* @Post("/{id:[0-9]+}/refund", name="admin.trade.refund")
* @Route("/{id:[0-9]+}/refund", name="admin.trade.refund")
*/
public function refundAction($id)
{
$tradeService = new TradeService();
$refund = $tradeService->refundTrade($id);
if ($this->request->isPost()) {
$location = $this->url->get([
'for' => 'admin.refund.show',
'id' => $refund->id,
]);
$tradeService->refundTrade($id);
$content = [
'location' => $location,
'msg' => '申请退款成功',
];
return $this->jsonSuccess(['msg' => '提交申请成功']);
}
return $this->jsonSuccess($content);
$this->view->setRenderLevel(View::LEVEL_ACTION_VIEW);
$trade = $tradeService->getTrade($id);
$confirm = $tradeService->confirmRefund($id);
$this->view->setVar('trade', $trade);
$this->view->setVar('confirm', $confirm);
}
}

View File

@ -94,19 +94,38 @@ class Trade extends Service
return $accountRepo->findById($userId);
}
public function confirmRefund($tradeId)
{
$trade = $this->findOrFail($tradeId);
$orderRepo = new OrderRepo();
$order = $orderRepo->findById($trade->order_id);
$refund = new \App\Services\Refund();
return $refund->preview($order);
}
public function refundTrade($id)
{
$trade = $this->findOrFail($id);
$user = $this->getLoginUser();
$post = $this->request->getPost();
$validator = new TradeValidator();
$validator->checkIfAllowRefund($trade);
$validator = new RefundValidator();
$refundAmount = $this->getRefundAmount($trade);
$applyNote = $validator->checkApplyNote($post['apply_note']);
$validator->checkAmount($trade->amount, $refundAmount);
$refundAmount = $validator->checkAmount($trade->amount, $post['refund_amount']);
$applyNote = sprintf('%s - 操作员(%s', $applyNote, $user->id);
$refund = new RefundModel();
@ -115,26 +134,13 @@ class Trade extends Service
$refund->owner_id = $trade->owner_id;
$refund->order_id = $trade->order_id;
$refund->trade_id = $trade->id;
$refund->apply_note = '后台人工申请退款';
$refund->apply_note = $applyNote;
$refund->create();
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

@ -4,7 +4,7 @@
<div class="kg-order-item">
<p>课程名称:{{ course['title'] }}</p>
<p>优惠价格:{{ '¥%0.2f'|format(course['market_price']) }},会员价格:{{ '¥%0.2f'|format(course['vip_price']) }}</p>
<p>学习期限:{{ date('Y-m-d',course['study_expiry_time']) }},退款期限:{% if course['refund_expiry'] > 0 %}{{ date('Y-m-d',course['refund_expiry_time']) }}{% else %}不支持{% endif %}</p>
<p>学习期限:{{ date('Y-m-d H:i:s',course['study_expiry_time']) }},退款期限:{% if course['refund_expiry'] > 0 %}{{ date('Y-m-d H:i:s',course['refund_expiry_time']) }}{% else %}不支持{% endif %}</p>
</div>
{% elseif order.item_type == 2 %}
{% set courses = order.item_info['courses'] %}
@ -12,7 +12,7 @@
<div class="kg-order-item">
<p>课程名称:{{ course['title'] }}</p>
<p>优惠价格:{{ '¥%0.2f'|format(course['market_price']) }},会员价格:{{ '¥%0.2f'|format(course['vip_price']) }}</p>
<p>学习期限:{{ date('Y-m-d',course['study_expiry_time']) }},退款期限:{% if course['refund_expiry'] > 0 %}{{ date('Y-m-d',course['refund_expiry_time']) }}{% else %}不支持{% endif %}</p>
<p>学习期限:{{ date('Y-m-d H:i:s',course['study_expiry_time']) }},退款期限:{% if course['refund_expiry'] > 0 %}{{ date('Y-m-d H:i:s',course['refund_expiry_time']) }}{% else %}不支持{% endif %}</p>
</div>
{% endfor %}
{% elseif order.item_type == 3 %}

View File

@ -0,0 +1,114 @@
{% extends 'templates/layer.volt' %}
{% block content %}
{%- macro item_info(confirm) %}
{% if confirm.item_type == 1 %}
{% set course = confirm.item_info.course %}
{% set expiry_flag = course.refund_expiry_time < time() ? '(已过期)' : '' %}
<div class="kg-order-item">
<p>课程名称:{{ course.title }}</p>
<p>退款期限:{{ date('Y-m-d H:i:s',course.refund_expiry_time) }} {{ expiry_flag }}</p>
<p>退款金额:{{ '¥%0.2f'|format(course.refund_amount) }},退款比例:{{ 100 * course.refund_percent }}%</p>
</div>
{% elseif confirm.item_type == 2 %}
{% set courses = confirm.item_info.courses %}
{% for course in courses %}
{% set expiry_flag = course.refund_expiry_time < time() ? '(已过期)' : '' %}
<div class="kg-order-item">
<p>课程名称:{{ course.title }}</p>
<p>退款期限:{{ date('Y-m-d H:i:s',course.refund_expiry_time) }} {{ expiry_flag }}</p>
<p>退款金额:{{ '¥%0.2f'|format(course.refund_amount) }},退款比例:{{ 100 * course.refund_percent }}%</p>
</div>
{% endfor %}
{% elseif confirm.item_type == 3 %}
{% set course = confirm.item_info.course %}
{% set reward = confirm.item_info.reward %}
<div class="kg-order-item">
<p>课程名称:{{ course.title }}</p>
<p>赞赏金额:{{ '¥%0.2f'|format(reward.price) }}</p>
</div>
{% elseif confirm.item_type == 4 %}
{% set vip = confirm.item_info.vip %}
<div class="kg-order-item">
<p>服务名称:会员服务({{ vip.title }}</p>
<p>会员期限:{{ date('Y-m-d H:i:s',vip.expiry_time) }}</p>
</div>
{% elseif confirm.item_type == 99 %}
<div class="kg-order-item">
<p>服务名称:支付测试</p>
</div>
{% endif %}
{%- endmacro %}
<table class="layui-table kg-table">
<tr>
<td>退款项目</td>
<td>支付金额</td>
<td>手续费({{ confirm.service_rate }}%</td>
<td>退款金额</td>
</tr>
<tr>
<td>{{ item_info(confirm) }}</td>
<td>{{ '¥%0.2f'|format(trade.amount) }}</td>
<td>{{ '¥%0.2f'|format(confirm.service_fee) }}</td>
<td>
<div id="refund-amount-tips">{{ '¥%0.2f'|format(confirm.refund_amount) }}</div>
</td>
</tr>
</table>
<br>
<form class="layui-form" method="post" action="{{ url({'for':'admin.trade.refund','id':trade.id}) }}">
<div class="layui-form-item">
<label class="layui-form-label">退款比例</label>
<div class="layui-input-block">
<div id="slider" style="padding-top:15px;"></div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">退款原因</label>
<div class="layui-input-block">
<input class="layui-input" name="apply_note" lay-verify="required">
</div>
</div>
<div class="layui-form-item kg-center">
<button class="layui-btn" lay-submit="true" lay-filter="go">提交申请</button>
<input type="hidden" name="trade_amount" value="{{ trade.amount }}">
<input type="hidden" name="refund_amount" value="{{ confirm.refund_amount }}">
<input type="hidden" name="service_fee" value="{{ confirm.service_fee }}">
</div>
</form>
{% endblock %}
{% block inline_js %}
<script>
layui.use(['jquery', 'slider', 'layer'], function () {
var $ = layui.jquery;
var slider = layui.slider;
var index = parent.layer.getFrameIndex(window.name);
parent.layer.iframeAuto(index);
slider.render({
elem: '#slider',
value: {{ confirm.service_rate }},
change: function (ratio) {
var $tradeAmount = $('input[name=trade_amount]');
var $refundAmount = $('input[name=refund_amount]');
var $serviceFee = $('input[name=service_fee]');
var $refundAmountTips = $('#refund-amount-tips');
var refundAmount = (parseFloat($tradeAmount.val()) - parseFloat($serviceFee.val())) * ratio / 100;
$refundAmount.val(refundAmount.toFixed(2));
$refundAmountTips.text('¥' + refundAmount.toFixed(2));
}
});
});
</script>
{% endblock %}

View File

@ -9,11 +9,11 @@
<br>
{% set trade_refund_url = url({'for':'admin.trade.refund','id':trade.id}) %}
{% set refund_url = url({'for':'admin.trade.refund','id':trade.id}) %}
<div class="kg-center">
{% if trade.status == 2 %}
<button class="kg-refund layui-btn layui-bg-green" data-url="{{ trade_refund_url }}">申请退款</button>
<button class="kg-refund layui-btn layui-bg-green" data-url="{{ refund_url }}">申请退款</button>
{% endif %}
<button class="kg-back layui-btn layui-bg-gray">返回上页</button>
</div>
@ -32,15 +32,15 @@
<th></th>
</tr>
{% for item in refunds %}
{% set refund_sh_url = url({'for':'admin.refund.status_history','id':item.id}) %}
{% set refund_show_url = url({'for':'admin.refund.show','id':item.id}) %}
{% set history_url = url({'for':'admin.refund.status_history','id':item.id}) %}
{% set show_url = url({'for':'admin.refund.show','id':item.id}) %}
<tr>
<td>{{ item.sn }}</td>
<td>{{ '¥%0.2f'|format(item.amount) }}</td>
<td><a href="javascript:" title="{{ item.apply_note }}">{{ substr(item.apply_note,0,15) }}</td>
<td><a class="kg-status-history" href="javascript:" title="查看历史状态" data-url="{{ refund_sh_url }}">{{ refund_status(item.status) }}</a></td>
<td><a class="kg-status-history" href="javascript:" title="查看历史状态" data-url="{{ history_url }}">{{ refund_status(item.status) }}</a></td>
<td>{{ date('Y-m-d H:i:s',item.create_time) }}</td>
<td><a class="layui-btn layui-btn-sm" href="{{ refund_show_url }}">详情</a></td>
<td><a class="layui-btn layui-btn-sm" href="{{ show_url }}">详情</a></td>
</tr>
{% endfor %}
</table>
@ -69,25 +69,15 @@
layui.use(['jquery', 'layer'], function () {
var $ = layui.jquery;
var layer = layui.layer;
$('.kg-refund').on('click', function () {
var url = $(this).data('url');
var tips = '确定要申请退款吗?';
layer.confirm(tips, function () {
$.ajax({
type: 'POST',
url: url,
success: function (res) {
layer.msg(res.msg, {icon: 1});
setTimeout(function () {
window.location.href = res.location;
}, 3000);
},
error: function (xhr) {
var json = JSON.parse(xhr.responseText);
layer.msg(json.msg, {icon: 2});
}
});
layer.open({
type: 2,
title: '申请退款',
content: [url, 'no'],
area: ['800px', '320px']
});
});

View File

@ -1,4 +1,4 @@
{% set trade_sh_url = url({'for':'admin.trade.status_history','id':trade.id}) %}
{% set trade_history_url = url({'for':'admin.trade.status_history','id':trade.id}) %}
<fieldset class="layui-elem-field layui-field-title">
<legend>交易信息</legend>
@ -16,7 +16,7 @@
<td>{{ trade.sn }}</td>
<td>{{ '¥%0.2f'|format(trade.amount) }}</td>
<td>{{ channel_type(trade.channel) }}</td>
<td><a class="kg-status-history" href="javascript:" title="查看历史状态" data-url="{{ trade_sh_url }}">{{ trade_status(trade.status) }}</a></td>
<td><a class="kg-status-history" href="javascript:" title="查看历史状态" data-url="{{ trade_history_url }}">{{ trade_status(trade.status) }}</a></td>
<td>{{ date('Y-m-d H:i:s',trade.create_time) }}</td>
</tr>
</table>

View File

@ -60,9 +60,7 @@ Trait ImGroupTrait
$notice = $validator->checkNotice($noticeId);
if ($notice->item_type != ImNoticeModel::TYPE_GROUP_REQUEST) {
return;
}
if ($notice->item_type != ImNoticeModel::TYPE_GROUP_REQUEST) return;
$groupId = $notice->item_info['group']['id'] ?: 0;
@ -70,7 +68,7 @@ Trait ImGroupTrait
$group = $validator->checkGroup($groupId);
$validator->checkOwner($user->id, $group->user_id);
$validator->checkOwner($user->id, $group->owner_id);
$applicant = $this->getImUser($notice->sender_id);
@ -120,9 +118,7 @@ Trait ImGroupTrait
$notice = $validator->checkNotice($noticeId);
if ($notice->item_type != ImNoticeModel::TYPE_GROUP_REQUEST) {
return;
}
if ($notice->item_type != ImNoticeModel::TYPE_GROUP_REQUEST) return;
$groupId = $notice->item_info['group']['id'] ?: 0;
@ -130,7 +126,7 @@ Trait ImGroupTrait
$group = $validator->checkGroup($groupId);
$validator->checkOwner($user->id, $group->user_id);
$validator->checkOwner($user->id, $group->owner_id);
$itemInfo = $notice->item_info;
@ -282,9 +278,7 @@ Trait ImGroupTrait
$users = $groupRepo->findUsers($group->id);
if ($users->count() == 0) {
return;
}
if ($users->count() == 0) return;
Gateway::$registerAddress = $this->getRegisterAddress();

View File

@ -4,7 +4,7 @@
<div class="order-item">
<p>课程名称:<span>{{ course.title }}</span></p>
<p>优惠价格:<span class="price">{{ '¥%0.2f'|format(course.market_price) }}</span>会员价格:<span class="price">{{ '¥%0.2f'|format(course.vip_price) }}</span></p>
<p>学习期限:<span>{{ date('Y-m-d',course.study_expiry_time) }}</span>退款期限:<span>{% if course.refund_expiry > 0 %}{{ date('Y-m-d',course.refund_expiry_time) }}{% else %}不支持{% endif %}</span></p>
<p>学习期限:<span>{{ date('Y-m-d H:i:s',course.study_expiry_time) }}</span>退款期限:<span>{% if course.refund_expiry > 0 %}{{ date('Y-m-d H:i:s',course.refund_expiry_time) }}{% else %}不支持{% endif %}</span></p>
</div>
{% elseif order.item_type == 2 %}
{% set courses = order.item_info.courses %}
@ -12,7 +12,7 @@
<div class="order-item">
<p>课程名称:<span>{{ course.title }}</span></p>
<p>优惠价格:<span class="price">{{ '¥%0.2f'|format(course.market_price) }}</span>会员价格:<span class="price">{{ '¥%0.2f'|format(course.vip_price) }}</span></p>
<p>学习期限:<span>{{ date('Y-m-d',course.study_expiry_time) }}</span>退款期限:<span>{% if course.refund_expiry > 0 %}{{ date('Y-m-d',course.refund_expiry_time) }}{% else %}不支持{% endif %}</span></p>
<p>学习期限:<span>{{ date('Y-m-d H:i:s',course.study_expiry_time) }}</span>退款期限:<span>{% if course.refund_expiry > 0 %}{{ date('Y-m-d H:i:s',course.refund_expiry_time) }}{% else %}不支持{% endif %}</span></p>
</div>
{% endfor %}
{% elseif order.item_type == 3 %}

View File

@ -28,7 +28,7 @@
<tr>
<td>退款项目</td>
<td>订单金额</td>
<td>手续费</td>
<td>手续费{{ confirm.service_rate }}%</td>
<td>退款金额</td>
</tr>
<tr>
@ -41,14 +41,14 @@
<br>
{% if confirm.refund_amount > 0 %}
<form class="layui-form layui-form-pane" method="post" action="{{ url({'for':'home.refund.create'}) }}">
<div class="layui-form-item layui-form-text">
<div class="layui-form-item">
<label class="layui-form-label">退款原因</label>
<div class="layui-input-block">
<textarea class="layui-textarea" name="apply_note" lay-verify="required"></textarea>
<input class="layui-input" name="apply_note" lay-verify="required">
</div>
</div>
<div class="layui-form-item center">
<button class="layui-btn" lay-submit="true" lay-filter="go">申请退款</button>
<button class="layui-btn" lay-submit="true" lay-filter="go">提交申请</button>
<input type="hidden" name="order_sn" value="{{ order.sn }}">
</div>
</form>

View File

@ -11,7 +11,7 @@ class AppInfo
protected $link = 'https://koogua.com';
protected $version = '1.2.7';
protected $version = '1.2.8';
public function __get($name)
{

View File

@ -35,9 +35,7 @@ class LiveNotify extends Service
'action' => $action,
]));
if (!$this->checkSign($sign, $time)) {
return false;
}
if (!$this->checkSign($sign, $time)) return false;
$result = false;
@ -125,7 +123,7 @@ class LiveNotify extends Service
*/
protected function handleRecord()
{
return true;
}
/**
@ -133,7 +131,7 @@ class LiveNotify extends Service
*/
protected function handleSnapshot()
{
return true;
}
/**
@ -141,7 +139,7 @@ class LiveNotify extends Service
*/
protected function handlePorn()
{
return true;
}
protected function handleStreamBeginNotice(ChapterModel $chapter)
@ -153,9 +151,7 @@ class LiveNotify extends Service
$keyName = "live_notify:{$chapter->id}";
if ($cache->get($keyName)) {
return;
}
if ($cache->get($keyName)) return;
$cache->save($keyName, time(), 86400);
@ -163,9 +159,7 @@ class LiveNotify extends Service
$courseUsers = $courseUserRepo->findByCourseId($chapter->course_id);
if ($courseUsers->count() == 0) {
return;
}
if ($courseUsers->count() == 0) return;
$notice = new LiveBeginNotice();
@ -206,13 +200,9 @@ class LiveNotify extends Service
*/
protected function checkSign($sign, $time)
{
if (!$sign || !$time) {
return false;
}
if (!$sign || !$time) return false;
if ($time < time()) {
return false;
}
if ($time < time()) return false;
$notify = $this->getSettings('live.notify');

View File

@ -8,7 +8,7 @@ use App\Repos\Refund as RefundRepo;
use App\Repos\User as UserRepo;
use App\Repos\WeChatSubscribe as WeChatSubscribeRepo;
use App\Services\Logic\Notice\Sms\RefundFinish as SmsRefundFinishNotice;
use App\Services\Logic\Notice\WeChat\OrderFinish as WeChatRefundFinishNotice;
use App\Services\Logic\Notice\WeChat\RefundFinish as WeChatRefundFinishNotice;
use App\Services\Logic\Service as LogicService;
class RefundFinish extends LogicService

View File

@ -207,15 +207,15 @@ class Alipay extends PayService
/**
* 查询交易(扫码生成订单后可执行)
*
* @param string $outTradeNo
* @param string $tradeNo
* @param string $type
* @return Collection|bool
*/
public function find($outTradeNo, $type = 'wap')
public function find($tradeNo, $type = 'wap')
{
try {
$order = ['out_trade_no' => $outTradeNo];
$order = ['out_trade_no' => $tradeNo];
$result = $this->gateway->find($order, $type);
@ -235,14 +235,14 @@ class Alipay extends PayService
/**
* 关闭交易(扫码生成订单后可执行)
*
* @param string $outTradeNo
* @param string $tradeNo
* @return bool
*/
public function close($outTradeNo)
public function close($tradeNo)
{
try {
$response = $this->gateway->close(['out_trade_no' => $outTradeNo]);
$response = $this->gateway->close(['out_trade_no' => $tradeNo]);
$result = $response->code == '10000';
@ -262,14 +262,14 @@ class Alipay extends PayService
/**
* 撤销交易(未生成订单也可执行)
*
* @param string $outTradeNo
* @param string $tradeNo
* @return bool
*/
public function cancel($outTradeNo)
public function cancel($tradeNo)
{
try {
$response = $this->gateway->cancel(['out_trade_no' => $outTradeNo]);
$response = $this->gateway->cancel(['out_trade_no' => $tradeNo]);
$result = $response->code == '10000';

View File

@ -208,15 +208,15 @@ class Wxpay extends PayService
/**
* 查询交易(扫码生成订单后可执行)
*
* @param string $outTradeNo
* @param string $tradeNo
* @param string $type
* @return Collection|bool
*/
public function find($outTradeNo, $type = 'wap')
public function find($tradeNo, $type = 'wap')
{
try {
$order = ['out_trade_no' => $outTradeNo];
$order = ['out_trade_no' => $tradeNo];
$result = $this->gateway->find($order, $type);
@ -236,14 +236,14 @@ class Wxpay extends PayService
/**
* 关闭交易(扫码生成订单后可执行)
*
* @param string $outTradeNo
* @param string $tradeNo
* @return bool
*/
public function close($outTradeNo)
public function close($tradeNo)
{
try {
$response = $this->gateway->close(['out_trade_no' => $outTradeNo]);
$response = $this->gateway->close(['out_trade_no' => $tradeNo]);
$result = $response->result_code == 'SUCCESS';
@ -263,12 +263,12 @@ class Wxpay extends PayService
/**
* 取消交易
*
* @param string $outTradeNo
* @param string $tradeNo
* @return bool
*/
public function cancel($outTradeNo)
public function cancel($tradeNo)
{
return $this->close($outTradeNo);
return $this->close($tradeNo);
}
/**

View File

@ -18,6 +18,7 @@ class Refund extends Service
'item_info' => [],
'refund_amount' => 0.00,
'service_fee' => 0.00,
'service_rate' => 5.00,
];
switch ($order->item_type) {
@ -27,8 +28,14 @@ class Refund extends Service
case OrderModel::ITEM_PACKAGE:
$result = $this->previewPackageRefund($order);
break;
default:
$result = $this->previewOtherRefund($order);
case OrderModel::ITEM_REWARD:
$result = $this->previewRewardRefund($order);
break;
case OrderModel::ITEM_VIP:
$result = $this->previewVipRefund($order);
break;
case OrderModel::ITEM_TEST:
$result = $this->previewTestRefund($order);
break;
}
@ -42,6 +49,7 @@ class Refund extends Service
$itemInfo['course']['cover'] = kg_cos_cover_url($itemInfo['course']['cover']);
$serviceFee = $this->getServiceFee($order);
$serviceRate = $this->getServiceRate($order);
$refundPercent = 0.00;
$refundAmount = 0.00;
@ -59,6 +67,7 @@ class Refund extends Service
'item_info' => $itemInfo,
'refund_amount' => $refundAmount,
'service_fee' => $serviceFee,
'service_rate' => $serviceRate,
];
}
@ -67,6 +76,7 @@ class Refund extends Service
$itemInfo = $order->item_info;
$serviceFee = $this->getServiceFee($order);
$serviceRate = $this->getServiceRate($order);
$totalMarketPrice = 0.00;
@ -102,24 +112,51 @@ class Refund extends Service
'item_info' => $itemInfo,
'refund_amount' => $totalRefundAmount,
'service_fee' => $serviceFee,
'service_rate' => $serviceRate,
];
}
protected function previewRewardRefund(OrderModel $order)
{
return $this->previewOtherRefund($order);
}
protected function previewVipRefund(OrderModel $order)
{
return $this->previewOtherRefund($order);
}
protected function previewTestRefund(OrderModel $order)
{
return $this->previewOtherRefund($order);
}
protected function previewOtherRefund(OrderModel $order)
{
$serviceFee = $this->getServiceFee($order);
$serviceRate = $this->getServiceRate($order);
$refundAmount = round($order->amount - $serviceFee, 2);
return [
'item_type' => $order->item_type,
'item_info' => [],
'item_info' => $order->item_info,
'refund_amount' => $refundAmount,
'service_fee' => $serviceFee,
'service_rate' => $serviceRate,
];
}
protected function getServiceFee(OrderModel $order)
{
$serviceRate = $this->getServiceRate($order);
$serviceFee = round($order->amount * $serviceRate / 100, 2);
return $serviceFee >= 0.01 ? $serviceFee : 0.00;
}
protected function getServiceRate(OrderModel $order)
{
$orderRepo = new OrderRepo();
@ -139,7 +176,7 @@ class Refund extends Service
break;
}
return round($order->amount * $serviceRate / 100, 2);
return $serviceRate;
}
protected function getCourseRefundPercent($courseId, $userId)

View File

@ -42,9 +42,15 @@ class Refund extends Validator
public function checkAmount($orderAmount, $refundAmount)
{
if ($orderAmount <= 0 || $refundAmount <= 0) {
throw new BadRequestException('refund.invalid_amount');
}
if ($refundAmount > $orderAmount) {
throw new BadRequestException('refund.invalid_amount');
}
return (float)$refundAmount;
}
public function checkStatus($status)

View File

@ -289,6 +289,7 @@ $error['refund.review_note_too_short'] = '审核备注太短少于2个字符
$error['refund.review_note_too_long'] = '审核备注太长多于255个字符';
$error['refund.cancel_not_allowed'] = '当前不允许取消退款';
$error['refund.review_not_allowed'] = '当前不允许审核退款';
$error['refund.invalid_amount'] = '无效的退款金额';
$error['refund.invalid_status'] = '无效的状态类型';
/**

View File

@ -34,6 +34,18 @@
list-style: decimal;
}
.red {
color: red;
}
.green {
color: green;
}
.gray {
color: gray;
}
.loading {
padding: 30px;
text-align: center;

View File

@ -1688,17 +1688,14 @@
}
.order-card {
padding: 10px 0;
padding-bottom: 20px;
margin-bottom: 20px;
background-color: white;
border-bottom: 1px dashed #e6e6e6;
color: #666;
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
}
.order-card .header {
padding-bottom: 10px;
margin-bottom: 10px;
border-bottom: 1px solid #e6e6e6;
}
.order-card .header span {

View File

@ -13,9 +13,6 @@ $bin = '/usr/local/bin/php';
$scheduler->php($script, $bin, ['--task' => 'deliver', '--action' => 'main'])
->at('*/3 * * * *');
$scheduler->php($script, $bin, ['--task' => 'notice', '--action' => 'main'])
->at('*/3 * * * *');
$scheduler->php($script, $bin, ['--task' => 'vod_event', '--action' => 'main'])
->at('*/5 * * * *');
@ -34,6 +31,9 @@ $scheduler->php($script, $bin, ['--task' => 'server_monitor', '--action' => 'mai
$scheduler->php($script, $bin, ['--task' => 'close_trade', '--action' => 'main'])
->at('*/13 * * * *');
$scheduler->php($script, $bin, ['--task' => 'notice', '--action' => 'main'])
->everyMinute();
$scheduler->php($script, $bin, ['--task' => 'close_order', '--action' => 'main'])
->hourly(3);