订单售后管理

This commit is contained in:
devil_gong 2019-05-27 18:40:31 +08:00
parent 18e4efd19a
commit ece92c66b0
18 changed files with 816 additions and 53 deletions

View File

@ -217,7 +217,8 @@ class Common extends Controller
{ {
exit(json_encode(DataReturn($name.' 非法访问', -1000))); exit(json_encode(DataReturn($name.' 非法访问', -1000)));
} else { } else {
exit($name.' 非法访问'); $this->assign('msg', $name.' 非法访问');
return $this->fetch('public/tips_error');
} }
} }
} }

View File

@ -53,7 +53,7 @@ class CustomView extends Common
$params = input(); $params = input();
// 分页 // 分页
$number = 10; $number = MyC('admin_page_number', 10, true);
// 条件 // 条件
$where = CustomViewService::CustomViewListWhere($params); $where = CustomViewService::CustomViewListWhere($params);

View File

@ -37,7 +37,8 @@ class Error extends Common
{ {
exit(json_encode(DataReturn($request->controller().' 控制器不存在', -1000))); exit(json_encode(DataReturn($request->controller().' 控制器不存在', -1000)));
} else { } else {
exit($request->controller().' 控制器不存在'); $this->assign('msg', $request->controller().' 控制器不存在');
return $this->fetch('public/tips_error');
} }
} }
} }

View File

@ -57,7 +57,7 @@ class Order extends Common
$params['user_type'] = 'admin'; $params['user_type'] = 'admin';
// 分页 // 分页
$number = 10; $number = MyC('admin_page_number', 10, true);
// 条件 // 条件
$where = OrderService::OrderListWhere($params); $where = OrderService::OrderListWhere($params);

View File

@ -0,0 +1,160 @@
<?php
// +----------------------------------------------------------------------
// | ShopXO 国内领先企业级B2C免费开源电商系统
// +----------------------------------------------------------------------
// | Copyright (c) 2011~2019 http://shopxo.net All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: Devil
// +----------------------------------------------------------------------
namespace app\admin\controller;
use app\service\OrderService;
use app\service\OrderAftersaleService;
/**
* 订单售后
* @author Devil
* @blog http://gong.gg/
* @version 0.0.1
* @datetime 2016-12-01T21:51:08+0800
*/
class Orderaftersale extends Common
{
/**
* 构造方法
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2018-11-30
* @desc description
*/
public function __construct()
{
// 调用父类前置方法
parent::__construct();
// 登录校验
$this->IsLogin();
// 权限校验
$this->IsPower();
}
/**
* 订单列表
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2018-09-28
* @desc description
*/
public function Index()
{
// 参数
$params = input();
$params['admin'] = $this->admin;
$params['user_type'] = 'admin';
// 分页
$number = MyC('admin_page_number', 10, true);
// 条件
$where = OrderAftersaleService::OrderAftersaleListWhere($params);
// 获取总数
$total = OrderAftersaleService::OrderAftersaleTotal($where);
// 分页
$page_params = array(
'number' => $number,
'total' => $total,
'where' => $params,
'page' => isset($params['page']) ? intval($params['page']) : 1,
'url' => MyUrl('index/orderaftersale/index'),
);
$page = new \base\Page($page_params);
$this->assign('page_html', $page->GetPageHtml());
// 获取列表
$data_params = array(
'm' => $page->GetPageStarNumber(),
'n' => $number,
'where' => $where,
'is_public' => 0,
);
$data = OrderAftersaleService::OrderAftersaleList($data_params);
$this->assign('data_list', $data['data']);
// 静态数据
$this->assign('common_order_aftersale_type_list', lang('common_order_aftersale_type_list'));
$this->assign('common_order_aftersale_status_list', lang('common_order_aftersale_status_list'));
$this->assign('common_order_aftersale_refundment_list', lang('common_order_aftersale_refundment_list'));
// 参数
$this->assign('params', $params);
return $this->fetch();
}
/**
* 确认
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2019-05-23
* @desc description
*/
public function Confirm()
{
// 是否ajax请求
if(!IS_AJAX)
{
return $this->error('非法访问');
}
$params = input();
return OrderAftersaleService::AftersaleConfirm($params);
}
/**
* 审核
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2019-05-23
* @desc description
*/
public function Audit()
{
// 是否ajax请求
if(!IS_AJAX)
{
return $this->error('非法访问');
}
$params = input();
return OrderAftersaleService::AftersaleAudit($params);
}
/**
* 订单取消
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2018-09-30
* @desc description
*/
public function Cancel()
{
// 是否ajax请求
if(!IS_AJAX)
{
return $this->error('非法访问');
}
$params = input();
return OrderAftersaleService::AftersaleCancel($params);
}
}
?>

View File

