mirror of
https://gitee.com/koogua/course-tencent-cloud.git
synced 2025-06-27 21:10:24 +08:00
完成订单详情,退款确认
This commit is contained in:
parent
b6f9a08fee
commit
9cd1466f06
@ -16,7 +16,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td>{{ item_info(order) }}</td>
|
<td>{{ item_info(order) }}</td>
|
||||||
<td>¥{{ order.amount }}</td>
|
<td>¥{{ order.amount }}</td>
|
||||||
<td>{{ item_type(order.item_type) }}</span></td>
|
<td>{{ item_type(order.item_type) }}</td>
|
||||||
<td>{{ order_status(order.status) }}</td>
|
<td>{{ order_status(order.status) }}</td>
|
||||||
<td>{{ date('Y-m-d H:i:s',order.create_time) }}</td>
|
<td>{{ date('Y-m-d H:i:s',order.create_time) }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
{% if captcha.enabled == 1 %}
|
{% if captcha.enabled == 1 %}
|
||||||
<div id="captcha-block" class="layui-form-item">
|
<div id="captcha-block" class="layui-form-item">
|
||||||
<div class="layui-input-block">
|
<div class="layui-input-block">
|
||||||
<button id="captcha-btn" class="layui-btn layui-btn-primary layui-btn-fluid" type="button" data-app-id="{{ captcha.app_id }}">点击完成验证</button>
|
<button id="captcha-btn" class="layui-btn layui-btn-fluid" type="button" data-app-id="{{ captcha.app_id }}">点击完成验证</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -14,6 +14,20 @@ use App\Services\Frontend\Order\OrderInfo as OrderInfoService;
|
|||||||
class OrderController extends Controller
|
class OrderController extends Controller
|
||||||
{
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Get("/info", name="web.order.info")
|
||||||
|
*/
|
||||||
|
public function infoAction()
|
||||||
|
{
|
||||||
|
$sn = $this->request->getQuery('sn');
|
||||||
|
|
||||||
|
$service = new OrderInfoService();
|
||||||
|
|
||||||
|
$order = $service->handle($sn);
|
||||||
|
|
||||||
|
$this->view->setVar('order', $order);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Get("/confirm", name="web.order.confirm")
|
* @Get("/confirm", name="web.order.confirm")
|
||||||
*/
|
*/
|
||||||
@ -61,20 +75,6 @@ class OrderController extends Controller
|
|||||||
$this->view->setVar('order', $order);
|
$this->view->setVar('order', $order);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @Get("/info", name="web.order.info")
|
|
||||||
*/
|
|
||||||
public function infoAction()
|
|
||||||
{
|
|
||||||
$sn = $this->request->getQuery('sn');
|
|
||||||
|
|
||||||
$service = new OrderInfoService();
|
|
||||||
|
|
||||||
$order = $service->handle($sn);
|
|
||||||
|
|
||||||
return $this->jsonSuccess(['order' => $order]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Post("/cancel", name="web.order.cancel")
|
* @Post("/cancel", name="web.order.cancel")
|
||||||
*/
|
*/
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace App\Http\Web\Controllers;
|
namespace App\Http\Web\Controllers;
|
||||||
|
|
||||||
|
use App\Services\Frontend\Order\OrderInfo as OrderInfoService;
|
||||||
use App\Services\Frontend\Refund\RefundCancel as RefundCancelService;
|
use App\Services\Frontend\Refund\RefundCancel as RefundCancelService;
|
||||||
use App\Services\Frontend\Refund\RefundConfirm as RefundConfirmService;
|
use App\Services\Frontend\Refund\RefundConfirm as RefundConfirmService;
|
||||||
use App\Services\Frontend\Refund\RefundCreate as RefundCreateService;
|
use App\Services\Frontend\Refund\RefundCreate as RefundCreateService;
|
||||||
@ -18,15 +19,18 @@ class RefundController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function confirmAction()
|
public function confirmAction()
|
||||||
{
|
{
|
||||||
$sn = $this->request->getQuery('order_sn');
|
$sn = $this->request->getQuery('sn');
|
||||||
|
|
||||||
|
$service = new OrderInfoService();
|
||||||
|
|
||||||
|
$order = $service->handle($sn);
|
||||||
|
|
||||||
$service = new RefundConfirmService();
|
$service = new RefundConfirmService();
|
||||||
|
|
||||||
$confirmInfo = $service->handle($sn);
|
$confirm = $service->handle($sn);
|
||||||
|
|
||||||
return $this->jsonSuccess(['confirm_info' => $confirmInfo]);
|
$this->view->setVar('order', $order);
|
||||||
|
$this->view->setVar('confirm', $confirm);
|
||||||
$this->view->setVar('confirm_info', $confirmInfo);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div id="captcha-block" class="layui-form-item">
|
<div id="captcha-block" class="layui-form-item">
|
||||||
<div class="layui-input-block">
|
<div class="layui-input-block">
|
||||||
<button id="captcha-btn" class="layui-btn layui-btn-primary layui-btn-fluid" type="button" data-app-id="{{ captcha.app_id }}">点击完成验证</button>
|
<button id="captcha-btn" class="layui-btn layui-btn-fluid" type="button" data-app-id="{{ captcha.app_id }}">点击完成验证</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-form-item">
|
<div class="layui-form-item">
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
<input class="layui-input" type="text" name="verify_code" placeholder="验证码" lay-verify="required">
|
<input class="layui-input" type="text" name="verify_code" placeholder="验证码" lay-verify="required">
|
||||||
</div>
|
</div>
|
||||||
<div class="verify-btn-inline">
|
<div class="verify-btn-inline">
|
||||||
<button id="cv-verify-emit" class="layui-btn layui-btn-primary layui-btn-disabled" type="button" disabled="disabled">获取验证码</button>
|
<button id="cv-verify-emit" class="layui-btn layui-btn-disabled" type="button" disabled="disabled">获取验证码</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-form-item">
|
<div class="layui-form-item">
|
||||||
|
@ -16,12 +16,12 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
<p>
|
<p>
|
||||||
{% if course.market_price > 0 %}
|
{% if course.market_price > 0 %}
|
||||||
市场价格 <span class="price">¥{{ course.market_price }}</span>
|
市场价格 <span class="price">{{ '¥%0.2f'|format(course.market_price) }}</span>
|
||||||
{% else %}
|
{% else %}
|
||||||
市场价格 <span class="free">免费</span>
|
市场价格 <span class="free">免费</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if course.vip_price > 0 %}
|
{% if course.vip_price > 0 %}
|
||||||
会员价格 <span class="price">¥{{ course.vip_price }}</span>
|
会员价格 <span class="price">{{ '¥%0.2f'|format(course.vip_price) }}</span>
|
||||||
{% else %}
|
{% else %}
|
||||||
会员价格 <span class="free">免费</span>
|
会员价格 <span class="free">免费</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -6,11 +6,13 @@
|
|||||||
<div class="title">{{ package.title }}</div>
|
<div class="title">{{ package.title }}</div>
|
||||||
<div class="origin-price">
|
<div class="origin-price">
|
||||||
<span>{{ package.course_count }} 门课程</span>
|
<span>{{ package.course_count }} 门课程</span>
|
||||||
<span>总价 <i>¥{{ package.origin_price }}</i></span>
|
<span>总价 <i>{{ '¥%0.2f'|format(package.origin_price) }}</i></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="price">
|
<div class="price">
|
||||||
<span>市场价 <i>¥{{ package.market_price }}</i></span>
|
<span>市场价 <i>{{ '¥%0.2f'|format(package.market_price) }}</i></span>
|
||||||
<span>会员价 <i>¥{{ package.vip_price }}</i></span>
|
</div>
|
||||||
|
<div class="price">
|
||||||
|
<span>会员价 <i>{{ '¥%0.2f'|format(package.vip_price) }}</i></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="order">
|
<div class="order">
|
||||||
<a class="layui-btn layui-btn-sm layui-bg-red" href="{{ order_url }}">立即购买</a>
|
<a class="layui-btn layui-btn-sm layui-bg-red" href="{{ order_url }}">立即购买</a>
|
||||||
|
@ -14,14 +14,14 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="order-filter">
|
<div class="order-filter">
|
||||||
{% set status = request.get('status','trim','all') %}
|
{% set status = request.get('status','trim','all') %}
|
||||||
{% for key,val in status_types %}
|
{% for key,value in status_types %}
|
||||||
{% set class = (status == key) ? 'layui-btn layui-btn-sm' : 'none' %}
|
{% set class = (status == key) ? 'layui-btn layui-btn-sm' : 'none' %}
|
||||||
{% set url = (key == 'all') ? url({'for':'web.my.orders'}) : url({'for':'web.my.orders'},{'status':key}) %}
|
{% set url = (key == 'all') ? url({'for':'web.my.orders'}) : url({'for':'web.my.orders'},{'status':key}) %}
|
||||||
<a class="{{ class }}" href="{{ url }}">{{ val }}</a>
|
<a class="{{ class }}" href="{{ url }}">{{ value }}</a>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
{% if pager.total_pages > 0 %}
|
{% if pager.total_pages > 0 %}
|
||||||
<table class="layui-table kg-table" lay-size="lg" lay-skin="nob">
|
<table class="layui-table order-table kg-table" lay-size="lg" lay-skin="nob">
|
||||||
<colgroup>
|
<colgroup>
|
||||||
<col>
|
<col>
|
||||||
<col>
|
<col>
|
||||||
@ -30,31 +30,34 @@
|
|||||||
</colgroup>
|
</colgroup>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>信息</th>
|
<th>基本信息</th>
|
||||||
<th>金额</th>
|
<th>订单金额</th>
|
||||||
<th>时间</th>
|
<th>创建时间</th>
|
||||||
<th>状态</th>
|
<th>订单状态</th>
|
||||||
<th>操作</th>
|
<th>操作</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for item in pager.items %}
|
{% for item in pager.items %}
|
||||||
|
{% set info_url = url({'for':'web.order.info'},{'sn':item.sn}) %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<p>名称:{{ item.subject }}</p>
|
<p>名称:{{ item.subject }}</p>
|
||||||
<p>单号:{{ item.sn }}</p>
|
<p>单号:{{ item.sn }}</p>
|
||||||
</td>
|
</td>
|
||||||
<td>¥{{ item.amount }}</td>
|
<td><span class="price">{{ '¥%0.2f'|format(item.amount) }}</span></td>
|
||||||
<td>{{ date('Y-m-d H:i',item.create_time) }}</td>
|
<td>{{ date('Y-m-d H:i:s',item.create_time) }}</td>
|
||||||
<td>{{ order_status(item.status) }}</td>
|
<td>{{ order_status(item.status) }}</td>
|
||||||
<td align="center">
|
<td align="center">
|
||||||
<a class="btn-view layui-btn layui-btn-xs" data-url="">详情</a>
|
<a class="layui-btn layui-btn-sm" href="{{ info_url }}">订单详情</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
{{ partial('partials/pager') }}
|
{{ partial('partials/pager') }}
|
||||||
|
{% else %}
|
||||||
|
<div class="search-empty">未发现相关记录</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
45
app/Http/Web/Views/order/info.volt
Normal file
45
app/Http/Web/Views/order/info.volt
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
{% extends 'templates/full.volt' %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
{{ partial('partials/macro_order') }}
|
||||||
|
|
||||||
|
<div class="layui-breadcrumb breadcrumb">
|
||||||
|
<a href="/">首页</a>
|
||||||
|
<a href="{{ url({'for':'web.my.orders'}) }}">我的订单</a>
|
||||||
|
<a><cite>订单详情</cite></a>
|
||||||
|
<a><cite>{{ order.subject }}</cite></a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<table class="layui-table kg-table order-table" lay-size="lg">
|
||||||
|
<tr>
|
||||||
|
<td colspan="6">订单编号:{{ order.sn }}</td>
|
||||||
|
<tr>
|
||||||
|
<tr>
|
||||||
|
<td>基本信息</td>
|
||||||
|
<td>订单金额</td>
|
||||||
|
<td>订单类型</td>
|
||||||
|
<td>订单状态</td>
|
||||||
|
<td>流转时间</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{ item_info(order) }}</td>
|
||||||
|
<td><span class="price">{{ '¥%0.2f'|format(order.amount) }}</span></td>
|
||||||
|
<td>{{ item_type(order.item_type) }}</td>
|
||||||
|
<td>{{ order_status(order.status) }}</td>
|
||||||
|
<td>{{ history_info(order.history) }}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<br>
|
||||||
|
<div class="text-center">
|
||||||
|
<a href="javascript:" class="kg-back layui-btn layui-bg-gray">返回上页</a>
|
||||||
|
{% if (order.item_type in ['course','package']) and (order.status == 'finished') %}
|
||||||
|
{% set confirm_url = url({'for':'web.refund.confirm'},{'sn':order.sn}) %}
|
||||||
|
<a href="{{ confirm_url }}" class="layui-btn layui-bg-blue">申请退款</a>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endblock %}
|
@ -30,10 +30,10 @@
|
|||||||
<div class="layui-hide">
|
<div class="layui-hide">
|
||||||
<input type="hidden" name="trade_create_url" value="{{ url({'for':'web.trade.create'}) }}">
|
<input type="hidden" name="trade_create_url" value="{{ url({'for':'web.trade.create'}) }}">
|
||||||
<input type="hidden" name="trade_status_url" value="{{ url({'for':'web.trade.status'}) }}">
|
<input type="hidden" name="trade_status_url" value="{{ url({'for':'web.trade.status'}) }}">
|
||||||
<input type="hidden" name="forward_url" value="{{ url({'for':'web.course.list'}) }}">
|
<input type="hidden" name="forward_url" value="{{ url({'for':'web.my.orders'}) }}">
|
||||||
<input type="hidden" name="order_sn" value="{{ order.sn }}">
|
<input type="hidden" name="order_sn" value="{{ order.sn }}">
|
||||||
<input type="hidden" name="alipay_trade_sn" value="">
|
<input type="hidden" name="alipay_trade_sn">
|
||||||
<input type="hidden" name="wxpay_trade_sn" value="">
|
<input type="hidden" name="wxpay_trade_sn">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -33,16 +33,16 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="meta">
|
<div class="meta">
|
||||||
{% if course.market_price > course.vip_price %}
|
{% if course.market_price > course.vip_price %}
|
||||||
<span>¥{{ course.market_price }}</span>
|
<span>{{ '¥%0.2f'|format(course.market_price) }}</span>
|
||||||
{% if course.vip_price > 0 %}
|
{% if course.vip_price > 0 %}
|
||||||
<span class="price">会员¥{{ course.vip_price }}</span>
|
<span class="price">{{ '会员¥%0.2f'|format(course.vip_price) }}</span>
|
||||||
{% else %}
|
{% else %}
|
||||||
<span class="free">会员免费</span>
|
<span class="free">会员免费</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<span class="level">{{ level_info(course.level) }}</span>
|
<span class="level">{{ level_info(course.level) }}</span>
|
||||||
<span class="user">{{ course.user_count }}人购买</span>
|
<span class="user">{{ course.user_count }}人购买</span>
|
||||||
{% elseif course.market_price > 0 %}
|
{% elseif course.market_price > 0 %}
|
||||||
<span class="price">¥{{ course.market_price }}</span>
|
<span class="price">{{ '¥%0.2f'|format(course.market_price) }}</span>
|
||||||
<span class="level">{{ level_info(course.level) }}</span>
|
<span class="level">{{ level_info(course.level) }}</span>
|
||||||
<span class="lesson">{{ course.lesson_count }}节课</span>
|
<span class="lesson">{{ course.lesson_count }}节课</span>
|
||||||
<span class="user">{{ course.user_count }}人购买</span>
|
<span class="user">{{ course.user_count }}人购买</span>
|
||||||
@ -68,7 +68,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="meta">
|
<div class="meta">
|
||||||
{% if course.market_price > 0 %}
|
{% if course.market_price > 0 %}
|
||||||
<span class="price">¥{{ course.market_price }}</span>
|
<span class="price">{{ '¥%0.2f'|format(course.market_price) }}</span>
|
||||||
<span class="level">{{ level_info(course.level) }}</span>
|
<span class="level">{{ level_info(course.level) }}</span>
|
||||||
<span class="user">{{ course.user_count }}人购买</span>
|
<span class="user">{{ course.user_count }}人购买</span>
|
||||||
{% else %}
|
{% else %}
|
||||||
|
@ -1,11 +1,80 @@
|
|||||||
{%- macro order_status(value) %}
|
{%- macro item_info(order) %}
|
||||||
{% if value == 'pending' %}
|
{% if order.item_type == 'course' %}
|
||||||
<span class="layui-badge layui-bg-blue">待支付</span>
|
{% set course = order.item_info.course %}
|
||||||
{% elseif value == 'finished' %}
|
{% set course_url = url({'for':'web.course.show','id':course.id}) %}
|
||||||
<span class="layui-badge layui-bg-green">已完成</span>
|
<div class="order-item">
|
||||||
{% elseif value == 'closed' %}
|
<p>课程名称:<a href="{{ course_url }}" target="_blank">{{ course.title }}</a></p>
|
||||||
<span class="layui-badge layui-bg-cyan">已关闭</span>
|
<p>市场价格:<span class="price">{{ '¥%0.2f'|format(course.market_price) }}</span>会员价格:<span class="price">{{ '¥%0.2f'|format(course.vip_price) }}</span></p>
|
||||||
{% elseif value == 'refunded' %}
|
<p>学习期限:{{ date('Y-m-d H:i:s',course.study_expiry_time) }}<span class="space"></span>退款期限:{{ date('Y-m-d H:i:s',course.refund_expiry_time) }}</p>
|
||||||
<span class="layui-badge layui-bg-red">已退款</span>
|
</div>
|
||||||
|
{% elseif order.item_type == 'package' %}
|
||||||
|
{% set courses = order.item_info.courses %}
|
||||||
|
{% for course in courses %}
|
||||||
|
{% set course_url = url({'for':'web.course.show','id':course.id}) %}
|
||||||
|
<div class="order-item">
|
||||||
|
<p>课程名称:<a href="{{ course_url }}" target="_blank">{{ course.title }}</a></p>
|
||||||
|
<p>市场价格:<span class="price">{{ '¥%0.2f'|format(course.market_price) }}</span>会员价格:<span class="price">{{ '¥%0.2f'|format(course.vip_price) }}</span></p>
|
||||||
|
<p>学习期限:{{ date('Y-m-d H:i:s',course.study_expiry_time) }}<span class="space"></span>退款期限:{{ date('Y-m-d H:i:s',course.refund_expiry_time) }}</p>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
{% elseif order.item_type == 'vip' %}
|
||||||
|
{% set vip = order.item_info.vip %}
|
||||||
|
<div class="order-item">
|
||||||
|
<p>商品名称:{{ order.subject }}</p>
|
||||||
|
<p>商品价格:<span class="price">{{ '¥%0.2f'|format(order.amount) }}</span></p>
|
||||||
|
</div>
|
||||||
|
{% elseif order.item_type == 'reward' %}
|
||||||
|
{% set course = order.item_info.course %}
|
||||||
|
{% set reward = order.item_info.reward %}
|
||||||
|
{% set course_url = url({'for':'web.course.show','id':course.id}) %}
|
||||||
|
<div class="order-item">
|
||||||
|
<p>课程名称:<a href="{{ course_url }}" target="_blank">{{ course.title }}</a></p>
|
||||||
|
<p>赞赏金额:<span class="price">{{ '¥%0.2f'|format(reward.price) }}</span></p>
|
||||||
|
</div>
|
||||||
|
{% elseif order.item_type == 'test' %}
|
||||||
|
<div class="order-item">
|
||||||
|
<p>商品名称:{{ order.subject }}</p>
|
||||||
|
<p>商品价格:<span class="price">{{ '¥%0.2f'|format(order.amount) }}</span></p>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{%- endmacro %}
|
||||||
|
|
||||||
|
{%- macro history_info(items) %}
|
||||||
|
{% for item in items %}
|
||||||
|
{% if item.status == 'pending' %}
|
||||||
|
<p>创建时间:{{ date('Y-m-d H:i:s',item.create_time) }}</p>
|
||||||
|
{% elseif item.status == 'finished' %}
|
||||||
|
<p>完成时间:{{ date('Y-m-d H:i:s',item.create_time) }}</p>
|
||||||
|
{% elseif item.status == 'closed' %}
|
||||||
|
<p>关闭时间:{{ date('Y-m-d H:i:s',item.create_time) }}</p>
|
||||||
|
{% elseif item.status == 'refunded' %}
|
||||||
|
<p>退款时间:{{ date('Y-m-d H:i:s',item.create_time) }}</p>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{%- endmacro %}
|
||||||
|
|
||||||
|
{%- macro item_type(value) %}
|
||||||
|
{% if value == 'course' %}
|
||||||
|
课程
|
||||||
|
{% elseif value == 'package' %}
|
||||||
|
套餐
|
||||||
|
{% elseif value == 'vip' %}
|
||||||
|
会员
|
||||||
|
{% elseif value == 'reward' %}
|
||||||
|
赞赏
|
||||||
|
{% elseif value == 'test' %}
|
||||||
|
测试
|
||||||
|
{% endif %}
|
||||||
|
{%- endmacro %}
|
||||||
|
|
||||||
|
{%- macro order_status(value) %}
|
||||||
|
{% if value == 'pending' %}
|
||||||
|
待支付
|
||||||
|
{% elseif value == 'finished' %}
|
||||||
|
已完成
|
||||||
|
{% elseif value == 'closed' %}
|
||||||
|
已关闭
|
||||||
|
{% elseif value == 'refunded' %}
|
||||||
|
已退款
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{%- endmacro %}
|
{%- endmacro %}
|
||||||
|
58
app/Http/Web/Views/refund/confirm.volt
Normal file
58
app/Http/Web/Views/refund/confirm.volt
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
{% extends 'templates/full.volt' %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
{%- macro item_info(confirm) %}
|
||||||
|
{% if confirm.item_type == 'course' %}
|
||||||
|
{% set course = confirm.item_info.course %}
|
||||||
|
{% set course_url = url({'for':'web.course.show','id':course.id}) %}
|
||||||
|
<div class="order-item">
|
||||||
|
<p>课程名称:<a href="{{ course_url }}" target="_blank">{{ course.title }}</a></p>
|
||||||
|
<p>退款期限:{{ date('Y-m-d H:i:s',course.refund_expiry_time) }}</p>
|
||||||
|
<p>退款金额:<span class="price">{{ '¥%0.2f'|format(course.refund_amount) }}</span>退款比例:{{ 100 * course.refund_percent }}%</p>
|
||||||
|
</div>
|
||||||
|
{% elseif confirm.item_type == 'package' %}
|
||||||
|
{% set courses = confirm.item_info.courses %}
|
||||||
|
{% for course in courses %}
|
||||||
|
{% set course_url = url({'for':'web.course.show','id':course.id}) %}
|
||||||
|
<div class="order-item">
|
||||||
|
<p>课程名称:<a href="{{ course_url }}" target="_blank">{{ course.title }}</a></p>
|
||||||
|
<p>退款期限:{{ date('Y-m-d H:i:s',course.refund_expiry_time) }}</p>
|
||||||
|
<p>退款金额:<span>{{ '¥%0.2f'|format(course.refund_amount) }}</span>退款比例:{{ 100 * course.refund_percent }}%</p>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
{%- endmacro %}
|
||||||
|
|
||||||
|
<div class="layui-breadcrumb breadcrumb">
|
||||||
|
<a href="/">首页</a>
|
||||||
|
<a href="{{ url({'for':'web.my.orders'}) }}">我的订单</a>
|
||||||
|
<a><cite>确认退款</cite></a>
|
||||||
|
<a><cite>{{ order.subject }}</cite></a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<table class="layui-table kg-table order-table" lay-size="lg">
|
||||||
|
<tr>
|
||||||
|
<td colspan="6">订单编号:{{ order.sn }}</td>
|
||||||
|
<tr>
|
||||||
|
<tr>
|
||||||
|
<td>基本信息</td>
|
||||||
|
<td>订单金额</td>
|
||||||
|
<td>退款金额</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{ item_info(confirm) }}</td>
|
||||||
|
<td><span class="price">{{ '¥%0.2f'|format(order.amount) }}</span></td>
|
||||||
|
<td><span class="price">{{ '¥%0.2f'|format(confirm.refund_amount) }}</span></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<br>
|
||||||
|
<div class="text-center">
|
||||||
|
<a href="javascript:" class="kg-back layui-btn layui-bg-gray">返回上页</a>
|
||||||
|
<a href="javascript:" class="layui-btn layui-bg-blue">提交申请</a>
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endblock %}
|
@ -4,6 +4,7 @@ namespace App\Repos;
|
|||||||
|
|
||||||
use App\Library\Paginator\Adapter\QueryBuilder as PagerQueryBuilder;
|
use App\Library\Paginator\Adapter\QueryBuilder as PagerQueryBuilder;
|
||||||
use App\Models\Order as OrderModel;
|
use App\Models\Order as OrderModel;
|
||||||
|
use App\Models\OrderStatus as OrderStatusModel;
|
||||||
use App\Models\Refund as RefundModel;
|
use App\Models\Refund as RefundModel;
|
||||||
use App\Models\Trade as TradeModel;
|
use App\Models\Trade as TradeModel;
|
||||||
use Phalcon\Mvc\Model;
|
use Phalcon\Mvc\Model;
|
||||||
@ -45,6 +46,10 @@ class Order extends Repository
|
|||||||
$builder->andWhere('status = :status:', ['status' => $where['status']]);
|
$builder->andWhere('status = :status:', ['status' => $where['status']]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isset($where['deleted'])) {
|
||||||
|
$builder->andWhere('deleted = :deleted:', ['deleted' => $where['deleted']]);
|
||||||
|
}
|
||||||
|
|
||||||
if (!empty($where['start_time']) && !empty($where['end_time'])) {
|
if (!empty($where['start_time']) && !empty($where['end_time'])) {
|
||||||
$startTime = strtotime($where['start_time']);
|
$startTime = strtotime($where['start_time']);
|
||||||
$endTime = strtotime($where['end_time']);
|
$endTime = strtotime($where['end_time']);
|
||||||
@ -160,4 +165,15 @@ class Order extends Repository
|
|||||||
->execute();
|
->execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $orderId
|
||||||
|
* @return ResultsetInterface|Resultset|OrderStatusModel[]
|
||||||
|
*/
|
||||||
|
public function findHistory($orderId)
|
||||||
|
{
|
||||||
|
return OrderStatusModel::query()
|
||||||
|
->where('order_id = :order_id:', ['order_id' => $orderId])
|
||||||
|
->execute();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -54,7 +54,7 @@ class OrderList extends FrontendService
|
|||||||
$items[] = [
|
$items[] = [
|
||||||
'sn' => $order['sn'],
|
'sn' => $order['sn'],
|
||||||
'subject' => $order['subject'],
|
'subject' => $order['subject'],
|
||||||
'amount' => $order['amount'],
|
'amount' => (float)$order['amount'],
|
||||||
'status' => $order['status'],
|
'status' => $order['status'],
|
||||||
'item_id' => $order['item_id'],
|
'item_id' => $order['item_id'],
|
||||||
'item_type' => $order['item_type'],
|
'item_type' => $order['item_type'],
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
namespace App\Services\Frontend\Order;
|
namespace App\Services\Frontend\Order;
|
||||||
|
|
||||||
use App\Models\Order as OrderModel;
|
use App\Models\Order as OrderModel;
|
||||||
|
use App\Repos\Order as OrderRepo;
|
||||||
use App\Services\Frontend\Service as FrontendService;
|
use App\Services\Frontend\Service as FrontendService;
|
||||||
use App\Validators\Order as OrderValidator;
|
use App\Validators\Order as OrderValidator;
|
||||||
|
|
||||||
@ -22,6 +23,8 @@ class OrderInfo extends FrontendService
|
|||||||
{
|
{
|
||||||
$order->item_info = $this->handleItemInfo($order);
|
$order->item_info = $this->handleItemInfo($order);
|
||||||
|
|
||||||
|
$history = $this->handleHistory($order);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'sn' => $order->sn,
|
'sn' => $order->sn,
|
||||||
'subject' => $order->subject,
|
'subject' => $order->subject,
|
||||||
@ -30,10 +33,32 @@ class OrderInfo extends FrontendService
|
|||||||
'item_id' => $order->item_id,
|
'item_id' => $order->item_id,
|
||||||
'item_type' => $order->item_type,
|
'item_type' => $order->item_type,
|
||||||
'item_info' => $order->item_info,
|
'item_info' => $order->item_info,
|
||||||
'create_time' => $order->create_time,
|
'history' => $history,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function handleHistory(OrderModel $order)
|
||||||
|
{
|
||||||
|
$orderRepo = new OrderRepo();
|
||||||
|
|
||||||
|
$records = $orderRepo->findHistory($order->id);
|
||||||
|
|
||||||
|
if ($records->count() == 0) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = [];
|
||||||
|
|
||||||
|
foreach ($records as $record) {
|
||||||
|
$result[] = [
|
||||||
|
'status' => $record->status,
|
||||||
|
'create_time' => $record->create_time,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
protected function handleItemInfo(OrderModel $order)
|
protected function handleItemInfo(OrderModel $order)
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
@ -22,6 +22,41 @@
|
|||||||
float: right;
|
float: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.text-center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.breadcrumb {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
padding: 20px;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
background-color: #fff;
|
||||||
|
border-radius: 2px;
|
||||||
|
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
.layer-container {
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pager {
|
||||||
|
margin-top: 25px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.layout-content {
|
||||||
|
float: left;
|
||||||
|
width: 800px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.layout-sidebar {
|
||||||
|
float: right;
|
||||||
|
width: 320px;
|
||||||
|
}
|
||||||
|
|
||||||
.layui-badge, .layui-badge-rim {
|
.layui-badge, .layui-badge-rim {
|
||||||
padding-bottom: 1px;
|
padding-bottom: 1px;
|
||||||
}
|
}
|
||||||
@ -88,33 +123,6 @@
|
|||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.breadcrumb {
|
|
||||||
margin-bottom: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.container {
|
|
||||||
padding: 20px;
|
|
||||||
margin-bottom: 15px;
|
|
||||||
background-color: #fff;
|
|
||||||
border-radius: 2px;
|
|
||||||
box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
|
|
||||||
}
|
|
||||||
|
|
||||||
.pager {
|
|
||||||
margin-top: 25px;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.layout-content {
|
|
||||||
float: left;
|
|
||||||
width: 800px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.layout-sidebar {
|
|
||||||
float: right;
|
|
||||||
width: 320px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.layout-sidebar .loading {
|
.layout-sidebar .loading {
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
@ -463,14 +471,13 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.package-info .origin-price i {
|
.package-info .origin-price i {
|
||||||
color: red;
|
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
text-decoration: line-through;
|
text-decoration: line-through;
|
||||||
}
|
}
|
||||||
|
|
||||||
.package-info .price {
|
.package-info .price {
|
||||||
color: #666;
|
color: #666;
|
||||||
margin-bottom: 15px;
|
margin-bottom: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.package-info .price i {
|
.package-info .price i {
|
||||||
@ -1103,3 +1110,23 @@
|
|||||||
.kg-table p {
|
.kg-table p {
|
||||||
line-height: 1.8em;
|
line-height: 1.8em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.order-table .price {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-item {
|
||||||
|
padding-bottom: 10px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
border-bottom: 1px solid #e6e6e6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-item:last-child {
|
||||||
|
padding-bottom: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.order-item span {
|
||||||
|
margin-right: 8px;
|
||||||
|
}
|
@ -75,6 +75,10 @@ $('.kg-delete').on('click', function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$('.kg-back').on('click', function () {
|
||||||
|
window.history.back();
|
||||||
|
});
|
||||||
|
|
||||||
$('body').on('click', '.layui-laypage > a', function () {
|
$('body').on('click', '.layui-laypage > a', function () {
|
||||||
var url = $(this).attr('data-url');
|
var url = $(this).attr('data-url');
|
||||||
var target = $(this).attr('data-target');
|
var target = $(this).attr('data-target');
|
||||||
|
Loading…
x
Reference in New Issue
Block a user