Browse Source

项目管理

李浩杰 4 years ago
parent
commit
7c6068c42e

+ 10 - 1
app/Http/Controllers/Admin/ProjectController.php

@@ -36,7 +36,7 @@ class ProjectController extends BaseController
 
 
     public function get(Request $request)
     public function get(Request $request)
     {
     {
-        $items = $this->model->where('id', '>', 0);
+        $items = $this->model->orderBy('created_at', 'desc');
 
 
         $tmp_items = collect(['name']);
         $tmp_items = collect(['name']);
         foreach($tmp_items as $tmp_item) {
         foreach($tmp_items as $tmp_item) {
@@ -54,6 +54,10 @@ class ProjectController extends BaseController
 
 
         $items = $items->paginate();
         $items = $items->paginate();
 
 
+        foreach($items as $item) {
+            $item->active_label = $item->getNameOrLabel('active', 'label');
+        }
+
         return response()->json(['code' => 0, 'message' => '', 'count' => $items->total(), 'data' => $items->items()]);
         return response()->json(['code' => 0, 'message' => '', 'count' => $items->total(), 'data' => $items->items()]);
     }
     }
 
 
@@ -105,4 +109,9 @@ class ProjectController extends BaseController
         return response()->json(['status' => 'success', 'info' => '操作成功']);
         return response()->json(['status' => 'success', 'info' => '操作成功']);
     }
     }
 
 
+    public function active(Request $request)
+    {
+        $this->model->where('id', $request->input('id'))->update(['active' => 1]);
+        return response()->json(['status' => 'success', 'info' => '操作成功']);
+    }
 }
 }

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

@@ -7,6 +7,7 @@ use App\Models\InnerDevice;
 use App\Models\Notification;
 use App\Models\Notification;
 use App\Models\Order;
 use App\Models\Order;
 use App\Models\OrderDevice;
 use App\Models\OrderDevice;
+use App\Models\Project;
 use App\Models\ProjectRole;
 use App\Models\ProjectRole;
 use App\Models\ProjectUser;
 use App\Models\ProjectUser;
 use App\Models\User;
 use App\Models\User;
@@ -19,7 +20,7 @@ class TestController extends Controller
 {
 {
     public function index(Request $request)
     public function index(Request $request)
     {
     {
-        Notification::send(143);
-    	return view('admin.test.index');
+        Project::first()->getShowLabel('test');
+//    	return view('admin.test.index');
     }
     }
 }
 }

+ 10 - 0
app/Http/Controllers/Api/mini/OrderController.php

@@ -385,4 +385,14 @@ class OrderController extends BaseController
         $order->updateMoney();
         $order->updateMoney();
         return $this->success();
         return $this->success();
     }
     }
+
+    public function delete(Request $request)
+    {
+        if($request->input('id')) {
+            $id = $request->input('id');
+            $this->model->where('id', $id)->delete();
+            OrderDevice::where('order_id', $id)->delete();
+        }
+        return $this->success();
+    }
 }
 }

+ 14 - 1
app/Http/Controllers/Api/mini/ProjectRoleController.php

@@ -5,6 +5,7 @@ namespace App\Http\Controllers\Api\mini;
 use App\Models\ProjectRole;
 use App\Models\ProjectRole;
 use App\Models\ProjectUser;
 use App\Models\ProjectUser;
 use Illuminate\Http\Request;
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
 
 
 class ProjectRoleController extends BaseController
 class ProjectRoleController extends BaseController
 {
 {
@@ -45,9 +46,21 @@ class ProjectRoleController extends BaseController
         return $this->success(['msg' => '创建成功', 'data' => $items->items()]);
         return $this->success(['msg' => '创建成功', 'data' => $items->items()]);
     }
     }
 
 
-    public function getAll(Request $request)
+    public function getAll()
     {
     {
         $items = $this->model->get();
         $items = $this->model->get();
         return $this->success(['msg' => '创建成功', 'data' => $items]);
         return $this->success(['msg' => '创建成功', 'data' => $items]);
     }
     }
+
+    public function getByExclude()
+    {
+        $top_role = Auth::guard('mini')->user()->getTopRole();
+        if($top_role && in_array($top_role->key, ['sub', 'admin'])) {
+            $items = $this->model->whereIn('key', ['work', 'machine', 'assist', 'manager'])->get();
+        } else {
+            $items = $this->model->whereIn('key', ['work', 'machine', 'assist'])->get();
+        }
+
+        return $this->success(['msg' => '创建成功', 'data' => $items]);
+    }
 }
 }

+ 19 - 0
app/Http/Controllers/Api/mini/UserController.php

@@ -79,4 +79,23 @@ class UserController extends BaseController
         $project_role = $user->getTopRole();
         $project_role = $user->getTopRole();
         return $this->success(['data' => $project_role]);
         return $this->success(['data' => $project_role]);
     }
     }
+
+    public function getRight(Request $request)
+    {
+        $user = Auth::guard('mini')->user();
+        $project_user = ProjectUser::where([
+            'user_id' => $user->id,
+            'project_id' => $request->input('id')
+        ])->first();
+        $right = ['managerMember' => false, 'createInner' => false, 'createOut' => false];
+        if($project_user) {
+            $project_role = ProjectRole::find($project_user->project_role_id);
+            if($project_role) {
+                $right['managerMember'] = !in_array($project_role->key, ['work', 'machine', 'assist']);
+                $right['createInner'] = $project_role->key == 'machine';
+                $right['createOut'] = $project_role->key == 'work';
+            }
+        }
+        return $this->success(['data' => $right]);
+    }
 }
 }

