李浩杰 4 rokov pred
rodič
commit
ae58a91e15
59 zmenil súbory, kde vykonal 2299 pridanie a 145 odobranie
  1. 2 3
      app/Http/Controllers/Admin/TestController.php
  2. 33 0
      app/Http/Controllers/Api/mini/DeviceController.php
  3. 14 2
      app/Http/Controllers/Api/mini/InnerDeviceController.php
  4. 154 27
      app/Http/Controllers/Api/mini/OrderController.php
  5. 5 0
      app/Http/Controllers/Api/mini/ProjectController.php
  6. 27 0
      app/Http/Controllers/Api/mini/RentTypeController.php
  7. 5 3
      app/Http/Controllers/Api/mini/WorkPointController.php
  8. 1 1
      app/Models/Device.php
  9. 8 0
      app/Models/DeviceName.php
  10. 5 0
      app/Models/InnerDevice.php
  11. 6 1
      app/Models/Order.php
  12. 9 0
      app/Models/RentType.php
  13. 31 0
      database/migrations/2020_12_19_021955_add_device_name_id_to_inner_devices.php
  14. 34 0
      database/migrations/2020_12_19_022242_create_device_names_table.php
  15. 31 0
      database/migrations/2020_12_19_022521_add_device_name_id_to_specs.php
  16. 33 0
      database/migrations/2020_12_19_023150_create_rent_types_table.php
  17. 32 0
      database/migrations/2020_12_19_023427_add_rent_type_id_to_order_devices.php
  18. 30 0
      database/migrations/2020_12_19_085113_add_inner_device_id_to_orders.php
  19. 12 15
      database/seeds/InnerOrderSeeder.php
  20. 42 4
      database/seeds/MiniSeeder.php
  21. 1 0
      database/seeds/OptionSeeder.php
  22. 14 5
      mini/app.json
  23. 27 1
      mini/app.wxss
  24. 23 0
      mini/components/inner-device-card/index.js
  25. 4 0
      mini/components/inner-device-card/index.json
  26. 34 0
      mini/components/inner-device-card/index.wxml
  27. 224 0
      mini/components/inner-device-card/index.wxss
  28. 40 4
      mini/pages/add-inner-device/index.js
  29. 7 7
      mini/pages/add-inner-device/index.wxml
  30. 3 0
      mini/pages/add-inner-device/index.wxss
  31. 21 24
      mini/pages/create-order-inner/index.js
  32. 12 4
      mini/pages/create-order-inner/index.wxml
  33. 89 9
      mini/pages/create-order/index.js
  34. 57 7
      mini/pages/create-order/index.wxml
  35. 4 1
      mini/pages/create-order/index.wxss
  36. 146 0
      mini/pages/device-inner/index.js
  37. 4 0
      mini/pages/device-inner/index.json
  38. 32 0
      mini/pages/device-inner/index.wxml
  39. 4 0
      mini/pages/device-inner/index.wxss
  40. 176 0
      mini/pages/filter/index.js
  41. 4 0
      mini/pages/filter/index.json
  42. 74 0
      mini/pages/filter/index.wxml
  43. 9 0
      mini/pages/filter/index.wxss
  44. 212 0
      mini/pages/order-detail-inner/index.js
  45. 4 0
      mini/pages/order-detail-inner/index.json
  46. 108 0
      mini/pages/order-detail-inner/index.wxml
  47. 57 0
      mini/pages/order-detail-inner/index.wxss
  48. 1 1
      mini/pages/order-detail/index.js
  49. 233 0
      mini/pages/order-inner/index.js
  50. 4 0
      mini/pages/order-inner/index.json
  51. 70 0
      mini/pages/order-inner/index.wxml
  52. 25 0
      mini/pages/order-inner/index.wxss
  53. 16 4
      mini/pages/order/index.js
  54. 19 16
      mini/pages/order/index.wxml
  55. 8 4
      mini/pages/project/index.js
  56. 1 1
      mini/pages/project/index.wxml
  57. 7 0
      mini/readme.md
  58. 6 1
      mini/utils/util.js
  59. 5 0
      routes/api.php

+ 2 - 3
app/Http/Controllers/Admin/TestController.php

xqd
@@ -17,9 +17,8 @@ class TestController extends Controller
 {
     public function index(Request $request)
     {
-        dd(InnerDevice::get()->pluck('name')->unique()->map(function($item) {
-            return collect(['text' => $item, 'name' => $item]);
-        }));
+        $a = json_decode(json_encode(['name' => 'a']));
+        dd($a->name);
     	return view('admin.test.index');
     }
 }

+ 33 - 0
app/Http/Controllers/Api/mini/DeviceController.php

xqd xqd
@@ -3,7 +3,10 @@
 namespace App\Http\Controllers\Api\mini;
 
 use App\Models\Device;
+use App\Models\DeviceName;
+use App\Models\Spec;
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Log;
 
 class DeviceController extends BaseController
 {
@@ -24,4 +27,34 @@ class DeviceController extends BaseController
         $items = $this->model->get();
         return $this->success(['data' => $items]);
     }
+
+    public function transObject($items)
+    {
+        return json_decode(json_encode($items));
+    }
+
+    public function getThreeLevel(Request $request)
+    {
+        if($request->input('type') == 'drop_menu') {
+            $items = $this->model->select('name as text', 'id as value')->get();
+            $items = $items->prepend($this->transObject(['text' => '设备类型', 'value' => '']));
+            foreach ($items as $item) {
+                $names = DeviceName::where('device_id', $item->value)->select('name as text', 'id as value')->get();
+                $item->names = $names->prepend($this->transObject(['text' => '设备名称', 'value' => '']));
+                foreach($item->names as $name) {
+                    $specs  = Spec::where('device_name_id', $name->value)->select('name as text', 'id as value')->get();
+                    $name->specs = $specs->prepend($this->transObject(['text' => '规格型号', 'value' => '']));
+                }
+            }
+            return $this->success(['data' => $items]);
+        }
+        $items = $this->model->select(['id', 'name'])->get();
+        foreach($items as $item) {
+            $item->names = DeviceName::where('device_id', $item->id)->select(['id', 'name'])->get();
+            foreach($item->names as $name) {
+                $name->specs = Spec::where('device_name_id', $name->id)->select(['id', 'name'])->get();
+            }
+        }
+        return $this->success(['data' => $items]);
+    }
 }

+ 14 - 2
app/Http/Controllers/Api/mini/InnerDeviceController.php