@ -95,7 +95,7 @@
<!-- operation end --> <!-- operation end -->
<!-- list start --> <!-- list start -->
<table class="am-table am-table-striped am-table-hover am-text-middle m-t-10 m-l-5"> <table class="am-table am-table-striped am-table-hover am-text-middle m-t-10">
<thead> <thead>
<tr> <tr>
<th class="am-hide-sm-only th-goods">基础信息</th> <th class="am-hide-sm-only th-goods">基础信息</th>

View File

@ -0,0 +1,394 @@
{{include file="public/header" /}}
<!-- right content start -->
<div class="content-right">
<div class="content">
<!-- form start -->
<form class="am-form form-validation form-search" method="post" action="{{:MyUrl('admin/orderaftersale/index')}}" request-type="form">
<div class="thin">
<div class="am-input-group am-input-group-sm am-fl so">
<input type="text" autocomplete="off" name="keywords" class="am-radius" placeholder="订单号" value="{{if !empty($params.keywords)}}{{$params.keywords}}{{/if}}" />
<span class="am-input-group-btn">
<button class="am-btn am-btn-default am-radius" type="submit" data-am-loading="{spinner:'circle-o-notch', loadingText:'搜索中...'}">搜索</button>
</span>
</div>
<label class="am-fl thin_sub more-submit">
更多筛选条件
{{if isset($params['is_more']) and $params['is_more'] eq 1}}
<input type="checkbox" name="is_more" value="1" id="is_more" checked />
<i class="am-icon-angle-up"></i>
{{else /}}
<input type="checkbox" name="is_more" value="1" id="is_more" />
<i class="am-icon-angle-down"></i>
{{/if}}
</label>
</div>
<table class="so-list more-where {{if !isset($params['is_more'])}}none{{/if}}">
<tbody>
<tr>
<td>
<span>类型:</span>
<select name="type" class="chosen-select" data-placeholder="类型...">
<option value="-1">类型...</option>
{{if !empty($common_order_aftersale_type_list)}}
{{foreach $common_order_aftersale_type_list as $v}}
<option value="{{$v.value}}" {{if isset($params['type']) and $params['type'] eq $v['value']}}selected{{/if}}>{{$v.name}}</option>
{{/foreach}}
{{/if}}
</select>
</td>
<td>
<span>状态:</span>
<select name="status" class="chosen-select" data-placeholder="状态...">
<option value="-1">状态...</option>
{{if !empty($common_order_aftersale_status_list)}}
{{foreach $common_order_aftersale_status_list as $v}}
<option value="{{$v.value}}" {{if isset($params['status']) and $params['status'] eq $v['value']}}selected{{/if}}>{{$v.name}}</option>
{{/foreach}}
{{/if}}
</select>
</td>
</tr>
<tr>
<td>
<span>退款:</span>
<select name="refundment" class="chosen-select" data-placeholder="退款...">
<option value="-1">退款...</option>
{{if !empty($common_order_aftersale_refundment_list)}}
{{foreach $common_order_aftersale_refundment_list as $v}}
<option value="{{$v.value}}" {{if isset($params['refundment']) and $params['refundment'] eq $v['value']}}selected{{/if}}>{{$v.name}}</option>
{{/foreach}}
{{/if}}
</select>
</td>
<td>
<button type="submit" class="am-btn am-btn-primary am-radius am-btn-xs btn-loading-example" data-am-loading="{spinner:'circle-o-notch', loadingText:'搜索中...'}">搜索</button>
<a href="{{:MyUrl('admin/orderaftersale/index')}}" class="am-btn am-btn-warning am-radius am-btn-sm reset-submit">清除条件</a>
</td>
</tr>
</tbody>
</table>
</form>
<!-- form end -->
<!-- list start -->
<table class="am-table am-table-striped am-table-hover am-text-middle m-t-10">
<thead>
<tr>
<th class="row-user-info am-hide-md-down">用户信息</th>
<th class="row-goods am-hide-sm-only">商品信息</th>
<th class="row-apply">申请信息</th>
<th class="am-hide-sm-only">凭证</th>
<th class="am-hide-sm-only">状态</th>
<th class="am-hide-sm-only">快递信息</th>
<th>更多</th>
<th class="row-operation">操作</th>
</tr>
</thead>
<tbody>
{{if !empty($data_list)}}
{{foreach $data_list as $v}}
<tr id="data-list-{{$v.id}}">
<td class="user-info am-hide-md-down">
{{if !empty($v['user'])}}
<img src="{{$v.user.avatar}}" alt="{{$v.user.user_name_view}}" class="am-img-thumbnail am-radius am-align-left" />
<ul class="user-base">
<li>名称:{{if empty($v['user']['username'])}}<span class="cr-ccc">未填写</span>{{else /}}{{$v.user.username}}{{/if}}</li>
<li>昵称:{{if empty($v['user']['nickname'])}}<span class="cr-ccc">未填写</span>{{else /}}{{$v.user.nickname}}{{/if}}</li>
<li>手机:{{if empty($v['user']['mobile'])}}<span class="cr-ccc">未填写</span>{{else /}}{{$v.user.mobile}}{{/if}}</li>
<li>邮箱:{{if empty($v['user']['email'])}}<span class="cr-ccc">未填写</span>{{else /}}{{$v.user.email}}{{/if}}</li>
</ul>
{{else /}}
用户信息异常
{{/if}}
</td>
<td class="am-hide-sm-only">
<div class="goods-detail">
<a href="{{$v.order_data.items.goods_url}}" target="_blank">
<img src="{{$v.order_data.items.images}}">
</a>
<div class="goods-base">
<a href="{{$v.order_data.items.goods_url}}" target="_blank" class="goods-title">{{$v.order_data.items.title}}</a>
{{if !empty($v.order_data.items.spec)}}
<ul class="goods-attr">
{{foreach $v.order_data.items.spec as $spec}}
<li>{{$spec.type}}{{$spec.value}}</li>
{{/foreach}}
</ul>
{{/if}}
</div>
</div>
{{if $v.order_data.items.original_price gt 0}}
<p class="original-price">¥{{$v.order_data.items.original_price}}</p>
{{/if}}
<p class="line-price">¥{{$v.order_data.items.price}} x {{$v.order_data.items.buy_number}}</p>
</td>
<td>
类型:{{$v.type_text}}<br />
原因:{{$v.reason}}<br />
数量:{{$v.number}}<br />
金额:{{$v.price}}<br />
说明:{{$v.msg}}<br />
时间:{{$v.apply_time_time}}
</td>
<td class="am-hide-sm-only">
{{if !empty($v['images'])}}
<div data-am-widget="slider" class="am-slider am-slider-a1" data-am-slider='{&quot;directionNav&quot;:false, slideshow:false}' >
<ul class="am-slides">
{{foreach $v.images as $img}}
<li>
<img src="{{$img}}" />
</li>
{{/foreach}}
</ul>
</div>
{{/if}}
</td>
<td class="am-hide-sm-only">
<p>{{$v.status_text}}</p>
{{if $v['status'] eq 3 and !empty($v['refundment_text'])}}
<span class="am-badge am-badge-success am-margin-top-xs">{{$v.refundment_text}}</span>
{{/if}}
{{if $v['status'] eq 4 and !empty($v['refuse_reason'])}}
<span class="am-badge am-badge-danger am-margin-top-xs">{{$v.refuse_reason}}</span>
{{/if}}
</td>
<td class="am-hide-sm-only">
{{if $v['type'] eq 1 and in_array($v['status'], [2,3])}}
快递:{{$v.express_name}}<br />
单号:{{$v.express_number}}<br />
时间:{{$v.delivery_time_time}}
{{/if}}
</td>
<td>
<span class="am-icon-caret-down c-p" data-am-modal="{target: '#my-popup{{$v.id}}'}"> 查看更多</span>
<div class="am-popup am-radius" id="my-popup{{$v.id}}">
<div class="am-popup-inner">
<div class="am-popup-hd">
<h4 class="am-popup-title">详情内容</h4>
<span data-am-modal-close
class="am-close">&times;</span>
</div>
<div class="am-popup-bd">
<dl class="dl-content">
<dt>用户信息</dt>
<dd class="user-info">
{{if !empty($v['user'])}}
<img src="{{$v.user.avatar}}" alt="{{$v.user.user_name_view}}" class="am-img-thumbnail am-radius am-align-left" />
<ul class="user-base">
<li>名称:{{if empty($v['user']['username'])}}<span class="cr-ccc">未填写</span>{{else /}}{{$v.user.username}}{{/if}}</li>
<li>昵称:{{if empty($v['user']['nickname'])}}<span class="cr-ccc">未填写</span>{{else /}}{{$v.user.nickname}}{{/if}}</li>
<li>手机:{{if empty($v['user']['mobile'])}}<span class="cr-ccc">未填写</span>{{else /}}{{$v.user.mobile}}{{/if}}</li>
<li>邮箱:{{if empty($v['user']['email'])}}<span class="cr-ccc">未填写</span>{{else /}}{{$v.user.email}}{{/if}}</li>
</ul>
{{else /}}
用户信息异常
{{/if}}
</dd>
<dt>商品信息</dt>
<dd>
<div class="goods-detail">
<a href="{{$v.order_data.items.goods_url}}" target="_blank">
<img src="{{$v.order_data.items.images}}">
</a>
<div class="goods-base">
<a href="{{$v.order_data.items.goods_url}}" target="_blank" class="goods-title">{{$v.order_data.items.title}}</a>
{{if !empty($v.order_data.items.spec)}}
<ul class="goods-attr">
{{foreach $v.order_data.items.spec as $spec}}
<li>{{$spec.type}}{{$spec.value}}</li>
{{/foreach}}
</ul>
{{/if}}
</div>
</div>
{{if $v.order_data.items.original_price gt 0}}
<p class="original-price">¥{{$v.order_data.items.original_price}}</p>
{{/if}}
<p class="line-price">¥{{$v.order_data.items.price}} x {{$v.order_data.items.buy_number}}</p>
</dd>
<dt>申请信息</dt>
<dd>
类型:{{$v.type_text}}<br />
原因:{{$v.reason}}<br />
数量:{{$v.number}}<br />
金额:{{$v.price}}<br />
说明:{{$v.msg}}<br />
时间:{{$v.apply_time_time}}
</dd>
<dt>凭证</dt>
<dd>
{{if !empty($v['images'])}}
{{foreach $v.images as $img}}
<a href="{{$img}}" target="_blank">
<img src="{{$img}}" class="am-img-thumbnail" width="80" height="80" />
</a>
{{/foreach}}
{{/if}}
</dd>
<dt>状态</dt>
<dd>
<p>{{$v.status_text}}</p>
{{if $v['status'] eq 3 and !empty($v['refundment_text'])}}
<span class="am-badge am-badge-success am-margin-top-xs">{{$v.refundment_text}}</span>
{{/if}}
{{if $v['status'] eq 4 and !empty($v['refuse_reason'])}}
<span class="am-badge am-badge-danger am-margin-top-xs">{{$v.refuse_reason}}</span>
{{/if}}
</dd>
<dt>快递信息</dt>
<dd>
{{if $v['type'] eq 1 and in_array($v['status'], [2,3])}}
快递:{{$v.express_name}}<br />
单号:{{$v.express_number}}<br />
时间:{{$v.delivery_time_time}}
{{/if}}
</dd>
<dt>申请时间</dt>
<dd>{{$v.apply_time_time}}</dd>
<dt>确认时间</dt>
<dd>{{$v.confirm_time_time}}</dd>
<dt>退货时间</dt>
<dd>{{$v.delivery_time_time}}</dd>
<dt>审核时间</dt>
<dd>{{$v.audit_time_time}}</dd>
<dt>取消时间</dt>
<dd>{{$v.cancel_time_time}}</dd>
<dt>添加时间</dt>
<dd>{{$v.add_time_time}}</dd>
<dt>更新时间</dt>
<dd>{{$v.upd_time_time}}</dd>
</dl>
</div>
</div>
</div>
</td>
<td>
{{if $v['status'] eq 0 and $v['type'] eq 1}}
<button type="button" class="am-btn am-btn-secondary am-btn-xs am-radius am-icon-check am-btn-block submit-ajax" data-url="{{:MyUrl('admin/orderaftersale/confirm')}}" data-id="{{$v.id}}" data-view="reload"> 确认</button>
{{/if}}
{{if $v['status'] eq 2}}
<button type="button" class="am-btn am-btn-secondary am-btn-xs am-radius am-icon-gavel am-btn-block submit-audit" data-json='{{:json_encode($v)}}'> 审核</button>
{{/if}}
{{if in_array($v['status'], [0,2])}}
<button type="button" class="am-btn am-btn-danger am-btn-xs am-radius am-icon-warning am-btn-block submit-refuse" data-json='{{:json_encode($v)}}'> 拒绝</button>
{{/if}}
{{if in_array($v['status'], [1,2])}}
<button type="button" class="am-btn am-btn-warning am-btn-xs am-radius am-icon-paint-brush am-btn-block submit-ajax submit-cancel" data-url="{{:MyUrl('admin/orderaftersale/cancel')}}" data-id="{{$v.id}}" data-view="reload"> 取消</button>
{{/if}}
{{if in_array($v['status'], [4,5])}}
<button class="am-btn am-btn-danger am-btn-xs am-radius am-btn-block am-icon-trash-o submit-delete" data-url="{{:MyUrl('admin/orderaftersale/delete')}}" data-id="{{$v.id}}"> 删除</button>
{{/if}}
</td>
</tr>
{{/foreach}}
{{/if}}
</tbody>
</table>
{{if empty($data_list)}}
<div class="table-no"><i class="am-icon-warning"></i> 没有相关数据</div>
{{/if}}
<!-- list end -->
<!-- 审核弹窗 -->
<div class="am-popup" id="order-audit-popup">
<div class="am-popup-inner">
<div class="am-popup-hd">
<h4 class="am-popup-title">审核操作</h4>
<span data-am-modal-close class="am-close">&times;</span>
</div>
<div class="am-popup-bd">
<dl class="dl-content">
<dt>用户信息</dt>
<dd class="user-info">
<img src="{{$attachment_host}}/static/common/images/user-img-sm.gif" class="am-img-thumbnail am-radius am-align-left" />
<ul class="user-base">
<li class="username">名称:<span>...</span></li>
<li class="nickname">昵称:<span>...</span></li>
<li class="mobile">手机:<span>...</span></li>
<li class="email">邮箱:<span>...</span></li>
</ul>
</dd>
</dl>
<form class="am-form form-validation-audit" action="{{:MyUrl('admin/orderaftersale/audit')}}" method="POST" request-type="ajax-reload" enctype="multipart/form-data">
<div class="am-form-group">
<label class="am-block">退款方式</label>
{{if !empty($common_order_aftersale_refundment_list)}}
{{foreach $common_order_aftersale_refundment_list as $k=>$v}}
<label class="am-radio-inline am-success">
<input type="radio" name="refundment" value="{{$v.value}}" data-am-ucheck {{if $k eq 0}} data-validation-message="请选择退狂方式" required{{/if}} /> {{$v.name}}
</label>
{{/foreach}}
{{/if}}
</div>
<div class="am-form-group reply-submit am-form-group-refreshing">
<input type="hidden" name="id" value="" />
<button type="submit" class="am-btn am-btn-primary am-radius am-btn-sm am-btn-block" data-am-loading="{loadingText:'处理中...'}">确认</button>
</div>
</form>
</div>
</div>
</div>
<!-- 拒绝弹窗 -->
<div class="am-popup" id="order-refuse-popup">
<div class="am-popup-inner">
<div class="am-popup-hd">
<h4 class="am-popup-title">拒绝操作</h4>
<span data-am-modal-close class="am-close">&times;</span>
</div>
<div class="am-popup-bd">
<dl class="dl-content">
<dt>用户信息</dt>
<dd class="user-info">
<img src="{{$attachment_host}}/static/common/images/user-img-sm.gif" class="am-img-thumbnail am-radius am-align-left" />
<ul class="user-base">
<li class="username">名称:<span>...</span></li>
<li class="nickname">昵称:<span>...</span></li>
<li class="mobile">手机:<span>...</span></li>
<li class="email">邮箱:<span>...</span></li>
</ul>
</dd>
</dl>
<form class="am-form form-validation-refuse" action="{{:MyUrl('admin/orderaftersale/refuse')}}" method="POST" request-type="ajax-reload" enctype="multipart/form-data">
<div class="am-form-group">
<label>拒绝原因</label>
<textarea name="refuse_reason" rows="5" class="am-radius" placeholder="拒绝原因格式 2~230 个字符" data-validation-message="拒绝原因格式 2~230 个字符" minlength="2" maxlength="230" required></textarea>
</div>
<div class="am-form-group reply-submit am-form-group-refreshing">
<input type="hidden" name="id" value="" />
<button type="submit" class="am-btn am-btn-danger am-radius am-btn-sm am-btn-block" data-am-loading="{loadingText:'处理中...'}">确认</button>
</div>
</form>
</div>
</div>
</div>
<!-- page start -->
{{if !empty($data_list)}}
{{$page_html|raw}}
{{/if}}
<!-- page end -->
</div>
</div>
<!-- right content end -->
<!-- footer start -->
{{include file="public/footer" /}}
<!-- footer end -->