+ 10 - 10
app/Models/BaseModel.php

@@ -83,16 +83,16 @@ class BaseModel extends Model
         else return '<div class="layui-badge layui-bg-' . $option['color'] . '">' . $option['name'] . '</div>';
         else return '<div class="layui-badge layui-bg-' . $option['color'] . '">' . $option['name'] . '</div>';
     }
     }
 
 
-    public function getNameOrLabel($options = [], $type = 'name', $name = 'status')
+    /**
+     * @param $column
+     * @param string $type(name|label)
+     * @return string
+     */
+    public function getNameOrLabel($column, $type = 'name')
     {
     {
-        $option = $options[0];
-        foreach($options as $item) {
-            if($item['id'] == $this[$name]) {
-                $option = $item;
-                break;
-            }
-        }
-        if($type == 'name') return $option['name'];
-        else return '<div class="layui-badge layui-bg-' . $option['color'] . '">' . $option['name'] . '</div>';
+        $option = Option::get($this->getTable(), $column, $this[$column], null);
+        if(!$option) return '';
+        if($type == 'name') return $option->name;
+        else return '<div class="layui-badge layui-bg-' . $option->label_type . '">' . $option->name . '</div>';
     }
     }
 }
 }

+ 2 - 1
app/Models/Option.php

@@ -17,7 +17,8 @@ class Option extends BaseModel
             ['column', '=', $column],
             ['column', '=', $column],
             ['key', '=', $key]
             ['key', '=', $key]
         ])->first();
         ])->first();
-        return $option ? $option[$option_key] : '';
+        if(!$option) return '';
+        return $option_key ? $option[$option_key] : $option;
     }
     }
 
 
     public static function getById($id, $option_key = 'id')
     public static function getById($id, $option_key = 'id')

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

@@ -0,0 +1,30 @@
+<?php
+
+use Illuminate\Support\Facades\Schema;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+class AddLabelTypeToOptions extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('options', function (Blueprint $table) {
+            $table->string('label_type', 50)->after('color')->comment('red|orange|green|cyan|blue|black|gray')->nullable();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        //
+    }
+}

+ 8 - 0
database/seeds/PatchSeeder.php

@@ -12,5 +12,13 @@ class PatchSeeder extends Seeder
     public function run()
     public function run()
     {
     {
         \App\Models\Project::where('id', '>', 0)->update(['active' => 1]);
         \App\Models\Project::where('id', '>', 0)->update(['active' => 1]);
+        \App\Models\RentType::truncate();
+        $rent_types = ['小时', '台班', '趟', '天', '月', '立方米', '米'];
+        foreach($rent_types as $key => $type) {
+            \App\Models\RentType::create([
+                'name' => $type,
+                'sort' => ($key + 1)
+            ]);
+        }
     }
     }
 }
 }

+ 1 - 1
mini/app.json

