This commit is contained in:
xman 2025-06-02 20:25:31 +08:00
parent f07ed061a8
commit 433f3bbce4
8 changed files with 200 additions and 52 deletions

View File

@ -255,15 +255,15 @@ class Aftersale extends Backend
$result = $row->allowField(true)->save($params);
if($params['handle_type'] == 1 && $params['status'] == 2){ //处理完成,重新计算利润
/*if($params['handle_type'] == 1 && $params['status'] == 2){ //处理完成,重新计算利润
$row->refund_status = 1;
$row->refund_status = 3;
$row->save();
$order = Order::get($row->order_id);
//重新计算订单利润
$orderLogic = new OrderLogic();
$orderLogic->recacle($order,$row);
}
}*/
Db::commit();
} catch (ValidateException|PDOException|Exception $e) {
Db::rollback();
@ -276,4 +276,29 @@ class Aftersale extends Backend
}
public function delete($ids){
$row = $this->model->get($ids);
if(empty($row)){
$this->error('售后不存在');
}
$order = Order::get($row->order_id);
if(empty($order)){
$this->error('订单不存在');
}
if($row->handle_type == 1){ //退款
if($row->status == 4){
$this->error('退款已完成,不可撤销');
}
}else{
if($row->status == 2){
$this->error('售后已完成,不可撤销');
}
}
$order->aftersale_id = 0;
$order->save();
$row->status = -1;
$row->save();
$this->success();
}
}

View File

