This commit is contained in:
2025-03-26 15:22:03 +08:00
parent 4a3911ba12
commit 92cc1c27f3
16 changed files with 565 additions and 227 deletions

View File

@ -29,6 +29,9 @@ class Ticket extends Auth
$ticket_address = $this->request->post('ticket_address');
$imgs = $this->request->post('imgs');
$work_days = $this->request->post('work_days');
$gc_content = $this->request->post('gc_content');
$zf_content = $this->request->post('zf_content');
$ys_content = $this->request->post('ys_content');
$data = [
'user_id' => $this->staff->id,
'type_id' => $type_id,
@ -42,6 +45,9 @@ class Ticket extends Auth
'contact_name' => $this->staff->name,
'contact_phone' => $this->staff->phone,
'status' => 0,
'gc_content' => $gc_content,
'zf_content' => $zf_content,
'ys_content' => $ys_content,
'work_days' => $work_days
];
if (!empty($record)) {
@ -49,6 +55,29 @@ class Ticket extends Auth
} else {
$ticket = TicketInspectionShare::create($data);
}
$tTicket = $ticket->linkedTicket()->save([
'source_type' => 2,
'type_id' => $data['type_id'],
'user_type' => 'staff',
'user_id' => $ticket->user_id,
'title' => $ticket->title,
'content' => $ticket->content,
'ticket_region' => $ticket->ticket_region,
'ticket_address' => $ticket->ticket_address,
'contact_name' => $ticket->contact_name,
'contact_phone' => $ticket->contact_phone,
'lat' => $ticket->ticket_lat,
'lng' => $ticket->ticket_lng,
'imgs' => $ticket->imgs,
'status' => 0, // 先审核
'gc_content' => $gc_content,
'zf_content' => $zf_content,
'ys_content' => $ys_content,
'work_days' => $work_days
]);
$ticket->linked_ticket_id = $tTicket->id;
$ticket->status = 1;
$ticket->save();
$this->success("工单创建成功", $ticket);
}

View File

