用户订单售后管理

feat/task1-c-wallet
devil_gong 2019-05-24 13:57:10 +08:00
parent 7cac938814
commit 5852b20bfb
21 changed files with 685 additions and 162 deletions

View File

@ -13,7 +13,6 @@ namespace app\index\controller;
use app\service\OrderService;
use app\service\PaymentService;
use app\service\GoodsCommentsService;
use app\service\OrderAftersaleService;
/**
* 订单管理
@ -200,85 +199,6 @@ class Order extends Common
}
}
/**
* 售后页面
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2019-05-21
* @desc description
*/
public function Aftersale()
{
// 参数
$params = input();
$order_id = isset($params['id']) ? intval($params['id']) : 0;
$goods_id = isset($params['gid']) ? intval($params['gid']) : 0;
$ret = OrderAftersaleService::OrdferGoodsRow($order_id, $goods_id, $this->user['id']);
if($ret['code'] == 0)
{
$this->assign('goods', $ret['data']['items']);
$this->assign('order', $ret['data']);
// 仅退款原因
$return_only_money_reason = MyC('home_order_aftersale_return_only_money_reason');
$this->assign('return_only_money_reason_list', empty($return_only_money_reason) ? [] : explode("\n", $return_only_money_reason));
// 退款退货原因
$return_money_goods_reason = MyC('home_order_aftersale_return_money_goods_reason');
$this->assign('return_money_goods_reason_list', empty($return_money_goods_reason) ? [] : explode("\n", $return_money_goods_reason));
// 获取当前订单商品售后最新的一条纪录
$data_params = [
'm' => 0,
'n' => 1,
'where' => [
['order_id', '=', $order_id],
['goods_id', '=', $goods_id],
['user_id', '=', $this->user['id']],
],
];
$new_aftersale = OrderAftersaleService::OrderGoodsAftersaleList($data_params);
$this->assign('new_aftersale_data', empty($new_aftersale['data'][0]) ? [] : $new_aftersale['data'][0]);
$this->assign('params', $params);
return $this->fetch();
} else {
$this->assign('msg', $ret['msg']);
return $this->fetch('public/tips_error');
}
}
/**
* 申请售后创建
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2019-05-23
* @desc description
*/
public function AftersaleCreate()
{
$params = input();
$params['user'] = $this->user;
return OrderAftersaleService::AftersaleCreate($params);
}
/**
* 申请售后-用户发货
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2019-05-23
* @desc description
*/
public function AftersaleDelivery()
{
$params = input();
$params['user'] = $this->user;
return OrderAftersaleService::AftersaleDelivery($params);
}
/**
* 订单支付
* @author Devil

View File

@ -0,0 +1,240 @@
<?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\index\controller;
use app\service\OrderService;
use app\service\PaymentService;
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();
}
/**
* 订单列表
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2018-09-28
* @desc description
*/
public function Index()
{
// 参数
$params = input();
$params['user'] = $this->user;
$params['user_type'] = 'user';
// 分页
$number = 10;
// 条件
$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,
);
$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 2018-10-08
* @desc description
*/
public function Detail()
{
// 参数
$params = input();
$params['user'] = $this->user;
$params['user_type'] = 'user';
// 条件
$where = OrderService::OrderListWhere($params);
// 获取列表
$data_params = array(
'm' => 0,
'n' => 1,
'where' => $where,
);
$data = OrderService::OrderList($data_params);
if(!empty($data['data'][0]))
{
// 发起支付 - 支付方式
$this->assign('buy_payment_list', PaymentService::BuyPaymentList(['is_enable'=>1, 'is_open_user'=>1]));
$this->assign('data', $data['data'][0]);
// 参数
$this->assign('params', $params);
return $this->fetch();
} else {
$this->assign('msg', '没有相关数据');
return $this->fetch('public/tips_error');
}
}
/**
* 售后页面
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2019-05-21
* @desc description
*/
public function Aftersale()
{
// 参数
$params = input();
$order_id = isset($params['id']) ? intval($params['id']) : 0;
$goods_id = isset($params['gid']) ? intval($params['gid']) : 0;
$ret = OrderAftersaleService::OrdferGoodsRow($order_id, $goods_id, $this->user['id']);
if($ret['code'] == 0)
{
$this->assign('goods', $ret['data']['items']);
$this->assign('order', $ret['data']);
// 仅退款原因
$return_only_money_reason = MyC('home_order_aftersale_return_only_money_reason');
$this->assign('return_only_money_reason_list', empty($return_only_money_reason) ? [] : explode("\n", $return_only_money_reason));
// 退款退货原因
$return_money_goods_reason = MyC('home_order_aftersale_return_money_goods_reason');
$this->assign('return_money_goods_reason_list', empty($return_money_goods_reason) ? [] : explode("\n", $return_money_goods_reason));
// 获取当前订单商品售后最新的一条纪录
$data_params = [
'm' => 0,
'n' => 1,
'where' => [
['order_id', '=', $order_id],
['goods_id', '=', $goods_id],
['user_id', '=', $this->user['id']],
],
];
$new_aftersale = OrderAftersaleService::OrderAftersaleList($data_params);
$this->assign('new_aftersale_data', empty($new_aftersale['data'][0]) ? [] : $new_aftersale['data'][0]);
// 静态数据
$this->assign('common_order_aftersale_type_list', lang('common_order_aftersale_type_list'));
$this->assign('params', $params);
return $this->fetch();
} else {
$this->assign('msg', $ret['msg']);
return $this->fetch('public/tips_error');
}
}
/**
* 申请售后创建
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2019-05-23
* @desc description
*/
public function Create()
{
$params = input();
$params['user'] = $this->user;
return OrderAftersaleService::AftersaleCreate($params);
}
/**
* 用户退货
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2019-05-23
* @desc description
*/
public function Delivery()
{
$params = input();
$params['user'] = $this->user;
return OrderAftersaleService::AftersaleDelivery($params);
}
/**
* 订单取消
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2018-09-30
* @desc description
*/
public function Cancel()
{
if(input('post.'))
{
$params = input('post.');
$params['user'] = $this->user;
return OrderAftersaleService::AftersaleCancel($params);
} else {
$this->assign('msg', '非法访问');
return $this->fetch('public/tips_error');
}
}
}
?>