@ -70,7 +70,7 @@ class Aftersale2 extends Backend
list($where, $sort, $order, $offset, $limit) = $this->buildparams();
$builder = $this->model
->where('refund_status','=',1)
->whereIn('fa_aftersale.status',[3,4])
->with(['order'])
->where($where);
@ -224,6 +224,10 @@ class Aftersale2 extends Backend
$this->view->assign('row', $row);
return $this->view->fetch();
}
if($row->status != 3 || $row->handle_type!= 1){
$this->error('售后状态不是待退款,不可编辑');
}
$params = $this->request->post('row/a');
if (empty($params)) {
$this->error(__('Parameter %s can not be empty', ''));
@ -254,15 +258,15 @@ class Aftersale2 extends Backend
$params['worker_refund_time'] = date('Y-m-d H:i:s');
}
$params['status'] = 4;
$params['refund_time'] = date('Y-m-d H:i:s');
$result = $row->allowField(true)->save($params);
if($params['handle_type'] == 1 && $params['status'] == 2){ //处理完成,重新计算利润
$order = Order::get($row->order_id);
//重新计算订单利润
$orderLogic = new OrderLogic();
$orderLogic->recacle($order,$row);
$order = Order::get($row->order_id);
//重新计算订单利润
$orderLogic = new OrderLogic();
$orderLogic->recacle($order,$row);
}
Db::commit();
} catch (ValidateException|PDOException|Exception $e) {
Db::rollback();

View File

@ -0,0 +1,99 @@
<?php
return [
'Id' => 'ID',
'Order_id' => '订单ID',
'Status' => '状态',
'Status 1' => '待处理',
'Set status to 1' => '设为待处理',
'Status 2' => '已办结',
'Set status to 2' => '设为已办结',
'Status 3' => '已退款',
'Set status to 3' => '设为已退款',
'Status -1' => '已作废',
'Set status to -1' => '设为已作废',
'Handle_type' => '办结方式',
'Handle_type 1' => '退款',
'Handle_type 2' => '返修',
'Handle_type 3' => '客户无理取闹',
'Handle_type 4' => '其它',
'From' => '责任方',
'From 1' => '师傅',
'From 2' => '顾客',
'From 3' => '平台',
'Refund_amount' => '退款金额',
'Company_refund_amount' => '公司退款金额',
'Worker_refund_amount' => '师傅退款金额',
'Refund_type' => '退款方式',
'Refund_type 0' => '无',
'Refund_type 1' => '微信支付',
'Refund_type 2' => '平台退款',
'Worker_refund_entry' => '师傅退款入账',
'Worker_refund_entry 0' => '否',
'Worker_refund_entry 1' => '是',
'Refund_time' => '退款时间',
'Customer_appeal' => '客户诉求',
'Customer_qrcode' => '客户二维码',
'Images' => '退款凭证',
'Remark' => '情况说明',
'Create_time' => '创建时间',
'Update_time' => '编辑时间',
'Company_refund_time' => '公司退款时间',
'Worker_refund_time' => '师傅退款时间',
'Admin_id' => '创建人',
'Admin_user' => '创建人',
'Handle_admin_id' => '处理人',
'Handle_admin_user' => '处理人',
'Star' => '评分',
'Order.id' => 'ID',
'Order.order_no' => '订单编号',
'Order.customer' => '客户姓名',
'Order.tel' => '客户电话',
'Order.status' => '订单状态',
'Order.status 10' => '未派单',
'Order.status 20' => '已派单',
'Order.status 30' => '已接单',
'Order.status 40' => '处理中',
'Order.status 50' => '已完成',
'Order.status -10' => '取消',
'Order.status -20' => '作废',
'Order.status -30' => '已拒接',
'Order.area_id' => '地域',
'Order.address' => '详细地址',
'Order.work_tel_id' => '工作机',
'Order.worker_id' => '师傅ID',
'Order.worker_name' => '师傅姓名',
'Order.worker_tel' => '师傅手机',
'Order.source' => '订单来源',
'Order.source_uid' => '来源UID',
'Order.service_id' => '服务ID',
'Order.service_title' => '服务名称',
'Order.detail' => '订单详情',
'Order.remark' => '订单备注',
'Order.images' => '图片',
'Order.collect' => '是否收藏',
'Order.collect 0' => '否',
'Order.collect 1' => '是',
'Order.collect_remark' => '收藏备注',
'Order.enter_admin_id' => '录单员ID',
'Order.dispatch_admin_id' => '派单员ID',
'Order.dispatch_type' => '派单方式',
'Order.dispatch_type 10' => '线上手动',
'Order.dispatch_type 11' => '线上自动',
'Order.dispatch_type 20' => '线下',
'Order.total' => '总收款',
'Order.cost' => '成本',
'Order.performance' => '绩效',
'Order.sb_amount' => '垫付',
'Order.real_amount' => '实付',
'Order.cancel_reason_id' => '取消原因',
'Order.cancel_detail' => '取消详情',
'Order.abolish_reason_id' => '作废原因',
'Order.abolish_detail' => '作废详情',
'Order.create_time' => '录单时间',
'Order.update_time' => '更新时间',
'Order.payment_time' => '付款时间',
'Order.finishe_time' => '完成时间',
'Order.dispatch_time' => '派单时间',
'Order.delete_time' => '删除时间'
];

View File

@ -39,7 +39,8 @@ class Aftersale extends Model
{
return ['1' => __('Status 1'),
'2' => __('Status 2'),
//'3' => __('Status 3'),
'3' => __('待退款'),
'4' => __('已退款'),
'-1' => __('Status -1')];
}
@ -116,9 +117,6 @@ class Aftersale extends Model
return $list[$value] ?? '';
}
public function order()
{
return $this->belongsTo('Order', 'order_id', 'id', [], 'LEFT')->setEagerlyType(0);

View File

@ -47,18 +47,8 @@
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Handle_type')}:</label>
<div class="col-xs-12 col-sm-8">
<select id="c-handle_type" data-rule="required" class="form-control selectpicker" name="row[handle_type]">
{foreach name="handleTypeList" item="vo"}
<option value="{$key}" {in name="key" value="$row.handle_type"}selected{/in}>{$vo}</option>
{/foreach}
</select>
</div>
</div>
{if condition="$row.type eq 1"}
<div class="form-group">
@ -117,12 +107,6 @@
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Customer_appeal')}:</label>
<div class="col-xs-12 col-sm-8">
<textarea class="form-control" id="c-customer_appeal" name="row[customer_appeal]" data-rule="required" placeholder="客户诉求">{$row.customer_appeal|htmlentities}</textarea>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Customer_qrcode')}:</label>
@ -153,6 +137,17 @@
<ul class="row list-inline faupload-preview" id="p-images"></ul>
</div>
</div>
{/if}
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Customer_appeal')}:</label>
<div class="col-xs-12 col-sm-8">
<textarea class="form-control" id="c-customer_appeal" name="row[customer_appeal]" data-rule="required" placeholder="客户诉求">{$row.customer_appeal|htmlentities}</textarea>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Remark')}:</label>
<div class="col-xs-12 col-sm-8">
@ -173,17 +168,39 @@
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="radio">
{foreach name="statusList" item="vo"}
<label for="row[status]-{$key}"><input id="row[status]-{$key}" name="row[status]" type="radio" value="{$key}" {in name="key" value="$row.status"}checked{/in} /> {$vo}</label>
{/foreach}
</div>
<label for="row[status]-1">
<input id="row[status]-1" data-rule="required" name="row[status]" type="radio" value="-1" {eq name="row.status" value="-1"}checked{/eq} /> 取消
</label>
{if condition='$row.type eq 1'}
<label for="row[status]-3">
<input id="row[status]-3" data-rule="required" name="row[status]" type="radio" value="3" {eq name="row.status" value="3"}checked{/eq} /> 已确认,待财务处理
</label>
{else /}
<label for="row[status]-2">
<input id="row[status]-2" data-rule="required" name="row[status]" type="radio" value="2" {eq name="row.status" value="2"}checked{/eq} /> 办结
</label>
{/if}
</div>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">处理{:__('Handle_type')}:</label>
<div class="col-xs-12 col-sm-8">
<select id="c-handle_type" class="form-control selectpicker" name="row[handle_type]">
{foreach name="handleTypeList" item="vo"}
<option value="{$key}" {in name="key" value="4"}selected{/in}>{$vo}</option>
{/foreach}
</select>
</div>
</div>
{if condition='$row.status eq 1'}

View File

@ -1,14 +1,4 @@
<div class="panel panel-default panel-intro">
<div class="panel-heading">
{:build_heading(null,FALSE)}
<ul class="nav nav-tabs" data-field="status">
<li class="{:$Think.get.status === null ? 'active' : ''}"><a href="#t-all" data-value="" data-toggle="tab">{:__('All')}</a></li>
{foreach name="statusList" item="vo"}
<li class="{:$Think.get.status === (string)$key ? 'active' : ''}"><a href="#t-{$key}" data-value="{$key}" data-toggle="tab">{$vo}</a></li>
{/foreach}
</ul>
</div>
<div class="panel-body">

View File

@ -32,9 +32,11 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
{field: 'order.order_no', title: __('Order.order_no'), operate: '='},
{field: 'order.customer', title: __('Order.customer'), operate: false},
{field: 'order.tel', title: __('Order.tel'), operate: '='},
{field: 'type', title: __('售后类型'), searchList: {"1":__('退款'),"2":__('返修'),"3":__('其它')}, formatter: Table.api.formatter.normal},
{field: 'status', title: __('Status'), searchList: {"1":__('Status 1'),"2":__('Status 2'),
//"3":__('Status 3'),
"3":__('Status 3'), "4":__('Status 4'),
"-1":__('Status -1')}, formatter: Table.api.formatter.status},
{field: 'handle_type', title: __('Handle_type'), searchList: {"1":__('Handle_type 1'),"2":__('Handle_type 2'),"3":__('Handle_type 3'),"4":__('Handle_type 4')}, formatter: Table.api.formatter.normal},
{field: 'from', title: __('From'), searchList: {"1":__('From 1'),"2":__('From 2'),"3":__('From 3')}, formatter: Table.api.formatter.normal},
{field: 'refund_amount', title: __('Refund_amount'), operate:false},
@ -78,6 +80,21 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
}
return false;
}
},
{
name: 'delete',
text:"撤销",
title:"撤销",
icon: 'fa fa-trash red',
//title: __('Edit'),
extend: 'data-toggle="tooltip" data-container="body"',
classname: 'btn btn-xs btn-danger btn-dialog',
visible:function(row){
if(row.status === 1 || (row.status === 2 && row.handle_type === 1 && row.return_status === 1)){
return true;
}
return false;
}
}
],
}

