三类工单审核提交

This commit is contained in:
2025-03-19 22:54:11 +08:00
parent cf2a2892b5
commit 05a0577d3e
9 changed files with 426 additions and 13 deletions

View File

@ -41,7 +41,7 @@ class Ticket extends Controller
$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', 'type_name', 'last_reply'])->with(['views', 'repairs', 'verifys']);
$query->append(['imgs_arr', 'source_type_name', 'type_name', 'last_reply'])->with(['views', 'repairs', 'verifys', 'view_process', 'repair_process', 'verify_process']);
});
}
@ -283,6 +283,219 @@ class Ticket 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 repair_process_create()
{
$data = $this->_vali([
'ticket_id.require'=>'请指定工单ID!',
]);
$process = ApprovalProcess::where('type', '=', 'WXSH')->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 verify_process_create()
{
$data = $this->_vali([
'ticket_id.require'=>'请指定工单ID!',
]);
$process = ApprovalProcess::where('type', '=', 'YSSH')->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();
}
}
/**
* 进行审核
* @return void

View File

@ -24,7 +24,7 @@ class ApprovalInstance extends Model
// 关联审批步骤
public function steps()
{
return $this->hasMany(ApprovalStep::class, 'instance_id', 'id');
return $this->hasMany(ApprovalStep::class, 'instance_id', 'id')->with('approver');
}
public function getCurrentAttr($value, $data)

View File

@ -31,7 +31,8 @@ class ApprovalStep extends Model
public function getApproverTypeTextAttr($value, $data)
{
$typeMap = [
0 => '定用户',
0 => '定用户',
3 => '指定用户',
// 1 => '指定部门',
// 2 => '角色审批'
];

View File

@ -113,16 +113,16 @@ class TicketTicket extends Model
return $this->hasMany(TicketView::class, 'ticket_id')->order('create_at', 'desc');
}
public function view_process() {
public function viewProcess() {
return $this->belongsTo(ApprovalInstance::class, 'view_pid', 'id');
}
public function repair_process()
public function repairProcess()
{
return $this->belongsTo(ApprovalInstance::class, 'repair_pid', 'id');
}
public function verify_process()
public function verifyProcess()
{
return $this->belongsTo(ApprovalInstance::class, 'verify_pid', 'id');
}

View File

@ -12,6 +12,9 @@
<div class="layui-input-block">
<select class="layui-select" name="type" required>
<option value="GDSH" {if isset($vo.type) && $vo.type == 'GDSH'}selected{/if}>工单审核</option>
<option value="HSSH" {if isset($vo.type) && $vo.type == 'HSSH'}selected{/if}>核实工单审核</option>
<option value="WXSH" {if isset($vo.type) && $vo.type == 'WXSH'}selected{/if}>维修工单审核</option>
<option value="YSSH" {if isset($vo.type) && $vo.type == 'YSSH'}selected{/if}>验收工单审核</option>
</select>
</div>
</div>
@ -69,7 +72,7 @@ $(function () {
cols: [[
{field:'title', title:'步骤名称', width:160, edit: true},
{field:'approver_type', title:'审批人类型', width:160, templet: '#approverType'},
{field:'approver_id', title:'审批人类型', width:160, templet: '#approverId'},
{field:'approver_id', title:'选择审批人', width:160, templet: '#approverId'},
{align: 'center', toolbar: '#editToolbar', title: '操作', width: 200}
]],
data: stepsData,

View File

@ -69,15 +69,28 @@
{field: 'view', title:'核验情况', width: 100, minWidth:100, templet:function(item){
if (item.view_pid) {
// 已有核验流程
if (item.view_process.status === 0) {
return `正在审核`
} else if (item.view_process.status === 1) {
return `已通过`
} else if (item.view_process.status === 2) {
return `<a data-modal="{:url('view_process_create')}?ticket_id=${item.id}" data-height="80%" data-width="80%" class="layui-btn layui-btn-xs layui-btn-danger" title="提请核验">提请核验</a>`;
}
} else {
return `<a data-modal="{:url('view_process_create')}?ticket_id=${item.id}" data-height="80%" data-width="80%" class="layui-btn layui-btn-xs layui-btn-normal" title="提请核验">提请核验</a>`;
}
}},
{field: 'repair', title:'维修情况', width: 100, minWidth:100, templet:function(item){
if (item.source_type === 1) {
// 用户随手拍
if (!item.views || item.views.length === 0) {
// 还没有核验流程
return `请先核验`
}
if (item.views[item.views.length - 1].status !== 1) {
return `请先完成核验`
}
}
if (item.repair_pid) {
// 已有维修流程
} else {
@ -85,10 +98,16 @@
}
}},
{field: 'verify', title:'验收情况', width: 100, minWidth:100, templet:function(item){
if (item.source_type === 1) {
// 用户随手拍
if (!item.views || item.views.length === 0) {
// 还没有核验流程
return `请先核验`
}
if (item.views[item.views.length - 1].status !== 1) {
return `请先完成核验`
}
}
if (!item.repairs || item.repairs.length === 0) {
// 还没有维修流程
return `请先维修`

View File

@ -0,0 +1,59 @@
<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}
<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">{$index+1}{if $step_index == $index}(当前步骤){/if}</h3>
<p>
{$step.title}
</p>
</div>
</div>
{/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,59 @@
<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}
<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">{$index+1}{if $step_index == $index}(当前步骤){/if}</h3>
<p>
{$step.title}
</p>
</div>
</div>
{/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,59 @@
<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}
<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">{$index+1}{if $step_index == $index}(当前步骤){/if}</h3>
<p>
{$step.title}
</p>
</div>
</div>
{/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>