xqd xqd
@@ -31,8 +31,8 @@ class InnerDeviceController extends BaseController
 
     public function search(Request $request)
     {
-        $items = $this->model->with('workPoint', 'spec', 'device');
-        $equal_items = ['device_id', 'name', 'spec_id'];
+        $items = $this->model->with('workPoint', 'spec', 'device', 'device_name');
+        $equal_items = ['device_id', 'device_name_id', 'spec_id'];
         foreach ($equal_items as $item) {
             if($request->input($item)) {
                 $items = $items->where($item, '=', $request->input($item));
@@ -45,6 +45,18 @@ class InnerDeviceController extends BaseController
                 $items = $items->where($item, 'like', $keyword);
             }
         }
+        $in_items = ['project_ids', 'work_point_ids'];
+        $key_items = ['project_id', 'work_point_id'];
+        foreach ($in_items as $key => $item) {
+            if($request->input($item)) {
+                $ids = collect($request->input($item))->filter(function($id) {
+                    return $id;
+                });
+                if($ids->count() > 0) {
+                    $items = $items->whereIn($key_items[$key], $ids);
+                }
+            }
+        }
 //        $items = $items->orderBy('created_at');
         $items = $items->paginate();
         foreach($items as $item) {

+ 154 - 27
app/Http/Controllers/Api/mini/OrderController.php

xqd xqd xqd xqd xqd xqd xqd xqd
@@ -3,6 +3,7 @@
 namespace App\Http\Controllers\Api\mini;
 
 use App\Models\Device;
+use App\Models\DeviceName;
 use App\Models\InnerDevice;
 use App\Models\Option;
 use App\Models\Order;
@@ -10,6 +11,9 @@ use App\Models\OrderDevice;
 use App\Models\Project;
 use App\Models\ProjectRole;
 use App\Models\ProjectUser;
+use App\Models\RentType;
+use App\Models\Spec;
+use App\Models\WorkPoint;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\Log;
@@ -47,21 +51,50 @@ class OrderController extends BaseController
         $total = 0;
         foreach($devices as $device) {
             $price = $this->transMoney($device['price']);
-            OrderDevice::create([
-                'name' => $device['name'],
+            $data = $this->getNameSpecRent($device);
+            OrderDevice::create(array_merge([
                 'order_id' => $order->id,
-                'device_id' => $device['type_id'],
                 'quantity' => $device['quantity'],
                 'price' => $price,
                 'start_date' => $device['start_date'],
                 'end_date' => $device['end_date']
-            ]);
+            ], $data));
             $total = $total + ($price * (int)$device['quantity']);
         }
         $order->update(['money' => $total]);
         return $this->success();
     }
 
+    public function getNameSpecRent($data)
+    {
+        $device = Device::find($data['type_id']);
+
+        $rent_type = RentType::firstOrCreate([
+            'name' => $data['rent']
+        ]);
+        if(!$device) return [
+            'device_id' => '',
+            'device_name_id' => '',
+            'spec_id' => '',
+            'rent_type_id' => $rent_type->id
+        ];
+        $device_name = DeviceName::firstOrCreate([
+            'device_id' => $device->id,
+            'name' => $data['name']
+        ]);
+        $spec = Spec::firstOrCreate([
+            'device_id' => $device->id,
+            'device_name_id' => $device_name->id,
+            'name' => $data['spec']
+        ]);
+        return [
+            'device_id' => $device->id,
+            'device_name_id' => $device_name->id,
+            'spec_id' => $spec->id,
+            'rent_type_id' => $rent_type->id
+        ];
+    }
+
     public function createInner(Request $request)
     {
         $project = Project::find($request->input('project_id'));
@@ -70,14 +103,18 @@ class OrderController extends BaseController
         $using_id = Option::get('inner_devices', 'status', 'using');
         $free_id = Option::get('inner_devices', 'status', 'free');
 
-        foreach($devices as $device) {
-            $device = InnerDevice::find($device['id']);
-            if($device->status != $free_id) {
-                $status = Option::find($device->status);
-                $msg = $device['name'] . ($status ? $status['name'] : '使用中') . ',不能使用';
-                return $this->error(['msg' => $msg]);
+        // 续租时不检查设备使用状态
+        if(!$request->input('type') || $request->input('type') != 're-rent') {
+            foreach($devices as $device) {
+                $device = InnerDevice::find($device['id']);
+                if($device->status != $free_id) {
+                    $status = Option::find($device->status);
+                    $msg = $device['name'] . ($status ? $status['name'] : '使用中') . ',不能使用';
+                    return $this->error(['msg' => $msg]);
+                }
             }
         }
+
         $user = Auth::guard('mini')->user();
         $project_role_id = $request->input('is_draft') == 1 ? ProjectRole::getByKey('machine', 'id') : ProjectRole::getByKey('assist', 'id');
         $option = Option::get('orders', 'status', 'checking');
@@ -98,15 +135,17 @@ class OrderController extends BaseController
             OrderDevice::create([
                 'name' => $device['name'],
                 'order_id' => $order->id,
-                'device_id' => $device['id'],
+                'inner_device_id' => $device['id'],
                 'start_date' => $device['start_date'],
                 'end_date' => $device['end_date']
             ]);
             if($device['id']) {
                 InnerDevice::find($device['id'])->update([
+                    'project_id' => $order['project_id'],
                     'status' => $using_id,
                     'start_date' => $device['start_date'],
-                    'end_date' => $device['end_date']
+                    'end_date' => $device['end_date'],
+                    'work_point_id' => $request->input('work_point_id')
                 ]);
             }
         }
@@ -151,25 +190,104 @@ class OrderController extends BaseController
         return $this->success();
     }
 
+    public function updateInner(Request $request)
+    {
+        $order = $this->model->find($request->input('id'));
+        if(!$order) return $this->error(['msg' => '找不到订单']);
+        $user = Auth::guard('mini')->user();
+        $project_role_id = $request->input('is_draft') == 1 ? ProjectRole::getByKey('work', 'id') : ProjectRole::getByKey('machine', 'id');
+        $type = $request->input('type');
+        $option = Option::get('orders', 'status', 'checking');
+        if($type == 'back') {
+            $option = Option::get('orders', 'status', 'back');
+        }
+
+        $res = $order->update([
+            'work_point_id' => $request->input('work_point_id'),
+            'remark' => $request->input('remark'),
+            'is_draft' => $request->input('is_draft'),
+            'status' => $option,
+            'user_id' => $user->id,
+            'project_role_id' => $project_role_id
+        ]);
+        if(!$res) return $this->error(['msg' => '订单修改失败']);
+        $devices = $request->input('devices');
+        if($type == 'back') {
+            foreach($devices as $device) {
+                if($device['id']) {
+                    InnerDevice::find($device['id'])->update([
+                        'project_id' => '',
+                        'start_date' => '',
+                        'end_date' => '',
+                        'work_point_id' => '',
+                        'status' => Option::get('inner_devices', 'status', 'free')
+                    ]);
+                }
+            }
+        } else {
+            OrderDevice::where('order_id', '=', $order->id)->delete();
+            foreach($devices as $device) {
+                OrderDevice::create([
+                    'name' => $device['name'],
+                    'order_id' => $order->id,
+                    'device_id' => $device['id'],
+                    'start_date' => $device['start_date'],
+                    'end_date' => $device['end_date']
+                ]);
+                if($device['id']) {
+                    InnerDevice::find($device['id'])->update([
+                        'start_date' => $device['start_date'],
+                        'end_date' => $device['end_date'],
+                        'work_point_id' => $request->input('work_point_id')
+                    ]);
+                }
+            }
+        }
+
+        return $this->success();
+    }
+
     public function get(Request $request)
     {
-        $items = $this->model->where('project_id', $request->input('project_id'))->where('is_draft', 2);
+        $items = $this->model->join('users', 'orders.user_id', '=', 'users.id')->select('orders.*', 'users.id as user_id', 'users.name');
+        $search_items = [
+            ['project_id', $request->input('project_id')],
+            ['is_draft', 2]
+        ];
         if($request->input('status')) {
             $status = Option::get('orders', 'status', $request->input('status'));
-            if($status) $items = $items->where('status', $status);
+            if($status) {
+                array_push($search_items, ['status', '=', $status]);
+            };
         }
-        $equal_items = ['work_point_id'];
+        $equal_items = ['work_point_id', 'type'];
         foreach ($equal_items as $item) {
             if($request->input($item)) {
-                $items = $items->where($item, '=', $request->input($item));
+                array_push($search_items, [$item, '=', $request->input($item)]);
             }
         }
-        $items = $items->orderBy('created_at', 'desc');
+        $items = $items->where($search_items);
+        if($request->input('keyword')) {
+            $keyword = '%' . $request->input('keyword') . '%';
+            $items = $items->where(function ($query) use($keyword) {
+                $query->where('order_number', 'like', $keyword)->orWhere('users.name', 'like', $keyword);
+            });
+        }
+        $items = $items->orderBy('updated_at', 'desc');
         $items = $items->paginate();
+        $type = $request->input('type');
+        $type = $type ? $type : 0;
         foreach($items as $item) {
-            $item->devices = OrderDevice::where('order_id', $item->id)->get();
-            foreach($item->devices as $device) {
-                $device->type = $device->device ? $device->device->name : '';
+            if($type == 1) {
+                $item->devices = OrderDevice::where('order_id', $item->id)->get();
+                foreach($item->devices as $device) {
+                    $device->device = Device::find($device->device_id);
+                    $device->device_name = DeviceName::find($device->device_name_id);
+                    $device->spec = Spec::find($device->spec_id);
+                    $device->rent_type = RentType::find($device->rent_type_id);
+                }
+            } else if($type == 2) {
+                $item->devices = $item->innerDevices;
             }
             $item->user_name = $item->user ? $item->user->name : '';
             $this->formatOrder($item);
@@ -190,9 +308,14 @@ class OrderController extends BaseController
 
     public function detail(Request $request)
     {
-        $order = $this->model->with('project', 'workPoint', 'devices', 'user')->find($request->input('id'));
+        $order = $this->model->with('project', 'workPoint', 'devices', 'user', 'innerDevices')->find($request->input('id'));
         if(!$order) return $this->error(['msg' => '找不到订单']);
         $this->formatOrder($order);
+        foreach($order['innerDevices'] as $device) {
+            $device->status = Option::find($device->status);
+            $device->spec = Spec::find($device->spec);
+            $device->work_point = WorkPoint::find($device->work_point_id);
+        }
         return $this->success(['data' => $order]);
     }
 
@@ -222,20 +345,24 @@ class OrderController extends BaseController
         if(!$project_role) return $this->error(['msg' => '找不到角色']);
         $status = Option::get('orders', 'status', $request->input('type'));
 
-        // 工区负责人确认通过
+        $is_inner = $order->type == 2;
+        // 工区负责人或机电负责人确认通过
         if($request->input('type') == 'confirm') {
             $status = Option::get('orders', 'status', 'pass');
             $next_project_role_id = $project_role->id;
         } else if($request->input('type') == 're-submit') {
             $status = Option::get('orders', 'status', 'checking');
-            $next_project_role_id = $project_role->getNext('id');
-        } else {
-            if($request->input('type') == 'reject' || $project_role->key == 'manager') {
-                $next_project_role_id = ProjectRole::getByKey('work', 'id');
+            $next_project_role_id = $project_role->getNext('id', $is_inner);
+        } else if($request->input('type') == 'reject') {
+            if($is_inner) {
+                $next_project_role_id = ProjectRole::getByKey('machine', 'id');
             } else {
-                $next_project_role_id = $project_role->getNext('id');
+                $next_project_role_id = ProjectRole::getByKey('work', 'id');
             }
+        } else {
+            $next_project_role_id = $project_role->getNext('id', $is_inner);
         }
+
         $res = $order->update([
             'status' => $status,
             'last_project_role_id' => $project_role->id,

+ 5 - 0
app/Http/Controllers/Api/mini/ProjectController.php

xqd
@@ -77,6 +77,11 @@ class ProjectController extends BaseController
 
     public function getAll(Request $request)
     {
+        if($request->input('type') == 'drop_menu') {
+            $items = $this->model->select('name as text', 'id as value')->get();
+            $items = $items->prepend(collect(['text' => '请选择项目', 'value' => '']));
+            return $this->success(['data' => $items]);
+        }
         $items = $this->model->get();
         return $this->success(['msg' => '创建成功', 'data' => $items]);
     }

+ 27 - 0
app/Http/Controllers/Api/mini/RentTypeController.php

xqd
@@ -0,0 +1,27 @@
+<?php
+
+namespace App\Http\Controllers\Api\mini;
+
+use App\Models\RentType;
+use Illuminate\Http\Request;
+
+class RentTypeController extends BaseController
+{
+    protected $model;
+
+    public function __construct()
+    {
+        $this->model = new RentType();
+    }
+
+    public function get(Request $request)
+    {
+        if($request->input('type') == 'drop_menu') {
+            $items = $this->model->select('name as text', 'id as value')->get();
+            $items = $items->prepend(collect(['text' => '型号规格', 'value' => '']));
+            return $this->success(['data' => $items]);
+        }
+        $items = $this->model->get();
+        return $this->success(['data' => $items]);
+    }
+}

+ 5 - 3
app/Http/Controllers/Api/mini/WorkPointController.php

xqd
@@ -21,10 +21,12 @@ class WorkPointController extends BaseController
 
     public function get(Request $request)
     {
-        $items = $this->model->get();
-        if($request->has('is_search')) {
-            $items = $items->prepend(collect(['id' => '0', 'name' => '所有需求工点']));
+        if($request->input('type') == 'drop_menu') {
+            $items = $this->model->select('name as text', 'id as value')->get();
+            $items = $items->prepend(collect(['text' => '所需工点', 'value' => '']));
+            return $this->success(['data' => $items]);
         }
+        $items = $this->model->get();
         return $this->success(['data' => $items]);
     }
 }

+ 1 - 1
app/Models/Device.php

xqd
@@ -4,5 +4,5 @@ namespace App\Models;
 
 class Device extends BaseModel
 {
-    //
+    // 设备类型
 }

+ 8 - 0
app/Models/DeviceName.php

xqd
@@ -0,0 +1,8 @@
+<?php
+
+namespace App\Models;
+
+class DeviceName extends BaseModel
+{
+    //
+}

+ 5 - 0
app/Models/InnerDevice.php

xqd
@@ -18,4 +18,9 @@ class InnerDevice extends BaseModel
     {
         return $this->belongsTo('App\Models\Device', 'device_id');
     }
+
+    public function device_name()
+    {
+        return $this->belongsTo('App\Models\DeviceName', 'device_name_id');
+    }
 }

+ 6 - 1
app/Models/Order.php

xqd xqd
@@ -40,6 +40,11 @@ class Order extends BaseModel
         return $this->belongsToMany('App\Models\Device', 'order_devices', 'order_id', 'device_id')->withPivot('name', 'quantity', 'price', 'start_date', 'end_date', 'id');
     }
 
+    public function innerDevices()
+    {
+        return $this->belongsToMany('App\Models\InnerDevice', 'order_devices', 'order_id', 'inner_device_id')->withPivot('id', 'start_date', 'end_date');
+    }
+
     public function getOrderStatus(Project $project, $user, $is_draft)
     {
         if($is_draft) {
@@ -62,7 +67,7 @@ class Order extends BaseModel
         } else if($option['key'] == 'pass') {
             return '提交人 - 已确定';
         }
-        return '';
+        return $option ? $option['name'] : '';
     }
 
     public function updateMoney()

+ 9 - 0
app/Models/RentType.php

xqd
@@ -0,0 +1,9 @@
+<?php
+
+namespace App\Models;
+
+
+class RentType extends BaseModel
+{
+    //
+}

+ 31 - 0
database/migrations/2020_12_19_021955_add_device_name_id_to_inner_devices.php

xqd
@@ -0,0 +1,31 @@
+<?php
+
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+class AddDeviceNameIdToInnerDevices extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('inner_devices', function (Blueprint $table) {
+            $table->unsignedInteger('device_name_id')->nullable()->after('name');
+            $table->unsignedInteger('project_id')->nullable()->after('device_name_id');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        //
+    }
+}

+ 34 - 0
database/migrations/2020_12_19_022242_create_device_names_table.php

xqd
@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+class CreateDeviceNamesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('device_names', function (Blueprint $table) {
+            $table->increments('id');
+            $table->unsignedInteger('device_id')->nullable()->comment('设备类型ID');
+            $table->string('name', 200)->nullable()->comment('设备名');
+            $table->integer('sort')->nullable();
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('device_names');
+    }
+}

+ 31 - 0
database/migrations/2020_12_19_022521_add_device_name_id_to_specs.php

xqd
@@ -0,0 +1,31 @@
+<?php
+
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+class AddDeviceNameIdToSpecs extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('specs', function (Blueprint $table) {
+            $table->unsignedInteger('device_id')->nullable()->comment('设备类型ID')->after('name');
+            $table->unsignedInteger('device_name_id')->nullable()->comment('设备名称ID')->after('name');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        //
+    }
+}

+ 33 - 0
database/migrations/2020_12_19_023150_create_rent_types_table.php

xqd
@@ -0,0 +1,33 @@
+<?php
+
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+class CreateRentTypesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('rent_types', function (Blueprint $table) {
+            $table->increments('id');
+            $table->string('name', 200)->nullable();
+            $table->integer('sort')->nullable();
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('rent_types');
+    }
+}

+ 32 - 0
database/migrations/2020_12_19_023427_add_rent_type_id_to_order_devices.php

xqd
@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+class AddRentTypeIdToOrderDevices extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('order_devices', function (Blueprint $table) {
+            $table->unsignedInteger('device_name_id')->nullable()->after('device_id');
+            $table->unsignedInteger('spec_id')->nullable()->after('device_id');
+            $table->unsignedInteger('rent_type_id')->nullable()->comment('租赁类型ID')->after('device_id');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        //
+    }
+}

+ 30 - 0
database/migrations/2020_12_19_085113_add_inner_device_id_to_orders.php

xqd
@@ -0,0 +1,30 @@
+<?php
+
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+class AddInnerDeviceIdToOrders extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('order_devices', function (Blueprint $table) {
+            $table->unsignedInteger('inner_device_id')->nullable()->after('device_id');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        //
+    }
+}

+ 12 - 15
database/seeds/InnerOrderSeeder.php

xqd xqd xqd
@@ -12,28 +12,23 @@ class InnerOrderSeeder extends Seeder
     public function run()
     {
         $total = 20;
-        for($i = 0; $i < $total; ++$i) {
-            \App\Models\Spec::create([
-                'name' => '规格' . ($i + 1),
-                'sort' => ($i + 1)
-            ]);
-        }
 
         $this->call([
             InnerDeviceStatusSeeder::class
         ]);
 
         $statuses = \App\Models\Option::get('inner_devices', 'status');
-        $specs = \App\Models\Spec::limit(3)->get();
-        $device_types = \App\Models\Device::limit(3)->get();
         \App\Models\InnerDevice::truncate();
+        $specs = \App\Models\Spec::all();
         for($i = 0; $i < $total * 10; ++$i) {
+            $spec = $specs->random();
             \App\Models\InnerDevice::create([
                 'name' => '内部设备' . ($i + 1),
-                'device_id' => $device_types->random()->id,
-                'spec_id' => $specs->random()->id,
+                'device_id' => $spec->device_id,
+                'device_name_id' => $spec->device_name_id,
+                'spec_id' => $spec->id,
                 'status' => $statuses->whereIn('key', ['free', 'error'])->first()->id,
-                'number' => time(),
+                'number' => mt_rand(10000, 99999),
                 'produce_date' => '2020-01-01',
                 'shape' => '180cm*180cm',
                 'buy_origin' => '100',
@@ -41,10 +36,11 @@ class InnerOrderSeeder extends Seeder
             ]);
             \App\Models\InnerDevice::create([
                 'name' => '内部设备' . ($i + 1),
-                'device_id' => $device_types->random()->id,
-                'spec_id' => $specs->random()->id,
+                'device_id' => $spec->device_id,
+                'device_name_id' => $spec->device_name_id,
+                'spec_id' => $spec->id,
                 'status' => $statuses->where('key', 'free')->first()->id,
-                'number' => time(),
+                'number' => mt_rand(10000, 99999),
                 'produce_date' => '2020-01-01',
                 'shape' => '180cm*180cm',
                 'buy_origin' => '100',
@@ -163,12 +159,13 @@ class InnerOrderSeeder extends Seeder
             $device = \App\Models\InnerDevice::where('status', $free_id)->where('id', '>', 10)->first();
             \App\Models\OrderDevice::create([
                 'order_id' => $order['id'],
-                'device_id' => $device->id,
+                'inner_device_id' => $device->id,
                 'start_date' => $start_date,
                 'end_date' => $end_date
             ]);
 //            \Illuminate\Support\Facades\Log::info($order['work_point_id']);
             $device->update([
+                'project_id' => $order['project_id'],
                 'status' => $using_id,
                 'start_date' => $start_date,
                 'end_date' => $end_date,

+ 42 - 4
database/seeds/MiniSeeder.php

xqd xqd
@@ -54,12 +54,43 @@ class MiniSeeder extends Seeder
         }
 
         \App\Models\Device::truncate();
+        \App\Models\DeviceName::truncate();
+        \App\Models\Spec::truncate();
         // 创建设备类型
-        $device_types = ['隧道掘进机', '钻机', '起重机械', '隧道牵引机械', '混泥土泵送机械', '土石方机械', '运输机械', '其他'];
+        $device_types = ['起重机械', '隧道掘进机'];
+        $cnt = 0;
         foreach($device_types as $key => $value) {
-            \App\Models\Device::create([
+            $cnt = $cnt + 1;
+            $device = \App\Models\Device::create([
                 'name' => $value,
-                'sort' => $key + 1
+                'sort' => $cnt
+            ]);
+            for($i = 1; $i < 3; ++$i) {
+                $cnt = $cnt + 1;
+                $device_name = \App\Models\DeviceName::create([
+                    'device_id' => $device->id,
+                    'name' => $value . $cnt,
+                    'sort' => $cnt
+                ]);
+
+                for($j = 1; $j < 3; ++$j) {
+                    $cnt = $cnt + 1;
+                    \App\Models\Spec::create([
+                        'device_id' => $device->id,
+                        'device_name_id' => $device_name->id,
+                        'name' => '规格' . $cnt,
+                        'sort' => $cnt,
+                    ]);
+                }
+            }
+        }
+
+        \App\Models\RentType::truncate();
+        $rent_names = ['按小时', '按天'];
+        foreach($rent_names as $key => $rent_name) {
+            \App\Models\RentType::create([
+                'name' => $rent_name,
+                'sort' => ($key + 1)
             ]);
         }
 
@@ -186,16 +217,23 @@ class MiniSeeder extends Seeder
     {
         $money = 0;
 
+        $specs = \App\Models\Spec::all();
+        $rent_types = \App\Models\RentType::all();
         for($j = 1; $j < 3; ++$j) {
             $start_date = \Carbon\Carbon::now()->addDay(mt_rand(1, 4))->toDateString();
             $end_date = \Carbon\Carbon::now()->addDay(mt_rand(5, 10))->toDateString();
             $quantity = mt_rand(1, 5);
             $price = mt_rand(1, 10) * 1000;
             $money = $money + $quantity * $price;
+            $spec = $specs->random();
+            $rent_type = $rent_types->random();
             \App\Models\OrderDevice::create([
                 'name' => '设备' . $j,
                 'order_id' => $order['id'],
-                'device_id' => $devices->random()->id,
+                'device_id' => $spec->device_id,
+                'device_name_id' => $spec->device_name_id,
+                'spec_id' => $spec->id,
+                'rent_type_id' => $rent_type->id,
                 'quantity' => $quantity,
                 'price' => $price,
                 'start_date' => $start_date,

+ 1 - 0
database/seeds/OptionSeeder.php

xqd
@@ -19,6 +19,7 @@ class OptionSeeder extends Seeder
             ['name' => '已审核', 'key' => 'checked', 'color' => 'rgba(76, 173, 132, 1)'],
             ['name' => '已完成', 'key' => 'pass', 'color' => 'rgba(25, 133, 251, 1)'],
             ['name' => '已驳回', 'key' => 'reject', 'color' => 'rgba(225, 132, 132, 1)'],
+            ['name' => '已归还', 'key' => 'back', 'color' => 'rgb(114, 50, 221)'],
         ];
         \App\Models\Option::where([
             ['table', '=', $table],

+ 14 - 5
mini/app.json

xqd xqd
@@ -1,13 +1,17 @@
 {
   "pages": [
-    "pages/create-order-inner/index",
-    "pages/add-inner-device/index",
-    "pages/index/index",
+    "pages/device-inner/index",
+    "pages/filter/index",
     "pages/project/index",
+    "pages/order-inner/index",
     "pages/order/index",
+    "pages/add-inner-device/index",
+    "pages/create-order/index",
+    "pages/create-order-inner/index",
+    "pages/index/index",
+    "pages/order-detail-inner/index",
     "pages/order-detail/index",
     "pages/account/index",
-    "pages/create-order/index",
     "pages/create-project-role/index",
     "pages/project-user/index",
     "pages/create-project/index",
@@ -51,6 +55,11 @@
     "van-tabbar": "@vant/weapp/tabbar/index",
     "van-tabbar-item": "@vant/weapp/tabbar-item/index",
     "van-dropdown-menu": "@vant/weapp/dropdown-menu/index",
-    "van-dropdown-item": "@vant/weapp/dropdown-item/index"
+    "van-dropdown-item": "@vant/weapp/dropdown-item/index",
+    "inner-device-card": "/components/inner-device-card/index",
+    "van-checkbox": "@vant/weapp/checkbox/index",
+    "van-checkbox-group": "@vant/weapp/checkbox-group/index",
+    "van-tab": "@vant/weapp/tab/index",
+    "van-tabs": "@vant/weapp/tabs/index"
   }
 }

+ 27 - 1
mini/app.wxss

xqd xqd xqd xqd xqd xqd
@@ -4,6 +4,9 @@
   padding-bottom: 100rpx;
   background: #f0f0f0;
 }
+.sg-light-gray-bg {
+  background: #f0f0f0;
+}
 .sg-bg {
   width: 100%;
   position: fixed;
@@ -20,6 +23,10 @@
 .sg-pad-bottom-sm {
   padding-bottom: 15rpx;
 }
+.sg-pad-tb-sm {
+  padding-bottom: 15rpx;
+  padding-top: 15rpx;
+}
 .sg-pad-sm {
   padding: 15rpx;
 }
@@ -39,6 +46,10 @@
 .sg-white {
   color: white;
 }
+.sg-center {
+  margin-left: auto;
+  margin-right: auto;
+}
 .sg-white-bg {
   background: white;
 }
@@ -75,12 +86,18 @@
 .sg-margin-bottom {
   margin-bottom: 30rpx;
 }
+.sg-margin-right {
+  margin-right: 30rpx;
+}
 .sg-margin-tb {
   margin: 30rpx 0;
 }
 .sg-pad-tb {
   padding: 30rpx 0;
 }
+.sg-pad-tb-sm {
+  padding: 15rpx 0;
+}
 .sg-margin-tb-sm {
   margin: 15rpx 0;
 }
@@ -158,10 +175,19 @@
   background: #ee0a24;
   color: white;
 }
+.sg-green {
+  color: #07c160;
+}
 .sg-green-bg {
   background: #07c160;
   color: white;
 }
+.sg-black {
+  color: black;
+}
+.sg-yellow {
+  color: #ff976a;
+}
 .sg-fix-bottom {
   width: 100%;
   position: fixed;
@@ -192,4 +218,4 @@
   height: 20rpx;
   border-radius: 50%;
   margin-right: 20rpx;
-}
+}

+ 23 - 0
mini/components/inner-device-card/index.js

xqd
@@ -0,0 +1,23 @@
+// components/inner-device-card/index.js
+Component({
+  /**
+   * 组件的属性列表
+   */
+  properties: {
+    item: Object
+  },
+
+  /**
+   * 组件的初始数据
+   */
+  data: {
+
+  },
+
+  /**
+   * 组件的方法列表
+   */
+  methods: {
+
+  }
+})

+ 4 - 0
mini/components/inner-device-card/index.json

xqd
@@ -0,0 +1,4 @@
+{
+  "component": true,
+  "usingComponents": {}
+}

+ 34 - 0
mini/components/inner-device-card/index.wxml

xqd
@@ -0,0 +1,34 @@
+<!--components/inner-device-card/index.wxml-->
+<view class="sg-item sg-white-bg sg-pad sg-margin-bottom">
+  <view class="sg-top sg-flex sg-space-between sg-bottom-border sg-pad-bottom-sm sg-font-small sg-bold">
+    <view class="sg-name">{{item.device ? item.device.name : ''}} - {{item.device_name ? item.device_name.name : ''}}
+    </view>
+    <view class="sg-status sg-flex sg-align-center">
+      <view class="sg-dot" style="background: {{item.status ? item.status.color : ''}}"></view>
+      <view class="sg-status-name">{{item.status ? item.status.name : ''}}</view>
+    </view>
+  </view>
+  <view class="sg-body sg-font-xs sg-bottom-border sg-pad-bottom-sm">
+    <view class="sg-item sg-margin-tb-sm sg-flex">
+      <view class="sg-left-item sg-width-50">固定资产编号:{{item.number}}</view>
+      <view class="sg-right-item sg-width-50">出厂日期:{{item.produce_date}}</view>
+    </view>
+    <view class="sg-item sg-margin-tb-sm sg-flex">
+      <view class="sg-left-item sg-width-50">外形尺寸:{{item.shape}}</view>
+      <view class="sg-right-item sg-width-50">采购原值:{{item.buy_origin}}</view>
+    </view>
+    <view class="sg-item sg-margin-tb-sm sg-flex">
+      <view class="sg-left-item sg-width-50">规格型号:{{item.spec ? item.spec.name : ''}}</view>
+      <view class="sg-right-item sg-width-50">生产厂家:{{item.manufacturer}}</view>
+    </view>
+  </view>
+  <view class="sg-bottom sg-font-xs sg-flex sg-align-center sg-space-between">
+    <view class="sg-left">
+      <view class="sg-item sg-margin-tb-sm">目前在用工点:{{item.work_point ? item.work_point.name : '无'}}</view>
+      <view class="sg-item sg-margin-tb-sm">借用时间:{{item.start_date ? item.start_date + '至' + item.end_date : '无'}}
+      </view>
+    </view>
+    <!-- <view class="sg-white sg-pad-sm {{item.status && item.status.key == 'free' ? 'sg-green-bg' : 'sg-gray-bg'}}">
+          借用设备</view> -->
+  </view>
+</view>

+ 224 - 0
mini/components/inner-device-card/index.wxss

xqd
@@ -0,0 +1,224 @@
+/**app.wxss**/
+.sg-container {
+  min-height: 100vh;
+  padding-bottom: 100rpx;
+  background: #f0f0f0;
+}
+.sg-light-gray-bg {
+  background: #f0f0f0;
+}
+.sg-bg {
+  width: 100%;
+  position: fixed;
+  top: 0;
+  left: 0;
+  z-index: -1;
+}
+.sg-pad-top {
+  padding-top: 30rpx;
+}
+.sg-pad-bottom {
+  padding-bottom: 30rpx;
+}
+.sg-pad-bottom-sm {
+  padding-bottom: 15rpx;
+}
+.sg-pad-tb-sm {
+  padding-bottom: 15rpx;
+  padding-top: 15rpx;
+}
+.sg-pad-sm {
+  padding: 15rpx;
+}
+.sg-pad {
+  padding: 30rpx;
+}
+.sg-pad-lg {
+  padding: 50rpx;
+  box-sizing: border-box;
+}
+.sg-center {
+  text-align: center;
+}
+.sg-primary-color {
+  color: #195ED7;
+}
+.sg-white {
+  color: white;
+}
+.sg-center {
+  margin-left: auto;
+  margin-right: auto;
+}
+.sg-white-bg {
+  background: white;
+}
+.sg-gray-color {
+  color: rgba(16, 16, 16, 0.5);
+}
+.sg-gray-bg {
+  background: rgba(16, 16, 16, 0.5);
+}
+.sg-bold {
+  font-weight: bold;
+}
+.sg-border {
+  border: 1px solid #ebedf0;
+}
+.sg-bottom-border {
+  border-bottom: 1px solid #ebedf0;
+}
+.sg-top-border {
+  border-top: 1px solid #ebedf0;
+}
+.sg-border-right {
+  border-right: 1px solid #ebedf0;
+}
+.sg-margin {
+  margin: 30rpx;
+}
+.sg-margin-top-sm {
+  margin-top: 30rpx;
+}
+.sg-margin-top {
+  margin-top: 50rpx;
+}
+.sg-margin-bottom {
+  margin-bottom: 30rpx;
+}
+.sg-margin-right {
+  margin-right: 30rpx;
+}
+.sg-margin-tb {
+  margin: 30rpx 0;
+}
+.sg-pad-tb {
+  padding: 30rpx 0;
+}
+.sg-pad-tb-sm {
+  padding: 15rpx 0;
+}
+.sg-margin-tb-sm {
+  margin: 15rpx 0;
+}
+.sg-shadow {
+  box-shadow: 0px 4px 6px 1px #c9c9c9;
+}
+.sg-icon-img {
+  width: 50rpx;
+}
+.sg-font-lg {
+  font-size: 1.2rem;
+}
+.sg-font-xs {
+  font-size: 0.8rem;
+}
+.sg-font-small {
+  font-size: 0.9rem;
+}
+.sg-index-bg {
+  background-color: #5693FC;
+}
+.sg-index-color {
+  color: #5693FC;
+}
+.sg-tabs .sg-tab.sg-selected {
+  color: #5693FC;
+  border-color: #5693FC;
+}
+.sg-avatar {
+  width: 80rpx;
+  border-radius: 50%;
+  border: 2px solid white;
+}
+.sg-icon {
+  font-size: 1.2rem;
+}
+.sg-header {
+  font-size: 1.2rem;
+  font-weight: bold;
+}
+.sg-flex {
+  display: flex;
+}
+.sg-align-center {
+  align-items: center;
+}
+.sg-space-between {
+  justify-content: space-between;
+}
+.sg-just-center {
+  justify-content: center;
+}
+.sg-space-around {
+  justify-content: space-around;
+}
+.sg-flex-grow {
+  flex-grow: 1;
+}
+.sg-bottom-submit-box {
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  background: white;
+}
+.sg-big-avatar {
+  width: 130rpx;
+  margin-right: 30rpx;
+  border-radius: 50%;
+}
+.sg-red {
+  color: #ee0a24;
+}
+.sg-red-bg {
+  background: #ee0a24;
+  color: white;
+}
+.sg-green {
+  color: #07c160;
+}
+.sg-green-bg {
+  background: #07c160;
+  color: white;
+}
+.sg-black {
+  color: black;
+}
+.sg-yellow {
+  color: #ff976a;
+}
+.sg-fix-bottom {
+  width: 100%;
+  position: fixed;
+  z-index: 100;
+  left: 0;
+  bottom: 0;
+}
+.sg-text-right {
+  text-align: right;
+}
+.sg-fix-top {
+  position: fixed;
+  left: 0;
+  top: 0;
+  width: 100%;
+}
+.sg-calendar .van-calendar {
+  z-index: 3000;
+}
+.sg-flex-column {
+  flex-direction: column;
+}
+.sg-block {
+  width: 100%;
+}
+.sg-dot {
+  width: 20rpx;
+  height: 20rpx;
+  border-radius: 50%;
+  margin-right: 20rpx;
+}
+.sg-width-50 {
+  width: 50%;
+}

+ 40 - 4
mini/pages/add-inner-device/index.js

xqd xqd xqd
@@ -29,12 +29,34 @@ Page({
    * 生命周期函数--监听页面加载d
    */
   onLoad: function (options) {
-    api.getByName(this, 'devices/get', 'device_types', {type: 'drop_menu'});
-    api.getByName(this, 'inner-devices/get', 'names', {type: 'drop_menu'});
-    api.getByName(this, 'specs/get', 'specs', {type: 'drop_menu'});
+    var that = this
+    api.getByName(this, 'devices/getThreeLevel', 'device_types', {type: 'drop_menu'}, function() {
+      that.updateNameSpec()
+    });
+    // api.getByName(this, 'inner-devices/get', 'names', {type: 'drop_menu'});
+    // api.getByName(this, 'specs/get', 'specs', {type: 'drop_menu'});
     this.getList()
   },
 
+  getItemById(items, id) {
+    for(var i = 0; i < items.length; ++i) {
+      if(items[i].value == id) return items[i]
+    }
+    return null
+  },
+
+  updateNameSpec: function() {
+    var device_types = this.data.device_types
+    var typeItem = this.getItemById(device_types, this.data.type)
+    var names = typeItem.names;
+    var nameItem = this.getItemById(names, this.data.name)
+    // var specs = this.getItemById(nameItem.specs, this.data.spec)
+    this.setData({
+      names,
+      specs: nameItem.specs
+    })
+  },
+
   switchShowDate: function(e) {
     this.setData({
       showDate: e.currentTarget.dataset.show
@@ -97,6 +119,20 @@ Page({
     this.setData({
       [name]: e.detail
     })
+    if(['type', 'name'].indexOf(name) != -1) {
+      if(name == 'type') {
+        this.setData({
+          name: '',
+          spec: ''
+        })
+      }
+      if(name == 'name') {
+        this.setData({
+          spec: ''
+        })
+      }
+      this.updateNameSpec()
+    }
     this.search()
   },
 
@@ -120,7 +156,7 @@ Page({
       data: {
         number: this.data.number,
         device_id: this.data.type,
-        name: this.data.name,
+        device_name_id: this.data.name,
         spec_id: this.data.spec,
         page: this.data.page
       },

+ 7 - 7
mini/pages/add-inner-device/index.wxml

xqd xqd
@@ -18,7 +18,7 @@
     <view class="sg-item sg-white-bg sg-pad sg-margin-bottom" wx:for="{{list}}" wx:key="index" bindtap="switchSelect"
       data-index="{{index}}" data-can="{{item.status && item.status.key == 'free'}}">
       <view class="sg-top sg-flex sg-space-between sg-bottom-border sg-pad-bottom-sm sg-font-small sg-bold">
-        <view class="sg-name">设备名称:{{item.name}}</view>
+        <view class="sg-name">{{item.device ? item.device.name : ''}} - {{item.device_name ? item.device_name.name : ''}}</view>
         <view class="sg-status sg-flex sg-align-center">
           <view class="sg-dot" style="background: {{item.status ? item.status.color : ''}}"></view>
           <view class="sg-status-name">{{item.status ? item.status.name : ''}}</view>
@@ -27,27 +27,27 @@
         <van-icon name="circle" wx:else class="sg-icon" />
       </view>
       <view class="sg-body sg-font-xs sg-bottom-border sg-pad-bottom-sm">
-        <view class="sg-item sg-margin-tb-sm sg-flex sg-space-between">
+        <view class="sg-item sg-margin-tb-sm sg-flex">
           <view class="sg-left-item">固定资产编号:{{item.number}}</view>
           <view class="sg-right-item">出厂日期:{{item.produce_date}}</view>
         </view>
-        <view class="sg-item sg-margin-tb-sm sg-flex sg-space-between">
+        <view class="sg-item sg-margin-tb-sm sg-flex">
           <view class="sg-left-item">外形尺寸:{{item.shape}}</view>
           <view class="sg-right-item">采购原值:{{item.buy_origin}}</view>
         </view>
-        <view class="sg-item sg-margin-tb-sm sg-flex sg-space-between">
+        <view class="sg-item sg-margin-tb-sm sg-flex">
           <view class="sg-left-item">规格型号:{{item.spec ? item.spec.name : ''}}</view>
           <view class="sg-right-item">生产厂家:{{item.manufacturer}}</view>
         </view>
       </view>
-      <view class="sg-bottom sg-font-xs sg-flex sg-space-between sg-align-center">
+      <view class="sg-bottom sg-font-xs sg-flex sg-align-center sg-space-between">
         <view class="sg-left">
           <view class="sg-item sg-margin-tb-sm">目前在用工点:{{item.work_point ? item.work_point.name : '无'}}</view>
           <view class="sg-item sg-margin-tb-sm">借用时间:{{item.start_date ? item.start_date + '至' + item.end_date : '无'}}
           </view>
         </view>
-        <view class="sg-white sg-pad-sm {{item.status && item.status.key == 'free' ? 'sg-green-bg' : 'sg-gray-bg'}}">
-          借用设备</view>
+        <!-- <view class="sg-white sg-pad-sm {{item.status && item.status.key == 'free' ? 'sg-green-bg' : 'sg-gray-bg'}}">
+          借用设备</view> -->
       </view>
     </view>
   </view>

+ 3 - 0
mini/pages/add-inner-device/index.wxss

xqd
@@ -2,6 +2,9 @@
 .sg-list {
   margin-top: 220rpx;
 }
+.sg-left-item {
+  width: 50%;
+}
 .sg-icon {
   z-index: 0;
 }

+ 21 - 24
mini/pages/create-order-inner/index.js

xqd xqd xqd xqd xqd
@@ -18,16 +18,22 @@ Page({
     devices: [],
     // create/edit
     type: 'create',
-    order_id: ''
+    order_id: '',
+    loadedOrder: false
   },
 
   /**
    * 生命周期函数--监听页面加载
    */
   onLoad: function (options) {
+    // options = {
+    //   id: 1,
+    //   type: 'edit',
+    //   order_id: 194
+    // }
     var id = options.id ? options.id : 1
     var type = options.type ? options.type : 'create'
-    var order_id = options.order_id ? options.order_id : ''
+    var order_id = options.order_id ? options.order_id : 195
     this.setData({
       id,
       type,
@@ -63,24 +69,11 @@ Page({
         break;
       }
     }
-    var devices = order.devices
-    var local_devices = []
-    for(var i = 0; i < devices.length; ++i) {
-      var device = devices[i]
-      local_devices.push({
-        name: device.pivot.name,
-        type_name: device.name,
-        type_id: device.id,
-        quantity: device.pivot.quantity,
-        price: device.pivot.price / 100,
-        start_date: device.pivot.start_date,
-        end_date: device.pivot.end_date
-      })
-    }
     this.setData({
       pointIndex,
       remark: order.remark,
-      devices: local_devices
+      devices: order.inner_devices,
+      loadedOrder: true
     })
   },
 
@@ -97,7 +90,8 @@ Page({
       return false;
     }
     var work_point = this.data.work_points[this.data.pointIndex]
-    var url = submit_type == 'create' ? 'orders/createInner' : 'orders/updateInner'
+    var url = (submit_type == 'create' || type == 're-rent') ? 'orders/createInner' : 'orders/updateInner'
+    wx.setStorageSync('sg-added-devices', [])
     http({
       url: url,
       data: {
@@ -106,7 +100,8 @@ Page({
         work_point_id: work_point.id,
         remark: this.data.remark,
         devices: this.data.devices,
-        is_draft: is_draft
+        is_draft: is_draft,
+        type: type
       },
       success: function(res) {
         if(res.code == 0) {
@@ -140,11 +135,13 @@ Page({
    * 生命周期函数--监听页面显示
    */
   onShow: function () {
-    var devices = wx.getStorageSync('sg-added-devices')
-    devices = devices ? devices : []
-    this.setData({
-      devices
-    })
+    if(this.data.type == 'create' || this.data.loadedOrder) {
+      var devices = wx.getStorageSync('sg-added-devices')
+      devices = devices ? devices : []
+      this.setData({
+        devices
+      })
+    }
   },
 
   goAdd: function(e) {

+ 12 - 4
mini/pages/create-order-inner/index.wxml

xqd xqd
@@ -46,7 +46,8 @@
             <view class="sg-left-bottom sg-gray-color sg-font-xs">{{item.start_date}}至{{item.end_date}}</view>
           </view>
           <view class="sg-right sg-pad sg-flex sg-align-center sg-icon">
-            <view class="sg-right sg-red-bg sg-white sg-pad-sm sg-font-small" bindtap="deleteDevice" data-index="{{index}}">删除</view>
+            <view class="sg-right sg-red-bg sg-white sg-pad-sm sg-font-small" bindtap="deleteDevice"
+              data-index="{{index}}">删除</view>
           </view>
           <!-- <view class="sg-right sg-red-bg sg-pad sg-flex sg-align-center" bindtap="deleteDevice" data-index="{{index}}">删除</view> -->
         </view>
@@ -54,12 +55,19 @@
     </view>
   </view>
   <block wx:if="{{tabIndex == 1}}">
-    <view class="sg-submit-box sg-pad sg-fix-bottom sg-flex sg-align-center sg-center" bindtap="goAdd" data-url="/pages/add-inner-device/index">
+    <view class="sg-submit-box sg-pad sg-fix-bottom sg-flex sg-align-center sg-center" bindtap="goAdd"
+      data-url="/pages/add-inner-device/index">
       <van-icon name="plus" /><text>立即添加</text>
     </view>
   </block>
   <view class="sg-submit-box sg-fix-bottom sg-flex sg-align-center sg-center" wx:if="{{tabIndex == 0}}">
-    <view class="sg-action sg-draft sg-pad sg-border-right" bindtap="submit" data-type='draft'>暂存</view>
-    <view class="sg-action sg-pad sg-index-bg sg-white" bindtap="submit" data-type='save'>提交</view>
+    <block wx:if="{{type == 'create'}}">
+      <view class="sg-action sg-draft sg-pad sg-border-right" bindtap="submit" data-type='draft'>暂存</view>
+      <view class="sg-action sg-pad sg-index-bg sg-white" bindtap="submit" data-type='save'>提交</view>
+    </block>
+    <block wx:else>
+      <view class="sg-action sg-draft sg-pad sg-border-right sg-red-bg" bindtap="submit" data-type='back'>归还</view>
+      <view class="sg-action sg-pad sg-index-bg sg-white sg-green-bg" bindtap="submit" data-type='re-rent'>续租</view>
+    </block>
   </view>
 </view>

+ 89 - 9
mini/pages/create-order/index.js

xqd xqd xqd xqd xqd
@@ -9,16 +9,29 @@ Page({
    */
   data: {
     tabs: ['设备租赁订单', '租赁设备添加'],
-    tabIndex: 0,
+    tabIndex: 1,
     work_points: [],
     pointIndex: -1,
     id: -1,
     project: null,
     remark: '',
     devices: [],
-    showAdd: false,
+    showAdd: true,
     device_types: [],
+    rent_types: [],
     typeIndex: -1,
+    nameIndex: -1,
+    specIndex: -1,
+    rentIndex: -1,
+    selectName: '',
+    selectSepc: '',
+    selectRent: '',
+    customName: false,
+    customSpec: false,
+    customRent: false,
+    customNameVal: '',
+    customNameSpecVal: '',
+    customRentVal: '',
     device_name: '',
     device_quantity: '',
     device_price: '',
@@ -49,7 +62,8 @@ Page({
     })
     api.getProject(this)
     api.getByName(this, 'work-points/get', 'work_points');
-    api.getByName(this, 'devices/get', 'device_types');
+    api.getByName(this, 'devices/getThreeLevel', 'device_types');
+    api.getByName(this, 'rent-types/get', 'rent_types');
     if(order_id) {
       var that = this
       api.getByName(this, 'orders/detail', 'order', {id: order_id}, function(res) {
@@ -175,13 +189,31 @@ Page({
     })
   },
 
+  getCustom: function(name) {
+    var index = name + 'Index'
+    var caseName = util.firstCase(name)
+    var custom = 'custom' + caseName
+    var customVal = custom + 'Val'
+    var select = 'select' + caseName
+    var data = this.data
+    return data[custom] ? data[customVal] : (data[index] >= 0 ? data[select] : '')
+  },
+
   addDevice: function() {
-    if(!this.data.device_name) {
-      util.error('设备名称必填');
+    if(this.data.typeIndex < 0) {
+      util.error('设备类型必填');
       return false;
     }
-    if(!this.data.typeIndex < 0) {
-      util.error('设备类型必填')
+    if(!this.getCustom('name')) {
+      util.error('设备名称必填')
+      return false
+    }
+    if(!this.getCustom('spec')) {
+      util.error('规格型号必填')
+      return false
+    }
+    if(!this.getCustom('rent')) {
+      util.error('租赁方式必填')
       return false
     }
     if(!this.data.device_quantity) {
@@ -198,10 +230,15 @@ Page({
     }
     var devices = this.data.devices
     var type = this.data.device_types[this.data.typeIndex]
+    var name = this.getCustom('name')
+    var spec = this.getCustom('spec')
+    var rent = this.getCustom('rent')
     var device = {
-      name: this.data.device_name,
       type_name: type.name,
       type_id: type.id,
+      name: name,
+      spec: spec,
+      rent: rent,
       quantity: this.data.device_quantity,
       price: this.data.device_price,
       start_date: this.data.start_date,
@@ -220,9 +257,52 @@ Page({
 
   onChange: function(e) {
     var name = e.currentTarget.dataset.name
+    var val = e.detail.value
+    if(['customSpec', 'customName', 'customRent'].indexOf(name) != -1) {
+      val = e.detail;
+    }
     this.setData({
-      [name]: e.detail.value
+      [name]: val
     })
+    if(name == 'customName' && val) {
+      this.setData({
+        customSpec: true,
+      })
+    }
+    if(name == 'typeIndex') {
+      this.setData({
+        nameIndex: -1,
+        specIndex: -1
+      })
+    }
+    if(name == 'nameIndex') {
+      var device_types = this.data.device_types
+      var typeIndex = this.data.typeIndex
+      var nameIndex = this.data.nameIndex
+      var selectName = device_types[typeIndex].names[nameIndex].name
+      this.setData({
+        selectName: selectName,
+        specIndex: -1
+      })
+    }
+    if(name == 'specIndex') {
+      var device_types = this.data.device_types
+      var typeIndex = this.data.typeIndex
+      var nameIndex = this.data.nameIndex
+      var specIndex = this.data.specIndex
+      var selectSpec = device_types[typeIndex].names[nameIndex].specs[specIndex].name
+      this.setData({
+        selectSpec: selectSpec
+      })
+    }
+    if(name == 'rentIndex') {
+      var rent_types = this.data.rent_types
+      var rentIndex = this.data.rentIndex
+      var selectRent = rent_types[rentIndex].name
+      this.setData({
+        selectRent: selectRent
+      })
+    }
   },
 
   switchShowAdd: function(e) {

+ 57 - 7
mini/pages/create-order/index.wxml

xqd xqd xqd
@@ -28,7 +28,7 @@
     </view>
   </view>
   <van-calendar show="{{ showDate }}" bind:close="switchShowDate" bind:confirm="confirmDate" data-show="{{false}}"
-    type="range" class="sg-calendar" default-date="{{default_dates}}"/>
+    type="range" class="sg-calendar" default-date="{{default_dates}}" />
   <view class="sg-device-box" wx:if="{{tabIndex == 1}}">
     <view class="sg-device-list sg-top-border">
       <block wx:if="{{devices.length <= 0}}">
@@ -55,13 +55,9 @@
       </block>
     </view>
   </view>
-  <van-dialog show="{{ showAdd }}" use-slot title="{{dialog_type == 'create' ? '添加设备' : '修改设备'}}" show-cancel-button bind:confirm="addDevice" z-index="1">
+  <van-dialog show="{{ showAdd }}" use-slot title="{{dialog_type == 'create' ? '添加设备' : '修改设备'}}" show-cancel-button
+    bind:confirm="addDevice" z-index="1">
     <view class="sg-add-device-box sg-pad sg-font-small">
-      <view class="sg-form-item sg-pad-tb sg-top-border">
-        <view class="sg-label">设备名称</view>
-        <input value="{{device_name}}" class="sg-input" bindinput="onChange" data-name="device_name"
-          placeholder="请输入设备名称"></input>
-      </view>
       <view class="sg-form-item sg-pad-tb sg-top-border">
         <view class="sg-label">设备类型</view>
         <picker bindchange="onChange" value="{{typeIndex}}" range="{{device_types}}" range-key="name"
@@ -71,6 +67,60 @@
           </view>
         </picker>
       </view>
+      <view class="sg-form-item sg-pad-tb sg-top-border">
+        <view class="sg-label">设备名称</view>
+        <block wx:if="{{customName}}">
+          <input value="{{customNameVal}}" class="sg-input" bindinput="onChange" data-name="customNameVal"
+            placeholder="请输入设备名称"></input>
+        </block>
+        <block wx:else>
+          <picker bindchange="onChange" value="{{nameIndex}}" range="{{device_types[typeIndex].names}}" range-key="name"
+            data-name="nameIndex" class="sg-input">
+            <view class="picker sg-gray-color">
+              {{nameIndex >= 0 ? device_types[typeIndex].names[nameIndex].name : '选择设备名称'}}
+            </view>
+          </picker>
+        </block>
+        <view class="sg-custom">
+          <van-checkbox value="{{ customName }}" bind:change="onChange" data-name="customName">项目自填</van-checkbox>
+        </view>
+      </view>
+      <view class="sg-form-item sg-pad-tb sg-top-border">
+        <view class="sg-label">规格型号</view>
+        <block wx:if="{{customSpec}}">
+          <input value="{{customSpecVal}}" class="sg-input" bindinput="onChange" data-name="customSpecVal"
+            placeholder="请输入规格型号"></input>
+        </block>
+        <block wx:else>
+          <picker bindchange="onChange" value="{{specIndex}}" range="{{device_types[typeIndex].names[nameIndex].specs}}"
+            range-key="name" data-name="specIndex" class="sg-input">
+            <view class="picker sg-gray-color">
+              {{specIndex >= 0 ? device_types[typeIndex].names[nameIndex].specs[specIndex].name : '选择规格型号'}}
+            </view>
+          </picker>
+        </block>
+        <view class="sg-custom">
+          <van-checkbox value="{{ customSpec }}" bind:change="onChange" data-name="customSpec">项目自填</van-checkbox>
+        </view>
+      </view>
+      <view class="sg-form-item sg-pad-tb sg-top-border">
+        <view class="sg-label">租赁方式</view>
+        <block wx:if="{{customRent}}">
+          <input value="{{customRentVal}}" class="sg-input" bindinput="onChange" data-name="customRentVal"
+            placeholder="请输入租赁方式"></input>
+        </block>
+        <block wx:else>
+          <picker bindchange="onChange" value="{{rentIndex}}" range="{{rent_types}}" range-key="name"
+            data-name="rentIndex" class="sg-input">
+            <view class="picker sg-gray-color">
+              {{rentIndex >= 0 ? rent_types[rentIndex].name : '选择租赁方式'}}
+            </view>
+          </picker>
+        </block>
+        <view class="sg-custom">
+          <van-checkbox value="{{ customRent }}" bind:change="onChange" data-name="customRent">项目自填</van-checkbox>
+        </view>
+      </view>
       <view class="sg-form-item sg-pad-tb sg-top-border">
         <view class="sg-label">租赁时间</view>
         <input value="{{ start_date ? start_date + '至' + end_date : '' }}" placeholder="请选择租赁时间" class="sg-input"

+ 4 - 1
mini/pages/create-order/index.wxss

xqd
@@ -45,5 +45,8 @@
   width: 50%;
 }
 .sg-submit-box.sg-fix-bottom {
-  z-index: 1;
+  z-index: 0;
+}
+.sg-custom {
+  min-width: 200rpx;
 }

+ 146 - 0
mini/pages/device-inner/index.js

xqd
@@ -0,0 +1,146 @@
+// pages/device-inner/index.js
+import http from '../../utils/http'
+import util from '../../utils/util'
+import api from '../../utils/api'
+
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    list: [],
+    page: 1,
+    touchBottom: false,
+    project_ids: [''],
+    work_point_ids: [''],
+    device: '',
+    device_name_id: '',
+    spec_id: '',
+    list: []
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad: function (options) {
+    
+  },
+
+  getList: function () {
+    var data = this.data
+    var that = this
+    http({
+      url: 'inner-devices/search',
+      data: {
+        number: data.number,
+        project_ids: data.project_ids,
+        work_point_ids: data.work_point_ids,
+        device_id: data.device_id,
+        device_name_id: data.device_name_id,
+        spec_id: data.spec_id,
+        page: data.page
+      },
+      success: function (res) {
+        if (res.code == 0) {
+          var list = that.data.list
+          var touchBottom = that.data.touchBottom
+          list = list.concat(res.data);
+          if (res.data.length <= 0) {
+            touchBottom = true;
+          }
+          that.setData({
+            touchBottom,
+            list,
+            isSearch: false
+          })
+        }
+      }
+    })
+  },
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady: function () {
+
+  },
+
+  navigate: function(e) {
+    this.saveFilter()
+    wx.navigateTo({
+      url: e.currentTarget.dataset.url,
+    })
+  },
+
+  saveFilter() {
+    var data = {
+      project_ids: this.data.project_ids,
+      work_point_ids: this.data.work_point_ids,
+      type: this.data.type,
+      name: this.data.name,
+      spec: this.data.spec
+    }
+    wx.setStorageSync('sg-device-filters', data)
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow: function () {
+    var data = wx.getStorageSync('sg-device-filters')
+    this.setData(data)
+    this.search()
+  },
+
+  search: function() {
+    this.setData({
+      touchBottom: false,
+      list: [],
+      page: 1
+    })
+    this.getList()
+  },
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide: function () {
+    // this.saveSearchOption()
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload: function () {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh: function () {
+
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom: function () {
+    if(!this.data.touchBottom) {
+      this.setData({
+        page: this.data.page + 1
+      })
+      this.getList()
+    } else {
+      util.error('没有更多数据了')
+    }
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage: function () {
+
+  }
+})

+ 4 - 0
mini/pages/device-inner/index.json

xqd
@@ -0,0 +1,4 @@
+{
+  "navigationBarTitleText": "所有设备",
+  "usingComponents": {}
+}

+ 32 - 0
mini/pages/device-inner/index.wxml

xqd
@@ -0,0 +1,32 @@
+<!--pages/device-inner/index.wxml-->
+<view class="sg-container">
+  <view class="sg-top sg-fix-top">
+    <van-search value="{{ number }}" placeholder="按设备固定资产编号模糊搜索" left-icon="none" use-action-slot use-right-icon-slot bind:change="onChange"
+      bind:search="onSearch">
+      <van-icon name="search" slot="right-icon" class="sg-icon sg-bold" bindtap="search"/>
+      <van-icon name="filter-o" slot="action" class="sg-icon sg-index-color sg-bold" bindtap="navigate" data-url="/pages/filter/index"/>
+    </van-search>
+    <view class="sg-stat-list sg-pad sg-white-bg sg-flex sg-align-center sg-space-around sg-font-xs sg-gray-color">
+      <view class="sg-item">
+        <text>闲置:</text><text class="sg-bold sg-green">125</text>
+      </view>
+      <view class="sg-item">
+        <text>在用:</text><text class="sg-bold sg-red">125</text>
+      </view>
+      <view class="sg-item">
+        <text>维修:</text><text class="sg-bold sg-yellow">125</text>
+      </view>
+      <view class="sg-item">
+        <text>报废:</text><text class="sg-bold sg-black">125</text>
+      </view>
+    </view>
+  </view>
+  <view class="sg-list">
+    <block wx:if="{{list.length > 0}}">
+      <inner-device-card item="{{item}}" wx:key="index" wx:for="{{list}}"></inner-device-card>
+    </block>
+    <block wx:else>
+      <view class="sg-text-center sg-center sg-gray-color">没有搜索到设备</view>
+    </block>
+  </view>
+</view>

+ 4 - 0
mini/pages/device-inner/index.wxss

xqd
@@ -0,0 +1,4 @@
+/* pages/device-inner/index.wxss */
+.sg-list {
+  padding-top: 220rpx;
+}

+ 176 - 0
mini/pages/filter/index.js

xqd
@@ -0,0 +1,176 @@
+// pages/filter/index.js
+import http from '../../utils/http'
+import util from '../../utils/util'
+import api from '../../utils/api'
+
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    active: 0,
+    projects: [],
+    project_ids: [''],
+    work_points: [],
+    work_point_ids: [''],
+    device_types: [],
+    device_id: '',
+    names: [],
+    device_name_id: '',
+    specs: [],
+    spec_id: ''
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad: function (options) {
+    api.getByName(this, 'projects/getAll', 'projects', {type: 'drop_menu'});
+    api.getByName(this, 'work-points/get', 'work_points', {type: 'drop_menu'});
+    var that = this
+    api.getByName(this, 'devices/getThreeLevel', 'device_types', {type: 'drop_menu'}, function() {
+      that.updateNameSpec()
+    });
+  },
+
+  onChange: function(e) {
+    var name = e.currentTarget.dataset.name
+    this.setData({
+      [name]: e.detail
+    })
+    if(['device_id', 'device_name_id'].indexOf(name) != -1) {
+      if(name == 'device_id') {
+        this.setData({
+          device_name_id: '',
+          spec_id: ''
+        })
+      }
+      if(name == 'device_name_id') {
+        this.setData({
+          spec_id: ''
+        })
+      }
+      this.updateNameSpec()
+    }
+  },
+
+  confirm: function() {
+    this.saveFilter()
+    wx.navigateBack()
+  },
+
+  updateNameSpec: function() {
+    var device_types = this.data.device_types
+    var typeItem = this.getItemById(device_types, this.data.device_id)
+    var names = typeItem.names;
+    var nameItem = this.getItemById(names, this.data.device_name_id)
+    // var specs = this.getItemById(nameItem.specs, this.data.spec)
+    this.setData({
+      names,
+      specs: nameItem.specs
+    })
+  },
+
+  getItemById(items, id) {
+    for(var i = 0; i < items.length; ++i) {
+      if(items[i].value == id) return items[i]
+    }
+    return ''
+  },
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady: function () {
+
+  },
+
+  delete: function(e) {
+    var name = e.currentTarget.dataset.name
+    var index = e.currentTarget.dataset.index
+    var items = this.data[name]
+    items.splice(index, 1)
+    this.setData({
+      [name]: items
+    })
+  },
+
+  add: function(e) {
+    var name = e.currentTarget.dataset.name
+    var items = this.data[name]
+    if(!items[items.length - 1]) {
+      util.error('请先选择');
+      return false
+    }
+    items.push('')
+    this.setData({
+      [name]: items
+    })
+  },
+
+  onDropChange: function(e) {
+    var index = e.currentTarget.dataset.index
+    var name = e.currentTarget.dataset.name
+    var val = e.detail
+    var items = this.data[name]
+    items[index] = val
+    this.setData({
+      [name]: items
+    })
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow: function () {
+    var data = wx.getStorageSync('sg-device-filters')
+    this.setData(data)
+  },
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide: function () {
+    this.saveFilter()
+  },
+
+  saveFilter() {
+    var data = {
+      project_ids: this.data.project_ids,
+      work_point_ids: this.data.work_point_ids,
+      device_id: this.data.device_id,
+      device_name_id: this.data.device_name_id,
+      spec_id: this.data.spec_id
+    }
+    wx.setStorageSync('sg-device-filters', data)
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload: function () {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh: function () {
+
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom: function () {
+    
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage: function () {
+
+  }
+})

+ 4 - 0
mini/pages/filter/index.json

xqd
@@ -0,0 +1,4 @@
+{
+  "navigationBarTitleText": "所有设备",
+  "usingComponents": {}
+}

+ 74 - 0
mini/pages/filter/index.wxml

xqd
@@ -0,0 +1,74 @@
+<!--pages/filter/index.wxml-->
+<view class="sg-container sg-index-bg">
+  <view class="sg-pad sg-white">
+    <view class="sg-flex sg-align-center sg-bold sg-font-lg">
+      <van-icon name="notes-o" class="sg-icon sg-margin-right" />
+      <view>数据筛选选择</view>
+    </view>
+    <view class="sg-pad-tb sg-font-small">请根据你需要查看的数据,选择筛选条件</view>
+  </view>
+  <view class="sg-search-tabs sg-white-bg">
+    <van-tabs active="{{ active }}" bind:change="onChange" class="sg-tabs">
+      <van-tab title="项目名称">
+        <view class="sg-list sg-pad sg-light-gray-bg">
+          <view class="sg-bold sg-text-center sg-center sg-margin-tb">- 请选择筛选项目 - </view>
+          <view>
+            <view wx:for="{{project_ids}}" wx:key="index" class="sg-flex sg-align-center">
+              <van-dropdown-menu class="sg-flex-grow sg-margin-tb-sm sg-margin-right">
+                <van-dropdown-item value="{{ item }}" options="{{ projects }}" bind:change="onDropChange"
+                  data-name="project_ids" data-index="{{index}}" />
+              </van-dropdown-menu>
+              <van-button icon="cross" type="danger" bindtap="delete" data-name="project_ids"
+                data-index="{{index}}"></van-button>
+            </view>
+          </view>
+          <view class="sg-margin-tb">
+            <van-button type="primary" block icon="plus" bindtap="add" data-name="project_ids">新增</van-button>
+          </view>
+        </view>
+      </van-tab>
+      <van-tab title="需求工点">
+        <view class="sg-list sg-pad sg-light-gray-bg">
+          <view class="sg-bold sg-text-center sg-center sg-margin-tb">- 请选择所需工点 - </view>
+          <view>
+            <view wx:for="{{work_point_ids}}" wx:key="index" class="sg-flex sg-align-center">
+              <van-dropdown-menu class="sg-flex-grow sg-margin-tb-sm sg-margin-right">
+                <van-dropdown-item value="{{ item }}" options="{{ work_points }}" bind:change="onDropChange"
+                  data-name="work_point_ids" data-index="{{index}}" />
+              </van-dropdown-menu>
+              <van-button icon="cross" type="danger" bindtap="delete"
+                data-name="work_point_ids" data-index="{{index}}"></van-button>
+            </view>
+          </view>
+          <view class="sg-margin-tb">
+            <van-button type="primary" block icon="plus" bindtap="add" data-name="work_point_ids">新增</van-button>
+          </view>
+        </view>
+      </van-tab>
+      <van-tab title="设备类型">
+        <view class="sg-list sg-pad sg-light-gray-bg">
+          <view class="sg-bold sg-text-center sg-center sg-margin-tb">- 请选择筛选设备 - </view>
+          <view class="sg-pad-tb-sm">
+            <van-dropdown-menu>
+              <van-dropdown-item value="{{ device_id }}" options="{{ device_types }}" bind:change="onChange"
+                data-name="device_id" />
+            </van-dropdown-menu>
+          </view>
+          <view class="sg-pad-tb-sm">
+            <van-dropdown-menu>
+              <van-dropdown-item value="{{ device_name_id }}" options="{{ names }}" bind:change="onChange" data-name="device_name_id" />
+            </van-dropdown-menu>
+          </view>
+          <view class="sg-pad-tb-sm">
+            <van-dropdown-menu>
+              <van-dropdown-item value="{{ spec_id }}" options="{{ specs }}" bind:change="onChange" data-name="spec_id" />
+            </van-dropdown-menu>
+          </view>
+        </view>
+      </van-tab>
+    </van-tabs>
+  </view>
+  <view class="sg-fix-bottom">
+    <van-button type="info" block bindtap="confirm">点击确认</van-button>
+  </view>
+</view>

+ 9 - 0
mini/pages/filter/index.wxss

xqd
@@ -0,0 +1,9 @@
+/* pages/filter/index.wxss */
+.sg-search-tabs {
+  border-top-left-radius: 30rpx;
+  border-top-right-radius: 30rpx;
+  padding-top: 30rpx;
+}
+.sg-search-tabs .sg-list {
+  min-height: 80vh;
+}

+ 212 - 0
mini/pages/order-detail-inner/index.js

xqd
@@ -0,0 +1,212 @@
+// pages/create-order/index.js
+import http from '../../utils/http'
+import util from '../../utils/util'
+import api from '../../utils/api'
+import Dialog from '../../miniprogram_npm/@vant/weapp/dialog/dialog';
+
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    tabs: ['内部设备调用', '调用设备添加'],
+    tabIndex: 1,
+    id: -1,
+    order: null,
+    device_total: 0,
+    role: null,
+    // 审核(check)|确认(pass)|重新提交(re-submit)
+    actionType: null,
+    changePrice: false,
+    remark: '',
+    order_device: {},
+    showPrice: false,
+    device_price: ''
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad: function (options) {
+    var id = options.id ? options.id : 193
+    this.setData({
+      id
+    })
+    this.init()
+  },
+
+  onChange: function(e) {
+    var name = e.currentTarget.dataset.name
+    this.setData({
+      [name]: e.detail.value
+    })
+  },
+
+  init() {
+    var that = this
+    var id = this.data.id
+    api.getByName(this, 'orders/detail', 'order', {
+      id: id
+    }, function (res) {
+      that.setData({
+        remark: that.data.order.remark
+      })
+      that.updateDeviceTotal()
+      api.getByName(that, 'orders/getRole', 'role', {
+        id: id
+      }, function (res) {
+        that.updateActionType()
+      });
+    });
+  },
+
+  updateActionType: function () {
+    var actionType = ''
+    var role = this.data.role
+    var order = this.data.order
+    if (order.project_role_id == role.id) {
+      if (['assist', 'manager', 'admin'].indexOf(role.project_role.key) != -1) actionType = 'check'
+      if(order.status_key == 'checked' && role.project_role.key == 'machine') actionType = 'pass'
+      if(order.status_key == 'reject' && role.project_role.key == 'machine') actionType = 're-submit'
+    }
+    var changePrice = false
+    this.setData({
+      actionType,
+      changePrice
+    })
+  },
+
+  changePrice: function() {
+    var order_device = this.data.order_device
+    var price = this.data.device_price
+    var that = this
+    http({
+      url: 'orders/changePrice',
+      data: {
+        id: order_device.pivot.id,
+        price: price
+      },
+      success: function (res) {
+        if (res.code == 0) {
+          that.init()
+        }
+      }
+    })
+  },
+
+  switchShowPrice: function(e) {
+    var data =  e.currentTarget.dataset
+    var show = data.show
+    var item = data.item
+    if(show) {
+      this.setData({
+        order_device: item,
+        device_price: item.pivot.price / 100
+      })
+    }
+    this.setData({
+      showPrice: e.currentTarget.dataset.show
+    })
+  },
+
+  updateDeviceTotal: function () {
+    var order = this.data.order
+    var devices = order.inner_devices ? order.inner_devices : []
+    var total = devices.length
+    this.setData({
+      device_total: total,
+      devices: devices
+    })
+  },
+
+  switchTab: function (e) {
+    this.setData({
+      tabIndex: e.currentTarget.dataset.index
+    })
+  },
+
+  check: function(e) {
+    var type = e.currentTarget.dataset.type
+    var that = this
+    var msg = '确认通过审核吗?'
+    if(type == 'reject') msg = '确认驳回申请吗?'
+    else if(type == 'confirm' || type == 're-submit') msg = '确认提交吗?'
+    Dialog.confirm({
+      title: '提示',
+      message: msg,
+    })
+      .then(() => {
+        that.submitCheck(e)
+      })
+  },
+  submitCheck: function (e) {
+    var type = e.currentTarget.dataset.type
+    var that = this
+    http({
+      url: 'orders/check',
+      data: {
+        id: this.data.id,
+        type: type,
+        remark: this.data.remark
+      },
+      success: function (res) {
+        if (res.code == 0) {
+          util.success('操作成功')
+          setTimeout(function() {
+            that.init()
+          }, 1000)
+        }
+      }
+    })
+  },
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload: function () {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh: function () {
+
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom: function () {
+
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage: function () {
+
+  }
+})

+ 4 - 0
mini/pages/order-detail-inner/index.json

xqd
@@ -0,0 +1,4 @@
+{
+  "navigationBarTitleText": "订单详情",
+  "usingComponents": {}
+}

+ 108 - 0
mini/pages/order-detail-inner/index.wxml

xqd
@@ -0,0 +1,108 @@
+<!--pages/create-order/index.wxml-->
+<view class="sg-container">
+  <view class="sg-tabs sg-flex sg-align-center sg-space-around">
+    <block wx:for="{{tabs}}" wx:key="index">
+      <view class="sg-tab sg-pad {{index == tabIndex ? 'sg-seleted' : 'sg-gray-color'}}" bindtap="switchTab"
+        data-index="{{index}}">{{item}}</view>
+    </block>
+  </view>
+  <view class="sg-order-box" wx:if="{{tabIndex == 0}}">
+    <view class="sg-form">
+      <view class="sg-form-item sg-pad sg-top-border">
+        <view class="sg-label">项目名称</view>
+        <view class="sg-input sg-gray-color">{{order.project ? order.project.name : ''}}</view>
+      </view>
+      <view class="sg-form-item sg-pad sg-top-border">
+        <view class="sg-label">需求工点</view>
+        <view class="sg-input sg-gray-color">{{order.work_point ? order.work_point.name : ''}}</view>
+      </view>
+      <view class="sg-form-item sg-pad sg-top-border">
+        <view class="sg-label">租赁设备</view>
+        <view class="sg-input sg-gray-color">{{device_total}}个</view>
+      </view>
+      <view class="sg-form-item sg-pad sg-top-border">
+        <view class="sg-label">填单人</view>
+        <view class="sg-input sg-gray-color">{{order.user ? order.user.name : ''}}</view>
+      </view>
+      <view class="sg-form-item sg-pad sg-top-border">
+        <view class="sg-label">创建时间</view>
+        <view class="sg-input sg-gray-color">{{order.created_at}}</view>
+      </view>
+      <view class="sg-form-item sg-pad sg-top-border">
+        <view class="sg-label">订单状态</view>
+        <view class="sg-input sg-gray-color sg-bold" style="color:{{order.color}}">{{order.status}}</view>
+      </view>
+      <view class="sg-form-item sg-pad sg-top-border">
+        <view class="sg-label">备注</view>
+        <input value="{{remark}}" class="sg-input" bindinput="onChange" data-name="remark" placeholder="订单备注填写"></input>
+      </view>
+    </view>
+  </view>
+  <van-calendar show="{{ showDate }}" bind:close="switchShowDate" bind:confirm="confirmDate" data-show="{{false}}"
+    type="range" class="sg-calendar" />
+  <view class="sg-device-box" wx:if="{{tabIndex == 1}}">
+    <view class="sg-device-list sg-top-border">
+      <block wx:if="{{devices.length <= 0}}">
+        <view class="sg-center sg-pad">暂无设备</view>
+      </block>
+      <block wx:else>
+        <view class="sg-list sg-pad">
+          <view class="sg-item sg-white-bg sg-pad sg-margin-bottom" wx:for="{{devices}}" wx:key="index"
+            bindtap="switchSelect" data-index="{{index}}" data-can="{{item.status && item.status.key == 'free'}}">
+            <view class="sg-top sg-flex sg-bottom-border sg-pad-bottom-sm sg-font-small sg-bold sg-space-between">
+              <view class="sg-name sg-margin-right">设备名称:{{item.name}}</view>
+              <view class="sg-status sg-flex sg-align-center">
+                <view class="sg-dot" style="background: {{item.status ? item.status.color : ''}}"></view>
+                <view class="sg-status-name">{{item.status ? item.status.name : ''}}</view>
+              </view>
+            </view>
+            <view class="sg-body sg-font-xs sg-bottom-border sg-pad-bottom-sm">
+              <view class="sg-item sg-margin-tb-sm sg-flex">
+                <view class="sg-left-item">固定资产编号:{{item.number}}</view>
+                <view class="sg-right-item">出厂日期:{{item.produce_date}}</view>
+              </view>
+              <view class="sg-item sg-margin-tb-sm sg-flex">
+                <view class="sg-left-item">外形尺寸:{{item.shape}}</view>
+                <view class="sg-right-item">采购原值:{{item.buy_origin}}</view>
+              </view>
+              <view class="sg-item sg-margin-tb-sm sg-flex">
+                <view class="sg-left-item">规格型号:{{item.spec ? item.spec.name : ''}}</view>
+                <view class="sg-right-item">生产厂家:{{item.manufacturer}}</view>
+              </view>
+            </view>
+            <view class="sg-bottom sg-font-xs">
+              <view class="sg-item sg-margin-tb-sm">目前在用工点:{{item.work_point ? item.work_point.name : '无'}}</view>
+              <view class="sg-item sg-margin-tb-sm">
+                借用时间:{{item.start_date ? item.start_date + '至' + item.end_date : '无'}}
+              </view>
+            </view>
+          </view>
+        </view>
+      </block>
+    </view>
+  </view>
+  <view class="sg-submit-box sg-fix-bottom sg-flex sg-align-center sg-center">
+    <block wx:if="{{actionType == 'check'}}">
+      <view class="sg-action sg-draft sg-pad sg-border-right sg-red-bg" bindtap="check" data-type='reject'>驳回申请</view>
+      <view class="sg-action sg-pad sg-index-bg sg-green-bg" bindtap="check" data-type='checked'>通过审核</view>
+    </block>
+    <block wx:if="{{actionType == 'pass'}}">
+      <view class="sg-action sg-draft sg-pad sg-border-right sg-index-bg sg-white sg-block" bindtap="check"
+        data-type='confirm' style="width: 100%">提交确认</view>
+    </block>
+    <block wx:if="{{actionType == 're-submit'}}">
+      <view class="sg-action sg-draft sg-pad sg-border-right sg-index-bg sg-white sg-block" bindtap="check"
+        data-type='re-submit' style="width: 100%">重新提交</view>
+    </block>
+  </view>
+  <van-dialog id="van-dialog" />
+  <van-dialog show="{{ showPrice }}" use-slot title="修改价格" show-cancel-button bind:confirm="changePrice" z-index="1">
+    <view class="sg-box sg-pad">
+      <view class="sg-form-item sg-pad-tb sg-top-border">
+        <view class="sg-label">设备单价</view>
+        <input value="{{device_price}}" class="sg-input" bindinput="onChange" data-name="device_price"
+          placeholder="请输入设备单价" type="number"></input>
+      </view>
+    </view>
+  </van-dialog>
+</view>

+ 57 - 0
mini/pages/order-detail-inner/index.wxss

xqd
@@ -0,0 +1,57 @@
+/* pages/create-order/index.wxss */
+.sg-tabs {
+  background: white;
+}
+.sg-tab {
+  width: 50%;
+  box-sizing: border-box;
+  text-align: center;
+}
+.sg-tab:first-child {
+  border-right: 1px solid #ebedf0;
+}
+.sg-form-item {
+  display: flex;
+  width: 100%;
+  box-sizing: border-box;
+}
+.sg-form-item .sg-label {
+  padding-right: 30rpx;
+  min-width: 150rpx;
+}
+.sg-form-item .sg-input {
+  flex-grow: 1;
+  text-align: right;
+}
+.sg-order-box {
+  background: white;
+}
+.sg-submit-box {
+  justify-content: center;
+  background: white;
+}
+.sg-device-list .sg-item {
+  background: white;
+  align-items: center;
+}
+.sg-device-list .sg-item .sg-left {
+  display: flex;
+  height: 80rpx;
+}
+.sg-device-list .sg-item .sg-right {
+  height: 80rpx;
+}
+.sg-submit-box .sg-action {
+  width: 50%;
+}
+.sg-submit-box.sg-fix-bottom {
+  z-index: 1;
+}
+.sg-rent-date {
+  padding: 5rpx 50rpx;
+  border-radius: 40rpx;
+  border-color: #BFC7D1;
+}
+.sg-device-list .sg-body .sg-item > view {
+  width: 50%;
+}

+ 1 - 1
mini/pages/order-detail/index.js

xqd
@@ -11,7 +11,7 @@ Page({
    */
   data: {
     tabs: ['设备租赁订单', '租赁设备添加'],
-    tabIndex: 1,
+    tabIndex: 0,
     id: -1,
     order: null,
     device_total: 0,

+ 233 - 0
mini/pages/order-inner/index.js

xqd
@@ -0,0 +1,233 @@
+// pages/order/index.js
+import http from '../../utils/http'
+import util from '../../utils/util'
+import api from '../../utils/api'
+import Dialog from '../../miniprogram_npm/@vant/weapp/dialog/dialog';
+
+Page({
+
+  /**
+   * 页面的初始数据
+   */
+  data: {
+    id: -1,
+    project: null,
+    tabs: ['全部订单', '待审核', '已审核', '已完成', '已驳回'],
+    statuses: ['', 'checking', 'checked', 'pass', 'reject'],
+    list: [
+      [],
+      [],
+      [],
+      [],
+      []
+    ],
+    pages: [1, 1, 1, 1, 1],
+    tabIndex: 0,
+    touchBottom: [false, false, false, false, false],
+    work_points: [],
+    work_point_id: '',
+    keyword: '',
+    pointIndex: -1,
+    isSearch: false,
+    role: '',
+    // list|check
+    type: 'list'
+  },
+
+  /**
+   * 生命周期函数--监听页面加载
+   */
+  onLoad: function (options) {
+    var id = options.id ? options.id : 1
+    var type = options.type ? options.type : 'list'
+    var tabIndex = options.index ? options.index : 0
+    this.setData({
+      id,
+      type,
+      tabIndex
+    })
+    api.getProject(this)
+    api.getByName(this, 'work-points/get', 'work_points', {type: 'drop_menu'});
+    api.getByName(this, 'orders/getRole', 'role', {id: id});
+    this.getList();
+  },
+  onDropChange: function(e) {
+    var name = e.currentTarget.dataset.name
+    this.setData({
+      [name]: e.detail
+    })
+    if(name == 'work_point_id') {
+      this.search()
+    }
+  },
+  doAction: function(e) {
+    var type = e.currentTarget.dataset.type
+    if(type == 'edit' || type == 'detail') {
+      this.navigate(e)
+    } else if(type == 'confirm') {
+      var that = this
+      var order = e.currentTarget.dataset.order
+      Dialog.confirm({
+        title: '提示',
+        message: '确定订单吗',
+      })
+        .then(() => {
+          that.submitCheck(order)
+        })
+    }
+  },
+
+  submitCheck(order) {
+    var that = this
+    http({
+      url: 'orders/check',
+      data: {
+        id: order.id,
+        type: 'confirm',
+        remark: order.remark
+      },
+      success: function (res) {
+        if (res.code == 0) {
+          that.search()
+        }
+      }
+    })
+  },
+
+  navigate: function(e) {
+    wx.navigateTo({
+      url: e.currentTarget.dataset.url,
+    })
+  },
+
+  search() {
+    this.setData({
+      list: [
+        [],
+        [],
+        [],
+        [],
+        []
+      ],
+      pages: [1, 1, 1, 1, 1],
+      touchBottom: [false, false, false, false, false],
+      isSearch: true
+    })
+    this.getList()
+  },
+
+  getList: function () {
+    var index = this.data.tabIndex
+    var touchBottom = this.data.touchBottom[index]
+    if (touchBottom) return false;
+    var status = this.data.statuses[index]
+    var page = this.data.pages[index]
+    var that = this
+    var work_point_id = this.data.work_point_id
+    http({
+      url: 'orders/get',
+      data: {
+        project_id: this.data.id,
+        status: status,
+        page: page,
+        work_point_id: work_point_id,
+        keyword: this.data.keyword,
+        type: 2
+      },
+      success: function (res) {
+        if (res.code == 0) {
+          var list = that.data.list
+          var touchBottom = that.data.touchBottom
+          list[index] = list[index].concat(res.data);
+          if (res.data.length <= 0) {
+            touchBottom[index] = true;
+          }
+          that.setData({
+            touchBottom,
+            list,
+            isSearch: false
+          })
+        }
+      }
+    })
+  },
+
+  switchTab: function (e) {
+    var index = e.currentTarget.dataset.index
+    this.setData({
+      tabIndex: index
+    })
+    wx.pageScrollTo({
+      scrollTop: 0,
+      duration: 300
+    })
+    this.search()
+  },
+
+  onChange: function (e) {
+    var name = e.currentTarget.dataset.name
+    this.setData({
+      [name]: e.detail.value
+    })
+  },
+
+  /**
+   * 生命周期函数--监听页面初次渲染完成
+   */
+  onReady: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面显示
+   */
+  onShow: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面隐藏
+   */
+  onHide: function () {
+
+  },
+
+  /**
+   * 生命周期函数--监听页面卸载
+   */
+  onUnload: function () {
+
+  },
+
+  /**
+   * 页面相关事件处理函数--监听用户下拉动作
+   */
+  onPullDownRefresh: function () {
+
+  },
+
+  /**
+   * 页面上拉触底事件的处理函数
+   */
+  onReachBottom: function () {
+    var index = this.data.tabIndex
+    if(!this.data.isSearch && !this.data.touchBottom[index]) {
+      var pages = this.data.pages
+      pages[index] = pages[index] + 1;
+      this.setData({
+        pages
+      })
+      this.getList()
+    }
+    if(this.data.touchBottom[index]) {
+      util.error('没有更多数据了')
+    }
+  },
+
+  /**
+   * 用户点击右上角分享
+   */
+  onShareAppMessage: function () {
+
+  }
+})

+ 4 - 0
mini/pages/order-inner/index.json

xqd
@@ -0,0 +1,4 @@
+{
+  "navigationBarTitleText": "所有订单",
+  "usingComponents": {}
+}

+ 70 - 0
mini/pages/order-inner/index.wxml

xqd
@@ -0,0 +1,70 @@
+<!--pages/order/index.wxml-->
+<view class="sg-container">
+  <view class="sg-top-box sg-fix-top">
+    <view class="sg-search-box sg-flex sg-align-center">
+      <van-dropdown-menu>
+        <van-dropdown-item value="{{ work_point_id }}" options="{{ work_points }}" bind:change="onDropChange" data-name="work_point_id"/>
+      </van-dropdown-menu>
+      <van-search value="{{ keyword }}" placeholder="请输入订单号或提交人搜索" use-right-icon-slot class="sg-flex-grow" left-icon="none" bind:change="onDropChange" data-name="keyword">
+        <van-icon name="search" class="sg-index-color sg-icon" slot="right-icon" bindtap="search"></van-icon>
+      </van-search>
+    </view>
+    <view class="sg-tabs sg-flex sg-align-center sg-white-bg sg-pad sg-bottom-border sg-top-border sg-font-small">
+      <view wx:for="{{tabs}}" wx:key="index" class="sg-tab {{tabIndex == index ? 'sg-selected' : ''}}"
+        bindtap="switchTab" data-index="{{index}}" hidden="{{ type=='check' && index > 2 }}">{{ item }}</view>
+    </view>
+  </view>
+  <view class="sg-list-box sg-pad">
+    <view class="sg-list" wx:for="{{list}}" hidden="{{tabIndex != index}}" wx:key="index">
+      <view class="sg-item sg-white-bg sg-pad sg-margin-bottom sg-font-small" wx:for="{{item}}" wx:for-item="i_item"
+        wx:for-index="i_index" wx:key="i_index" data-url="/pages/order-detail-inner/index?id={{i_item.id}}"
+        bindtap="navigate">
+        <view class="sg-top sg-bottom-border">
+          <view class="sg-order-status sg-flex sg-align-center sg-space-between sg-margin-bottom sg-font-xs">
+            <view class="sg-order sg-gray-color">订单号:{{i_item.order_number}}</view>
+            <view class="sg-status sg-bold" style="color: {{i_item.color}}">{{i_item.status}}</view>
+          </view>
+          <view class="sg-device-info sg-font-xs">
+            <view class="sg-table-row sg-flex sg-align-center sg-space-around sg-pad-tb-sm sg-top-border">
+              <view class="sg-table-column">资产编号</view>
+              <view class="sg-table-column">设备名称</view>
+              <view class="sg-table-column">开始时间</view>
+              <view class="sg-table-column">结束时间</view>
+            </view>
+            <view class="sg-table-row sg-flex sg-align-center sg-space-around sg-pad-tb-sm sg-top-border" wx:for="{{i_item.devices}}" wx:for-item="j_item" wx:for-index="j_index"
+              wx:key="j_index">
+              <view class="sg-table-column">{{j_item.number}}</view>
+              <view class="sg-table-column">{{j_item.name}}</view>
+              <view class="sg-table-column">{{j_item.pivot ? j_item.pivot.start_date : ''}}</view>
+              <view class="sg-table-column">{{j_item.pivot ? j_item.pivot.end_date : ''}}</view>
+            </view>
+          </view>
+        </view>
+        <view class="sg-bottom sg-flex sg-align-center sg-space-between">
+          <view class="sg-left">
+            <view class="sg-left-item sg-margin-tb-sm">需求工点:{{i_item.work_point_name}}</view>
+            <view class="sg-left-item sg-margin-tb-sm">提交人:{{i_item.user_name}}</view>
+            <view class="sg-left-item sg-margin-tb-sm">创建时间:{{i_item.date_time}}</view>
+          </view>
+          <block wx:if="{{i_item.status=='管理员 - 已审核' && role && role.project_role.key == 'machine'}}">
+            <view class="sg-right sg-green-bg sg-pad-sm sg-white" catchtap="doAction" data-type="confirm"
+              data-order="{{i_item}}">确认订单</view>
+          </block>
+          <block wx:elif="{{i_item.status_key=='reject'}}">
+            <view class="sg-right sg-red-bg sg-pad-sm sg-white" catchtap="doAction" data-type="edit"
+              data-url="/pages/create-order-inner/index?id={{i_item.project_id}}&order_id={{i_item.id}}&type=edit">重新修订</view>
+          </block>
+          <block wx:elif="{{i_item.status_key=='pass' && role && role.project_role && role.project_role.key=='machine'}}">
+            <view class="sg-right sg-green-bg sg-pad-sm sg-white" catchtap="doAction" data-type="edit"
+              data-url="/pages/create-order-inner/index?id={{i_item.project_id}}&order_id={{i_item.id}}&type=edit">归还/续租</view>
+          </block>
+          <block wx:else>
+            <view class="sg-right sg-index-bg sg-pad-sm sg-white" catchtap="doAction" data-type="detail"
+              data-url="/pages/order-detail-inner/index?id={{i_item.id}}">查看详情</view>
+          </block>
+        </view>
+      </view>
+    </view>
+  </view>
+  <van-dialog id="van-dialog" />
+</view>

+ 25 - 0
mini/pages/order-inner/index.wxss

xqd
@@ -0,0 +1,25 @@
+/* pages/order/index.wxss */
+.sg-search-box {
+  background: white;
+}
+.sg-search-box .sg-left {
+  margin-right: 30rpx;
+}
+.sg-tabs {
+  justify-content: space-around;
+}
+.sg-tabs .sg-tab {
+  padding-bottom: 15rpx;
+  box-sizing: border-box;
+  border-bottom: 2px solid white;
+}
+.sg-container .sg-tabs {
+  padding-bottom: 15rpx;
+}
+.sg-list-box {
+  margin-top: 200rpx;
+}
+.sg-table-column {
+  width: 25%;
+  text-align: center;
+}

+ 16 - 4
mini/pages/order/index.js

xqd xqd xqd xqd
@@ -25,6 +25,7 @@ Page({
     tabIndex: 0,
     touchBottom: [false, false, false, false, false],
     work_points: [],
+    work_point_id: '',
     pointIndex: -1,
     isSearch: false,
     role: '',
@@ -45,7 +46,7 @@ Page({
       tabIndex
     })
     api.getProject(this)
-    api.getByName(this, 'work-points/get', 'work_points', {is_search: true});
+    api.getByName(this, 'work-points/get', 'work_points', {type: 'drop_menu'});
     api.getByName(this, 'orders/getRole', 'role', {id: id});
     this.getList();
   },
@@ -112,15 +113,16 @@ Page({
     var status = this.data.statuses[index]
     var page = this.data.pages[index]
     var that = this
-    var pointIndex = this.data.pointIndex
-    var work_point_id = pointIndex >= 0 ? this.data.work_points[pointIndex].id : 0
+    var work_point_id = this.data.work_point_id
     http({
       url: 'orders/get',
       data: {
         project_id: this.data.id,
         status: status,
         page: page,
-        work_point_id: work_point_id
+        work_point_id: work_point_id,
+        keyword: this.data.keyword,
+        type: 1
       },
       success: function (res) {
         if (res.code == 0) {
@@ -159,6 +161,16 @@ Page({
     })
   },
 
+  onDropChange: function(e) {
+    var name = e.currentTarget.dataset.name
+    this.setData({
+      [name]: e.detail
+    })
+    if(name == 'work_point_id') {
+      this.search()
+    }
+  },
+
   /**
    * 生命周期函数--监听页面初次渲染完成
    */

+ 19 - 16
mini/pages/order/index.wxml

xqd xqd xqd xqd
@@ -1,16 +1,13 @@
 <!--pages/order/index.wxml-->
 <view class="sg-container">
-  <view class="sg-top-box sg-fix-top">
-    <view class="sg-search-box sg-pad sg-flex sg-align-center">
-      <view class="sg-left sg-flex-grow">
-        <picker bindchange="onChange" value="{{pointIndex}}" range="{{work_points}}" range-key="name"
-          data-name="pointIndex" class="sg-input">
-          <view class="picker sg-gray-color sg-center">
-            {{pointIndex >= 0 ? work_points[pointIndex].name : '选择所需的工点'}}
-          </view>
-        </picker>
-      </view>
-      <van-icon name="search" class="sg-icon sg-index-color" bind:click="search"/>
+  <view class="sg-top-box sg-fix-top sg-white-bg">
+    <view class="sg-search-box sg-flex sg-align-center">
+      <van-dropdown-menu>
+        <van-dropdown-item value="{{ work_point_id }}" options="{{ work_points }}" bind:change="onDropChange" data-name="work_point_id"/>
+      </van-dropdown-menu>
+      <van-search value="{{ keyword }}" placeholder="请输入订单号或提交人搜索" use-right-icon-slot class="sg-flex-grow" left-icon="none" bind:change="onDropChange" data-name="keyword">
+        <van-icon name="search" class="sg-index-color sg-icon" slot="right-icon" bindtap="search"></van-icon>
+      </van-search>
     </view>
     <view class="sg-tabs sg-flex sg-align-center sg-white-bg sg-pad sg-bottom-border sg-top-border sg-font-small">
       <view wx:for="{{tabs}}" wx:key="index" class="sg-tab {{tabIndex == index ? 'sg-selected' : ''}}"
@@ -20,7 +17,8 @@
   <view class="sg-list-box sg-pad">
     <view class="sg-list" wx:for="{{list}}" hidden="{{tabIndex != index}}" wx:key="index">
       <view class="sg-item sg-white-bg sg-pad sg-margin-bottom sg-font-small" wx:for="{{item}}" wx:for-item="i_item"
-        wx:for-index="i_index" wx:key="i_index" data-url="/pages/order-detail/index?id={{i_item.id}}" bindtap="navigate">
+        wx:for-index="i_index" wx:key="i_index" data-url="/pages/order-detail/index?id={{i_item.id}}"
+        bindtap="navigate">
         <view class="sg-top sg-bottom-border">
           <view class="sg-order-status sg-flex sg-align-center sg-space-between sg-margin-bottom sg-font-xs">
             <view class="sg-order sg-gray-color">订单号:{{i_item.order_number}}</view>
@@ -30,7 +28,9 @@
             <view class="sg-label">租借设备概要:</view>
             <view class="sg-device-item sg-flex sg-align-center sg-space-between sg-margin-tb-sm"
               wx:for="{{i_item.devices}}" wx:for-item="j_item" wx:for-index="j_index" wx:key="j_index">
-              <view class="sg-name">{{j_index+1}}.{{j_item.type}}-{{j_item.name}}</view>
+              <view class="sg-name">
+                {{j_index+1}}.{{j_item.device ? j_item.device.name : ''}}-{{j_item.device_name ? j_item.device_name.name : ''}}-{{j_item.spec ? j_item.spec.name : ''}}
+              </view>
               <view class="sg-price">¥{{j_item.price/100}}×{{j_item.quantity}}</view>
             </view>
           </view>
@@ -43,13 +43,16 @@
             <view class="sg-left-item sg-margin-tb-sm">创建时间:{{i_item.date_time}}</view>
           </view>
           <block wx:if="{{i_item.status=='项目经理 - 已审核' && role && role.project_role.key == 'work'}}">
-            <view class="sg-right sg-green-bg sg-pad-sm sg-white" catchtap="doAction" data-type="confirm" data-order="{{i_item}}">确认订单</view>
+            <view class="sg-right sg-green-bg sg-pad-sm sg-white" catchtap="doAction" data-type="confirm"
+              data-order="{{i_item}}">确认订单</view>
           </block>
           <block wx:elif="{{i_item.status_key=='reject'}}">
-            <view class="sg-right sg-red-bg sg-pad-sm sg-white" catchtap="doAction" data-type="edit" data-url="/pages/create-order/index?id={{i_item.project_id}}&order_id={{i_item.id}}&type=edit">重新修订</view>
+            <view class="sg-right sg-red-bg sg-pad-sm sg-white" catchtap="doAction" data-type="edit"
+              data-url="/pages/create-order/index?id={{i_item.project_id}}&order_id={{i_item.id}}&type=edit">重新修订</view>
           </block>
           <block wx:else>
-            <view class="sg-right sg-index-bg sg-pad-sm sg-white" catchtap="doAction" data-type="detail" data-url="/pages/order-detail/index?id={{i_item.id}}">查看详情</view>
+            <view class="sg-right sg-index-bg sg-pad-sm sg-white" catchtap="doAction" data-type="detail"
+              data-url="/pages/order-detail/index?id={{i_item.id}}">查看详情</view>
           </block>
         </view>
       </view>

+ 8 - 4
mini/pages/project/index.js

xqd
@@ -40,20 +40,24 @@ Page({
     }, {
       img: 'http://t18.9026.com/mini/rent-check.png',
       title: '调用审核',
-      desc: '设备调用订单审核'
+      desc: '设备调用订单审核',
+      url: '/pages/order-inner/index?type=check'
     }, {
       img: 'http://t18.9026.com/mini/error-handle.png',
       title: '异常处理',
-      desc: '订单流程变更审核处理'
+      desc: '订单流程变更审核处理',
+      url: '/pages/order-inner/index?index=4'
     }, {
       img: 'http://t18.9026.com/mini/all-order.png',
       title: '所有订单',
-      desc: '查看全部设备调用订单'
+      desc: '查看全部设备调用订单',
+      url: '/pages/order-inner/index'
     }],
     device_depot_menus: [{
       img: 'http://t18.9026.com/mini/all-order.png',
       title: '所有设备',
-      desc: '查看仓库所有设备'
+      desc: '查看仓库所有设备',
+      url: '/pages/device-inner/index'
     }, {
       img: 'http://t18.9026.com/mini/rent-check.png',
       title: '维修上报',

+ 1 - 1
mini/pages/project/index.wxml

xqd
@@ -38,7 +38,7 @@
       <text class="sg-sub-title sg-gray-color">内部设备调用</text>
     </view>
     <view class="sg-menu-list">
-      <view class="sg-item sg-flex sg-align-center sg-pad" wx:for="{{device_use_menus}}" wx:key="index">
+      <view class="sg-item sg-flex sg-align-center sg-pad" wx:for="{{device_use_menus}}" wx:key="index" bindtap="navigate" data-url="{{item.url}}?id={{id}}">
         <image class="sg-img" src="{{item.img}}" mode="widthFix"></image>
         <view class="sg-name sg-margin-top-sm">{{item.title}}</view>
         <view class="sg-desp sg-margin-top-sm sg-gray-color sg-font-xs">{{item.desc}}</view>

+ 7 - 0
mini/readme.md

xqd
@@ -0,0 +1,7 @@
+import http from '../../utils/http'
+import util from '../../utils/util'
+import api from '../../utils/api'
+
+api.getByName(this, 'orders/detail', 'order', {id: order_id}, function(res) {
+  that.initData()
+});

+ 6 - 1
mini/utils/util.js

xqd
@@ -40,9 +40,14 @@ const success = msg => {
   })
 }
 
+const firstCase = str => {
+  return str.charAt(0).toUpperCase() + str.slice(1)
+}
+
 module.exports = {
   formatDate,
   checkMobile: checkMobile,
   error,
-  success
+  success,
+  firstCase
 }

+ 5 - 0
routes/api.php

xqd
@@ -41,15 +41,20 @@ $api->version('v1', ['namespace' => 'App\Http\Controllers\Api\mini', 'prefix' =>
     $api->any('work-points/get', 'WorkPointController@get');
 
     $api->any('devices/get', 'DeviceController@get');
+    $api->any('devices/getThreeLevel', 'DeviceController@getThreeLevel');
 
     $api->any('inner-devices/get', 'InnerDeviceController@get');
     $api->any('inner-devices/search', 'InnerDeviceController@search');
+    $api->any('inner-devices/search2', 'InnerDeviceController@search2');
 
     $api->any('specs/get', 'SpecController@get');
 
+    $api->any('rent-types/get', 'RentTypeController@get');
+
     $api->any('orders/create', 'OrderController@create');
     $api->any('orders/createInner', 'OrderController@createInner');
     $api->any('orders/update', 'OrderController@update');
+    $api->any('orders/updateInner', 'OrderController@updateInner');
     $api->any('orders/get', 'OrderController@get');
     $api->any('orders/detail', 'OrderController@detail');
     $api->any('orders/getRole', 'OrderController@getRole');