diff --git a/app/Http/Admin/Views/order/order_info.volt b/app/Http/Admin/Views/order/order_info.volt index fdbe8206..e378ced1 100644 --- a/app/Http/Admin/Views/order/order_info.volt +++ b/app/Http/Admin/Views/order/order_info.volt @@ -16,7 +16,7 @@ {{ item_info(order) }} ¥{{ order.amount }} - {{ item_type(order.item_type) }} + {{ item_type(order.item_type) }} {{ order_status(order.status) }} {{ date('Y-m-d H:i:s',order.create_time) }} diff --git a/app/Http/Admin/Views/public/login.volt b/app/Http/Admin/Views/public/login.volt index 862e7022..cb0c6693 100644 --- a/app/Http/Admin/Views/public/login.volt +++ b/app/Http/Admin/Views/public/login.volt @@ -15,7 +15,7 @@ {% if captcha.enabled == 1 %}
- +
{% endif %} diff --git a/app/Http/Web/Controllers/OrderController.php b/app/Http/Web/Controllers/OrderController.php index 6d43910e..0614bcb9 100644 --- a/app/Http/Web/Controllers/OrderController.php +++ b/app/Http/Web/Controllers/OrderController.php @@ -14,6 +14,20 @@ use App\Services\Frontend\Order\OrderInfo as OrderInfoService; 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") */ @@ -61,20 +75,6 @@ class OrderController extends Controller $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") */ diff --git a/app/Http/Web/Controllers/RefundController.php b/app/Http/Web/Controllers/RefundController.php index 6026fb2e..3f78f2c5 100644 --- a/app/Http/Web/Controllers/RefundController.php +++ b/app/Http/Web/Controllers/RefundController.php @@ -2,6 +2,7 @@ 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\RefundConfirm as RefundConfirmService; use App\Services\Frontend\Refund\RefundCreate as RefundCreateService; @@ -18,15 +19,18 @@ class RefundController extends Controller */ public function confirmAction() { - $sn = $this->request->getQuery('order_sn'); + $sn = $this->request->getQuery('sn'); + + $service = new OrderInfoService(); + + $order = $service->handle($sn); $service = new RefundConfirmService(); - $confirmInfo = $service->handle($sn); + $confirm = $service->handle($sn); - return $this->jsonSuccess(['confirm_info' => $confirmInfo]); - - $this->view->setVar('confirm_info', $confirmInfo); + $this->view->setVar('order', $order); + $this->view->setVar('confirm', $confirm); } /** diff --git a/app/Http/Web/Views/account/login_by_password.volt b/app/Http/Web/Views/account/login_by_password.volt index 81d21fef..9c7e8a40 100644 --- a/app/Http/Web/Views/account/login_by_password.volt +++ b/app/Http/Web/Views/account/login_by_password.volt @@ -11,7 +11,7 @@
- +
diff --git a/app/Http/Web/Views/account/login_by_verify.volt b/app/Http/Web/Views/account/login_by_verify.volt index f7438cad..e8709a89 100644 --- a/app/Http/Web/Views/account/login_by_verify.volt +++ b/app/Http/Web/Views/account/login_by_verify.volt @@ -9,7 +9,7 @@
- +
diff --git a/app/Http/Web/Views/course/meta.volt b/app/Http/Web/Views/course/meta.volt index 1f0c6171..e7f364b8 100644 --- a/app/Http/Web/Views/course/meta.volt +++ b/app/Http/Web/Views/course/meta.volt @@ -16,12 +16,12 @@ {% endif %}

{% if course.market_price > 0 %} - 市场价格 ¥{{ course.market_price }} + 市场价格 {{ '¥%0.2f'|format(course.market_price) }} {% else %} 市场价格 免费 {% endif %} {% if course.vip_price > 0 %} - 会员价格 ¥{{ course.vip_price }} + 会员价格 {{ '¥%0.2f'|format(course.vip_price) }} {% else %} 会员价格 免费 {% endif %} diff --git a/app/Http/Web/Views/course/packages.volt b/app/Http/Web/Views/course/packages.volt index dbe83c00..dcc27d5a 100644 --- a/app/Http/Web/Views/course/packages.volt +++ b/app/Http/Web/Views/course/packages.volt @@ -6,11 +6,13 @@

{{ package.title }}
{{ package.course_count }} 门课程 - 总价 ¥{{ package.origin_price }} + 总价 {{ '¥%0.2f'|format(package.origin_price) }}
- 市场价 ¥{{ package.market_price }} - 会员价 ¥{{ package.vip_price }} + 市场价 {{ '¥%0.2f'|format(package.market_price) }} +
+
+ 会员价 {{ '¥%0.2f'|format(package.vip_price) }}
立即购买 diff --git a/app/Http/Web/Views/my/orders.volt b/app/Http/Web/Views/my/orders.volt index a16a8b00..1e0400b5 100644 --- a/app/Http/Web/Views/my/orders.volt +++ b/app/Http/Web/Views/my/orders.volt @@ -14,14 +14,14 @@
{% 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 url = (key == 'all') ? url({'for':'web.my.orders'}) : url({'for':'web.my.orders'},{'status':key}) %} - {{ val }} + {{ value }} {% endfor %}
{% if pager.total_pages > 0 %} - +
@@ -30,31 +30,34 @@ - - - - + + + + {% for item in pager.items %} + {% set info_url = url({'for':'web.order.info'},{'sn':item.sn}) %} - - + + {% endfor %}
信息金额时间状态基本信息订单金额创建时间订单状态 操作

名称:{{ item.subject }}

单号:{{ item.sn }}

¥{{ item.amount }}{{ date('Y-m-d H:i',item.create_time) }}{{ '¥%0.2f'|format(item.amount) }}{{ date('Y-m-d H:i:s',item.create_time) }} {{ order_status(item.status) }} - 详情 + 订单详情
{{ partial('partials/pager') }} + {% else %} +
未发现相关记录
{% endif %}
diff --git a/app/Http/Web/Views/order/info.volt b/app/Http/Web/Views/order/info.volt new file mode 100644 index 00000000..e57b2a8f --- /dev/null +++ b/app/Http/Web/Views/order/info.volt @@ -0,0 +1,45 @@ +{% extends 'templates/full.volt' %} + +{% block content %} + + {{ partial('partials/macro_order') }} + + + +
+ + + + + + + + + + + + + + + + + + +
订单编号:{{ order.sn }}
基本信息订单金额订单类型订单状态流转时间
{{ item_info(order) }}{{ '¥%0.2f'|format(order.amount) }}{{ item_type(order.item_type) }}{{ order_status(order.status) }}{{ history_info(order.history) }}
+
+
+ 返回上页 + {% if (order.item_type in ['course','package']) and (order.status == 'finished') %} + {% set confirm_url = url({'for':'web.refund.confirm'},{'sn':order.sn}) %} + 申请退款 + {% endif %} +
+
+
+ +{% endblock %} \ No newline at end of file diff --git a/app/Http/Web/Views/order/pay.volt b/app/Http/Web/Views/order/pay.volt index d5083133..74c9925f 100644 --- a/app/Http/Web/Views/order/pay.volt +++ b/app/Http/Web/Views/order/pay.volt @@ -30,10 +30,10 @@
- + - - + +
{% endblock %} diff --git a/app/Http/Web/Views/partials/macro_course.volt b/app/Http/Web/Views/partials/macro_course.volt index d565d69f..a68a62fd 100644 --- a/app/Http/Web/Views/partials/macro_course.volt +++ b/app/Http/Web/Views/partials/macro_course.volt @@ -33,16 +33,16 @@
{% if course.market_price > course.vip_price %} - ¥{{ course.market_price }} + {{ '¥%0.2f'|format(course.market_price) }} {% if course.vip_price > 0 %} - 会员¥{{ course.vip_price }} + {{ '会员¥%0.2f'|format(course.vip_price) }} {% else %} 会员免费 {% endif %} {{ level_info(course.level) }} {{ course.user_count }}人购买 {% elseif course.market_price > 0 %} - ¥{{ course.market_price }} + {{ '¥%0.2f'|format(course.market_price) }} {{ level_info(course.level) }} {{ course.lesson_count }}节课 {{ course.user_count }}人购买 @@ -68,7 +68,7 @@
{% if course.market_price > 0 %} - ¥{{ course.market_price }} + {{ '¥%0.2f'|format(course.market_price) }} {{ level_info(course.level) }} {{ course.user_count }}人购买 {% else %} diff --git a/app/Http/Web/Views/partials/macro_order.volt b/app/Http/Web/Views/partials/macro_order.volt index 7f3b31e6..f6cb1bbe 100644 --- a/app/Http/Web/Views/partials/macro_order.volt +++ b/app/Http/Web/Views/partials/macro_order.volt @@ -1,11 +1,80 @@ -{%- macro order_status(value) %} - {% if value == 'pending' %} - 待支付 - {% elseif value == 'finished' %} - 已完成 - {% elseif value == 'closed' %} - 已关闭 - {% elseif value == 'refunded' %} - 已退款 +{%- macro item_info(order) %} + {% if order.item_type == 'course' %} + {% set course = order.item_info.course %} + {% set course_url = url({'for':'web.course.show','id':course.id}) %} +
+

课程名称:{{ course.title }}

+

市场价格:{{ '¥%0.2f'|format(course.market_price) }}会员价格:{{ '¥%0.2f'|format(course.vip_price) }}

+

学习期限:{{ date('Y-m-d H:i:s',course.study_expiry_time) }}退款期限:{{ date('Y-m-d H:i:s',course.refund_expiry_time) }}

+
+ {% 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}) %} +
+

课程名称:{{ course.title }}

+

市场价格:{{ '¥%0.2f'|format(course.market_price) }}会员价格:{{ '¥%0.2f'|format(course.vip_price) }}

+

学习期限:{{ date('Y-m-d H:i:s',course.study_expiry_time) }}退款期限:{{ date('Y-m-d H:i:s',course.refund_expiry_time) }}

+
+ {% endfor %} + {% elseif order.item_type == 'vip' %} + {% set vip = order.item_info.vip %} +
+

商品名称:{{ order.subject }}

+

商品价格:{{ '¥%0.2f'|format(order.amount) }}

+
+ {% 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}) %} +
+

课程名称:{{ course.title }}

+

赞赏金额:{{ '¥%0.2f'|format(reward.price) }}

+
+ {% elseif order.item_type == 'test' %} +
+

商品名称:{{ order.subject }}

+

商品价格:{{ '¥%0.2f'|format(order.amount) }}

+
+ {% endif %} +{%- endmacro %} + +{%- macro history_info(items) %} + {% for item in items %} + {% if item.status == 'pending' %} +

创建时间:{{ date('Y-m-d H:i:s',item.create_time) }}

+ {% elseif item.status == 'finished' %} +

完成时间:{{ date('Y-m-d H:i:s',item.create_time) }}

+ {% elseif item.status == 'closed' %} +

关闭时间:{{ date('Y-m-d H:i:s',item.create_time) }}

+ {% elseif item.status == 'refunded' %} +

退款时间:{{ date('Y-m-d H:i:s',item.create_time) }}

+ {% 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 %} {%- endmacro %} diff --git a/app/Http/Web/Views/refund/confirm.volt b/app/Http/Web/Views/refund/confirm.volt new file mode 100644 index 00000000..28450ce7 --- /dev/null +++ b/app/Http/Web/Views/refund/confirm.volt @@ -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}) %} +
+

课程名称:{{ course.title }}

+

退款期限:{{ date('Y-m-d H:i:s',course.refund_expiry_time) }}

+

退款金额:{{ '¥%0.2f'|format(course.refund_amount) }}退款比例:{{ 100 * course.refund_percent }}%

+
+ {% 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}) %} +
+

课程名称:{{ course.title }}

+

退款期限:{{ date('Y-m-d H:i:s',course.refund_expiry_time) }}

+

退款金额:{{ '¥%0.2f'|format(course.refund_amount) }}退款比例:{{ 100 * course.refund_percent }}%

+
+ {% endfor %} + {% endif %} + {%- endmacro %} + + + +
+ + + + + + + + + + + + + + +
订单编号:{{ order.sn }}
基本信息订单金额退款金额
{{ item_info(confirm) }}{{ '¥%0.2f'|format(order.amount) }}{{ '¥%0.2f'|format(confirm.refund_amount) }}
+
+ +
+
+ +{% endblock %} \ No newline at end of file diff --git a/app/Repos/Order.php b/app/Repos/Order.php index 129486a3..ce2f8f87 100644 --- a/app/Repos/Order.php +++ b/app/Repos/Order.php @@ -4,6 +4,7 @@ namespace App\Repos; use App\Library\Paginator\Adapter\QueryBuilder as PagerQueryBuilder; use App\Models\Order as OrderModel; +use App\Models\OrderStatus as OrderStatusModel; use App\Models\Refund as RefundModel; use App\Models\Trade as TradeModel; use Phalcon\Mvc\Model; @@ -45,6 +46,10 @@ class Order extends Repository $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'])) { $startTime = strtotime($where['start_time']); $endTime = strtotime($where['end_time']); @@ -160,4 +165,15 @@ class Order extends Repository ->execute(); } + /** + * @param $orderId + * @return ResultsetInterface|Resultset|OrderStatusModel[] + */ + public function findHistory($orderId) + { + return OrderStatusModel::query() + ->where('order_id = :order_id:', ['order_id' => $orderId]) + ->execute(); + } + } diff --git a/app/Services/Frontend/My/OrderList.php b/app/Services/Frontend/My/OrderList.php index b0bc30d3..0373e6d4 100644 --- a/app/Services/Frontend/My/OrderList.php +++ b/app/Services/Frontend/My/OrderList.php @@ -54,7 +54,7 @@ class OrderList extends FrontendService $items[] = [ 'sn' => $order['sn'], 'subject' => $order['subject'], - 'amount' => $order['amount'], + 'amount' => (float)$order['amount'], 'status' => $order['status'], 'item_id' => $order['item_id'], 'item_type' => $order['item_type'], diff --git a/app/Services/Frontend/Order/OrderInfo.php b/app/Services/Frontend/Order/OrderInfo.php index 7a38cd1b..fb3cad10 100644 --- a/app/Services/Frontend/Order/OrderInfo.php +++ b/app/Services/Frontend/Order/OrderInfo.php @@ -3,6 +3,7 @@ namespace App\Services\Frontend\Order; use App\Models\Order as OrderModel; +use App\Repos\Order as OrderRepo; use App\Services\Frontend\Service as FrontendService; use App\Validators\Order as OrderValidator; @@ -22,6 +23,8 @@ class OrderInfo extends FrontendService { $order->item_info = $this->handleItemInfo($order); + $history = $this->handleHistory($order); + return [ 'sn' => $order->sn, 'subject' => $order->subject, @@ -30,10 +33,32 @@ class OrderInfo extends FrontendService 'item_id' => $order->item_id, 'item_type' => $order->item_type, '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) { /** diff --git a/public/static/web/css/common.css b/public/static/web/css/common.css index 8c75adc3..e8165626 100644 --- a/public/static/web/css/common.css +++ b/public/static/web/css/common.css @@ -22,6 +22,41 @@ 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 { padding-bottom: 1px; } @@ -88,33 +123,6 @@ 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 { padding: 15px; text-align: center; @@ -463,14 +471,13 @@ } .package-info .origin-price i { - color: red; font-style: normal; text-decoration: line-through; } .package-info .price { color: #666; - margin-bottom: 15px; + margin-bottom: 10px; } .package-info .price i { @@ -1102,4 +1109,24 @@ .kg-table p { 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; } \ No newline at end of file diff --git a/public/static/web/js/common.js b/public/static/web/js/common.js index f2161f8a..6eb9f697 100644 --- a/public/static/web/js/common.js +++ b/public/static/web/js/common.js @@ -75,6 +75,10 @@ $('.kg-delete').on('click', function () { }); }); +$('.kg-back').on('click', function () { + window.history.back(); +}); + $('body').on('click', '.layui-laypage > a', function () { var url = $(this).attr('data-url'); var target = $(this).attr('data-target');