ChenWuJie %!s(int64=4) %!d(string=hai) anos
pai
achega
2312e44874

+ 94 - 0
app/Console/Commands/GetOrdersOverview.php

xqd
@@ -0,0 +1,94 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\Models\Order;
+use App\Models\OrderOverviewModel;
+use App\Models\Project;
+use Illuminate\Console\Command;
+use Illuminate\Support\Facades\Log;
+
+class GetOrdersOverview extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $name = 'ordersOverview';
+    protected $signature = 'get:orders_overview';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = '获取每月订单总览数据';
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return mixed
+     */
+    public function handle()
+    {
+        //获取每月一号的上一个月的时间
+        $time = strtotime('-1 month');
+        $before_date = date('Y-m-01 00:00:00',$time);
+        $date = date('Y-m-01 00:00:00');
+        //获取到所有的通过审核的项目id
+        $project_ids = Project::where('active',1)->pluck('id')->toArray();
+        foreach ($project_ids as $project_id)
+        {
+            $data = [
+                'total_price' => 0,
+            ];
+            //获取到项目内已完成并且更新时间在上个月的订单id的数组
+            $order_arr = Order::where('project_id',$project_id)
+                                ->where('status',3)
+                                ->where('type',1)
+                                ->where('updated_at','>=',$before_date)
+                                ->where('updated_at','<',$date)
+                                ->get(['id','money','project_id'])->toArray();
+            //如果订单数据为空那就添加一个空的数据条目到数据总览中
+            if (empty($order_arr))
+            {
+                Log::info(Project::where('id',$project_id)->value('name').'项目'.date('Y-m',$time).'的数据总金额为空,默认写入空数据');
+                $data['order_sn'] = Order::createOrderNumber();
+                $data['date'] = $before_date;
+                $data['project_id'] = $project_id;
+                $data['status'] = 0;
+                $data['confirmation_user_id'] = Project::where('id',$project_id)->value('user_id');
+                $data['created_at'] = date('Y-m-d H:i:s',time());
+                $data['updated_at'] = date('Y-m-d H:i:s',time());
+
+                OrderOverviewModel::insert($data);
+            }else
+                {
+                    Log::info(Project::where('id',$project_id)->value('name').'项目'.date('Y-m',$time).'的数据写入');
+                    $num_arr = array_column($order_arr,'money');
+                    $total = array_sum($num_arr);
+                    $data['order_sn'] = Order::createOrderNumber();
+                    $data['date'] = $before_date;
+                    $data['project_id'] = $project_id;
+                    $data['status'] = 0;
+                    $data['confirmation_user_id'] = Project::where('id',$project_id)->value('user_id');
+                    $data['total_price'] = $total;
+                    $data['created_at'] = date('Y-m-d H:i:s',time());
+                    $data['updated_at'] = date('Y-m-d H:i:s',time());
+                    OrderOverviewModel::insert($data);
+                }
+        }
+
+    }
+}

+ 1 - 0
app/Console/Kernel.php

xqd
@@ -20,6 +20,7 @@ class Kernel extends ConsoleKernel
         //
 //        Commands\UpdateRentDevice::class,
         Commands\UpdateApplyDevice::class,
