You've already forked guangan
常用回复和直接回复功能
This commit is contained in:
97
plugs/think-plugs-ticket/src/controller/CommonReply.php
Normal file
97
plugs/think-plugs-ticket/src/controller/CommonReply.php
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace plugin\ticket\controller;
|
||||||
|
|
||||||
|
use plugin\ticket\model\TicketCommonReply;
|
||||||
|
use think\admin\Controller;
|
||||||
|
use think\admin\helper\QueryHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 常用回复管理
|
||||||
|
*/
|
||||||
|
class CommonReply extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* 常用回复列表
|
||||||
|
* @auth true
|
||||||
|
* @menu true
|
||||||
|
* @return void
|
||||||
|
* @throws \think\db\exception\DataNotFoundException
|
||||||
|
* @throws \think\db\exception\DbException
|
||||||
|
* @throws \think\db\exception\ModelNotFoundException
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
$this->title = '常用回复列表';
|
||||||
|
TicketCommonReply::mQuery()->layTable(function () {
|
||||||
|
}, function (QueryHelper $query) {
|
||||||
|
$query->like(['title#keyword'])
|
||||||
|
->dateBetween(['create_at'])
|
||||||
|
->equal(['status']);
|
||||||
|
$query->append(['status_text']);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加常用回复
|
||||||
|
* @auth true
|
||||||
|
* @menu true
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function add()
|
||||||
|
{
|
||||||
|
$this->title = '添加常用回复';
|
||||||
|
TicketCommonReply::mForm('form');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 编辑常用回复
|
||||||
|
* @auth true
|
||||||
|
* @menu true
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function edit()
|
||||||
|
{
|
||||||
|
$this->title = '编辑常用回复';
|
||||||
|
TicketCommonReply::mForm('form');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除常用回复
|
||||||
|
* @auth true
|
||||||
|
* @menu true
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function remove()
|
||||||
|
{
|
||||||
|
TicketCommonReply::mDelete();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 启用常用回复
|
||||||
|
* @auth true
|
||||||
|
* @menu true
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function enable()
|
||||||
|
{
|
||||||
|
$this->_applyFormToken();
|
||||||
|
['id' => $id] = $this->_vali(['id.require' => '请指定常用回复ID!']);
|
||||||
|
TicketCommonReply::mk()->where(['id' => $id])->update(['status' => 1]);
|
||||||
|
$this->success('启用成功!');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 禁用常用回复
|
||||||
|
* @auth true
|
||||||
|
* @menu true
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function disable()
|
||||||
|
{
|
||||||
|
$this->_applyFormToken();
|
||||||
|
['id' => $id] = $this->_vali(['id.require' => '请指定常用回复ID!']);
|
||||||
|
TicketCommonReply::mk()->where(['id' => $id])->update(['status' => 0]);
|
||||||
|
$this->success('禁用成功!');
|
||||||
|
}
|
||||||
|
}
|
@ -3,6 +3,7 @@
|
|||||||
namespace plugin\ticket\controller;
|
namespace plugin\ticket\controller;
|
||||||
|
|
||||||
use plugin\points_mall\service\UserPointService;
|
use plugin\points_mall\service\UserPointService;
|
||||||
|
use plugin\ticket\model\TicketCommonReply;
|
||||||
use plugin\ticket\model\TicketTicket;
|
use plugin\ticket\model\TicketTicket;
|
||||||
use plugin\ticket\model\TicketType;
|
use plugin\ticket\model\TicketType;
|
||||||
use plugin\ticket\model\TicketUserShare;
|
use plugin\ticket\model\TicketUserShare;
|
||||||
@ -59,6 +60,7 @@ class UserShare extends Controller
|
|||||||
}
|
}
|
||||||
$this->type_list = TicketType::getList();
|
$this->type_list = TicketType::getList();
|
||||||
$this->user_list = SystemUser::query()->select();
|
$this->user_list = SystemUser::query()->select();
|
||||||
|
$this->common_reply_list = TicketCommonReply::query()->scope(['avail'])->select();
|
||||||
$this->fetch('detail');
|
$this->fetch('detail');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,6 +77,7 @@ class UserShare extends Controller
|
|||||||
if ($userShare->isEmpty()) $this->error('用户随手拍不存在!');
|
if ($userShare->isEmpty()) $this->error('用户随手拍不存在!');
|
||||||
if ($userShare->status !== 0) $this->error('用户随手拍已处理!');
|
if ($userShare->status !== 0) $this->error('用户随手拍已处理!');
|
||||||
$ticket_id = null;
|
$ticket_id = null;
|
||||||
|
$result = "已形成工单交由专人处理";
|
||||||
switch ($basic_data['_type']) {
|
switch ($basic_data['_type']) {
|
||||||
case 'new':
|
case 'new':
|
||||||
$data = $this->_vali([
|
$data = $this->_vali([
|
||||||
@ -112,6 +115,9 @@ class UserShare extends Controller
|
|||||||
$ticket->source = $userShare;
|
$ticket->source = $userShare;
|
||||||
$ticket->save();
|
$ticket->save();
|
||||||
break;
|
break;
|
||||||
|
case 'skip':
|
||||||
|
$result = "已处理完毕";
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
$this->error('参数错误');
|
$this->error('参数错误');
|
||||||
}
|
}
|
||||||
@ -121,6 +127,12 @@ class UserShare extends Controller
|
|||||||
UserPointService::addUserPoint($userShare->user_id, $basic_data['point_aware'], '用户随手拍奖励积分');
|
UserPointService::addUserPoint($userShare->user_id, $basic_data['point_aware'], '用户随手拍奖励积分');
|
||||||
$userShare->status = 1;
|
$userShare->status = 1;
|
||||||
$userShare->save();
|
$userShare->save();
|
||||||
|
$adminInfo = $this->request->session('user');
|
||||||
|
$userShare->logs()->save([
|
||||||
|
'op_name' => $adminInfo["username"],
|
||||||
|
'content' => $basic_data['content'],
|
||||||
|
'result' => $result,
|
||||||
|
]);
|
||||||
$this->success('处理成功!');
|
$this->success('处理成功!');
|
||||||
}
|
}
|
||||||
}
|
}
|
23
plugs/think-plugs-ticket/src/model/TicketCommonReply.php
Normal file
23
plugs/think-plugs-ticket/src/model/TicketCommonReply.php
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace plugin\ticket\model;
|
||||||
|
|
||||||
|
use think\admin\Model;
|
||||||
|
|
||||||
|
class TicketCommonReply extends Model
|
||||||
|
{
|
||||||
|
protected $table = 'ticket_common_reply';
|
||||||
|
protected $autoWriteTimestamp = true;
|
||||||
|
protected $createTime = 'create_at';
|
||||||
|
protected $updateTime = 'update_at';
|
||||||
|
|
||||||
|
public function getStatusTextAttr($value, $data)
|
||||||
|
{
|
||||||
|
return $data['status'] ? '启用' : '禁用';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function scopeAvail($query)
|
||||||
|
{
|
||||||
|
return $query->where('status', '=', 1);
|
||||||
|
}
|
||||||
|
}
|
@ -31,4 +31,9 @@ class TicketUserShare extends Model
|
|||||||
{
|
{
|
||||||
return $this->belongsTo(TicketTicket::class, 'linked_ticket_id', 'id');
|
return $this->belongsTo(TicketTicket::class, 'linked_ticket_id', 'id');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function logs()
|
||||||
|
{
|
||||||
|
return $this->hasMany(TicketUserShareLog::class, 'us_id', 'id');
|
||||||
|
}
|
||||||
}
|
}
|
21
plugs/think-plugs-ticket/src/model/TicketUserShareLog.php
Normal file
21
plugs/think-plugs-ticket/src/model/TicketUserShareLog.php
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace plugin\ticket\model;
|
||||||
|
|
||||||
|
use think\admin\Model;
|
||||||
|
|
||||||
|
class TicketUserShareLog extends Model
|
||||||
|
{
|
||||||
|
protected $table = 'ticket_user_share_log';
|
||||||
|
protected $append = ['op_name_with_result'];
|
||||||
|
|
||||||
|
public function getOpNameWithResultAttr($value, $data)
|
||||||
|
{
|
||||||
|
return $data['op_name'] . ($data['result'] ? " - {$data['result']}" : '');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function userShare()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(TicketUserShare::class, 'us_id', 'id');
|
||||||
|
}
|
||||||
|
}
|
20
plugs/think-plugs-ticket/src/view/common_reply/form.html
Normal file
20
plugs/think-plugs-ticket/src/view/common_reply/form.html
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<form class="layui-form layui-card margin-top-10 padding-10" action="{:sysuri()}" data-auto="true" method="post" autocomplete="off">
|
||||||
|
<input class="layui-input layui-hide" type='hidden' value="{:input('get.id')}" name='id'>
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<label class="layui-form-label">后台显示名称</label>
|
||||||
|
<div class="layui-input-block">
|
||||||
|
<input type="text" name="title" required class="layui-input" placeholder="请输入回复名称" value="{$vo.title|default=''}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<label class="layui-form-label">回复内容</label>
|
||||||
|
<div class="layui-input-block">
|
||||||
|
<textarea name="content" required class="layui-textarea" placeholder="请输入回复内容">{$vo.content|default=''}</textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="layui-form-item">
|
||||||
|
<div class="layui-input-block">
|
||||||
|
<button class="layui-btn" lay-submit lay-filter="formSubmit">提交</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
60
plugs/think-plugs-ticket/src/view/common_reply/index.html
Normal file
60
plugs/think-plugs-ticket/src/view/common_reply/index.html
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
{extend name="table"}
|
||||||
|
|
||||||
|
{block name="button"}
|
||||||
|
<!--{if auth("add")}-->
|
||||||
|
<a data-modal="{:url('add')}" data-height="80%" data-width="80%" class="layui-btn layui-btn-xs" title="新增">新增</a>
|
||||||
|
<!--{/if}-->
|
||||||
|
{/block}
|
||||||
|
|
||||||
|
{block name="content"}
|
||||||
|
<div class="layui-row">
|
||||||
|
<div class="layui-col">
|
||||||
|
<div class="article_list think-bg-white">
|
||||||
|
{include file='common_reply/index_search'}
|
||||||
|
<table class="layui-hide" data-url="{$request->url()}" data-target-search="form.form-search" id="commonReplyTable" lay-filter="commonReplyTable"></table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script type="text/html" id="toolbar">
|
||||||
|
<!--{if auth("edit")}-->
|
||||||
|
<a data-modal="{:url('edit')}?id={{ d.id }}" data-height="80%" data-width="80%" class="layui-btn layui-btn-xs" title="编辑">编辑</a>
|
||||||
|
<!--{/if}-->
|
||||||
|
{{# if(d.status == 0) { }}
|
||||||
|
<!--{if auth("enable")}-->
|
||||||
|
<a data-confirm="确定要启用此常用回复吗?" data-action="{:url('enable')}" data-value="id#{{ d.id }}" data-csrf="{:systoken('enable')}" class="layui-btn layui-btn-xs layui-btn-normal" title="启用">启用</a>
|
||||||
|
<!--{/if}-->
|
||||||
|
<!--{if auth("remove")}-->
|
||||||
|
<a data-confirm="确定要删除此常用回复吗?" data-action="{:url('remove')}" data-value="id#{{ d.id }}" data-csrf="{:systoken('remove')}" class="layui-btn layui-btn-xs layui-btn-danger" title="删除">删除</a>
|
||||||
|
<!--{/if}-->
|
||||||
|
{{# } else { }}
|
||||||
|
<!--{if auth("disable")}-->
|
||||||
|
<a data-confirm="确定要禁用此常用回复吗?" data-action="{:url('disable')}" data-value="id#{{ d.id }}" data-csrf="{:systoken('disable')}" class="layui-btn layui-btn-xs layui-btn-warm" title="禁用">禁用</a>
|
||||||
|
<!--{/if}-->
|
||||||
|
{{# } }}
|
||||||
|
</script>
|
||||||
|
{/block}
|
||||||
|
|
||||||
|
{block name='style'}
|
||||||
|
<style>
|
||||||
|
</style>
|
||||||
|
{/block}
|
||||||
|
|
||||||
|
{block name='script'}
|
||||||
|
<script>
|
||||||
|
$(function () {
|
||||||
|
$('#commonReplyTable').layTable({
|
||||||
|
height: 'full-250',
|
||||||
|
toolbar: true,
|
||||||
|
sort: {field: 'create_at', type: 'desc'},
|
||||||
|
title: '常用回复列表',
|
||||||
|
cols: [[
|
||||||
|
{field:'create_at', title: '创建时间', width: 160, sort: true},
|
||||||
|
{field:'title', title:'回复名称', width:160},
|
||||||
|
{field:'content', title:'回复内容', minWidth:100},
|
||||||
|
{field:'status_text', title:'状态', width:100},
|
||||||
|
{align: 'center', toolbar: '#toolbar', title: '操作', width: 200}
|
||||||
|
]]
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{/block}
|
@ -0,0 +1,16 @@
|
|||||||
|
<fieldset>
|
||||||
|
<legend>条件搜索</legend>
|
||||||
|
<form class="layui-form layui-form-pane form-search" action="{:request()->url()}" onsubmit="return false" method="get" autocomplete="off">
|
||||||
|
<div class="layui-form-item layui-inline">
|
||||||
|
<label class="layui-form-label">显示名称</label>
|
||||||
|
<div class="layui-input-inline">
|
||||||
|
<input name="keyword" value="{:input('get.keyword')}" placeholder="请输入显示名称" class="layui-input">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="layui-form-item layui-inline">
|
||||||
|
<button class="layui-btn layui-btn-primary" lay-submit lay-filter="searchData"><i class="layui-icon"></i> 搜 索</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</fieldset>
|
@ -1,7 +1,7 @@
|
|||||||
<div class="layui-tab layui-tab-brief">
|
<div class="layui-tab layui-tab-brief">
|
||||||
<ul class="layui-tab-title">
|
<ul class="layui-tab-title">
|
||||||
<li class="layui-this">基本信息</li>
|
<li class="layui-this">基本信息</li>
|
||||||
<li>关联工单</li>
|
<li>处置信息</li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="layui-tab-content">
|
<div class="layui-tab-content">
|
||||||
<div class="layui-tab-item layui-show">
|
<div class="layui-tab-item layui-show">
|
||||||
@ -105,35 +105,60 @@
|
|||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-tab-item">
|
<div class="layui-tab-item">
|
||||||
{if $vo.linked_ticket_id}
|
{if $vo.status eq 1}
|
||||||
<div class="layui-card">
|
{if $vo.linked_ticket_id}
|
||||||
<div class="layui-card-header">关联工单</div>
|
<div class="layui-card">
|
||||||
<div class="layui-card-body">
|
<div class="layui-card-header">关联工单</div>
|
||||||
<table class="layui-table">
|
<div class="layui-card-body">
|
||||||
<tbody class="layui-table-body">
|
<table class="layui-table">
|
||||||
<tr>
|
<tbody class="layui-table-body">
|
||||||
<td style="width: 120px">工单编号</td>
|
<tr>
|
||||||
<td>{$vo.linked_ticket.id|default=""}</td>
|
<td style="width: 120px">工单编号</td>
|
||||||
</tr>
|
<td>{$vo.linked_ticket.id|default=""}</td>
|
||||||
<tr>
|
</tr>
|
||||||
<td>工单类型</td>
|
<tr>
|
||||||
<td>{$vo.linked_ticket.type_name|default=""}</td>
|
<td>工单类型</td>
|
||||||
</tr>
|
<td>{$vo.linked_ticket.type_name|default=""}</td>
|
||||||
</tbody>
|
</tr>
|
||||||
</table>
|
<tr>
|
||||||
|
<td>工单标题</td>
|
||||||
|
<td>{$vo.linked_ticket.title|default=""}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>工单内容</td>
|
||||||
|
<td>{$vo.linked_ticket.content|default=""}</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
{else}
|
||||||
|
<div class="layui-card">
|
||||||
|
<div class="layui-card-header">直接回复</div>
|
||||||
|
<div class="layui-card-body">
|
||||||
|
<table class="layui-table">
|
||||||
|
<tbody class="layui-table-body">
|
||||||
|
<tr>
|
||||||
|
<td style="width: 120px">回复内容</td>
|
||||||
|
<td>{$vo.content|default=""}</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
{else}
|
{else}
|
||||||
<div class="layui-card">
|
<div class="layui-card">
|
||||||
<div class="layui-card-header">关联工单</div>
|
<div class="layui-card-header">处置随手拍</div>
|
||||||
<div class="layui-card-body">
|
<div class="layui-card-body">
|
||||||
<form action="{:url('link')}" method="post" class="layui-form">
|
<form action="{:url('link')}" method="post" class="layui-form">
|
||||||
<input type="hidden" name="id" value="{$vo.id}">
|
<input type="hidden" name="id" value="{$vo.id}">
|
||||||
<div class="layui-form-item">
|
<div class="layui-form-item">
|
||||||
<label class="layui-form-label">工单类型</label>
|
<label class="layui-form-label label-required">处置方式</label>
|
||||||
<div class="layui-input-block">
|
<div class="layui-input-block">
|
||||||
<select name="_type" lay-verify="required" lay-filter="Type">
|
<select name="_type" lay-verify="required" lay-filter="Type">
|
||||||
<option value="">请选择绑定方式</option>
|
<option value="">请选择处置方式</option>
|
||||||
|
<option value="skip">直接回复</option>
|
||||||
<option value="new">新建工单</option>
|
<option value="new">新建工单</option>
|
||||||
<option value="exist">已有工单</option>
|
<option value="exist">已有工单</option>
|
||||||
</select>
|
</select>
|
||||||
@ -173,14 +198,20 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-form-item">
|
<div class="layui-form-item">
|
||||||
<label class="layui-form-label">用户反馈</label>
|
<label class="layui-form-label label-required">用户反馈</label>
|
||||||
<div class="layui-input-block">
|
<div class="layui-input-block">
|
||||||
|
<select name="_common_reply" lay-filter="CommonReply">
|
||||||
|
<option value="">请选择常用回复</option>
|
||||||
|
{foreach $common_reply_list as $reply}
|
||||||
|
<option value="{$reply.content}">{$reply.title}</option>
|
||||||
|
{/foreach}
|
||||||
|
</select>
|
||||||
<textarea name="content" placeholder="请输入给用户反馈的内容" class="layui-textarea" lay-verify="required"></textarea>
|
<textarea name="content" placeholder="请输入给用户反馈的内容" class="layui-textarea" lay-verify="required"></textarea>
|
||||||
<div class="layui-form-mid layui-word-aux">给用户反馈的内容,会发送给用户,请谨慎填写</div>
|
<div class="layui-form-mid layui-word-aux">给用户反馈的内容,会发送给用户,请谨慎填写</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-form-item">
|
<div class="layui-form-item">
|
||||||
<label class="layui-form-label">积分奖励</label>
|
<label class="layui-form-label label-required">积分奖励</label>
|
||||||
<div class="layui-input-block">
|
<div class="layui-input-block">
|
||||||
<input value="0" name="point_aware" type="number" min="0" step="1" placeholder="请输入积分奖励" class="layui-input layui-input-number" lay-verify="required">
|
<input value="0" name="point_aware" type="number" min="0" step="1" placeholder="请输入积分奖励" class="layui-input layui-input-number" lay-verify="required">
|
||||||
</div>
|
</div>
|
||||||
@ -214,6 +245,9 @@
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
form.on('select(CommonReply)', function (data) {
|
||||||
|
$("textarea[name='content']").val(data.value)
|
||||||
|
});
|
||||||
form.on('submit(submit)', function (data) {
|
form.on('submit(submit)', function (data) {
|
||||||
const field = data.field
|
const field = data.field
|
||||||
const _type = field._type
|
const _type = field._type
|
||||||
|
Reference in New Issue
Block a user