You've already forked guangan
工单
This commit is contained in:
@ -2,11 +2,13 @@
|
|||||||
|
|
||||||
namespace plugin\ticket\controller;
|
namespace plugin\ticket\controller;
|
||||||
|
|
||||||
|
use plugin\ticket\model\TicketDept;
|
||||||
use plugin\ticket\model\TicketReply;
|
use plugin\ticket\model\TicketReply;
|
||||||
use plugin\ticket\model\TicketTicket;
|
use plugin\ticket\model\TicketTicket;
|
||||||
use plugin\ticket\model\TicketType;
|
use plugin\ticket\model\TicketType;
|
||||||
use think\admin\Controller;
|
use think\admin\Controller;
|
||||||
use think\admin\helper\QueryHelper;
|
use think\admin\helper\QueryHelper;
|
||||||
|
use think\admin\model\SystemUser;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 工单管理
|
* 工单管理
|
||||||
@ -127,4 +129,34 @@ class Ticket extends Controller
|
|||||||
$data['contact'] = $adminInfo['contact_phone'];
|
$data['contact'] = $adminInfo['contact_phone'];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function move()
|
||||||
|
{
|
||||||
|
$this->title = "工单分配";
|
||||||
|
if ($this->request->isPost()) {
|
||||||
|
// 提交
|
||||||
|
$data = $this->_vali([
|
||||||
|
'id.require' => '请指定工单ID!',
|
||||||
|
'type.require' => '请指定分配类型!',
|
||||||
|
'dept_id.require' => '请指定处理部门!',
|
||||||
|
'user_id.require' => '请指定负责人员!',
|
||||||
|
]);
|
||||||
|
$ticket = TicketTicket::mk()->where('id', '=', $data['id'])->findOrEmpty();
|
||||||
|
if ($ticket->isEmpty()) $this->error('工单不存在!');
|
||||||
|
$ticket->fz_user_id = $data['user_id'];
|
||||||
|
$ticket->fz_dept_id = $data['dept_id'];
|
||||||
|
if ($data['type'] == 1) {
|
||||||
|
// 内部
|
||||||
|
$ticket->state = 1;
|
||||||
|
} else {
|
||||||
|
// 外部
|
||||||
|
$ticket->state = 2;
|
||||||
|
}
|
||||||
|
$ticket->save();
|
||||||
|
} else {
|
||||||
|
$this->dept_list = TicketDept::query()->scope('avail')->select();
|
||||||
|
$this->user_list = SystemUser::query()->select();
|
||||||
|
$this->fetch();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -32,7 +32,22 @@ class TicketInter extends Controller
|
|||||||
$query->like(['title|content|contact_name|ticket_address|contact_phone#keyword'])
|
$query->like(['title|content|contact_name|ticket_address|contact_phone#keyword'])
|
||||||
->dateBetween(['create_at'])
|
->dateBetween(['create_at'])
|
||||||
->equal(['status', 'type_id']);
|
->equal(['status', 'type_id']);
|
||||||
$query->append(['imgs_arr', 'source_type_name', 'status_text', 'type_name', 'last_reply']);
|
$query->append(['imgs_arr', 'source_type_name', 'status_text', 'type_name']);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public function my()
|
||||||
|
{
|
||||||
|
$this->title = '我的工单';
|
||||||
|
$this->user_id = $this->request->session('user')['id'];
|
||||||
|
TicketTicketInter::mQuery()->layTable(function () {
|
||||||
|
|
||||||
|
}, function (QueryHelper $query) {
|
||||||
|
$query->like(['title|content|contact_name|ticket_address|contact_phone#keyword'])
|
||||||
|
->dateBetween(['create_at'])
|
||||||
|
->equal(['status', 'type_id']);
|
||||||
|
$query->append(['imgs_arr', 'source_type_name', 'status_text', 'type_name']);
|
||||||
|
$query->where(['current_admin_id' => $this->user_id]);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,6 +37,21 @@ class TicketOuter extends Controller
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function my()
|
||||||
|
{
|
||||||
|
$this->title = '我的工单';
|
||||||
|
$this->user_id = $this->request->session('user')['id'];
|
||||||
|
TicketTicketOuter::mQuery()->layTable(function () {
|
||||||
|
|
||||||
|
}, function (QueryHelper $query) {
|
||||||
|
$query->like(['title|content|contact_name|ticket_address|contact_phone#keyword'])
|
||||||
|
->dateBetween(['create_at'])
|
||||||
|
->equal(['status', 'type_id']);
|
||||||
|
$query->append(['imgs_arr', 'source_type_name', 'status_text', 'type_name']);
|
||||||
|
$query->where(['current_admin_id' => $this->user_id]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查看工单
|
* 查看工单
|
||||||
* @auth true
|
* @auth true
|
||||||
|
@ -8,6 +8,7 @@ use plugin\ticket\model\TicketType;
|
|||||||
use plugin\ticket\model\TicketUserShare;
|
use plugin\ticket\model\TicketUserShare;
|
||||||
use think\admin\Controller;
|
use think\admin\Controller;
|
||||||
use think\admin\helper\QueryHelper;
|
use think\admin\helper\QueryHelper;
|
||||||
|
use think\admin\model\SystemUser;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户随手拍
|
* 用户随手拍
|
||||||
@ -57,7 +58,7 @@ class UserShare extends Controller
|
|||||||
$this->ticket_list = [];
|
$this->ticket_list = [];
|
||||||
}
|
}
|
||||||
$this->type_list = TicketType::getList();
|
$this->type_list = TicketType::getList();
|
||||||
$this->user_list = [];
|
$this->user_list = SystemUser::query()->select();
|
||||||
$this->fetch('detail');
|
$this->fetch('detail');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,5 +6,8 @@ use think\admin\Model;
|
|||||||
|
|
||||||
class TicketDept extends Model
|
class TicketDept extends Model
|
||||||
{
|
{
|
||||||
|
public function scopeAvail($query)
|
||||||
|
{
|
||||||
|
$query->where('status', '=', 1);
|
||||||
|
}
|
||||||
}
|
}
|
@ -6,7 +6,9 @@ use think\admin\Model;
|
|||||||
|
|
||||||
class TicketTicket extends Model
|
class TicketTicket extends Model
|
||||||
{
|
{
|
||||||
protected $append = ['status_text', 'type_name'];
|
protected $append = ['status_text', 'type_name', 'dept_name'];
|
||||||
|
protected $globalScope = ['unConf'];
|
||||||
|
protected $table = 'ticket_ticket';
|
||||||
public function type()
|
public function type()
|
||||||
{
|
{
|
||||||
return $this->belongsTo(TicketType::class, 'type_id');
|
return $this->belongsTo(TicketType::class, 'type_id');
|
||||||
|
@ -4,7 +4,6 @@ namespace plugin\ticket\model;
|
|||||||
|
|
||||||
class TicketTicketInter extends TicketTicket
|
class TicketTicketInter extends TicketTicket
|
||||||
{
|
{
|
||||||
protected $append = ['status_text', 'type_name', 'dept_name'];
|
|
||||||
protected $globalScope = ['inter'];
|
protected $globalScope = ['inter'];
|
||||||
protected $table = 'ticket_ticket';
|
protected $table = 'ticket_ticket';
|
||||||
public function type()
|
public function type()
|
||||||
|
@ -4,7 +4,6 @@ namespace plugin\ticket\model;
|
|||||||
|
|
||||||
class TicketTicketOuter extends TicketTicket
|
class TicketTicketOuter extends TicketTicket
|
||||||
{
|
{
|
||||||
protected $append = ['status_text', 'type_name', 'dept_name'];
|
|
||||||
protected $globalScope = ['outer'];
|
protected $globalScope = ['outer'];
|
||||||
protected $table = 'ticket_ticket';
|
protected $table = 'ticket_ticket';
|
||||||
public function type()
|
public function type()
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
{extend name="table"}
|
{extend name="table"}
|
||||||
|
|
||||||
{block name="button"}
|
{block name="button"}
|
||||||
|
<button type="button" class="layui-btn layui-btn-sm layui-btn-primary" data-modal='{:url("my")}' data-title="我的工单">我的工单</button>
|
||||||
<!--{if auth("add")}-->
|
<!--{if auth("add")}-->
|
||||||
<button type="button" class="layui-btn layui-btn-sm layui-btn-disabled" data-modal='{:url("add")}' data-title="添加工单">添加工单</button>
|
<button type="button" class="layui-btn layui-btn-sm layui-btn-disabled" data-modal='{:url("add")}' data-title="添加工单">添加工单</button>
|
||||||
<!--{/if}-->
|
<!--{/if}-->
|
||||||
@ -22,14 +23,11 @@
|
|||||||
<a data-modal="{:url('detail')}?id={{ d.id }}" data-height="90%" data-width="60%" class="layui-btn layui-btn-xs layui-btn-normal" title="详情">详情</a>
|
<a data-modal="{:url('detail')}?id={{ d.id }}" data-height="90%" data-width="60%" class="layui-btn layui-btn-xs layui-btn-normal" title="详情">详情</a>
|
||||||
<!--{/if}-->
|
<!--{/if}-->
|
||||||
<!--{if auth("move")}-->
|
<!--{if auth("move")}-->
|
||||||
<a data-modal="{:url('move')}?ticket_id={{ d.id }}" data-height="80%" data-width="80%" class="layui-btn layui-btn-xs" title="流转">分配</a>
|
<a data-modal="{:url('move')}?ticket_id={{ d.id }}" data-height="80%" data-width="80%" class="layui-btn layui-btn-xs" title="分配">分配</a>
|
||||||
<!--{/if}-->
|
<!--{/if}-->
|
||||||
<!--{if auth("edit")}-->
|
<!--{if auth("edit")}-->
|
||||||
<a data-modal="{:url('edit')}?id={{ d.id }}" data-height="80%" data-width="80%" class="layui-btn layui-btn-xs layui-btn-danger" title="修改工单">修改</a>
|
<a data-modal="{:url('edit')}?id={{ d.id }}" data-height="80%" data-width="80%" class="layui-btn layui-btn-xs layui-btn-danger" title="修改工单">修改</a>
|
||||||
<!--{/if}-->
|
<!--{/if}-->
|
||||||
<!--{if auth("remove")}-->
|
|
||||||
<a data-confirm="是否删除此工单?" data-action="{:url('remove')}" data-value="id#{{ d.id }}" class="layui-btn layui-btn-xs layui-btn-danger" title="删除">删除</a>
|
|
||||||
<!--{/if}-->
|
|
||||||
</script>
|
</script>
|
||||||
{/block}
|
{/block}
|
||||||
|
|
||||||
|
@ -18,6 +18,9 @@
|
|||||||
<!--{if auth("detail")}-->
|
<!--{if auth("detail")}-->
|
||||||
<a data-modal="{:url('detail')}?id={{ d.id }}" data-height="90%" data-width="60%" class="layui-btn layui-btn-xs layui-btn-normal" title="详情">详情</a>
|
<a data-modal="{:url('detail')}?id={{ d.id }}" data-height="90%" data-width="60%" class="layui-btn layui-btn-xs layui-btn-normal" title="详情">详情</a>
|
||||||
<!--{/if}-->
|
<!--{/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}-->
|
||||||
</script>
|
</script>
|
||||||
{/block}
|
{/block}
|
||||||
|
|
||||||
|
78
plugs/think-plugs-ticket/src/view/ticket_inter/my.html
Normal file
78
plugs/think-plugs-ticket/src/view/ticket_inter/my.html
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
{extend name="table"}
|
||||||
|
|
||||||
|
{block name="button"}
|
||||||
|
<button type="button" class="layui-btn layui-btn-sm layui-btn-primary" data-modal='{:url("index")}' data-title="所有工单">所有工单</button>
|
||||||
|
{/block}
|
||||||
|
|
||||||
|
{block name="content"}
|
||||||
|
<div class="layui-tab">
|
||||||
|
<div class="layui-row">
|
||||||
|
<div class="layui-col">
|
||||||
|
<div class="article_list think-bg-white">
|
||||||
|
{include file='ticket_inter/index_search'}
|
||||||
|
<table class="layui-hide" data-url="{$request->url()}" data-target-search="form.form-search" id="ticketTable" lay-filter="ticketTable"></table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script type="text/html" id="toolbar">
|
||||||
|
<!--{if auth("detail")}-->
|
||||||
|
<a data-modal="{:url('detail')}?id={{ d.id }}" data-height="90%" data-width="60%" 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}-->
|
||||||
|
</script>
|
||||||
|
{/block}
|
||||||
|
|
||||||
|
{block name='style'}
|
||||||
|
<style>
|
||||||
|
</style>
|
||||||
|
{/block}
|
||||||
|
|
||||||
|
{block name='script'}
|
||||||
|
<script>
|
||||||
|
$(function () {
|
||||||
|
$('#ticketTable').layTable({
|
||||||
|
height: 'full-250',
|
||||||
|
toolbar: true,
|
||||||
|
sort: {field: 'create_at', type: 'desc'},
|
||||||
|
title: '工单列表',
|
||||||
|
cols: [[
|
||||||
|
{field:'create_at', title: '工单创建时间', width: 160, sort: true},
|
||||||
|
{field:'source_type_name', title:'工单来源', width:120},
|
||||||
|
{field:'type_name', title:'工单类型', width:160},
|
||||||
|
{field:'content', title:'工单内容', minWidth:100},
|
||||||
|
{field:'ticket_address', title:'工单地址', width:200, templet:function(item){
|
||||||
|
if (item.ticket_address) {
|
||||||
|
return `${item.ticket_region} ${item.ticket_address}`;
|
||||||
|
} else {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}},
|
||||||
|
{field: 'imgs', title: '工单图片', width: 100, templet:function(item){
|
||||||
|
if (item.imgs) {
|
||||||
|
return item.imgs.split("|").map((img) => {
|
||||||
|
return laytpl('<a target="_blank" data-tips-hover data-tips-image="{{d}}"><i class="layui-icon layui-icon-picture"></i></a>').render(img)
|
||||||
|
}).concat(' ')
|
||||||
|
} else {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}},
|
||||||
|
{field:'status', title:'状态', width:80, templet:function(item){
|
||||||
|
if(item.status == 0){
|
||||||
|
return '<span style="color:red;">正在处理</span>';
|
||||||
|
}else if(item.status == 1){
|
||||||
|
return '<span style="color:green;">已处理</span>';
|
||||||
|
}else{
|
||||||
|
return '<span style="color:gray;">已关闭</span>';
|
||||||
|
}
|
||||||
|
}},
|
||||||
|
|
||||||
|
{fixed: 'right', title:'操作', toolbar: '#toolbar', width:200}
|
||||||
|
]],
|
||||||
|
page: true
|
||||||
|
})
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
{/block}
|
@ -18,14 +18,8 @@
|
|||||||
<!--{if auth("detail")}-->
|
<!--{if auth("detail")}-->
|
||||||
<a data-modal="{:url('detail')}?id={{ d.id }}" data-height="90%" data-width="60%" class="layui-btn layui-btn-xs layui-btn-normal" title="详情">详情</a>
|
<a data-modal="{:url('detail')}?id={{ d.id }}" data-height="90%" data-width="60%" class="layui-btn layui-btn-xs layui-btn-normal" title="详情">详情</a>
|
||||||
<!--{/if}-->
|
<!--{/if}-->
|
||||||
<!--{if auth("move")}-->
|
|
||||||
<a data-modal="{:url('move')}?ticket_id={{ d.id }}" data-height="80%" data-width="80%" class="layui-btn layui-btn-xs" title="流转">分配</a>
|
|
||||||
<!--{/if}-->
|
|
||||||
<!--{if auth("edit")}-->
|
|
||||||
<a data-modal="{:url('edit')}?id={{ d.id }}" data-height="80%" data-width="80%" class="layui-btn layui-btn-xs layui-btn-danger" title="修改工单">修改</a>
|
|
||||||
<!--{/if}-->
|
|
||||||
<!--{if auth("remove")}-->
|
<!--{if auth("remove")}-->
|
||||||
<a data-confirm="是否删除此工单?" data-action="{:url('remove')}" data-value="id#{{ d.id }}" class="layui-btn layui-btn-xs layui-btn-danger" title="删除">删除</a>
|
<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}-->
|
<!--{/if}-->
|
||||||
</script>
|
</script>
|
||||||
{/block}
|
{/block}
|
||||||
|
78
plugs/think-plugs-ticket/src/view/ticket_outer/my.html
Normal file
78
plugs/think-plugs-ticket/src/view/ticket_outer/my.html
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
{extend name="table"}
|
||||||
|
|
||||||
|
{block name="button"}
|
||||||
|
<button type="button" class="layui-btn layui-btn-sm layui-btn-primary" data-modal='{:url("index")}' data-title="所有工单">所有工单</button>
|
||||||
|
{/block}
|
||||||
|
|
||||||
|
{block name="content"}
|
||||||
|
<div class="layui-tab">
|
||||||
|
<div class="layui-row">
|
||||||
|
<div class="layui-col">
|
||||||
|
<div class="article_list think-bg-white">
|
||||||
|
{include file='ticket_outer/index_search'}
|
||||||
|
<table class="layui-hide" data-url="{$request->url()}" data-target-search="form.form-search" id="ticketTable" lay-filter="ticketTable"></table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script type="text/html" id="toolbar">
|
||||||
|
<!--{if auth("detail")}-->
|
||||||
|
<a data-modal="{:url('detail')}?id={{ d.id }}" data-height="90%" data-width="60%" 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}-->
|
||||||
|
</script>
|
||||||
|
{/block}
|
||||||
|
|
||||||
|
{block name='style'}
|
||||||
|
<style>
|
||||||
|
</style>
|
||||||
|
{/block}
|
||||||
|
|
||||||
|
{block name='script'}
|
||||||
|
<script>
|
||||||
|
$(function () {
|
||||||
|
$('#ticketTable').layTable({
|
||||||
|
height: 'full-250',
|
||||||
|
toolbar: true,
|
||||||
|
sort: {field: 'create_at', type: 'desc'},
|
||||||
|
title: '工单列表',
|
||||||
|
cols: [[
|
||||||
|
{field:'create_at', title: '工单创建时间', width: 160, sort: true},
|
||||||
|
{field:'source_type_name', title:'工单来源', width:120},
|
||||||
|
{field:'type_name', title:'工单类型', width:160},
|
||||||
|
{field:'content', title:'工单内容', minWidth:100},
|
||||||
|
{field:'ticket_address', title:'工单地址', width:200, templet:function(item){
|
||||||
|
if (item.ticket_address) {
|
||||||
|
return `${item.ticket_region} ${item.ticket_address}`;
|
||||||
|
} else {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}},
|
||||||
|
{field: 'imgs', title: '工单图片', width: 100, templet:function(item){
|
||||||
|
if (item.imgs) {
|
||||||
|
return item.imgs.split("|").map((img) => {
|
||||||
|
return laytpl('<a target="_blank" data-tips-hover data-tips-image="{{d}}"><i class="layui-icon layui-icon-picture"></i></a>').render(img)
|
||||||
|
}).concat(' ')
|
||||||
|
} else {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}},
|
||||||
|
{field:'status', title:'状态', width:80, templet:function(item){
|
||||||
|
if(item.status == 0){
|
||||||
|
return '<span style="color:red;">正在处理</span>';
|
||||||
|
}else if(item.status == 1){
|
||||||
|
return '<span style="color:green;">已处理</span>';
|
||||||
|
}else{
|
||||||
|
return '<span style="color:gray;">已关闭</span>';
|
||||||
|
}
|
||||||
|
}},
|
||||||
|
|
||||||
|
{fixed: 'right', title:'操作', toolbar: '#toolbar', width:200}
|
||||||
|
]],
|
||||||
|
page: true
|
||||||
|
})
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
{/block}
|
@ -144,9 +144,8 @@
|
|||||||
<div class="layui-input-block">
|
<div class="layui-input-block">
|
||||||
<select name="user_id" lay-search="{caseSensitive:false, fuzzy: false}">
|
<select name="user_id" lay-search="{caseSensitive:false, fuzzy: false}">
|
||||||
<option value="">请选择核实人员</option>
|
<option value="">请选择核实人员</option>
|
||||||
<option value="0">TEST</option>
|
|
||||||
{foreach $user_list as $user}
|
{foreach $user_list as $user}
|
||||||
<option value="{$user.id}">{$user.name}</option>
|
<option value="{$user.id}">【{$user.username}】{$user.nickname}</option>
|
||||||
{/foreach}
|
{/foreach}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
@ -157,7 +156,7 @@
|
|||||||
<select name="ticket_id" lay-search="{caseSensitive:false, fuzzy: false}">
|
<select name="ticket_id" lay-search="{caseSensitive:false, fuzzy: false}">
|
||||||
<option value="">请选择已有工单</option>
|
<option value="">请选择已有工单</option>
|
||||||
{foreach $ticket_list as $ticket}
|
{foreach $ticket_list as $ticket}
|
||||||
<option value="{$ticket.id}">{$ticket.id} - {$ticket.type_name}</option>
|
<option value="{$ticket.id}">{$ticket.id} - {$ticket.content}</option>
|
||||||
{/foreach}
|
{/foreach}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
Reference in New Issue
Block a user