+        Commands\GetOrdersOverview::class,
     ];
 
     /**

+ 143 - 0
app/Http/Controllers/Admin/OrderOverviewController.php

xqd
@@ -0,0 +1,143 @@
+<?php
+
+namespace App\Http\Controllers\Admin;
+
+use App\Models\Device;
+use App\Models\DeviceName;
+use App\Models\InnerDeviceNamesModel;
+use App\Models\Order;
+use App\Models\OrderDevice;
+use App\Models\OrderOverviewModel;
+use App\Models\Spec;
+use App\Models\User;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Log;
+
+class OrderOverviewController extends BaseController
+{
+    protected $model;
+
+    protected $department;
+
+    protected $model_name = '账单明细列表';
+
+    protected $pre_uri = '/admin/OrderOverview/';
+
+    protected $view_path = 'admin.order-overviews.';
+
+    protected $redirect_index = '/admin/OrderOverview/index';
+
+    public function __construct()
+    {
+        parent::__construct();
+        $this->model = new OrderOverviewModel();
+        $this->order_device = new OrderDevice();
+    }
+
+    public function index()
+    {
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'index', compact('model', 'model_name','pre_uri'));
+    }
+    public function orderDetails(Request $request)
+    {
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'order-details', compact('model', 'model_name','pre_uri'));
+    }
+
+    public function get(Request $request)
+    {
+        if($request->input('type') == 'details') {
+            $before_time = strtotime($request->input('date'));
+            $now = strtotime('+1 month',$before_time);
+            $now = date('Y-m-d H:i:s',$now);
+            $order_arr = Order::where('project_id',$request->input('project_id'))
+                ->where('status',3)
+                ->where('type',1)
+                ->where('updated_at','>=',$before_time)
+                ->where('updated_at','<',$now)
+                ->pluck('id')->toArray();
+            $items = $this->order_device->where('project_id',$request->input('project_id'))->whereIn('order_id',$order_arr);
+        }else{
+            $items = $this->model->where('id', '>', 0)->orderBy('id','desc');
+        }
+        $items = $items->paginate(15);
+        if ($request->input('type') == 'details')
+        {
+            foreach ($items as $item) {
+                $device = $item->device ? $item->device->name : '';
+                $device_name = $item->device_name ? $item->device_name->name : '';
+                $spec_name =   $item->spec ? $item->spec->name : '';
+                $item->name = $device.'-'.$device_name.'-'.$spec_name;
+                $user_id = Order::where('id',$item->order_id)->value('user_id');
+                $item->user_name = User::where('id',$user_id)->value('name');
+                $item->price = ($item->price*$item->quantity)/100;
+            }
+
+        }else
+        {
+            foreach ($items as $item) {
+                $item->dates = date('Y-m',strtotime($item->date));
+                $item->project_name = $item->projects ? $item->projects->name : '';
+                $item->total_price = $item->total_price/100;
+                $item->status = $item->status?'已确认':'未确认';
+                $item->confirmation_user_id = $item->user ? $item->user->name : '';
+                $item->phone = $item->user ? $item->user->phone : '';
+            }
+        }
+
+
+        return response()->json(['code' => 0, 'message' => '', 'count' => $items->total(), 'data' => $items->items()]);
+    }
+
+    public function create()
+    {
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'create', compact('model', 'model_name','pre_uri'));
+    }
+
+    public function store(Request $request)
+    {
+        if(empty($request->input('data')) || !is_array($request->input('data'))) return back()->withErrors(['sg_error_info' => '数据错误']);
+        $validator = $this->model->getValidator($request, 'store');
+        if($validator->fails()) {
+            return back()->withErrors($validator)->withInput();
+        }
+        $data = $request->input('data');
+        $res = $this->model->create($data);
+        if(empty($res)) return back()->withErrors(['sg_error_info' => '保存失败']);
+        return redirect($this->pre_uri . 'create')->with(['sg_success_info' => '创建成功']);
+    }
+
+    public function edit(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return back()->withErrors(['sg_error_info' => '找不到要编辑的数据']);
+        list($model, $model_name, $pre_uri) = array($this->model, $this->model_name, $this->pre_uri);
+        return view($this->view_path . 'edit', compact('model', 'model_name', 'pre_uri', 'item'));
+    }
+
+    public function update(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return back()->withErrors(['sg_error_info' => '找不到要编辑的数据']);
+        if(empty($request->input('data')) || !is_array($request->input('data'))) return back()->withErrors(['sg_error_info' => '数据错误']);
+        $validator = $this->model->getValidator($request, 'update');
+        if($validator->fails()) {
+            return back()->withErrors($validator)->withInput();
+        }
+        $data = $request->input('data');
+        $res = $this->model->where('id', $request->input('id'))->update($data);
+        if(!$res) return back()->withErrors(['sg_error_info' => '数据库保存失败!']);
+        return back()->with(['sg_success_info' => '编辑成功']);
+    }
+
+    public function delete(Request $request)
+    {
+        if(empty($request->input('id')) || empty($item = $this->model->find($request->input('id')))) return response()->json(['status' => 'fail', 'info' => '找不到要删除的数据']);
+        DeviceName::where('device_id', $item->id)->delete();
+        Spec::where('device_id', $item->id)->delete();
+        $res = $item->delete();
+        if (!$res) return response()->json(['status' => 'fail', 'info' => '删除失败']);
+        return response()->json(['status' => 'success', 'info' => '操作成功']);
+    }
+
+}

+ 55 - 0
app/Models/OrderOverviewModel.php

xqd
@@ -0,0 +1,55 @@
+<?php
+namespace App\Models;
+use App\Models\BaseModel;
+use Illuminate\Database\Eloquent\Model;
+
+class OrderOverviewModel extends BaseModel
+{
+    /**
+     * 数据表名
+     *
+     * @var string
+     *
+     */
+    protected $table = 'order_overview';
+    /**
+    主键
+     */
+    protected $primaryKey = 'id';
+
+    //分页
+    protected $perPage = PAGE_NUMS;
+
+    /**
+     * 可以被集体附值的表的字段
+     *
+     * @var string
+     */
+    protected $fillable = [
+//                           'name',
+//                           'sort',
+                           'status'
+                          ];
+    public static function getOptions(){
+            return self::where('id', '>', 0)->get()->toArray();
+    }
+    public function projects(){
+        return $this->hasOne(Project::class,'id','project_id');
+    }
+    public function user(){
+        return $this->hasOne(User::class,'id','confirmation_user_id');
+    }
+    public function device()
+    {
+        return $this->hasOne(Device::class,'id','device_id');
+    }
+    public function device_name()
+    {
+        return $this->hasOne(DeviceName::class,'id','device_name_id');
+    }
+    public function spec()
+    {
+        return $this->hasOne(Spec::class,'id','spec_id');
+    }
+
+}