@@ -1,6 +1,7 @@
 {
 {
   "pages": [
   "pages": [
     "pages/index/index",
     "pages/index/index",
+    "pages/create-order/index",
     "pages/create-project-role/index",
     "pages/create-project-role/index",
     "pages/data/index",
     "pages/data/index",
     "pages/order-inner/index",
     "pages/order-inner/index",
@@ -21,7 +22,6 @@
     "pages/repair/index",
     "pages/repair/index",
     "pages/filter/index",
     "pages/filter/index",
     "pages/add-inner-device/index",
     "pages/add-inner-device/index",
-    "pages/create-order/index",
     "pages/create-order-inner/index",
     "pages/create-order-inner/index",
     "pages/order-detail-inner/index",
     "pages/order-detail-inner/index",
     "pages/order-detail/index",
     "pages/order-detail/index",

+ 24 - 0
mini/components/inner-order-item/index.js

@@ -40,8 +40,32 @@ Component({
           .then(() => {
           .then(() => {
             that.submitCheck(order)
             that.submitCheck(order)
           })
           })
+      } else if(type == 'delete') {
+        var that = this
+        var order = e.currentTarget.dataset.order
+        Dialog.confirm({
+          title: '提示',
+          message: '确定订单吗',
+        })
+          .then(() => {
+            that.delete(order)
+          })
       }
       }
     },
     },
+    delete(order) {
+      var that = this
+      http({
+        url: 'orders/delete',
+        data: {
+          id: order.id
+        },
+        success: function (res) {
+          if (res.code == 0) {
+            that.triggerEvent("update")
+          }
+        }
+      })
+    },
     submitCheck(order) {
     submitCheck(order) {
       var that = this
       var that = this
       http({
       http({

+ 51 - 44
mini/components/inner-order-item/index.wxml

@@ -1,51 +1,58 @@
 <!--components/out-order-item/index.wxml-->
 <!--components/out-order-item/index.wxml-->
 <view class="sg-item sg-white-bg sg-pad sg-margin-bottom sg-font-small">
 <view class="sg-item sg-white-bg sg-pad sg-margin-bottom sg-font-small">
-        <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">订单号:{{item.order_number}}</view>
-            <view class="sg-status sg-bold" style="color: {{item.color}}">{{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="{{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">需求工点:{{item.work_point_name}}</view>
-            <view class="sg-left-item sg-margin-tb-sm">提交人:{{item.user_name}}</view>
-            <view class="sg-left-item sg-margin-tb-sm">创建时间:{{item.date_time}}</view>
-          </view>
-          <block wx:if="{{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="{{item}}">确认订单</view>
-          </block>
-          <block wx:elif="{{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={{item.project_id}}&order_id={{item.id}}&type=edit">重新修订</view>
-          </block>
-          <block wx:elif="{{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={{item.project_id}}&order_id={{item.id}}&type=edit">归还/续租</view>
-          </block>
-          <block wx:elif="{{item.status_key=='checked' && role && role.project_role && role.project_role.key=='admin'}}">
+  <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">订单号:{{item.order_number}}</view>
+      <view class="sg-status sg-bold" style="color: {{item.color}}">{{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="{{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">需求工点:{{item.work_point_name}}</view>
+      <view class="sg-left-item sg-margin-tb-sm">提交人:{{item.user_name}}</view>
+      <view class="sg-left-item sg-margin-tb-sm">创建时间:{{item.date_time}}</view>
+    </view>
+    <view>
+      <block
+        wx:if="{{(item.status_key=='reject' || item.status_key=='checking') && (role && role.project_role.key == 'machine')}}">
+        <view class="sg-right sg-red-bg sg-pad-sm sg-white sg-margin-bottom" catchtap="doAction" data-type="delete"
+          data-order="{{item}}">删除订单</view>
+      </block>
+      <block wx:if="{{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="{{item}}">确认订单</view>
+      </block>
+      <block wx:elif="{{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={{item.project_id}}&order_id={{item.id}}&type=edit">重新修订</view>
+      </block>
+      <!-- <block wx:elif="{{item.status_key=='pass' && role && role.project_role && role.project_role.key=='machine'}}">
             <view class="sg-right sg-index-bg sg-pad-sm sg-white" catchtap="doAction" data-type="edit"
             <view class="sg-right sg-index-bg sg-pad-sm sg-white" catchtap="doAction" data-type="edit"
               data-url="/pages/create-order-inner/index?id={{item.project_id}}&order_id={{item.id}}&type=edit">查看详情</view>
               data-url="/pages/create-order-inner/index?id={{item.project_id}}&order_id={{item.id}}&type=edit">查看详情</view>
           </block>
           </block>
-          <block wx:else>
+          <block wx:elif="{{item.status_key=='checked' && role && role.project_role && role.project_role.key=='admin'}}">
             <view class="sg-right sg-index-bg sg-pad-sm sg-white" catchtap="doAction" data-type="edit"
             <view class="sg-right sg-index-bg sg-pad-sm sg-white" catchtap="doAction" data-type="edit"
               data-url="/pages/create-order-inner/index?id={{item.project_id}}&order_id={{item.id}}&type=edit">查看详情</view>
               data-url="/pages/create-order-inner/index?id={{item.project_id}}&order_id={{item.id}}&type=edit">查看详情</view>
-          </block>
-        </view>
-      </view>
+          </block> -->
+      <block wx:else>
+        <view class="sg-right sg-index-bg sg-pad-sm sg-white" catchtap="doAction" data-type="edit"
+          data-url="/pages/create-order-inner/index?id={{item.project_id}}&order_id={{item.id}}&type=edit">查看详情</view>
+      </block>
+    </view>
+  </view>
+</view>

+ 26 - 2
mini/components/out-order-item/index.js

@@ -16,6 +16,7 @@ Component({
   data: {
   data: {
 
 
   },
   },
+  
 
 
   /**
   /**
    * 组件的方法列表
    * 组件的方法列表
@@ -28,11 +29,12 @@ Component({
     },
     },
     doAction: function(e) {
     doAction: function(e) {
       var type = e.currentTarget.dataset.type
       var type = e.currentTarget.dataset.type
+      var that = this
+      var order = e.currentTarget.dataset.order
+      console.log(type)
       if(type == 'edit' || type == 'detail') {
       if(type == 'edit' || type == 'detail') {
         this.navigate(e)
         this.navigate(e)
       } else if(type == 'confirm') {
       } else if(type == 'confirm') {
-        var that = this
-        var order = e.currentTarget.dataset.order
         Dialog.confirm({
         Dialog.confirm({
           title: '提示',
           title: '提示',
           message: '确定订单吗',
           message: '确定订单吗',
@@ -40,8 +42,30 @@ Component({
           .then(() => {
           .then(() => {
             that.submitCheck(order)
             that.submitCheck(order)
           })
           })
+      } else if(type == 'delete') {
+        Dialog.confirm({
+          title: '提示',
+          message: '确定删除订单吗',
+        })
+          .then(() => {
+            that.delete(order)
+          })
       }
       }
     },
     },
+    delete(order) {
+      var that = this
+      http({
+        url: 'orders/delete',
+        data: {
+          id: order.id
+        },
+        success: function (res) {
+          if (res.code == 0) {
+            that.triggerEvent("update")
+          }
+        }
+      })
+    },
   
   
     submitCheck(order) {
     submitCheck(order) {
       var that = this
       var that = this

+ 25 - 13
mini/components/out-order-item/index.wxml

@@ -1,5 +1,5 @@
 <!--components/inner-order-item/index.wxml-->
 <!--components/inner-order-item/index.wxml-->
-<view class="sg-item sg-white-bg sg-pad sg-margin-bottom sg-font-small" data-url="/pages/order-detail/index?id={{item.id}}" bindtap="navigate">
+<view class="sg-item sg-white-bg sg-pad sg-margin-bottom sg-font-small">
   <view class="sg-top sg-bottom-border">
   <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-status sg-flex sg-align-center sg-space-between sg-margin-bottom sg-font-xs">
       <view class="sg-order sg-gray-color">订单号:{{item.order_number}}</view>
       <view class="sg-order sg-gray-color">订单号:{{item.order_number}}</view>
@@ -23,17 +23,29 @@
       <view class="sg-left-item sg-margin-tb-sm">提交人:{{item.user_name}}</view>
       <view class="sg-left-item sg-margin-tb-sm">提交人:{{item.user_name}}</view>
       <view class="sg-left-item sg-margin-tb-sm">创建时间:{{item.date_time}}</view>
       <view class="sg-left-item sg-margin-tb-sm">创建时间:{{item.date_time}}</view>
     </view>
     </view>
-    <block wx:if="{{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="{{item}}">确认订单</view>
-    </block>
-    <block wx:elif="{{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={{item.project_id}}&order_id={{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={{item.id}}">查看详情</view>
-    </block>
+    <view>
+      <block
+        wx:if="{{(item.status_key=='reject' || item.status_key=='checking') && (role && role.project_role.key == 'work')}}">
+        <view class="sg-right sg-red-bg sg-pad-sm sg-white sg-font-xs sg-margin-bottom" catchtap="doAction"
+          data-type="delete" data-order="{{item}}">
+          删除订单</view>
+      </block>
+      <block wx:if="{{item.status=='项目经理 - 已审核' && role && role.project_role.key == 'work'}}">
+        <view class="sg-right sg-green-bg sg-pad-sm sg-white sg-font-xs" catchtap="doAction" data-type="confirm"
+          data-order="{{item}}">确认订单</view>
+      </block>
+      <block wx:elif="{{item.status_key=='reject'}}">
+        <view class="sg-right sg-red-bg sg-pad-sm sg-white sg-font-xs" catchtap="doAction" data-type="edit"
+          data-url="/pages/create-order/index?id={{item.project_id}}&order_id={{item.id}}&type=edit">
+          重新修订</view>
+      </block>
+      <block wx:else>
+        <view class="sg-right sg-index-bg sg-pad-sm sg-white sg-font-xs" catchtap="doAction" data-type="detail"
+          data-url="/pages/create-order/index?id={{item.project_id}}&order_id={{item.id}}&type=edit"
+          wx:if="{{item.is_draft == 1}}">查看详情</view>
+        <view class="sg-right sg-index-bg sg-pad-sm sg-white sg-font-xs" catchtap="doAction" data-type="detail"
+          data-url="/pages/order-detail/index?id={{item.id}}" wx:else>查看详情</view>
+      </block>
+    </view>
   </view>
   </view>
 </view>
 </view>

+ 4 - 0
mini/pages/create-order-inner/index.js

@@ -79,6 +79,10 @@ Page({
       else if(order.status_key == 'pass' && role.project_role.key == 'machine') actionType = 'back'
       else if(order.status_key == 'pass' && role.project_role.key == 'machine') actionType = 'back'
     }
     }
     var canEdit = actionType == 'check' && role.project_role.key == 'admin' || (actionType == 're-submit');
     var canEdit = actionType == 'check' && role.project_role.key == 'admin' || (actionType == 're-submit');
+    if(order.is_draft == 1) {
+      canEdit = true
+      actionType = 'edit'
+    }
     this.setData({
     this.setData({
       actionType,
       actionType,
       canEdit
       canEdit

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

@@ -82,7 +82,8 @@
       <view class="sg-action sg-pad sg-index-bg sg-white" bindtap="submit" data-type='save'>提交</view>
       <view class="sg-action sg-pad sg-index-bg sg-white" bindtap="submit" data-type='save'>提交</view>
     </block>
     </block>
     <block wx:if="{{actionType == 'check'}}">
     <block wx:if="{{actionType == 'check'}}">
-      <view class="sg-action sg-draft sg-pad sg-border-right sg-red-bg" bindtap="check" data-change="2" data-type='reject'>驳回申请</view>
+      <view class="sg-action sg-draft sg-pad sg-border-right sg-red-bg" bindtap="check" data-change="2"
+        data-type='reject'>驳回申请</view>
       <block wx:if="{{ role && role.project_role && role.project_role.key == 'admin' }}">
       <block wx:if="{{ role && role.project_role && role.project_role.key == 'admin' }}">
         <view class="sg-action sg-pad sg-green-bg" bindtap="check" data-change="2" data-type='pass'>通过审核</view>
         <view class="sg-action sg-pad sg-green-bg" bindtap="check" data-change="2" data-type='pass'>通过审核</view>
         <view class="sg-action sg-pad sg-index-bg sg-white" bindtap="check" data-change="1" data-type='pass'>修订通过</view>
         <view class="sg-action sg-pad sg-index-bg sg-white" bindtap="check" data-change="1" data-type='pass'>修订通过</view>
@@ -91,17 +92,23 @@
         <view class="sg-action sg-pad sg-green-bg" bindtap="check" data-change="2" data-type='checked'>通过审核</view>
         <view class="sg-action sg-pad sg-green-bg" bindtap="check" data-change="2" data-type='checked'>通过审核</view>
       </block>
       </block>
     </block>
     </block>
+    <block wx:if="{{actionType == 'edit'}}">
+      <view class="sg-action sg-draft sg-pad sg-border-right" bindtap="submit" data-type='update'>暂存</view>
+      <view class="sg-action sg-pad sg-index-bg sg-white" bindtap="check" data-type='re-submit'>提交</view>
+    </block>
     <!-- <block wx:if="{{actionType == 'pass'}}">
     <!-- <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-change="2"
       <view class="sg-action sg-draft sg-pad sg-border-right sg-index-bg sg-white sg-block" bindtap="check" data-change="2"
         data-type='confirm' style="width: 100%">提交确认</view>
         data-type='confirm' style="width: 100%">提交确认</view>
     </block> -->
     </block> -->
     <block wx:if="{{actionType == 're-submit'}}">
     <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-change="2"
-        data-type='re-submit' style="width: 100%">重新提交</view>
+      <view class="sg-action sg-draft sg-pad sg-border-right sg-index-bg sg-white sg-block" bindtap="check"
+        data-change="2" data-type='re-submit' style="width: 100%">重新提交</view>
     </block>
     </block>
     <block wx:if="{{actionType == 'back'}}">
     <block wx:if="{{actionType == 'back'}}">
-      <view class="sg-action sg-draft sg-pad sg-border-right sg-red-bg" bindtap="check" data-change="2" data-type='back'>归还</view>
-      <view class="sg-action sg-pad sg-index-bg sg-green-bg" bindtap="check" data-change="2" data-type='checked'>续租</view>
+      <view class="sg-action sg-draft sg-pad sg-border-right sg-red-bg" bindtap="check" data-change="2"
+        data-type='back'>归还</view>
+      <view class="sg-action sg-pad sg-index-bg sg-green-bg" bindtap="submit" data-change="2" data-type='re-rent'>续租
+      </view>
     </block>
     </block>
   </view>
   </view>
 </view>
 </view>

+ 52 - 1
mini/pages/create-order/index.js

@@ -45,7 +45,9 @@ Page({
     selectIndex: -1,
     selectIndex: -1,
     // create/edit
     // create/edit
     dialog_type: 'create',
     dialog_type: 'create',
-    default_dates: []
+    default_dates: [],
+    device_total: 0,
+    device_money: 0
   },
   },
 
 
   /**
   /**
@@ -112,6 +114,7 @@ Page({
       remark: order.remark,
       remark: order.remark,
       devices: local_devices
       devices: local_devices
     })
     })
+    this.updateDeviceStat()
   },
   },
 
 
   submit: function(e) {
   submit: function(e) {
@@ -128,6 +131,7 @@ Page({
     }
     }
     var work_point = this.data.work_points[this.data.pointIndex]
     var work_point = this.data.work_points[this.data.pointIndex]
     var url = submit_type == 'create' ? 'orders/create' : 'orders/update'
     var url = submit_type == 'create' ? 'orders/create' : 'orders/update'
+    var that = this
     http({
     http({
       url: url,
       url: url,
       data: {
       data: {
@@ -141,6 +145,18 @@ Page({
       success: function(res) {
       success: function(res) {
         if(res.code == 0) {
         if(res.code == 0) {
           util.success('操作成功')
           util.success('操作成功')
+          setTimeout(function() {
+            var url = '/pages/order/index?id=' + that.data.id
+            if(is_draft == 1) {
+              wx.navigateBack({
+                delta: 0,
+              })
+            } else {
+              wx.redirectTo({
+                url: url,
+              })
+            }
+          }, 1000)
         }
         }
       }
       }
     })
     })
@@ -160,6 +176,7 @@ Page({
       devices,
       devices,
       selectIndex: -1
       selectIndex: -1
     })
     })
+    this.updateDeviceStat()
   },
   },
 
 
   editDevice: function() {
   editDevice: function() {
@@ -199,33 +216,46 @@ Page({
     return data[custom] ? data[customVal] : (data[index] >= 0 ? data[select] : '')
     return data[custom] ? data[customVal] : (data[index] >= 0 ? data[select] : '')
   },
   },
 
 
+  stopClose() {
+    this.setData({
+      showAdd: true
+    })
+  },
+
   addDevice: function() {
   addDevice: function() {
     if(this.data.typeIndex < 0) {
     if(this.data.typeIndex < 0) {
       util.error('设备类型必填');
       util.error('设备类型必填');
+      this.stopClose()
       return false;
       return false;
     }
     }
     if(!this.getCustom('name')) {
     if(!this.getCustom('name')) {
       util.error('设备名称必填')
       util.error('设备名称必填')
+      this.stopClose()
       return false
       return false
     }
     }
     if(!this.getCustom('spec')) {
     if(!this.getCustom('spec')) {
       util.error('规格型号必填')
       util.error('规格型号必填')
+      this.stopClose()
       return false
       return false
     }
     }
     if(!this.getCustom('rent')) {
     if(!this.getCustom('rent')) {
       util.error('租赁方式必填')
       util.error('租赁方式必填')
+      this.stopClose()
       return false
       return false
     }
     }
     if(!this.data.device_quantity) {
     if(!this.data.device_quantity) {
       util.error('设备数量必填')
       util.error('设备数量必填')
+      this.stopClose()
       return false
       return false
     }
     }
     if(!this.data.device_price) {
     if(!this.data.device_price) {
       util.error('设备单价必填')
       util.error('设备单价必填')
+      this.stopClose()
       return false
       return false
     }
     }
     if(!this.data.start_date) {
     if(!this.data.start_date) {
       util.error('租赁时间必填')
       util.error('租赁时间必填')
+      this.stopClose()
       return false
       return false
     }
     }
     var devices = this.data.devices
     var devices = this.data.devices
@@ -253,6 +283,27 @@ Page({
     this.setData({
     this.setData({
       devices
       devices
     })
     })
+    this.updateDeviceStat()
+  },
+  onClose: function(e) {
+    console.log('----------')
+    console.log(e)
+    if(e.detail == 'confirm') return false;
+    return true
+  },
+  updateDeviceStat() {
+    var devices = this.data.devices
+    var device_total = 0
+    var device_money = 0
+    for(var i = 0; i < devices.length; ++i) {
+      device_total = device_total + parseInt(devices[i].quantity)
+      device_money = device_money + Math.round(parseFloat(devices[i].price) * parseInt(devices[i].quantity) * 100)
+    }
+    device_money = device_money / 100;
+    this.setData({
+      device_total,
+      device_money
+    })
   },
   },
 
 
   onChange: function(e) {
   onChange: function(e) {

+ 11 - 3
mini/pages/create-order/index.wxml

@@ -21,6 +21,14 @@
           </view>
           </view>
         </picker>
         </picker>
       </view>
       </view>
+      <view class="sg-form-item sg-pad sg-top-border">
+        <view class="sg-label">租赁设备</view>
+        <input value="{{device_total + '台'}}" class="sg-input" disabled="{{true}}"></input>
+      </view>
+      <view class="sg-form-item sg-pad sg-top-border">
+        <view class="sg-label">租赁总金额</view>
+        <input value="{{'¥' + device_money}}" class="sg-input" disabled="{{true}}"></input>
+      </view>
       <view class="sg-form-item sg-pad sg-top-border">
       <view class="sg-form-item sg-pad sg-top-border">
         <view class="sg-label">备注</view>
         <view class="sg-label">备注</view>
         <input value="{{remark}}" class="sg-input" bindinput="onChange" data-name="remark" placeholder="订单备注填写"></input>
         <input value="{{remark}}" class="sg-input" bindinput="onChange" data-name="remark" placeholder="订单备注填写"></input>
@@ -56,7 +64,7 @@
     </view>
     </view>
   </view>
   </view>
   <van-dialog show="{{ showAdd }}" use-slot title="{{dialog_type == 'create' ? '添加设备' : '修改设备'}}" show-cancel-button
   <van-dialog show="{{ showAdd }}" use-slot title="{{dialog_type == 'create' ? '添加设备' : '修改设备'}}" show-cancel-button
-    bind:confirm="addDevice" z-index="1">
+    bind:confirm="addDevice" z-index="1" data-show="{{false}}">
     <view class="sg-add-device-box sg-pad sg-font-small">
     <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-form-item sg-pad-tb sg-top-border">
         <view class="sg-label">设备类型</view>
         <view class="sg-label">设备类型</view>
@@ -129,12 +137,12 @@
       <view class="sg-form-item sg-pad-tb sg-top-border">
       <view class="sg-form-item sg-pad-tb sg-top-border">
         <view class="sg-label">设备数量</view>
         <view class="sg-label">设备数量</view>
         <input value="{{device_quantity}}" class="sg-input" bindinput="onChange" data-name="device_quantity"
         <input value="{{device_quantity}}" class="sg-input" bindinput="onChange" data-name="device_quantity"
-          placeholder="请输入设备数量"></input>
+          placeholder="请输入设备数量" type="number"></input>
       </view>
       </view>
       <view class="sg-form-item sg-pad-tb sg-top-border">
       <view class="sg-form-item sg-pad-tb sg-top-border">
         <view class="sg-label">设备单价</view>
         <view class="sg-label">设备单价</view>
         <input value="{{device_price}}" class="sg-input" bindinput="onChange" data-name="device_price"
         <input value="{{device_price}}" class="sg-input" bindinput="onChange" data-name="device_price"
-          placeholder="请输入设备单价"></input>
+          placeholder="请输入设备单价" type="number"></input>
       </view>
       </view>
     </view>
     </view>
   </van-dialog>
   </van-dialog>

+ 6 - 3
mini/pages/create-project-role/index.js

@@ -25,7 +25,6 @@ Page({
    */
    */
   onLoad: function (options) {
   onLoad: function (options) {
     this.getProjects()
     this.getProjects()
-    this.getRoles()
     if(options.id) {
     if(options.id) {
       this.setData({
       this.setData({
         id: options.id,
         id: options.id,
@@ -36,6 +35,7 @@ Page({
         title: '修改权限'
         title: '修改权限'
       })
       })
     }
     }
+    this.getRoles()
   },
   },
 
 
   updateIndex: function() {
   updateIndex: function() {
@@ -141,6 +141,7 @@ Page({
     }
     }
     if(this.type == 'edit') {
     if(this.type == 'edit') {
       data = {
       data = {
+        keyword: this.data.keyword,
         id: this.data.project_user.user_id
         id: this.data.project_user.user_id
       }
       }
     }
     }
@@ -171,8 +172,10 @@ Page({
   getRoles: function() {
   getRoles: function() {
     var that = this
     var that = this
     http({
     http({
-      url: 'project-roles/getAll',
-      data: {},
+      url: 'project-roles/getByExclude',
+      data: {
+        id: this.data.id
+      },
       success: function(res) {
       success: function(res) {
         if(res.code == 0) {
         if(res.code == 0) {
           that.setData({
           that.setData({

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

@@ -77,7 +77,7 @@ Page({
     var url = e.currentTarget.dataset.url
     var url = e.currentTarget.dataset.url
     if(['/pages/create-project/index', '/pages/create-project-role/index'].indexOf(url) != -1) {
     if(['/pages/create-project/index', '/pages/create-project-role/index'].indexOf(url) != -1) {
       var role = this.data.topRole
       var role = this.data.topRole
-      if(!role || ['manager', 'admin'].indexOf(role.key)) {
+      if(!role || ['manager', 'admin'].indexOf(role.key) == -1) {
         util.error('没有权限');
         util.error('没有权限');
         return false;
         return false;
       }
       }

+ 1 - 1
mini/pages/order-inner/index.wxml

@@ -17,7 +17,7 @@
   <view class="sg-list-box sg-pad">
   <view class="sg-list-box sg-pad">
     <view class="sg-list" wx:for="{{list}}" hidden="{{tabIndex != index}}" wx:key="index">
     <view class="sg-list" wx:for="{{list}}" hidden="{{tabIndex != index}}" wx:key="index">
       <block wx:for="{{item}}" wx:for-item="i_item" wx:for-index="i_index" wx:key="i_index">
       <block wx:for="{{item}}" wx:for-item="i_item" wx:for-index="i_index" wx:key="i_index">
-        <inner-order-item item="{{i_item}}" role="{{role}}" bind:update="update"></inner-order-item>
+        <inner-order-item item="{{i_item}}" role="{{role}}" bind:update="search"></inner-order-item>
       </block>
       </block>
     </view>
     </view>
   </view>
   </view>

+ 13 - 1
mini/pages/project/index.js

@@ -63,7 +63,8 @@ Page({
       title: '维修上报',
       title: '维修上报',
       desc: '设备维修上报',
       desc: '设备维修上报',
       url: '/pages/repair/index'
       url: '/pages/repair/index'
-    }]
+    }],
+    right: null
   },
   },
 
 
   /**
   /**
@@ -78,14 +79,25 @@ Page({
     api.getByName(this, 'getUserInfo', 'userInfo', {}, function(res) {
     api.getByName(this, 'getUserInfo', 'userInfo', {}, function(res) {
       app.updateUserInfo(res);
       app.updateUserInfo(res);
     });
     });
+    api.getByName(this, 'users/getRight', 'right', {id: id});
     wx.setStorageSync('sg-added-devices', [])
     wx.setStorageSync('sg-added-devices', [])
   },
   },
 
 
   navigate: function(e) {
   navigate: function(e) {
     var url = e.currentTarget.dataset.url
     var url = e.currentTarget.dataset.url
+    var right = this.data.right
+    var id = this.data.id
     if(url == '/pages/device-inner/index?id=' + this.data.id) {
     if(url == '/pages/device-inner/index?id=' + this.data.id) {
       app.resetFilter();
       app.resetFilter();
     }
     }
+    if(url == '/pages/create-order/index?id=' + id && (!right || !right.createOut)) {
+      util.error('没有权限')
+      return false;
+    }
+    if(url == '/pages/create-order-inner/index?id=' + id && (!right || !right.createInner)) {
+      util.error('没有权限')
+      return false;
+    }
     wx.navigateTo({
     wx.navigateTo({
       url: url,
       url: url,
     })
     })

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

@@ -11,9 +11,11 @@
       </view>
       </view>
       <view class="sg-phone-user sg-flex sg-align-center sg-space-between">
       <view class="sg-phone-user sg-flex sg-align-center sg-space-between">
         <view class="sg-phone sg-gray-color sg-font-small">{{ userInfo.phone }}</view>
         <view class="sg-phone sg-gray-color sg-font-small">{{ userInfo.phone }}</view>
-        <view class="sg-user sg-font-small sg-index-color sg-flex sg-align-center" bindtap="navigate"
+        <block wx:if="{{ right && right.managerMember }}">
+          <view class="sg-user sg-font-small sg-index-color sg-flex sg-align-center" bindtap="navigate"
           data-url="/pages/project-user/index?id={{id}}">
           data-url="/pages/project-user/index?id={{id}}">
           <van-icon name="user-o" /><text>人员管理</text></view>
           <van-icon name="user-o" /><text>人员管理</text></view>
+        </block>
       </view>
       </view>
     </view>
     </view>
   </view>
   </view>

+ 1 - 1
mini/project.config.json

@@ -40,7 +40,7 @@
   },
   },
   "compileType": "miniprogram",
   "compileType": "miniprogram",
   "libVersion": "2.14.0",
   "libVersion": "2.14.0",
-  "appid": "wx127fbc7abac491bd",
+  "appid": "wx91d43ffa93b78d6e",
   "projectname": "mini",
   "projectname": "mini",
   "debugOptions": {
   "debugOptions": {
     "hidedInDevtools": []
     "hidedInDevtools": []

+ 6 - 1
mini/utils/util.js

@@ -109,6 +109,10 @@ const checkPass = (str) => {
   return /^(\d+[a-zA-Z]+|[a-zA-Z]+\d+)([0-9a-zA-Z]*)$/.test(str)
   return /^(\d+[a-zA-Z]+|[a-zA-Z]+\d+)([0-9a-zA-Z]*)$/.test(str)
 }
 }
 
 
+const beforeClose = (action) => {
+  return false
+};
+
 module.exports = {
 module.exports = {
   formatDate,
   formatDate,
   checkMobile: checkMobile,
   checkMobile: checkMobile,
@@ -117,5 +121,6 @@ module.exports = {
   firstCase,
   firstCase,
   uploadFile,
   uploadFile,
   wechatLogin,
   wechatLogin,
-  checkPass
+  checkPass,
+  beforeClose
 }
 }

+ 33 - 1
resources/views/admin/projects/index.blade.php

@@ -31,6 +31,9 @@
             <script type="text/html" id="sg-table-bar">
             <script type="text/html" id="sg-table-bar">
                 <div class="layui-btn-group">
                 <div class="layui-btn-group">
                     <div class="layui-btn-group">
                     <div class="layui-btn-group">
+                        @{{# if(d.active == 2) { }}
+                            <a class="layui-btn layui-btn-warm layui-btn-xs" lay-event="active">激活</a>
+                        @{{# } }}
                         <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="member">成员管理</a>
                         <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="member">成员管理</a>
                         <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
                         <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
                         <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delete">删除</a>
                         <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="delete">删除</a>
@@ -58,6 +61,7 @@
                     cols: [[
                     cols: [[
                         { field: 'id', title: 'ID', align: 'center' },
                         { field: 'id', title: 'ID', align: 'center' },
                         { field: 'name', title: '名称', align: 'center' },
                         { field: 'name', title: '名称', align: 'center' },
+                        { field: 'active_label', title: '激活', align: 'center' },
                         { field: 'created_at', title: '创建时间', align: 'center' },
                         { field: 'created_at', title: '创建时间', align: 'center' },
                         { title: '操作', align:'center', toolbar: '#sg-table-bar' }
                         { title: '操作', align:'center', toolbar: '#sg-table-bar' }
                     ]],
                     ]],
@@ -113,8 +117,36 @@
                             }
                             }
                         });
                         });
                     } else if(obj.event === 'member') {
                     } else if(obj.event === 'member') {
-                        console.log('ProjectUser/index?project_id=' + data.id)
                         window.location = '/admin/ProjectUser/index?project_id=' + data.id
                         window.location = '/admin/ProjectUser/index?project_id=' + data.id
+                    } else if(obj.event === 'active') {
+                        layer.confirm('确定激活吗?', function(index) {
+                            $.ajax({
+                                method: 'POST',
+                                url: '{{ $pre_uri }}' + 'active',
+                                headers: {
+                                    'X-CSRF-TOKEN': '{{ csrf_token() }}'
+                                },
+                                data: {
+                                    id: data.id
+                                },
+                                success: function (data) {
+                                    if(data.status === 'success') {
+                                        updateTableBySearch()
+                                    } else {
+                                        layer.msg(data.info, {
+                                            icon: 2
+                                        });
+                                    }
+                                    layer.close(index);
+                                },
+                                error: function () {
+                                    layer.close(index);
+                                    layer.msg('操作失败', {
+                                        icon: 2
+                                    });
+                                }
+                            });
+                        });
                     }
                     }
                 });
                 });
 
 

+ 3 - 0
routes/api.php

@@ -33,6 +33,7 @@ $api->version('v1', ['namespace' => 'App\Http\Controllers\Api\mini', 'prefix' =>
     $api->any('project-roles/create', 'ProjectRoleController@create');
     $api->any('project-roles/create', 'ProjectRoleController@create');
     $api->any('project-roles/get', 'ProjectRoleController@get');
     $api->any('project-roles/get', 'ProjectRoleController@get');
     $api->any('project-roles/getAll', 'ProjectRoleController@getAll');
     $api->any('project-roles/getAll', 'ProjectRoleController@getAll');
+    $api->any('project-roles/getByExclude', 'ProjectRoleController@getByExclude');
 
 
     $api->any('project-users/detail', 'ProjectUserController@detail');
     $api->any('project-users/detail', 'ProjectUserController@detail');
 
 
@@ -61,6 +62,7 @@ $api->version('v1', ['namespace' => 'App\Http\Controllers\Api\mini', 'prefix' =>
     $api->any('orders/getRole', 'OrderController@getRole');
     $api->any('orders/getRole', 'OrderController@getRole');
     $api->any('orders/check', 'OrderController@check');
     $api->any('orders/check', 'OrderController@check');
     $api->any('orders/changePrice', 'OrderController@changePrice');
     $api->any('orders/changePrice', 'OrderController@changePrice');
+    $api->any('orders/delete', 'OrderController@delete');
 
 
     $api->any('repair-devices/create', 'RepairDeviceController@create');
     $api->any('repair-devices/create', 'RepairDeviceController@create');
     $api->any('repair-devices/get', 'RepairDeviceController@get');
     $api->any('repair-devices/get', 'RepairDeviceController@get');
@@ -88,6 +90,7 @@ $api->version('v1', ['namespace' => 'App\Http\Controllers\Api\mini', 'prefix' =>
     $api->any('users/update', 'UserController@update');
     $api->any('users/update', 'UserController@update');
     $api->any('users/changePassword', 'UserController@changePassword');
     $api->any('users/changePassword', 'UserController@changePassword');
     $api->any('users/getTopRole', 'UserController@getTopRole');
     $api->any('users/getTopRole', 'UserController@getTopRole');
+    $api->any('users/getRight', 'UserController@getRight');
 
 
     $api->any('feedback/create', 'FeedbackController@create');
     $api->any('feedback/create', 'FeedbackController@create');
 });
 });