View File

@ -47,7 +47,7 @@ class Search extends Common
$this->params['screening_price_id'] = intval(input('screening_price_id', 0));
// 搜索关键字
$this->params['keywords'] = str_replace(['?', ' ', '+', '-'], '', trim(input('keywords')));
$this->params['wd'] = str_replace(['?', ' ', '+', '-'], '', trim(input('wd')));
// 排序方式
$this->params['order_by_field'] = input('order_by_field', 'default');
@ -68,11 +68,11 @@ class Search extends Common
{
if(input('post.'))
{
$p = empty($this->params['keywords']) ? [] : ['keywords'=>$this->params['keywords']];
$p = empty($this->params['wd']) ? [] : ['wd'=>$this->params['wd']];
return redirect(MyUrl('index/search/index', $p));
} else {
// 品牌列表
$this->assign('brand_list', BrandService::CategoryBrandList(['category_id'=>$this->params['category_id'], 'keywords'=>$this->params['keywords']]));
$this->assign('brand_list', BrandService::CategoryBrandList(['category_id'=>$this->params['category_id'], 'keywords'=>$this->params['wd']]));
// 商品分类
$this->assign('category_list', SearchService::GoodsCategoryList(['category_id'=>$this->params['category_id']]));
@ -99,8 +99,9 @@ class Search extends Common
* @desc description
*/
public function GoodsList()
{
{
// 获取商品列表
$this->params['keywords'] = $this->params['wd'];
$ret = SearchService::GoodsList($this->params);
if(empty($ret['data']['data']))
{

View File

@ -185,7 +185,7 @@
</td>
<td class="row-number">
{{if in_array($order['status'], [2,3,4])}}
<a href="{{:MyUrl('index/order/aftersale', ['id'=>$order['id'], 'gid'=>$goods['goods_id']])}}" target="_blank">申请售后</a>
<a href="{{:MyUrl('index/orderaftersale/aftersale', ['id'=>$order['id'], 'gid'=>$goods['goods_id']])}}" target="_blank">申请售后</a>
{{/if}}
</td>
{{if $keys eq 0}}

View File

@ -120,64 +120,63 @@
<!-- 类型 -->
<div class="am-cf aftersale-type">
<div class="am-fl items-align" data-type="0">
<div class="items-middle">
<div class="am-fl icon">
<i class="am-icon-random"></i>
{{foreach $common_order_aftersale_type_list as $v}}
<div class="items-align {{$v.class}}" data-type="{{$v.value}}">
<div class="items-middle">
<div class="am-fl icon">
<i class="{{$v.icon}}"></i>
</div>
<p class="name">{{$v.name}}</p>
<p class="desc">{{$v.desc}}</p>
</div>
<p class="name">仅退款</p>
<p class="desc">未收到货(未签收),协商同意前提下</p>
</div>
</div>
<div class="am-fr items-align" data-type="1">
<div class="items-middle">
<div class="am-fl icon">
<i class="am-icon-retweet"></i>
</div>
<p class="name">退货退款</p>
<p class="desc">已收到货,需要退换已收到的货物</p>
</div>
</div>
{{/foreach}}
</div>
<!-- 步骤 -->
{{include file="order/aftersale_step" /}}
{{include file="orderaftersale/step" /}}
<!-- 表单 -->
<div class="am-panel am-panel-default aftersale-form-panel none">
<div class="am-panel-bd">
{{include file="order/aftersale_create" /}}
{{include file="orderaftersale/create" /}}
</div>
</div>
{{else /}}
<!-- 步骤 -->
{{include file="order/aftersale_step" /}}
{{include file="orderaftersale/step" /}}
<!-- 状态环节 -->
{{switch $new_aftersale_data.status}}
{{case 0}}
<div class="am-alert">
当前订单商品售后已提交申请,等待管理员确认中!<a href="#">详情查看</a>
当前订单商品售后已提交申请,等待管理员确认中!<a href="{{:MyUrl('index/orderaftersale/index', ['keywords'=>$new_aftersale_data['order_no']])}}">详情查看</a>
</div>
{{/case}}
{{case 1}}
<div class="am-panel am-panel-default aftersale-form-panel">
<div class="am-panel-bd">
{{include file="order/aftersale_delivery" /}}
{{if $new_aftersale_data['type'] eq 1}}
<div class="am-panel am-panel-default aftersale-form-panel">
<div class="am-panel-bd">
{{include file="orderaftersale/delivery" /}}
</div>
</div>
</div>
{{else /}}
<div class="am-alert">
当前订单商品售后已提交申请,等待管理员确认中!<a href="{{:MyUrl('index/orderaftersale/index', ['keywords'=>$new_aftersale_data['order_no']])}}">详情查看</a>
</div>
{{/if}}
{{/case}}
{{case 2}}
<div class="am-alert">
当前订单商品售后已退货,等待管理员审核中!<a href="#">详情查看</a>
当前订单商品售后已退货,等待管理员审核中!<a href="{{:MyUrl('index/orderaftersale/index', ['keywords'=>$new_aftersale_data['order_no']])}}">详情查看</a>
</div>
{{/case}}
{{case 3}}
<div class="am-alert am-alert-success">
当前订单商品售后已处理结束!<a href="#">详情查看</a>
当前订单商品售后已处理结束!<a href="{{:MyUrl('index/orderaftersale/index', ['keywords'=>$new_aftersale_data['order_no']])}}">详情查看</a>
</div>
{{/case}}
{{/switch}}

View File

@ -1,4 +1,4 @@
<form class="am-form form-validation view-save" action="{{:MyUrl('index/order/aftersalecreate')}}" method="POST" request-type="ajax-reload">
<form class="am-form form-validation view-save" action="{{:MyUrl('index/orderaftersale/create')}}" method="POST" request-type="ajax-reload">
<div class="am-form-group">
<label>退款原因<span class="am-form-group-label-tips-must">必选</span></label>
<select name="reason" class="chosen-select" data-placeholder="退款原因..." data-validation-message="请选择退款原因" data-only-json='{{:json_encode($return_only_money_reason_list)}}' data-goods-json='{{:json_encode($return_money_goods_reason_list)}}' required>

View File

@ -1,4 +1,4 @@
<form class="am-form form-validation view-save" action="{{:MyUrl('index/order/aftersaledelivery')}}" method="POST" request-type="ajax-reload">
<form class="am-form form-validation view-save" action="{{:MyUrl('index/orderaftersale/delivery')}}" method="POST" request-type="ajax-reload">
<div class="am-form-group">
<label>快递名称<span class="am-form-group-label-tips-must">必选</span></label>
<input type="text" name="express_name" class="am-radius" placeholder="快递名称" minlength="1" maxlength="60" data-validation-message="快递名称格式 1~60 个字符之间" required />

View File

@ -0,0 +1,174 @@
{{include file="public/header" /}}
<!-- header top nav -->
{{include file="public/header_top_nav" /}}
<!-- search -->
{{include file="public/nav_search" /}}
<!-- header nav -->
{{include file="public/header_nav" /}}
<!-- goods category -->
{{include file="public/goods_category" /}}
<!-- content -->
<div class="am-container user-main">
<!-- user menu start -->
{{include file="public/user_menu" /}}
<!-- user menu end -->
<!-- content start -->
<div class="user-content">
<div class="user-content-body">
<!-- form start -->
<form class="am-form form-validation form-search" method="post" action="{{:MyUrl('index/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('index/orderaftersale/index')}}" class="am-btn am-btn-warning am-radius am-btn-sm reset-submit">清除条件</a>
</td>
</tr>
</tbody>
</table>
</form>
<!-- form end -->
<!-- 列表 -->
<div class="data-list am-margin-top-sm">
<table class="am-table am-table-striped">
<thead>
<tr>
<th>申请信息</th>
<th class="am-hide-sm-only">凭证</th>
<th>状态</th>
<th class="am-hide-sm-only">快递信息</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{{if !empty($data_list)}}
{{foreach $data_list as $v}}
<tr>
<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>
<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 class="operation">
{{if in_array($v['status'], [0,3])}}
<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>
{{/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>
</td>
</tr>
{{/foreach}}
{{/if}}
</tbody>
</table>
{{if empty($data_list)}}
<div class="table-no"><i class="am-icon-warning"></i> 没有相关数据</div>
{{/if}}
</div>
<!-- 分页 -->
{{if !empty($data_list)}}
{{$page_html|raw}}
{{/if}}
</div>
</div>
<!-- content end -->
</div>
<!-- footer start -->
{{include file="public/footer" /}}
<!-- footer end -->

View File

@ -5,7 +5,7 @@
<i class="am-icon-caret-right"></i>
<i class="am-icon-angle-right"></i>
</li>
<li class="am-text-truncate {{if isset($new_aftersale_data['status']) and $new_aftersale_data['status'] elt 3 and $new_aftersale_data['status'] egt 0}} selected{{/if}} {{if isset($new_aftersale_data['status']) and $new_aftersale_data['status'] eq 0}} selected-end{{/if}}">
<li class="am-text-truncate {{if isset($new_aftersale_data['status']) and $new_aftersale_data['status'] elt 3 and $new_aftersale_data['status'] egt 0}} selected{{/if}} {{if isset($new_aftersale_data['status']) and $new_aftersale_data['status'] elt 2}} selected-end{{/if}}">
<span class="number">2</span>
<span class="text">管理员审核</span>
{{if isset($new_aftersale_data['status']) and $new_aftersale_data['status'] elt 3 and $new_aftersale_data['status'] egt 0}}

View File

@ -90,7 +90,7 @@
</a> {{$Think.APPLICATION_VERSION}}
</p>
<p>
<a href="http://www.miitbeian.gov.cn/" target="_blank">{{:MyC('home_site_icp')}}</a>
<a href="http://www.beian.miit.gov.cn/" target="_blank">{{:MyC('home_site_icp')}}</a>
</p>
</div>
</div>

View File

@ -14,13 +14,13 @@
<div class="search-bar">
<form action="{{:MyUrl('index/search/index')}}" method="POST">
<div class="search-group">
<input id="search-input" name="keywords" type="text" placeholder="其实搜索很简单^_^ !" value="{{if !empty($params['keywords'])}}{{$params.keywords}}{{/if}}" autocomplete="off" />
<input id="search-input" name="wd" type="text" placeholder="其实搜索很简单^_^ !" value="{{if !empty($params['wd'])}}{{$params.wd}}{{/if}}" autocomplete="off" />
<input id="ai-topsearch" class="submit am-btn" placeholder="其实搜索很简单^_^ !" index="1" type="submit" value="搜索" />
</div>
{{if !empty($home_search_keywords)}}
<ul class="search-hot-keywords">
{{foreach $home_search_keywords as $v}}
<li><a href="{{:MyUrl('index/search/index', ['keywords'=>$v])}}" target="_blank">{{$v}}</a></li>
<li><a href="{{:MyUrl('index/search/index', ['wd'=>$v])}}" target="_blank">{{$v}}</a></li>
{{/foreach}}
</ul>
{{/if}}

View File

@ -294,6 +294,29 @@ return array(
4 => array('value' => 4, 'name' => '拨打电话'),
),
// 订单售后类型
'common_order_aftersale_type_list' => array(
0 => array('value' => 0, 'name' => '仅退款', 'desc' => '未收到货(未签收),协商同意前提下', 'icon' => 'am-icon-random', 'class' => 'am-fl'),
1 => array('value' => 1, 'name' => '退款退货', 'desc' => '已收到货,需要退换已收到的货物', 'icon' => 'am-icon-retweet', 'class' => 'am-fr'),
),
// 订单售后状态
'common_order_aftersale_status_list' => array(
0 => array('value' => 0, 'name' => '待确认'),
1 => array('value' => 1, 'name' => '待退货'),
2 => array('value' => 2, 'name' => '待审核'),
3 => array('value' => 3, 'name' => '已完成'),
4 => array('value' => 4, 'name' => '已拒绝'),
5 => array('value' => 5, 'name' => '已取消'),
),
// 订单售后退款方式
'common_order_aftersale_refundment_list' => array(
0 => array('value' => 0, 'name' => '原路退回'),
1 => array('value' => 1, 'name' => '退至钱包'),
2 => array('value' => 2, 'name' => '手动处理'),
),
// 色彩值
'common_color_list' => array(

View File

@ -710,6 +710,13 @@ class NavigationService
'contains' => ['orderindex', 'orderdetail', 'ordercomments'],
'icon' => 'am-icon-th-list',
],
[
'name' => '订单售后',
'url' => MyUrl('index/orderaftersale/index'),
'is_show' => 1,
'contains' => ['orderaftersaleindex', 'orderaftersaleaftersale'],
'icon' => 'am-icon-puzzle-piece',
],
[
'name' => '我的收藏',
'url' => MyUrl('index/userfavor/goods'),

View File

@ -24,22 +24,6 @@ use app\service\ResourcesService;
*/
class OrderAftersaleService
{
// 订单售后类型
public static $order_aftersale_type_list = [
0 => '仅退款',
1 => '退款退货',
];
// 订单售后状态
public static $order_aftersale_status_list = [
0 => '待确认',
1 => '待退货',
2 => '待审核',
3 => '已完成',
4 => '已拒绝',
5 => '已取消',
];
/**
* 获取一条订单,附带一条指定商品
* @author Devil
@ -166,7 +150,7 @@ class OrderAftersaleService
['order_id', '=', intval($params['order_id'])],
['goods_id', '=', intval($params['goods_id'])],
['user_id', '=', $params['user']['id']],
['status', '<=', 1],
['status', '<=', 2],
];
$count = (int) Db::name('OrderAftersale')->where($where)->count();
if($count > 0)
@ -177,9 +161,8 @@ class OrderAftersaleService
// 获取历史申请售后条件
$where = [
['order_id', '=', intval($params['order_id'])],
['goods_id', '=', intval($params['goods_id'])],
['user_id', '=', $params['user']['id']],
['status', '<=', 2],
['status', '<=', 3],
];
// 退款金额
@ -196,6 +179,7 @@ class OrderAftersaleService
$number = isset($params['number']) ? intval($params['number']) : 0;
// 历史退货数量
$where[] = ['goods_id', '=', intval($params['goods_id'])];
$history_number = (int) Db::name('OrderAftersale')->where($where)->sum('number');
if($params['type'] == 1)
{
@ -217,6 +201,7 @@ class OrderAftersaleService
// 数据
$data = [
'order_no' => $order['data']['order_no'],
'type' => intval($params['type']),
'order_id' => intval($params['order_id']),
'goods_id' => intval($params['goods_id']),
@ -226,6 +211,7 @@ class OrderAftersaleService
'reason' => $params['reason'],
'msg' => $params['msg'],
'images' => json_encode($images),
'status' => ($params['type'] == 0) ? 2 : 0,
'add_time' => time(),
'apply_time' => time(),
];
@ -296,7 +282,8 @@ class OrderAftersaleService
}
if($aftersale['status'] != 1)
{
return DataReturn('该售后订单状态不可操作['.self::$order_aftersale_status_list[$aftersale['status']].']', -10);
$common_order_aftersale_status_list = lang('common_order_aftersale_status_list');
return DataReturn('该售后订单状态不可操作['.$common_order_aftersale_status_list[$aftersale['status']]['name'].']', -10);
}
// 数据
@ -315,7 +302,7 @@ class OrderAftersaleService
}
/**
* 获取订单商品售后纪录列表
* 获取订单售后纪录列表
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
@ -323,7 +310,7 @@ class OrderAftersaleService
* @desc description
* @param [array] $params [输入参数]
*/
public static function OrderGoodsAftersaleList($params = [])
public static function OrderAftersaleList($params = [])
{
$where = empty($params['where']) ? [] : $params['where'];
$m = isset($params['m']) ? intval($params['m']) : 0;
@ -335,6 +322,9 @@ class OrderAftersaleService
$data = Db::name('OrderAftersale')->field($field)->where($where)->limit($m, $n)->order($order_by)->select();
if(!empty($data))
{
$common_order_aftersale_type_list = lang('common_order_aftersale_type_list');
$common_order_aftersale_status_list = lang('common_order_aftersale_status_list');
$common_order_aftersale_refundment_list = lang('common_order_aftersale_refundment_list');
foreach($data as &$v)
{
// 用户信息
@ -347,10 +337,13 @@ class OrderAftersaleService
}
// 类型
$v['type_text'] = self::$order_aftersale_type_list[$v['type']];
$v['type_text'] = $common_order_aftersale_type_list[$v['type']]['name'];
// 状态
$v['status_text'] = self::$order_aftersale_status_list[$v['status']];
$v['status_text'] = $common_order_aftersale_status_list[$v['status']]['name'];
// 退款方式
$v['refundment_text'] = $common_order_aftersale_refundment_list[$v['refundment']]['name'];
// 图片
if(!empty($v['images']))
@ -381,6 +374,10 @@ class OrderAftersaleService
$v['audit_time_time'] = empty($v['audit_time']) ? null : date('Y-m-d H:i:s', $v['audit_time']);
$v['audit_time_date'] = empty($v['audit_time']) ? null : date('Y-m-d', $v['audit_time']);
// 取消时间
$v['cancel_time_time'] = empty($v['cancel_time']) ? null : date('Y-m-d H:i:s', $v['cancel_time']);
$v['cancel_time_date'] = empty($v['cancel_time']) ? null : date('Y-m-d', $v['cancel_time']);
// 添加时间
$v['add_time_time'] = date('Y-m-d H:i:s', $v['add_time']);
$v['add_time_date'] = date('Y-m-d', $v['add_time']);
@ -393,5 +390,150 @@ class OrderAftersaleService
}
return DataReturn('获取成功', 0, $data);
}
/**
* 订单售后列表条件
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2018-09-29
* @desc description
* @param [array] $params [输入参数]
*/
public static function OrderAftersaleListWhere($params = [])
{
// 用户类型
$user_type = isset($params['user_type']) ? $params['user_type'] : 'user';
// 条件初始化
$where = [];
// id
if(!empty($params['id']))
{
$where[] = ['id', '=', intval($params['id'])];
}
// 用户类型
if(isset($params['user_type']) && $params['user_type'] == 'user')
{
// 用户id
if(!empty($params['user']))
{
$where[] = ['user_id', '=', $params['user']['id']];
}
}
// 关键字根据用户筛选
if(!empty($params['keywords']))
{
if(empty($params['user']))
{
$user_ids = Db::name('User')->where('username|nickname|mobile|email', '=', $params['keywords'])->column('id');
if(!empty($user_ids))
{
$where[] = ['user_id', 'in', $user_ids];
} else {
// 无数据条件,走单号条件
$where[] = ['order_no', '=', $params['keywords']];
}
} else {
// 用户走关键字
$where[] = ['order_no', '=', $params['keywords']];
}
}
// 是否更多条件
if(isset($params['is_more']) && $params['is_more'] == 1)
{
// 等值
if(isset($params['type']) && $params['type'] > -1)
{
$where[] = ['type', '=', intval($params['type'])];
}
if(isset($params['refundment']) && $params['refundment'] > -1)
{
$where[] = ['refundment', '=', intval($params['refundment'])];
}
if(isset($params['status']) && $params['status'] > -1)
{
$where[] = ['status', '=', intval($params['status'])];
}
if(!empty($params['express_number']))
{
$where[] = ['express_number', '=', $params['express_number']];
}
// 时间
if(!empty($params['time_start']))
{
$where[] = ['add_time', '>', strtotime($params['time_start'])];
}
if(!empty($params['time_end']))
{
$where[] = ['add_time', '<', strtotime($params['time_end'])];
}
}
return $where;
}
/**
* 订单售后总数
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2018-09-29
* @desc description
* @param [array] $where [条件]
*/
public static function OrderAftersaleTotal($where = [])
{
return (int) Db::name('OrderAftersale')->where($where)->count();
}
/**
* 订单售后取消
* @author Devil
* @blog http://gong.gg/
* @version 0.0.1
* @datetime 2016-12-06T21:31:53+0800
* @param [array] $params [输入参数]
*/
public static function AftersaleCancel($params = [])
{
// 请求参数
$p = [
[
'checked_type' => 'empty',
'key_name' => 'id',
'error_msg' => '操作id有误',
],
[
'checked_type' => 'empty',
'is_checked' => 2,
'key_name' => 'user',
'error_msg' => '用户信息有误',
],
];
$ret = ParamsChecked($params, $p);
if($ret !== true)
{
return DataReturn($ret, -1);
}
// 数据更新
$where = [
'id' => intval($params['id']),
];
if(!empty($params['user']['id']))
{
$where['user_id'] = $params['user']['id'];
}
if(Db::name('OrderAftersale')->where($where)->update(['status'=>5, 'cancel_time'=>time(), 'upd_time'=>time()]))
{
return DataReturn('取消成功');
}
return DataReturn('取消失败', -100);
}
}
?>

View File

@ -163,14 +163,19 @@ class SearchService
$screening_price = $price['min_price'].'-'.$price['max_price'];
}
// 参数
$params['screening_price'] = $screening_price;
$params['ymd'] = date('Ymd');
$params['add_time'] = time();
unset($params['screening_price_id'], $params['page'], $params['max_price'], $params['min_price']);
// 添加日志
Db::name('SearchHistory')->insert($params);
$data = [
'user_id' => isset($params['user_id']) ? intval($params['user_id']) : 0,
'brand_id' => isset($params['brand_id']) ? intval($params['brand_id']) : 0,
'category_id' => isset($params['category_id']) ? intval($params['category_id']) : 0,
'keywords' => empty($params['keywords']) ? '' : $params['keywords'],
'order_by_field' => empty($params['order_by_field']) ? '' : $params['order_by_field'],
'order_by_type' => empty($params['order_by_type']) ? '' : $params['order_by_type'],
'screening_price' => $screening_price,
'ymd' => date('Ymd'),
'add_time' => time(),
];
Db::name('SearchHistory')->insert($data);
}
/**

File diff suppressed because one or more lines are too long

View File

@ -307,6 +307,7 @@ color: #F5F5F2;font-size: 12px;cursor:pointer;border-radius:0px 0px; position: a
}
.footer-about li {
text-align: left;
line-height: 24px;
}
.footer-about li span, .footer-about li a {
font-size: 14px;

View File

@ -0,0 +1,8 @@
.data-list .am-slider {
width: 130px;
max-height: 108px;
overflow: hidden;
}
.data-list .operation {
width: 100px;
}

View File

@ -152,7 +152,7 @@ $(function()
// 请求参数处理
var data = {
category_id: $('.search-content').data('category-id') || 0,
keywords: $('#search-input').val() || '',
wd: $('#search-input').val() || '',
page: page || parseInt($('.search-pages-submit').attr('data-page')) || 1,
order_by_field: $('.sort-nav li.active').attr('data-field') || 'default',
order_by_type: $('.sort-nav li.active').attr('data-type') == 'asc' ? 'desc' : 'asc',