+ 23 - 12
resources/views/admin/order-overviews/index.blade.php

xqd xqd xqd
@@ -16,21 +16,22 @@
         </div>
         <div class="layui-card-body">
             <form class="layui-form" id="sg-search-form">
-                <div class="layui-form-item layui-row">
-                    <div class="layui-inline">
-                        <div class="layui-input-inline">
-                            <input type="text" name="name" placeholder="请输入设备名称" autocomplete="off" class="layui-input" value="{{ request('name') }}">
-                        </div>
-                    </div>
-                    <div class="layui-inline">
-                        <div class="layui-btn" id="sg-search-btn">搜索</div>
-                    </div>
-                </div>
+                {{--<div class="layui-form-item layui-row">--}}
+                    {{--<div class="layui-inline">--}}
+                        {{--<div class="layui-input-inline">--}}
+                            {{--<input type="text" name="name" placeholder="请输入设备名称" autocomplete="off" class="layui-input" value="{{ request('name') }}">--}}
+                        {{--</div>--}}
+                    {{--</div>--}}
+                    {{--<div class="layui-inline">--}}
+                        {{--<div class="layui-btn" id="sg-search-btn">搜索</div>--}}
+                    {{--</div>--}}
+                {{--</div>--}}
             </form>
             <table id="sg-main-table" class="layui-hide" lay-filter="tableEvent"></table>
             <script type="text/html" id="sg-table-bar">
                 <div class="layui-btn-group">
                     <div class="layui-btn-group">
+                        <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="details">账单详情</a>
                         <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
                         <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delete">删除</a>
                     </div>
