You've already forked guangan
111111
This commit is contained in:
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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'],
|
||||
|
@ -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 {
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
@ -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">
|
||||
|
@ -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>
|
||||
|
@ -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">
|
||||
|
@ -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>`
|
||||
}
|
||||
|
@ -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> </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>
|
||||
|
@ -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>`;
|
||||
}
|
||||
|
@ -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>
|
@ -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>
|
@ -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>
|
@ -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>
|
183
plugs/think-plugs-ticket/src/view/user_share/comment.html
Normal file
183
plugs/think-plugs-ticket/src/view/user_share/comment.html
Normal 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}
|
@ -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}
|
||||
|
||||
|
Reference in New Issue
Block a user