View File

@ -32,10 +32,8 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
{field: 'order.order_no', title: __('Order.order_no'), operate: '='},
{field: 'order.customer', title: __('Order.customer'), operate: false},
{field: 'order.tel', title: __('Order.tel'), operate: '='},
{field: 'status', title: __('Status'), searchList: {"1":__('Status 1'),"2":__('Status 2'),
//"3":__('Status 3'),
"-1":__('Status -1')}, formatter: Table.api.formatter.status},
{field: 'handle_type', title: __('Handle_type'), searchList: {"1":__('Handle_type 1'),"2":__('Handle_type 2'),"3":__('Handle_type 3'),"4":__('Handle_type 4')}, formatter: Table.api.formatter.normal},
{field: 'status', title: __('处理状态'), searchList: {"3":__('待退款'),"4":__('已退款')}, formatter: Table.api.formatter.status},
// {field: 'handle_type', title: __('Handle_type'), searchList: {"1":__('Handle_type 1'),"2":__('Handle_type 2'),"3":__('Handle_type 3'),"4":__('Handle_type 4')}, formatter: Table.api.formatter.normal},
{field: 'from', title: __('From'), searchList: {"1":__('From 1'),"2":__('From 2'),"3":__('From 3')}, formatter: Table.api.formatter.normal},
{field: 'refund_amount', title: __('Refund_amount'), operate:false},
{field: 'company_refund_amount', title: __('Company_refund_amount'), operate:false},
@ -73,7 +71,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
extend: 'data-toggle="tooltip" data-container="body"',
classname: 'btn btn-xs btn-success btn-editone',
visible:function(row){
if(row.status === 1){
if(row.status === 3){
return true;
}
return false;