@@ -55,8 +56,16 @@
                     url: '{{ $pre_uri }}' + 'get',
                     cellMinWidth: 80,
                     cols: [[
-                        { field: 'name', title: '设备名称', align: 'center' },
-                        { field: 'sort', title: '排序', align: 'center' },
+                        { field: 'order_sn', title: '订单号', align: 'center' },
+                        { field: 'dates', title: '年月', align: 'center' },
+                        { field: 'project_name', title: '项目名称', align: 'center' },
+                        { field: 'total_price', title: '总金额', align: 'center' },
+                        { field: 'confirmation_time', title: '对账时间', align: 'center' },
+                        { field: 'status', title: '订单确认状态', align: 'center' },
+                        { field: 'confirmation_user_id', title: '项目经理名称', align: 'center' },
+                        { field: 'phone', title: '联系电话', align: 'center' },
+                        { field: 'created_at', title: '创建时间', align: 'center' },
+                        { field: 'updated_at', title: '更新时间', align: 'center' },
                         { title: '操作', align:'center', toolbar: '#sg-table-bar' }
                     ]],
                     page: {
@@ -110,6 +119,8 @@
                                 top_window.location.reload();
                             }
                         });
+                    } else if(obj.event === 'details') {
+                        window.location = '/admin/OrderOverview/orderDetails?project_id=' + data.project_id+'&date='+ data.date;
                     }
                 });
 

+ 229 - 0
resources/views/admin/order-overviews/order-details.blade.php

