标准审批代码
<?php
namespace App\Admin\Controllers;
use Encore\Admin\Controllers\AdminController;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Show;
use App\Models\Api\Report;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Encore\Admin\Facades\Admin;
class ReportController extends AdminController
{
protected $title = '手动上报管理';
/**
* 列表页
*/
protected function grid()
{
$grid = new Grid(new Report);
// ---------- 基础列 ----------
$grid->column('id', __('ID'))->sortable();
$grid->column('purchase_proof', __('购买凭证'))->lightbox(['width' => 50, 'height' => 50]);
$grid->column('payment_records', __('付款记录'))->lightbox(['width' => 50, 'height' => 50]);
$grid->column('inspection_reports', __('监测报告'))->lightbox(['width' => 50, 'height' => 50]);
// 审批状态(带颜色标签)
$grid->column('status', __('审批状态'))->display(function ($status) {
if (is_null($status)) {
return '<span class="label label-warning">待审批</span>';
}
if ($status == 1) {
return '<span class="label label-success">通过</span>';
}
if ($status == 0) {
return '<span class="label label-danger">拒绝</span>';
}
return $status;
});
// 最新审批意见
$grid->column('view', __('审批意见'));
// 审批人(显示姓名,需关联 admin_users 表)
$grid->column('admin_id', __('审批人'))->display(function ($adminId) {
if ($adminId) {
$user = Admin::user()->find($adminId);
return $user ? $user->name : $adminId;
}
return '';
});
$grid->column('created_at', __('创建时间'));
$grid->column('updated_at', __('更新时间'));
// ---------- 自定义操作列:审批按钮 ----------
$grid->column('操作')->display(function () {
if (is_null($this->status)) {
return '<a class="btn btn-sm btn-primary shenpi-btn" data-id="' . $this->id . '" data-toggle="modal" data-target="#shenpiModal">审批</a>';
}
return '';
});
// ---------- 模态框(使用闭包注入) ----------
$grid->footer(function () {
return <<<HTML
<div class="modal fade" id="shenpiModal" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
<h4 class="modal-title">审批报告</h4>
</div>
<div class="modal-body">
<form>
<div class="form-group">
<label>审批结果 <span style="color:red;">*</span></label><br>
<label class="radio-inline">
<input type="radio" name="status" value="1" required> 通过
</label>
<label class="radio-inline">
<input type="radio" name="status" value="0" required> 拒绝
</label>
</div>
<div class="form-group">
<label>审批意见 <span style="color:red;">*</span></label>
<textarea name="view" class="form-control" rows="3" placeholder="请输入审批意见(必填)" required></textarea>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
<button type="button" class="btn btn-primary" id="shenpiSubmit">提交审批</button>
</div>
</div>
</div>
</div>
HTML;
});
// ---------- JavaScript 处理逻辑 ----------
Admin::script(
<<<JS
$(document).on('click', '.shenpi-btn', function () {
var id = $(this).data('id');
$('#shenpiModal').data('id', id);
$('#shenpiModal input[name="status"]').prop('checked', false);
$('#shenpiModal textarea[name="view"]').val('');
});
$(document).on('click', '#shenpiSubmit', function () {
var modal = $('#shenpiModal');
var id = modal.data('id');
var status = modal.find('input[name="status"]:checked').val();
var view = modal.find('textarea[name="view"]').val();
// 前端校验
if (!id) {
toastr.error('记录 ID 缺失,请刷新重试');
return;
}
if (!status) {
toastr.warning('请选择审批结果(通过或拒绝)');
return;
}
if (!view || view.trim() === '') {
toastr.warning('请填写审批意见');
return;
}
// 提交数据
$.ajax({
url: '/admin/report/shenpi',
type: 'POST',
data: {
id: id,
status: status,
view: view,
_token: $('meta[name="csrf-token"]').attr('content')
},
beforeSend: function() {
$('#shenpiSubmit').prop('disabled', true).text('提交中...');
},
success: function (res) {
$('#shenpiSubmit').prop('disabled', false).text('提交审批');
if (res.status === 'success') {
toastr.success(res.message);
$('#shenpiModal').modal('hide');
$.pjax.reload('#pjax-container');
} else {
toastr.error(res.message || '审批失败');
}
},
error: function (xhr) {
$('#shenpiSubmit').prop('disabled', false).text('提交审批');
var msg = '请求失败,请重试';
if (xhr.responseJSON && xhr.responseJSON.message) {
msg = xhr.responseJSON.message;
}
toastr.error(msg);
}
});
});
JS
);
return $grid;
}
/**
* 详情页
*/
protected function detail($id)
{
$show = new Show(Report::findOrFail($id));
$show->field('id', __('ID'));
$show->field('created_at', __('创建时间'));
$show->field('updated_at', __('更新时间'));
return $show;
}
/**
* 表单页(创建/编辑)
*/
protected function form()
{
$form = new Form(new Report);
$form->display('id', __('ID'));
$form->multipleImage('purchase_proof', __('检测报告'))
->removable()
->sortable()
->uniqueName()
->move('report/purchase_proof/' . date('Y/m/d'));
$form->multipleImage('payment_records', __('付款记录'))
->removable()
->sortable()
->uniqueName()
->move('report/payment_records/' . date('Y/m/d'));
$form->multipleImage('inspection_reports', __('监测报告'))
->removable()
->sortable()
->uniqueName()
->move('report/inspection_reports/' . date('Y/m/d'));
$form->display('created_at', __('创建时间'));
$form->display('updated_at', __('更新时间'));
return $form;
}
/**
* 审批处理接口(AJAX)
*/
public function shenpi(Request $request)
{
$id = $request->input('id');
$status = $request->input('status');
$view = $request->input('view');
// 1. 参数校验(给出明确错误信息)
if (!$id) {
return response()->json(['status' => 'error', 'message' => '缺少报告 ID']);
}
if (!in_array($status, [0, 1])) { // 非严格比较,允许字符串 '1' 或 '0'
return response()->json(['status' => 'error', 'message' => '审批结果必须为通过(1)或拒绝(0)']);
}
if (empty(trim($view))) {
return response()->json(['status' => 'error', 'message' => '审批意见不能为空']);
}
// 2. 检查报告是否存在
$report = Report::find($id);
if (!$report) {
return response()->json(['status' => 'error', 'message' => '报告不存在']);
}
// 3. 防止重复审批
if (!is_null($report->status)) {
return response()->json(['status' => 'error', 'message' => '该报告已审批,不可重复操作']);
}
// 4. 获取当前管理员ID
$adminId = Admin::user()->id;
if (!$adminId) {
return response()->json(['status' => 'error', 'message' => '无法获取当前管理员信息,请重新登录']);
}
// 5. 事务处理
try {
DB::transaction(function () use ($id, $status, $view, $adminId) {
// 更新主表(同时记录审批人和意见)
Report::where('id', $id)->update([
'status' => $status,
'view' => $view,
'admin_id' => $adminId, // 需在 lmai_report 表中增加该字段
]);
// 插入审批记录表
DB::table('lmai_report_shenpi')->insert([
'report_id' => $id,
'status' => $status,
'view' => $view,
'admin_id' => $adminId, // 需在 lmai_report_shenpi 表中增加该字段
'created_at' => now(),
'updated_at' => now(),
]);
});
} catch (\Exception $e) {
\Log::error('审批事务失败', ['id' => $id, 'error' => $e->getMessage()]);
return response()->json(['status' => 'error', 'message' => '审批失败,请稍后重试']);
}
return response()->json(['status' => 'success', 'message' => '审批成功']);
}
}
最近访问时间:2026-08-07 03:37:43