标准审批代码
xuexi 2026-08-06 16:07:00 发表在:PHP 查看数:22
<?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">&times;</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
知识库:464条鸣谢:TAY  备案号:蜀ICP备2024090044号