xqd
@@ -0,0 +1,229 @@
+@extends('admin.layout-content')
+
+@section('header')
+    <style>
+
+    </style>
+@endsection
+
+@section('content')
+    <div class="layui-card">
+        <div class="layui-card-header sg-card-header">
+            账单详情表
+            {{--<div class="sg-card-create">--}}
+                {{--@if(request('inner_device_id'))--}}
+                    {{--<button id="sg-back-btn" class="layui-btn layui-btn-sm">返回</button>--}}
+                {{--@else--}}
+                    {{--<button id="sg-create-btn" class="layui-btn layui-btn-sm">创建</button>--}}
+                {{--@endif--}}
+            {{--</div>--}}
+        </div>
+        <div class="layui-card-body">
+            <form class="layui-form" id="sg-search-form">
+                <input type="hidden" name="project_id" value="{{ request('project_id') }}">
+                <input type="hidden" name="date" value="{{ request('date') }}">
+                <input type="hidden" name="type" value="details">
+
+                <div class="layui-form-item layui-row">
+                    {{--<div class="layui-inline">--}}
+                        {{--<div class="layui-input-inline">--}}
+                            {{--<input type="text" name="name" placeholder="请输入名称" autocomplete="off" class="layui-input" value="{{ request('name') }}">--}}
+                        {{--</div>--}}
+                    {{--</div>--}}
+                    <div class="layui-inline">
+                        <div class="layui-btn" id="sg-search-btn">搜索</div>
+                    </div>
+                </div>
+            </form>
+            <table id="sg-main-table" class="layui-hide" lay-filter="tableEvent"></table>
+            <script type="text/html" id="sg-table-bar">
+                <div class="layui-btn-group">
+                    <div class="layui-btn-group">
+                        <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
+                        <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delete">删除</a>
+                    </div>
+                </div>
+            </script>
+        </div>
+    </div>
+@endsection
+
+@section('footer')
+    <script>
+        $(function () {
+            layui.use(['table', 'layer'], function(){
+                var table = layui.table,
+                    layer = layui.layer,
+                    form = layui.form,
+                    laydate = layui.laydate,
+                    top_window = window;
+
+                $('#sg-back-btn').on('click', function () {
+                    window.history.go(-1);
+                });
+                table.render({
+                    elem: '#sg-main-table',
+                    url: '{{ $pre_uri }}' + 'get',
+                    cellMinWidth: 80,
+                    cols: [[
+                        { field: 'name', title: '调用设备名称', align: 'center' },
+                        { field: 'user_name', title: '提交人', align: 'center' },
+                        { field: 'price', title: '金额', align: 'center' },
+                        // { title: '操作', align:'center', toolbar: '#sg-table-bar' }
+                    ]],
+                    page: {
+                        layout: ['count', 'prev', 'page', 'next', 'skip', 'refresh'],
+                        limit: 15
+                    },
+                    even: true,
+                    where: transformToJson($('#sg-search-form').serializeArray()),
+                    done: function(res, curr, count) {
+
+                    }
+                });
+                table.on('tool(tableEvent)', function(obj){
+                    var data = obj.data;
+                    if(obj.event === 'delete'){
+                        layer.confirm('确定要删除吗?', function(index) {
+                            $.ajax({
+                                method: 'POST',
+                                url: '{{ $pre_uri }}' + 'delete',
+                                headers: {
+                                    'X-CSRF-TOKEN': '{{ csrf_token() }}'
+                                },
+                                data: {
+                                    id: data.id
+                                },
+                                success: function (data) {
+                                    if(data.status === 'success') {
+                                        obj.del();
+                                    } else {
+                                        layer.msg(data.info, {
+                                            icon: 2
+                                        });
+                                    }
+                                    layer.close(index);
+                                },
+                                error: function () {
+                                    layer.close(index);
+                                    layer.msg('删除失败', {
+                                        icon: 2
+                                    });
+                                }
+                            });
+                        });
+                    } else if(obj.event === 'edit') {
+                        layer.open({
+                            title: '编辑成员',
+                            type: 2,
+                            area: ['90%', '90%'],
+                            content: '{{ $pre_uri }}' + 'edit?id=' + data.id,
+                            end: function () {
+                                top_window.location.reload();
+                            }
+                        });
+                    }
+                });
+
+                if($('#search-begin-date').length > 0) {
+                    laydate.render({
+                        elem: '#search-begin-date',
+                        done: function () {
+                            updateTableBySearch();
+                        }
+                    });
+                }
+
+                if($('#search-end-date').length > 0) {
+                    laydate.render({
+                        elem: '#search-end-date',
+                        done: function () {
+                            updateTableBySearch();
+                        }
+                    });
+                }
+
+                function transformToJson(formData){
+                    var obj={};
+                    for (var i in formData) {
+                        obj[formData[i].name]=formData[i]['value'];
+                    }
+                    return obj;
+                }
+
+                function updateTableBySearch() {
+                    table.reload('sg-main-table', {
+                        where: transformToJson($('#sg-search-form').serializeArray()),
+                        page: {
+                            curr: 1
+                        }
+                    });
+                }
+
+                $('#sg-search-btn').click(function() {
+                    updateTableBySearch();
+                });
+                // $('#sg-search-form').change(function () {
+                //     updateTableBySearch();
+                // });
+                //
+                // form.on('select()', function(){
+                //     updateTableBySearch();
+                // });
+
+                $('#sg-create-btn').on('click', function () {
+                    layer.open({
+                        title: '创建' + '{{ $model_name }}',
+                        type: 2,
+                        area: ['90%', '90%'],
+                        content: '{{ $pre_uri }}' + 'create',
+                        end: function () {
+                            top_window.location.reload();
+                        }
+                    });
+                });
+
+                $('#sg-table-top-container').on('click', '.btn-delete-many', function () {
+                    layer.confirm('确定要删除所有选中行吗?', function () {
+                        var data = table.checkStatus('sg-main-table').data;
+                        if(data.length <= 0) {
+                            layer.msg('选择不能为空', {
+                                icon: 2
+                            });
+                            return false;
+                        }
+                        var ids = [];
+                        for(var i = 0; i < data.length; ++i) {
+                            ids.push(data[i]['id']);
+                        }
+                        $.ajax({
+                            method: 'POST',
+                            url: '{{ $pre_uri }}' + 'deleteMany',
+                            headers: {
+                                'X-CSRF-TOKEN': '{{ csrf_token() }}'
+                            },
+                            data: {
+                                ids: JSON.stringify(ids)
+                            },
+                            success: function (data) {
+                                if(data.status === 'success') {
+                                    top_window.location.reload();
+                                } else {
+                                    layer.msg(data.info, {
+                                        icon: 2
+                                    });
+                                }
+
+                            },
+                            error: function () {
+                                layer.msg('删除失败', {
+                                    icon: 2
+                                });
+                            }
+                        });
+                    })
+                });
+            });
+        })
+    </script>
+@endsection