@ -81,16 +81,8 @@ class Ticket extends Controller
{
$this->title = '工单详情';
['id' => $id] = $this->_vali(['id.require' => '请指定工单ID!']);
$this->vo = TicketTicket::mk()->with(['user', 'type'])->append(['imgs_arr', 'type_name'])->find($id);
$this->vo = TicketTicket::mk()->with(['user_shares', 'views', 'repairs', 'verifys', 'view_process', 'repair_process', 'verify_process'])->append(['imgs_arr', 'type_name'])->find($id);
$this->ticket = $this->vo;
$process = ApprovalProcess::where('type', '=', 'GDSH')->order('id', 'asc')->findOrEmpty();
$instance = ApprovalInstance::query()->with(['steps.approver', 'logs'])->where('process_id', '=', $process->id)->where('oid', '=', $id)->findOrEmpty();
$this->instance = $instance;
if ($instance->isEmpty()) {
$this->step_index = -1;
} else {
$this->step_index = $instance->current_step;
}
$this->fetch();
}
@ -160,6 +152,9 @@ class Ticket extends Controller
public function move()
{
$this->title = "工单分配";
$id = $this->request->param('id');
$ticket = TicketTicket::mk()->where('id', '=', $id)->findOrEmpty();
if ($ticket->isEmpty()) $this->error('工单不存在!');
if ($this->request->isPost()) {
// 提交
$data = $this->_vali([
@ -168,8 +163,6 @@ class Ticket extends Controller
'dept_id.require' => '请指定处理部门!',
'user_id.default' => '0',
]);
$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) {
@ -467,15 +460,6 @@ class Ticket extends Controller
if ($ticket->isEmpty()) {
$this->error('未找到工单信息');
}
if (sizeof($ticket->views) === 0) {
if (sizeof($ticket->inspection_shares) === 0) {
$this->error('请先提请核验工单!');
} else {
$view = $ticket->inspection_shares[0];
}
} else {
$view = $ticket->views[0];
}
if ($this->request->isPost()) {
$adminInfo = $this->request->session('user');
$instance_data = $this->_vali([
@ -484,9 +468,10 @@ class Ticket extends Controller
]);
$ticket->kj_user_id = $instance_data['kj_user_id'];
$repair = $ticket->repairs()->save([
'gc_content'=>$view->gc_content,
'zf_content'=>$view->zf_content,
'ys_content'=>$view->ys_content,
'gc_content'=>$ticket->gc_content,
'zf_content'=>$ticket->zf_content,
'ys_content'=>$ticket->ys_content,
'work_days'=>$ticket->work_days,
'staff_id'=>$instance_data['staff_id'],
'status'=>0,
'create_id'=>$adminInfo['id'],

View File

@ -63,46 +63,11 @@ class TicketInter extends Controller
{
$this->title = '工单详情';
['id' => $id] = $this->_vali(['id.require' => '请指定工单ID!']);
$this->vo = TicketTicketInter::mk()->with(['user', 'type'])->append(['imgs_arr', 'type_name'])->find($id);
$this->vo = TicketTicketInter::mk()->with(['user_shares', 'views', 'repairs', 'verifys', 'view_process', 'repair_process', 'verify_process'])->append(['imgs_arr', 'type_name'])->find($id);
$this->ticket = $this->vo;
$process = ApprovalProcess::where('type', '=', 'GDSH')->order('id', 'asc')->findOrEmpty();
$instance = ApprovalInstance::query()->with(['steps.approver', 'logs'])->where('process_id', '=', $process->id)->where('oid', '=', $id)->findOrEmpty();
$this->instance = $instance;
if ($instance->isEmpty()) {
$this->step_index = -1;
} else {
$this->step_index = $instance->current_step;
}
$this->fetch();
}
public function reply()
{
$this->title = '回复工单';
[
'ticket_id'=>$ticket_id,
'id'=>$id
] = $this->_vali([
'ticket_id.require'=>'请指定工单ID!',
'id.require'=>'请指定回复ID!'
]);
$this->vo = TicketTicket::mk()->with(['user', 'type'])->append(['imgs_arr', 'type_name'])->find($ticket_id);
TicketReply::mForm('reply');
}
public function _reply_form_filter(&$data)
{
if ($this->request->isPost()) {
$this->_applyFormToken();
$data['type'] = 1;
$adminInfo = $this->request->session('user');
$data['user_id'] = $adminInfo['id'];
$data['username'] = $adminInfo['nickname'];
$data['contact'] = $adminInfo['contact_phone'];
}
}
/**
* 审核页面
* @auth true
@ -201,105 +166,6 @@ class TicketInter extends Controller
$this->success('创建成功!');
}
public function view_process_create()
{
$data = $this->_vali([
'ticket_id.require'=>'请指定工单ID!',
]);
$process = ApprovalProcess::where('type', '=', 'HSSH')->order('id', 'asc')->findOrEmpty();
if ($process->isEmpty()) {
$this->error('未找到可用的审核流程');
}
$adminInfo = $this->request->session('user');
$ticket = TicketTicket::query()->with(['user', 'type'])->append(['imgs_arr', 'type_name'])->where('id', '=', $data['ticket_id'])->findOrEmpty();
if ($ticket->isEmpty()) {
$this->error('未找到工单信息');
}
if ($this->request->isPost()) {
$instance_data = $this->_vali([
'title.default'=>'核验工单审核',
'content.default'=>'',
]);
ApprovalInstance::mk()->startTrans();
try {
$instance = ApprovalInstance::create([
'process_id' => $process->id,
'oid' => $ticket->id,
'title' => $instance_data['title'],
'content' => $instance_data['content'],
'status' => 0,
'current_step' => 0,
'create_time' => date('Y-m-d H:i:s'),
'create_by' => $adminInfo['id'],
'create_name' => $adminInfo['username'],
]);
foreach ($process->steps as $index => $step) {
$approver_id = $step['approver_id'] ?? 0;
if ($index == 0) {
if ($step['approver_type'] == 3) {
$approve_data = $this->_vali([
'approver_id.require' => '请指定审核人!',
]);
$approver_id = $approve_data['approver_id'];
}
}
ApprovalStep::create([
'instance_id' => $instance->id,
'step_number' => $index,
'approver_type' => $step['approver_type'],
'approver_id' => $approver_id,
'status' => 0,
]);
}
$ticket->view_pid = $instance->id;
$ticket->save();
ApprovalInstance::mk()->commit();
} catch (HttpResponseException $e) {
ApprovalInstance::mk()->rollback();
throw $e;
} catch (\Exception $e) {
ApprovalInstance::mk()->rollback();
$this->error("创建失败");
}
$this->success('创建成功!');
} else {
$this->vo = $ticket;
$this->process = $process;
$this->step_index = -1;
$this->current_step = $process->steps[0];
$this->users = SystemUser::query()->field('id,username,nickname')->select();
$this->fetch();
}
}
public function view_ticket_create()
{
$data = $this->_vali([
'ticket_id.require'=>'请指定工单ID!',
]);
$ticket = TicketTicket::query()->with(['view_process'])->append(['imgs_arr', 'type_name'])->where('id', '=', $data['ticket_id'])->findOrEmpty();
$staffs = InspectionStaff::query()->field('id,name,phone')->select();
if ($ticket->isEmpty()) {
$this->error('未找到工单信息');
}
if ($this->request->isPost()) {
$adminInfo = $this->request->session('user');
$instance_data = $this->_vali([
'staff_id.require'=>'请指定维修人员!',
]);
$view = $ticket->views()->save([
'staff_id'=>$instance_data['staff_id'],
'status'=>0,
'create_by'=>$adminInfo['id'],
]);
$this->success('创建成功!', $view);
} else {
$this->vo = $ticket;
$this->staffs = $staffs;
$this->fetch();
}
}
public function repair_process_create()
{
$data = $this->_vali([
@ -389,7 +255,7 @@ class TicketInter extends Controller
$view = $ticket->repairs()->save([
'staff_id'=>$instance_data['staff_id'],
'status'=>0,
'create_by'=>$adminInfo['id'],
'create_id'=>$adminInfo['id'],
]);
$this->success('创建成功!', $view);
} else {
@ -428,7 +294,7 @@ class TicketInter extends Controller
'status' => 0,
'current_step' => 0,
'create_time' => date('Y-m-d H:i:s'),
'create_by' => $adminInfo['id'],
'create_id' => $adminInfo['id'],
'create_name' => $adminInfo['username'],
]);
foreach ($process->steps as $index => $step) {
@ -488,7 +354,7 @@ class TicketInter extends Controller
$view = $ticket->verifys()->save([
'staff_id'=>$instance_data['staff_id'],
'status'=>0,
'create_by'=>$adminInfo['id'],
'create_id'=>$adminInfo['id'],
]);
$this->success('创建成功!', $view);
} else {

View File

@ -133,4 +133,31 @@ class UserShare extends Controller
]);
$this->success('处理成功!');
}
/**
* 随手拍评论
* @auth true
* @menu true
* @return void
*/
public function comment()
{
$this->title = '随手拍详情';
$where = $this->_vali([
'id.require' => '随手拍ID不能为空',
]);
$this->vo = TicketUserShare::mk()->where($where)->with(['linked_ticket'])->findOrEmpty();
if ($this->vo->isEmpty()) $this->error('用户随手拍不存在!');
if (!$this->vo->linked_ticket_id) {
$this->ticket_list = TicketTicket::mk()->scope(['avail'])->select();
} else {
$this->ticket_list = [];
}
$this->type_list = TicketType::getList();
$this->user_list = SystemUser::query()->select();
$this->common_reply_list = TicketCommonReply::query()->scope(['avail'])->select();
$this->fetch();
}
}

View File

@ -9,13 +9,13 @@
{if $ticket.views && sizeof($ticket.views) > 0}
<li>核验信息</li>
{/if}
{if $ticket.repair_process && sizeof($ticket.repair_process) > 0}
{if $ticket.repair_process}
<li>维修审核信息</li>
{/if}
{if $ticket.repairs && sizeof($ticket.repairs) > 0}
<li>维修信息</li>
{/if}
{if $ticket.verify_process && sizeof($ticket.verify_process) > 0}
{if $ticket.verify_process}
<li>验收审核信息</li>
{/if}
{if $ticket.verifys && sizeof($ticket.verifys) > 0}
@ -164,7 +164,7 @@
</div>
</div>
{/if}
{if $ticket.repair_process && sizeof($ticket.repair_process) > 0}
{if $ticket.repair_process}
<div class="layui-tab-item">
<div class="layui-collapse">
<div class="layui-colla-item">
@ -247,7 +247,7 @@
</div>
</div>
{/if}
{if $ticket.verify_process && sizeof($ticket.verify_process) > 0}
{if $ticket.verify_process}
<div class="layui-tab-item">
<div class="layui-collapse">
<div class="layui-colla-item">

View File

@ -2,7 +2,6 @@
<ul class="layui-tab-title">
<li class="layui-this">基本信息</li>
<li>工单全流程信息</li>
<li>关联随手拍</li>
</ul>
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
@ -108,34 +107,5 @@
<div class="layui-tab-item">
{include file="common/ticket_flow" /}
</div>
<div class="layui-tab-item">
<div class="layui-card">
<div class="layui-card-header">关联随手拍</div>
<div class="layui-card-body">
<table class="layui-table">
<thead>
<tr>
<th>随手拍编号</th>
<th>问题类型</th>
<th>反馈人</th>
<th>联系方式</th>
<th>反馈时间</th>
</tr>
</thead>
<tbody class="layui-table-body">
{foreach $vo.userShares as $user_share}
<tr>
<td><a data-modal="{:url('user_share/detail', ['id' => $user_share.id])}" data-height="90%" data-width="60%" class="layui-btn layui-btn-xs layui-btn-normal" title="随手拍详情">{$user_share.id}</a></td>
<td>{$user_share.type_name|default=""}</td>
<td>{$user_share.contact_name|default=""}</td>
<td>{$user_share.contact_phone|default=""}</td>
<td>{$user_share.create_at|default=""}</td>
</tr>
</tbody>
{/foreach}
</table>
</div>
</div>
</div>
</div>
</div>

View File

@ -36,6 +36,30 @@
<input type="hidden" value='{$vo.imgs|default=""}' name="imgs">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">工程内容</label>
<div class="layui-input-block">
<textarea data-textarea class="layui-textarea" name='content' required>{$vo.gc_content|default=""}</textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">做法及质量要求</label>
<div class="layui-input-block">
<textarea data-textarea class="layui-textarea" name='content' required>{$vo.zf_content|default=""}</textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">工程预算</label>
<div class="layui-input-block">
<textarea data-textarea class="layui-textarea" name='content' required>{$vo.ys_content|default=""}</textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">预估工作量</label>
<div class="layui-input-block">
<input type="number" name="work_days" value='{$vo.work_days|default=""}' required placeholder="请输入预估工作量" class="layui-input">
</div>
</div>
</div>
{notempty name='id'}<input class="layui-input layui-hide" type='hidden' value='{$id}' name='id'>{/notempty}
<div class="layui-form-item text-center">

View File

@ -25,17 +25,29 @@
<!--{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 (d.status == 0 && d.views && d.views.length > 0) { }}
{{# let view = d.views[d.views.length - 1]; }}
{{# if (view.status == 1) { }}
{{# if (d.status !== 1) { }}
{{# if (d.source_type != 1) { }}
<!--{if auth("move")}-->
<a data-modal="{:url('move')}?id=${ d.id }" data-height="80%" data-width="80%" class="layui-btn layui-btn-xs" title="分配">分配</a>
<a data-modal="{:url('move')}?id={{ d.id }}" data-height="80%" data-width="80%" class="layui-btn layui-btn-xs" title="分配">分配</a>
<!--{/if}-->
{{# } else if (d.views && d.views.length > 0) { }}
<a data-modal="{:url('view/detail')}?id={{ d.views[d.views.length - 1].id }}" data-height="80%" data-width="80%" class="layui-btn layui-btn-xs layui-btn-danger" data-title="查看核验工单" title="查看核验工单">查看核验工单</a>
{{# if (view.status == 1) { }}
<!--{if auth("move")}-->
<a data-modal="{:url('move')}?id={{ d.id }}" data-height="80%" data-width="80%" class="layui-btn layui-btn-xs" title="分配">分配</a>
<!--{/if}-->
{{# } }}
{{# } else { }}
<!--{if auth("view_ticket_create")}-->
<a data-modal="{:url('view_ticket_create')}?ticket_id={{ d.id }}" data-height="80%" data-width="80%" class="layui-btn layui-btn-xs layui-btn-normal" title="提请核验">创建核验工单</a>
<!--{/if}-->
{{# } }}
{{# } }}
{{# if (d.status !== 1) { }}
<!--{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}-->
{{# } }}
</script>
{/block}
@ -73,31 +85,25 @@
return '';
}
}},
{field: 'view', title:'核验情况', width: 100, minWidth:100, templet:function(item){
if (item.views && item.views.length > 0) {
// 已有核验工单
const view = item.views[item.views.length - 1];
if (view.status == 1) {
if (view.is_error == 1) {
return `<a data-modal="{:url('view/detail')}?id=${view.id}" data-height="80%" data-width="80%" class="layui-btn layui-btn-xs layui-btn-danger" data-title="查看核验工单" title="查看核验工单">存在异常</a>`;
} else {
return `<a data-modal="{:url('view/detail')}?id=${view.id}" data-height="80%" data-width="80%" class="layui-btn layui-btn-xs layui-btn-active" data-title="查看核验工单" title="查看核验工单">不存在异常</a>`;
}
} else {
return `<a data-modal="{:url('view/detail')}?id=${view.id}" data-height="80%" data-width="80%" class="layui-btn layui-btn-xs layui-btn-normal" data-title="查看核验工单" title="查看核验工单">查看工单</a>`;
}
} else {
return `<a data-modal="{:url('view_ticket_create')}?ticket_id=${item.id}" data-height="80%" data-width="80%" class="layui-btn layui-btn-xs layui-btn-normal" title="提请核验">创建核验工单</a>`;
}
}},
{field:'status', title:'状态', width:80, templet:function(item){
if (item.source_type !== 1) {
if (item.status === 1) {
return `<span style="color: green">已分配</span>`
} else {
return `<span style="color: red">待分配</span>`
}
}
if (item.status !== 1) {
if (!item.views || item.views.length === 0) {
return `<span style="color: red">待核验</span>`
}
const view = item.views[item.views.length - 1];
if (view.status == 1) {
return `<span style="color: red">待分配</span>`
if (view.is_error == 1) {
return `<span style="color: red">已核验</span>`
} else {
return `<span style="color: green">无异常</span>`
}
} else {
return `<span style="color: yellowgreen">待核验完成</span>`
}

View File

@ -1 +1,111 @@
{include file="common/ticket_flow" /}
<div class="layui-tab layui-tab-brief">
<ul class="layui-tab-title">
<li class="layui-this">基本信息</li>
<li>工单全流程信息</li>
</ul>
<div class="layui-tab-content">
<div class="layui-tab-item layui-show">
<div class="layui-card">
<div class="layui-card-header">工单内容</div>
<div class="layui-card-body">
<div class="layui-table">
<table class="layui-table">
<tbody class="layui-table-body">
<tr>
<td style="width: 120px">工单编号</td>
<td>{$vo.id|default=""}</td>
</tr>
<tr>
<td>工单标题</td>
<td>{$vo.title|default=""}</td>
</tr>
<tr>
<td>工单类型</td>
<td>{$vo.type_name|default=""}</td>
</tr>
<tr>
<td>工单地址</td>
<td>{$vo.ticket_region|default=""} {$vo.ticket_address|default=""}</td>
</tr>
<tr>
<td>工单内容</td>
<td>{$vo.content|default=""}</td>
</tr>
<tr>
<td>反馈人信息</td>
<td>{$vo.contact_name|default="未填写名称"} {$vo.contact_phone|default="未填写联系方式"}</td>
</tr>
<tr>
<td>工单图片</td>
<td>
<div>
{if count($vo.imgs_arr) > 0}
{foreach $vo.imgs_arr as $img}
<img data-tips-image src="{$img}" alt="image" style="height: 100px;">
<span>&nbsp;</span>
{/foreach}
{else}
无图片
{/if}
</div>
</td>
</tr>
{if $vo.lat && $vo.lng}
<tr>
<td>位置</td>
<td>
<div id="map" style="height: 320px;"></div>
</td>
</tr>
{/if}
</tbody>
</table>
</div>
{if $vo.lat && $vo.lng}
<script src="https://map.qq.com/api/gljs?v=1.exp&key=T6XBZ-L33CB-TMFUL-JQ4D6-MKBTK-KNBED"></script>
<script>
function initMap() {
//定义地图中心点坐标
var center = new TMap.LatLng("{$vo.lat}", "{$vo.lng}")
//定义map变量,调用 TMap.Map() 构造函数创建地图
var map = new TMap.Map(document.getElementById('map'), {
center: center,//设置地图中心点坐标
zoom: 17.2, //设置地图缩放级别
pitch: 30, //设置俯仰角
});
var marker = new TMap.MultiMarker({
map: map,
styles: {
// 点标记样式
marker: new TMap.MarkerStyle({
width: 20, // 样式宽
height: 30, // 样式高
anchor: { x: 10, y: 30 }, // 描点位置
}),
},
geometries: [
// 点标记数据数组
{
// 标记位置(纬度,经度,高度)
position: center,
id: 'marker',
},
],
});
}
var mapInit = setInterval(function () {
if (window.TMap) {
clearInterval(mapInit)
initMap()
}
}, 500)
</script>
{/if}
</div>
</div>
</div>
<div class="layui-tab-item">
{include file="common/ticket_flow" /}
</div>
</div>
</div>

View File

@ -66,18 +66,14 @@
}
}},
{field: 'view', title:'核验情况', width: 100, minWidth:100, templet:function(item){
if (item.state === 2) {
return `外部工单`
if (item.source_type !== 1) {
return `-`
}
if (item.views && item.views.length > 0) {
// 已有核验工单
const view = item.views[item.views.length - 1];
if (view.status == 1) {
if (view.is_error == 1) {
return `<a data-modal="{:url('view/detail')}?id=${view.id}" data-height="80%" data-width="80%" class="layui-btn layui-btn-xs layui-btn-danger" data-title="查看核验工单" title="查看核验工单">存在异常</a>`;
} else {
return `<a data-modal="{:url('view/detail')}?id=${view.id}" data-height="80%" data-width="80%" class="layui-btn layui-btn-xs layui-btn-active" data-title="查看核验工单" title="查看核验工单">不存在异常</a>`;
}
return `<a data-modal="{:url('view/detail')}?id=${view.id}" data-height="80%" data-width="80%" class="layui-btn layui-btn-xs layui-btn-active" data-title="查看核验工单" title="查看核验工单">查看工单</a>`;
} else {
return `<a data-modal="{:url('view/detail')}?id=${view.id}" data-height="80%" data-width="80%" class="layui-btn layui-btn-xs layui-btn-normal" data-title="查看核验工单" title="查看核验工单">查看工单</a>`;
}

View File

@ -0,0 +1,51 @@
<div class="layui-collapse">
<div class="layui-colla-item">
<div class="layui-colla-title">审核流程</div>
<div class="layui-colla-content">
<div class="layui-timeline">
<div class="layui-timeline-item">
<i class="layui-icon layui-timeline-axis"></i>
<div class="layui-timeline-content layui-text">
<h3 class="layui-timeline-title">提交审核</h3>
</div>
</div>
{foreach $process.steps as $index=>$step}
{include file="common/step_p" /}
{/foreach}
</div>
</div>
</div>
</div>
<div class="layui-card">
<div class="layui-card-header">创建审核单</div>
<div class="layui-card-body">
<form class="layui-form" data-table-id="formDemo" action="{:url()}" data-auto="true" method="post">
<input type="hidden" name="ticket_id" value="{$vo.id}">
<div class="layui-form-item">
<label class="layui-form-label">审核说明</label>
<div class="layui-input-block">
<textarea name="content" placeholder="请输入审核说明" class="layui-textarea"></textarea>
</div>
</div>
{if $current_step.approver_type == 3}
<div class="layui-form-item">
<label class="layui-form-label">请指定下一步审核人</label>
<div class="layui-input-block">
<select name="approver_id" lay-verify="required" lay-search>
<option value="">请选择审核人</option>
{foreach $users as $user}
<option value="{$user.id}">{$user.username}</option>
{/foreach}
</select>
</div>
</div>
{/if}
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn layui-btn-normal" type='submit'>立即提交</button>
<button class="layui-btn layui-btn-primary" type="reset">重置</button>
</div>
</div>
</form>
</div>
</div>

View File

@ -0,0 +1,19 @@
<form class="layui-form layui-card" action="{:sysuri()}" data-auto="true" method="post" autocomplete="off" style="min-height: 300px">
<input class="layui-input layui-hide" type='hidden' value="{:input('get.ticket_id')}" name='ticket_id'>
<input class="layui-input layui-hide" type='hidden' value='{:systoken("view_ticket_create")}' name='_token_'>
<div class="layui-form-item">
<label class="layui-form-label">选择维修人员</label>
<div class="layui-input-block">
<select name="staff_id">
<option value="">请选择维修负责人员</option>
{foreach $staffs as $item}
<option value="{$item.id}">{$item.name} {$item.phone}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item text-center">
<button class="layui-btn layui-btn-normal" type='submit'>创建维修工单</button>
<button class="layui-btn layui-btn-danger" type='button' data-confirm="确定要取消编辑吗?" data-close>取消</button>
</div>
</form>

View File

@ -0,0 +1,51 @@
<div class="layui-collapse">
<div class="layui-colla-item">
<div class="layui-colla-title">审核流程</div>
<div class="layui-colla-content">
<div class="layui-timeline">
<div class="layui-timeline-item">
<i class="layui-icon layui-timeline-axis"></i>
<div class="layui-timeline-content layui-text">
<h3 class="layui-timeline-title">提交审核</h3>
</div>
</div>
{foreach $process.steps as $index=>$step}
{include file="common/step_p" /}
{/foreach}
</div>
</div>
</div>
</div>
<div class="layui-card">
<div class="layui-card-header">创建审核单</div>
<div class="layui-card-body">
<form class="layui-form" data-table-id="formDemo" action="{:url()}" data-auto="true" method="post">
<input type="hidden" name="ticket_id" value="{$vo.id}">
<div class="layui-form-item">
<label class="layui-form-label">审核说明</label>
<div class="layui-input-block">
<textarea name="content" placeholder="请输入审核说明" class="layui-textarea"></textarea>
</div>
</div>
{if $current_step.approver_type == 3}
<div class="layui-form-item">
<label class="layui-form-label">请指定下一步审核人</label>
<div class="layui-input-block">
<select name="approver_id" lay-verify="required" lay-search>
<option value="">请选择审核人</option>
{foreach $users as $user}
<option value="{$user.id}">{$user.username}</option>
{/foreach}
</select>
</div>
</div>
{/if}
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn layui-btn-normal" type='submit'>立即提交</button>
<button class="layui-btn layui-btn-primary" type="reset">重置</button>
</div>
</div>
</form>
</div>
</div>

View File

@ -0,0 +1,19 @@
<form class="layui-form layui-card" action="{:sysuri()}" data-auto="true" method="post" autocomplete="off" style="min-height: 300px">
<input class="layui-input layui-hide" type='hidden' value="{:input('get.ticket_id')}" name='ticket_id'>
<input class="layui-input layui-hide" type='hidden' value='{:systoken("view_ticket_create")}' name='_token_'>
<div class="layui-form-item">
<label class="layui-form-label">选择维修人员</label>
<div class="layui-input-block">
<select name="staff_id">
<option value="">请选择维修负责人员</option>
{foreach $staffs as $item}
<option value="{$item.id}">{$item.name} {$item.phone}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item text-center">
<button class="layui-btn layui-btn-normal" type='submit'>创建验收工单</button>
<button class="layui-btn layui-btn-danger" type='button' data-confirm="确定要取消编辑吗?" data-close>取消</button>
</div>
</form>

View File

@ -0,0 +1,183 @@
{if $vo.status eq 1}
{if $vo.linked_ticket_id}
<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.linked_ticket.id|default=""}</td>
</tr>
<tr>
<td>工单类型</td>
<td>{$vo.linked_ticket.type_name|default=""}</td>
</tr>
<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>
{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}
<div class="layui-card">
<div class="layui-card-header">处置随手拍</div>
<div class="layui-card-body">
<form action="{:url('link')}" method="post" class="layui-form">
<input type="hidden" name="id" value="{$vo.id}">
<div class="layui-form-item">
<label class="layui-form-label label-required">处置方式</label>
<div class="layui-input-block">
<select name="_type" lay-verify="required" lay-filter="Type">
<option value="">请选择处置方式</option>
<option value="skip">直接回复</option>
<option value="new">创建工单</option>
<option value="exist">关联工单</option>
</select>
</div>
</div>
<div class="layui-form-item new_ticket">
<label class="layui-form-label">核实人员</label>
<div class="layui-input-block">
<select name="user_id" lay-search="{caseSensitive:false, fuzzy: false}">
<option value="">请选择核实人员</option>
{foreach $user_list as $user}
<option value="{$user.id}">{$user.username}{$user.nickname}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item exist_ticket">
<label class="layui-form-label">关联工单</label>
<div class="layui-input-block">
<select name="ticket_id" lay-search="{caseSensitive:false, fuzzy: false}">
<option value="">请选择已有工单</option>
{foreach $ticket_list as $ticket}
<option value="{$ticket.id}">{$ticket.id} - {$ticket.content}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item new_ticket">
<label class="layui-form-label">工单类型</label>
<div class="layui-input-block">
<select name="type_id">
<option value="">请选择工单类型</option>
{foreach $type_list as $type}
<option value="{$type.id}">{$type.name}</option>
{/foreach}
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label label-required">用户反馈</label>
<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>
<div class="layui-form-mid layui-word-aux">给用户反馈的内容,会发送给用户,请谨慎填写</div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label label-required">积分奖励</label>
<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">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="submit">提交</button>
</div>
</div>
</form>
</div>
</div>
<script>
const $new = $(".new_ticket");
const $exist = $(".exist_ticket");
$new.hide()
$exist.hide()
layui.use(['form'], function () {
var form = layui.form;
form.on('select(Type)', function (data) {
$new.hide()
$exist.hide()
switch (data.value) {
case 'new':
$new.show();
break;
case 'exist':
$exist.show();
break;
default:
break;
}
});
form.on('select(CommonReply)', function (data) {
$("textarea[name='content']").val(data.value)
});
form.on('submit(submit)', function (data) {
const field = data.field
const _type = field._type
switch (_type) {
case 'new':
if (!field.user_id) {
layer.msg('请选择核实人员')
return false;
}
if (!field.type_id) {
layer.msg('请选择工单类型')
return false;
}
break;
case 'exist':
if (!field.ticket_id) {
layer.msg('请选择工单')
return false;
}
break;
default:
break;
}
console.log(data)
$.post("{:url('link')}", field, function (res) {
if (res.code === 1) {
layer.msg(res.info, {icon: 1, time: 1500}, function () {
layer.closeAll();
window.location.reload();
});
} else {
layer.msg(res.info, {icon: 2, anim: 6, time: 3000}, function () {
});
}
});
return false;
});
});
</script>
{/if}

View File

@ -18,9 +18,11 @@
<!--{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("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 (d.status != 1) { }}
<!--{if auth("comment")}-->
<a data-modal="{:url('comment')}?id={{ d.id }}" data-height="80%" data-width="80%" class="layui-btn layui-btn-xs layui-btn-normal" title="处理">处理</a>
<!--{/if}-->
{{# } }}
</script>
{/block}