View File

@ -196,6 +196,13 @@ class Orderaftersale extends Common
*/ */
public function Create() public function Create()
{ {
// 是否ajax请求
if(!IS_AJAX)
{
$this->assign('msg', '非法访问');
return $this->fetch('public/tips_error');
}
$params = input(); $params = input();
$params['user'] = $this->user; $params['user'] = $this->user;
return OrderAftersaleService::AftersaleCreate($params); return OrderAftersaleService::AftersaleCreate($params);
@ -211,6 +218,13 @@ class Orderaftersale extends Common
*/ */
public function Delivery() public function Delivery()
{ {
// 是否ajax请求
if(!IS_AJAX)
{
$this->assign('msg', '非法访问');
return $this->fetch('public/tips_error');
}
$params = input(); $params = input();
$params['user'] = $this->user; $params['user'] = $this->user;
return OrderAftersaleService::AftersaleDelivery($params); return OrderAftersaleService::AftersaleDelivery($params);
@ -226,15 +240,16 @@ class Orderaftersale extends Common
*/ */
public function Cancel() public function Cancel()
{ {
if(input('post.')) // 是否ajax请求
if(!IS_AJAX)
{ {
$params = input('post.');
$params['user'] = $this->user;
return OrderAftersaleService::AftersaleCancel($params);
} else {
$this->assign('msg', '非法访问'); $this->assign('msg', '非法访问');
return $this->fetch('public/tips_error'); return $this->fetch('public/tips_error');
} }
$params = input('post.');
$params['user'] = $this->user;
return OrderAftersaleService::AftersaleCancel($params);
} }
} }
?> ?>

View File

@ -187,7 +187,8 @@ class Safety extends Common
// 是否ajax请求 // 是否ajax请求
if(!IS_AJAX) if(!IS_AJAX)
{ {
return $this->error('非法访问'); $this->assign('msg', '非法访问');
return $this->fetch('public/tips_error');
} }
// 开始处理 // 开始处理
@ -209,7 +210,8 @@ class Safety extends Common
// 是否ajax请求 // 是否ajax请求
if(!IS_AJAX) if(!IS_AJAX)
{ {
return $this->error('非法访问'); $this->assign('msg', '非法访问');
return $this->fetch('public/tips_error');
} }
// 开始处理 // 开始处理
@ -230,7 +232,8 @@ class Safety extends Common
// 是否ajax请求 // 是否ajax请求
if(!IS_AJAX) if(!IS_AJAX)
{ {
return $this->error('非法访问'); $this->assign('msg', '非法访问');
return $this->fetch('public/tips_error');
} }
// 开始处理 // 开始处理

View File

@ -126,16 +126,18 @@
<!-- 订单抬头 --> <!-- 订单抬头 -->
<div class="am-alert am-alert-secondary meila-radius"> <div class="am-alert am-alert-secondary meila-radius">
<table class="content-title"> <table class="content-title">
<tbody><tr> <tbody>
<th class="row-content">商品</th> <tr>
<th class="row-price am-hide-sm-only">单价</th> <th class="row-content">商品</th>
<th class="row-number am-hide-sm-only">数量</th> <th class="row-price am-hide-sm-only">单价</th>
<th class="row-goods-operate">商品操作</th> <th class="row-number am-hide-sm-only">数量</th>
<th class="row-total-price am-hide-sm-only">合计</th> <th class="row-goods-operate">商品操作</th>
<th class="row-status">状态</th> <th class="row-total-price am-hide-sm-only">合计</th>
<th class="row-operate">操作</th> <th class="row-status">状态</th>
</tr> <th class="row-operate">操作</th>
</tbody></table> </tr>
</tbody>
</table>
</div> </div>
<!-- 订单列表 --> <!-- 订单列表 -->

View File

@ -166,8 +166,11 @@
{{/if}} {{/if}}
</td> </td>
<td> <td>
{{if in_array($v['status'], [0,3])}} {{if $v['status'] eq 1 and $v['type'] eq 1}}
<button type="button" class="am-btn am-btn-danger am-btn-xs am-radius am-icon-paint-brush am-btn-block submit-ajax submit-cancel" data-url="{{:MyUrl('index/orderaftersale/cancel')}}" data-id="{{$v.id}}" data-view="reload"> 取消</button> <a href="{{:MyUrl('index/orderaftersale/aftersale', ['id'=>$v['order_id'], 'gid'=>$v['goods_id']])}}" target="_blank" class="am-btn am-btn-secondary am-btn-xs am-radius am-icon-send am-btn-block"> 发货</a>
{{/if}}
{{if !in_array($v['status'], [3,4,5])}}
<button type="button" class="am-btn am-btn-warning am-btn-xs am-radius am-icon-paint-brush am-btn-block submit-ajax submit-cancel" data-url="{{:MyUrl('index/orderaftersale/cancel')}}" data-id="{{$v.id}}" data-view="reload"> 取消</button>
{{/if}} {{/if}}
<a href="{{:MyUrl('index/orderaftersale/detail', ['id'=>$v['id']])}}" target="_blank" class="am-btn am-btn-default am-btn-xs am-radius am-icon-cubes am-btn-block"> 详情</a> <a href="{{:MyUrl('index/orderaftersale/detail', ['id'=>$v['id']])}}" target="_blank" class="am-btn am-btn-default am-btn-xs am-radius am-icon-cubes am-btn-block"> 详情</a>
</td> </td>

View File

@ -16,7 +16,7 @@
<form class="am-topbar-form am-topbar-left am-form-inline am-show-sm-only navigation-search" role="search" action="{{:MyUrl('index/search/index')}}" method="POST"> <form class="am-topbar-form am-topbar-left am-form-inline am-show-sm-only navigation-search" role="search" action="{{:MyUrl('index/search/index')}}" method="POST">
<div class="am-input-group am-input-group-sm"> <div class="am-input-group am-input-group-sm">
<input type="text" name="keywords" class="am-form-field" placeholder="其实搜索很简单^_^ !" value="{{if !empty($params['keywords'])}}{{$params.keywords}}{{/if}}" autocomplete="off" /> <input type="text" name="wd" class="am-form-field" placeholder="其实搜索很简单^_^ !" value="{{if !empty($params['wd'])}}{{$params.wd}}{{/if}}" autocomplete="off" />
<span class="am-input-group-btn"> <span class="am-input-group-btn">
<button class="am-btn am-btn-default" type="submit"> <button class="am-btn am-btn-default" type="submit">
<span class="am-icon-search am-icon-xs"></span> <span class="am-icon-search am-icon-xs"></span>

View File

@ -525,19 +525,94 @@ class OrderAftersaleService
return DataReturn($ret, -1); return DataReturn($ret, -1);
} }
// 数据更新 // 条件
$where = [ $where = [
'id' => intval($params['id']), 'id' => intval($params['id']),
]; ];
if(!empty($params['user']['id'])) if(!empty($params['user']))
{ {
$where['user_id'] = $params['user']['id']; $where['user_id'] = $params['user']['id'];
} }
// 售后订单
$aftersale = Db::name('OrderAftersale')->where($where)->find();
if(empty($aftersale))
{
return DataReturn('数据不存在或已删除', -1);
}
// 状态校验
if(in_array($aftersale['status'], [3,5]))
{
$status_list = lang('common_order_aftersale_status_list');
return DataReturn('状态不可操作['.$status_list[$aftersale['status']]['name'].']', -1);
}
// 数据更新
if(Db::name('OrderAftersale')->where($where)->update(['status'=>5, 'cancel_time'=>time(), 'upd_time'=>time()])) if(Db::name('OrderAftersale')->where($where)->update(['status'=>5, 'cancel_time'=>time(), 'upd_time'=>time()]))
{ {
return DataReturn('取消成功'); return DataReturn('取消成功');
} }
return DataReturn('取消失败', -100); return DataReturn('取消失败', -100);
} }
/**
* 确认
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2019-05-27
* @desc description
* @param [array] $params [输入参数]
*/
public static function AftersaleConfirm($params = [])
{
// 请求参数
$p = [
[
'checked_type' => 'empty',
'key_name' => 'id',
'error_msg' => '操作id有误',
],
];
$ret = ParamsChecked($params, $p);
if($ret !== true)
{
return DataReturn($ret, -1);
}
// 条件
$where = [
'id' => intval($params['id']),
];
// 售后订单
$aftersale = Db::name('OrderAftersale')->where($where)->find();
if(empty($aftersale))
{
return DataReturn('数据不存在或已删除', -1);
}
// 状态校验
if($aftersale['status'] != 0)
{
$status_list = lang('common_order_aftersale_status_list');
return DataReturn('状态不可操作['.$status_list[$aftersale['status']]['name'].']', -1);
}
// 类型
if($aftersale['type'] != 1)
{
$aftersale_type_list = lang('common_order_aftersale_type_list');
return DataReturn('类型不可操作['.$aftersale_type_list[$aftersale['type']]['name'].']', -1);
}
// 数据更新
if(Db::name('OrderAftersale')->where($where)->update(['status'=>1, 'confirm_time'=>time(), 'upd_time'=>time()]))
{
return DataReturn('确认成功');
}
return DataReturn('确认失败', -100);
}
} }
?> ?>

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,26 @@
/** /**
* 公共 * 公共
*/ */
div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
vertical-align: baseline;
font-family: arial,"Lantinghei SC","Microsoft Yahei";
font-style: normal;
}
* { font-size: 12px; } * { font-size: 12px; }
.w100 {width:100%;} .w100 {width:100%;}
.fw-100 {font-weight:100;} .fw-100 {font-weight:100;}
@ -64,8 +84,6 @@ h4 {line-height:22px;}
h4 small {color:#444444;} h4 small {color:#444444;}
h5 {font-size:15px;} h5 {font-size:15px;}
h5 small {color:#444444;} h5 small {color:#444444;}
p {line-height:1.6;}
* {outline:none !important;}
b {font-weight:600;} b {font-weight:600;}
i{ font-style: normal; } i{ font-style: normal; }
a:hover {outline:0;text-decoration:none;} a:hover {outline:0;text-decoration:none;}

View File

@ -0,0 +1,49 @@
/**
* 商品列表
*/
.content-right .goods-detail img { width: 80px; height: 80px; position: absolute; border: 1px solid #eee; }
.content-right .goods-detail { position: relative; min-height: 80px; }
.content-right .goods-title { display: block; max-height: 36px; overflow: hidden; text-overflow: ellipsis; }
.content-right .goods-title:hover { text-decoration: underline; }
.content-right .goods-base {float: left; top: 0; margin-left: 85px; }
.content-right .goods-attr { margin-top: 5px; }
.content-right .goods-attr li { color: #888; line-height: 16px; }
.content-right .original-price, .content-right .line-price { font-family: Verdana,Tahoma,arial; }
.content-right .original-price { color: #9c9c9c; text-decoration: line-through; }
.content-right .line-price { color: #3c3c3c; font-weight: 700; }
/**
* 用户信息
*/
.content-right .user-info img {
max-width: 35px;
max-height: 35px;
margin: 0 5px 2px 0;
}
.content-right ul {
list-style: none;
padding: 0;
margin: 0;
}
/**
* 列表
*/
@media only screen and (min-width:640px) {
.content-right table.am-table tr .row-user-info { width: 20%; }
.content-right table.am-table tr .row-goods { width: 20%; }
.content-right table.am-table tr .row-apply { width: 25%; }
.content-right table.am-table tr .row-operation { width: 85px; }
}
@media only screen and (max-width:640px) {
.content-right table.am-table tr .row-apply { width: 50%; }
.content-right table.am-table tr .row-operation { width: 75px; }
}
.content-right table.am-table .am-slider {
width: 100px;
max-height: 108px;
overflow: hidden;
box-shadow: none;
-webkit-box-shadow: none;
}

View File

@ -0,0 +1,42 @@
// 表单初始化
FromInit('form.form-validation-audit');
FromInit('form.form-validation-refuse');
$(function()
{
// 审核
$('table.am-table .submit-audit').on('click', function()
{
var $audit_popup = $('#order-audit-popup');
var json = $(this).data('json');
console.log(json);
// 用户信息
$audit_popup.find('input[name="id"]').val(json.id);
$audit_popup.find('.user-info img').attr('src', json.user.avatar || $audit_popup.find('.user-info img').attr('src'));
$audit_popup.find('.user-info .user-base .username span').html(json.user.username || '<span class="cr-ddd">未填写</span>');
$audit_popup.find('.user-info .user-base .nickname span').html(json.user.nickname || '<span class="cr-ddd">未填写</span>');
$audit_popup.find('.user-info .user-base .mobile span').html(json.user.mobile || '<span class="cr-ddd">未填写</span>');
$audit_popup.find('.user-info .user-base .email span').html(json.user.email || '<span class="cr-ddd">未填写</span>');
$audit_popup.modal();
});
// 拒绝
$('table.am-table .submit-refuse').on('click', function()
{
var $refuse_popup = $('#order-refuse-popup');
var json = $(this).data('json');
console.log(json);
// 用户信息
$refuse_popup.find('input[name="id"]').val(json.id);
$refuse_popup.find('.user-info img').attr('src', json.user.avatar || $refuse_popup.find('.user-info img').attr('src'));
$refuse_popup.find('.user-info .user-base .username span').html(json.user.username || '<span class="cr-ddd">未填写</span>');
$refuse_popup.find('.user-info .user-base .nickname span').html(json.user.nickname || '<span class="cr-ddd">未填写</span>');
$refuse_popup.find('.user-info .user-base .mobile span').html(json.user.mobile || '<span class="cr-ddd">未填写</span>');
$refuse_popup.find('.user-info .user-base .email span').html(json.user.email || '<span class="cr-ddd">未填写</span>');
$refuse_popup.modal();
});
});

View File

@ -1,16 +1,16 @@
/** /**
* 商品列表 * 商品列表
*/ */
.goods-detail img { width: 80px; height: 80px; position: absolute; border: 1px solid #eee; } .user-content-body .goods-detail img { width: 80px; height: 80px; position: absolute; border: 1px solid #eee; }
.goods-detail { position: relative; min-height: 80px; } .user-content-body .goods-detail { position: relative; min-height: 80px; }
.goods-title { display: block; max-height: 36px; overflow: hidden; text-overflow: ellipsis; } .user-content-body .goods-title { display: block; max-height: 36px; overflow: hidden; text-overflow: ellipsis; }
.goods-title:hover { text-decoration: underline; } .user-content-body .goods-title:hover { text-decoration: underline; }
.goods-base {float: left; top: 0; margin-left: 85px; } .user-content-body .goods-base {float: left; top: 0; margin-left: 85px; }
.goods-attr { margin-top: 5px; } .user-content-body .goods-attr { margin-top: 5px; }
.goods-attr li { color: #888; line-height: 16px; } .user-content-body .goods-attr li { color: #888; line-height: 16px; }
.original-price, .line-price { font-family: Verdana,Tahoma,arial; } .user-content-body .original-price, .user-content-body .line-price { font-family: Verdana,Tahoma,arial; }
.original-price { color: #9c9c9c; text-decoration: line-through; } .user-content-body .original-price { color: #9c9c9c; text-decoration: line-through; }
.line-price { color: #3c3c3c; font-weight: 700; } .user-content-body .line-price { color: #3c3c3c; font-weight: 700; }
/** /**
* 列表 * 列表