Kaynağa Gözat

任务发布需求二期

ANG YU 4 yıl önce
ebeveyn
işleme
242f98bfe8

+ 16 - 1
app/Filters/RequirementFilters.php

@@ -4,6 +4,7 @@
 namespace App\Filters;
 
 use App\Order;
+use App\Requirement;
 use App\RequirementUser;
 use App\Services\UserService;
 use Illuminate\Http\Request;
@@ -25,6 +26,8 @@ class RequirementFilters
         'finished_at_end',
         'created_at_start',
         'created_at_end',
+        'requirement_id',
+        'status'
     ];
 
     public function __construct(Request $request)
@@ -46,7 +49,7 @@ class RequirementFilters
 
     public function creator_id($creator_id)
     {
-        $this->queryBuilder->where('user_id', $creator_id);
+        $this->queryBuilder->where('u];ser_id', $creator_id);
     }
 
     private function worker_ids($worker_ids)
@@ -93,4 +96,16 @@ class RequirementFilters
     {
         $this->queryBuilder->where('title', 'like', $title.'%');
     }
+
+    //        'requirement_id',
+    //        'status'
+    public function status($status)
+    {
+        $this->queryBuilder->where('status', Requirement::$enums['status'][$status]);
+    }
+
+    public function requirement_id($requirement_id)
+    {
+        $this->queryBuilder->where('id', $requirement_id);
+    }
 }

+ 37 - 5
app/Http/Controllers/RequirementController.php

@@ -35,7 +35,7 @@ class RequirementController extends Controller
     {
         $requirement->fill($request->all());
         $requirement->user_id = Auth::id();
-        $requirement->status = '已发布';
+        $requirement->status = '待接收';
         $requirement->save();
         return redirect()->route('requirements.index', $requirement->id)->with('success', '需求创建成功!');
     }
@@ -74,18 +74,26 @@ class RequirementController extends Controller
 
     }
 
-    public function begin(Requirement $requirement)
+    public function begin(Requirement $requirement,Request $request)
     {
         $this->authorize('begin', $requirement);
-        $requirement->status = '已开始';
+        $requirement->status = '开发中';
         $requirement->began_at = now();
+        if (count($request->users) > 0) {
+            $attachData = [];
+            foreach ($request->users as $worker) {
+                $attachData[] = $worker['name'];
+            }
+            $requirement->workers()->sync($attachData);
+        }
+
         $requirement->save();
         return redirect()->route('requirements.show', $requirement->id)->with('success', '需求已开始执行');
     }
 
     public function finish(Request $request, Requirement $requirement)
     {
-        $requirement->status = '已完成';
+        $requirement->status = '待验收';
         if (count($request->users) > 0) {
             $attachData = [];
             foreach ($request->users as $worker) {
@@ -95,6 +103,30 @@ class RequirementController extends Controller
         }
         $requirement->finished_at = now();
         $requirement->save();
-        return redirect()->route('requirements.show', $requirement->id)->with('success', '需求已完成');
+        return redirect()->route('requirements.show', $requirement->id)->with('success', '需求等待验收');
+    }
+
+    public function review(Requirement $requirement,Request $request)
+    {
+        //验收通过
+        if ($request->flag==="1") {
+            $requirement->status = '验收通过';
+        }
+        //验收未通过
+        if ($request->flag==="0") {
+            $requirement->status = '验收未通过';
+        }
+        $requirement->reviewed_at = now();
+        $requirement->save();
+        return redirect()->route('requirements.show', $requirement->id)->with('success', '验收完成');
+    }
+
+    public function againReview(Requirement $requirement,Request $request)
+    {
+        $requirement->status = '开发中';
+        $requirement->finished_at = null;
+        $requirement->reviewed_at = null;
+        $requirement->save();
+        return redirect()->route('requirements.show', $requirement->id)->with('success', '再次申请验收流程完成');
     }
 }

+ 1 - 0
app/Http/Controllers/TestController.php

@@ -5,6 +5,7 @@ namespace App\Http\Controllers;
 use App\Components\AsyncResponse;
 use App\Components\ErrorPush;
 use App\ErrorTemp;
+use App\Events\SettlementBillCreateEvent;
 use App\Feature;
 use App\MaterialBoxModel;
 use App\Owner;

+ 2 - 2
app/Policies/RequirementPolicy.php

@@ -27,11 +27,11 @@ class RequirementPolicy
 
     public function destroy(User $user, \App\Requirement $requirement)
     {
-        return $requirement->status != '已完成';
+        return $requirement->status == '待接收';
     }
 
     public function begin(User $user ,\App\Requirement $requirement)
     {
-        return $requirement->status == '已发布';
+        return $requirement->status == '待接收';
     }
 }

+ 7 - 3
app/Requirement.php

@@ -25,19 +25,23 @@ class Requirement extends Model
         'status',//状态
         'began_at',//开始时间
         'finished_at',//完成时间
+        'reviewed_at',//验收时间
     ];
 
     public $dates = [
         'began_at',//开始时间
         'finished_at',//完成时间
+        'reviewed_at',//验收时间
     ];
 
     static public $enums=[
         'status'=>[
             ''=>0,
-            '已发布'=>1,
-            '已开始'=>2,
-            '已完成'=>3,
+            '待接收'=>1,
+            '开发中'=>2,
+            '待验收'=>3,
+            '验收通过'=>4,
+            '验收未通过'=>5,
         ],
     ];
     function __construct(array $attributes = [])

+ 32 - 0
database/migrations/2021_08_04_174608_add_check_time_to_requirements_table.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddCheckTimeToRequirementsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('requirements', function (Blueprint $table) {
+            $table->timestamp('reviewed_at')->nullable()->comment('验收时间');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('requirements', function (Blueprint $table) {
+            $table->dropColumn('reviewed_at');
+        });
+    }
+}

+ 61 - 22
resources/views/requirement/index.blade.php

@@ -12,17 +12,39 @@
                     @click="selectTr===i+1?selectTr=0:selectTr=i+1"
                     :class="selectTr===i+1?'focusing' : ''">
                     <td><input class="checkItem" type="checkbox" :value="requirement.id"></td>
-                    <td>@{{ i+1 }}</td>
+                    <td>@{{ requirement.id }}</td>
                     <td>@{{ requirement.creator.name }}</td>
                     <td>@{{ requirement.score }}</td>
                     <td>@{{ requirement.title }}</td>
-                    <td :title="requirement.content" class="d-inline-block text-truncate" style="max-width: 300px;">@{{ requirement.content }}</td>
+                    <td :title="requirement.content" class="text-truncate" style="max-width: 300px;">@{{
+                        requirement.content }}
+                    </td>
                     <td><span :class="calStatusClass(requirement.status)">@{{ requirement.status }}</span></td>
+                    <td>
+                        <div v-if="requirement.workers.length>0 && requirement.showMore"
+                             class="text-overflow-warp-200 up" :id="'route-'+i">
+                            <p v-for="worker in requirement.workers">
+                                @{{ worker.name}}
+                            </p>
+                        </div>
+                        <div class="text-overflow-warp-200 " v-else>
+                            @{{ requirement.workers.length>0? requirement.workers[0].name:'' }}
+                        </div>
+                        <div @click="requirement.showMore=!requirement.showMore" v-if="requirement.workers.length > 1">
+                            <label class="text-center mt-0 p-0 cursor-pointer pull-left">
+                                <span class="fa"
+                                      :class="requirement.showMore ? 'fa-angle-double-down' : 'fa-angle-double-right'"></span>
+                                &nbsp;<span v-if="requirement.showMore">收起</span><span
+                                    v-else>展开</span>&nbsp;@{{ requirement.workers.length }} 条
+                            </label>
+                        </div>
+                    </td>
                     <td>@{{ requirement.began_at }}</td>
                     <td>@{{ requirement.finished_at }}</td>
+                    <td>@{{ requirement.reviewed_at }}</td>
                     <td>@{{ requirement.created_at }}</td>
                     <td>
-                        <form v-if="requirement.status!=='已完成'" :action="targetUrl(requirement.id)" method="post"
+                        <form v-if="requirement.status==='待接收'" :action="targetUrl(requirement.id)" method="post"
                               style="display: inline-block;"
                               onsubmit="return confirm('您确定要删除吗?');">
                             {{ csrf_field() }}
@@ -31,14 +53,6 @@
                                 <i class="far fa-trash-alt"></i> 删
                             </button>
                         </form>
-                        <form v-if="requirement.status==='已发布'" :action="targetUrl(requirement.id)+'/edit'" method="get"
-                              style="display: inline-block;"
-                              onsubmit="return">
-                            <button type="submit" class="btn btn-outline-info btn-sm">
-                                <i class="far fa-trash-alt"></i> 改
-                            </button>
-                        </form>
-
                         <button type="submit" class="btn btn-outline-info btn-sm">
                             <i class="far fa-trash-alt"></i> <a :href="targetUrl(requirement.id)">查</a>
                         </button>
@@ -109,6 +123,12 @@
                             type: 'dateTime',
                             tip: '选择任务开始的截止时间'
                         },
+                        {
+                            name: 'requirement_id',
+                            type: 'input',
+                            tip: '输入任务号',
+                            placeholder: '任务号',
+                        },
 
                     ],
                     [
@@ -131,6 +151,19 @@
                             name: 'created_at_end',
                             type: 'dateTime',
                             tip: '选择任务创建的截止时间'
+                        },
+                        {
+                            name: 'status',
+                            type: 'select',
+                            tip: '选择状态',
+                            placeholder: '状态',
+                            data:[
+                                {name:'待接收',value:'待接收'},
+                                {name:'开发中',value:'开发中'},
+                                {name:'待验收',value:'待验收'},
+                                {name:'验收通过',value:'验收通过'},
+                                {name:'验收未通过',value:'验收未通过'},
+                            ]
                         }
                     ]
                 ];
@@ -140,14 +173,17 @@
                 });
                 _this.form.init();
                 let column = [
-                    {name: 'index', value: '序号', neglect: true},
+                    // {name: 'index', value: '序号', neglect: true},
+                    {name: 'requirement_id', value: '任务号'},
                     {name: 'creator_name', value: '创建人'},
                     {name: 'score', value: '分数'},
                     {name: 'title', value: '标题'},
                     {name: 'content', value: '内容'},
                     {name: 'status', value: '状态'},
-                    {name: 'began_at', value: '开始时间'},
+                    {name: 'workers', value: '完成人'},
+                    {name: 'began_at', value: '接收时间'},
                     {name: 'finished_at', value: '完成时间'},
+                    {name: 'reviewed_at', value: '验收时间'},
                     {name: 'created_at', value: '创建时间'},
                     {name: 'operation', value: '操作'},
                 ];
@@ -159,25 +195,28 @@
                     restorationColumn: 'addtime',
                     fixedTop: ($('#form_div').height()) + ($('#btn').height()) + 1,
                 }).init();
-
+                _this.requirements = _this.requirements.map(item => {
+                    item.showMore = false
+                    return item;
+                });
             },
             methods: {
-                {{--edit(id) {--}}
-                    {{--    location.href = "{{url('finance/settlementBills/ownerSundryFeeDetails')}}/" + id + "/edit";--}}
-                    {{--},--}}
                 targetUrl(id) {
                     return "{{ url('requirements') }}/" + id;
                 },
 
                 calStatusClass(status) {
                     switch (status) {
-                        case '已发布':
-                            return "badge badge-info";
-                        case '已开始':
+                        case '待接收':
+                            return "badge badge-primary";
+                        case '开发中':
                             return "badge badge-warning";
-                        case '已完成':
+                        case '待验收':
+                            return "badge badge-info";
+                        case '验收通过':
                             return "badge badge-success";
-
+                        case '验收未通过':
+                            return "badge badge-danger";
                     }
                 }
             },

+ 83 - 33
resources/views/requirement/show.blade.php

@@ -29,7 +29,7 @@
                 </div>
             </div>
         </div>
-        @if($requirement->status==='已发布')
+        @if($requirement->status==='待接收')
             <div class="col-12 text-center mt-4">
                 <form action="{{ route('requirements.edit',$requirement->id) }}" method="get"
                       style="display: inline-block;"
@@ -45,73 +45,122 @@
                           style="display: inline-block;"
                           onsubmit="return confirm('您确定要开始吗?');">
                         {{ csrf_field() }}
+                        <div class="form-group">
+                            <template v-for="(item,i) in items">
+                                <div class="row">
+                                    <div class="col-auto mb-4">
+                                        <select class="form-control" :name="'users['+i+'][name]'"
+                                                required {{ $requirement->workers->count()>0 ? 'disabled' :''}}>
+                                            <option value="" hidden disabled selected>请选择用户
+                                            </option>
+                                            @foreach ($workers as $value)
+                                                <option
+                                                    value="{{ $value->id }}">
+                                                    {{ $value->name }}
+                                                </option>
+                                            @endforeach
+                                        </select>
+                                    </div>
+                                    <div v-if="i!==0" class="col-1 mb-4 mt-1">
+                                        <button class="btn btn-sm btn-primary float-right" type="button"
+                                                @click="items.splice(i,1)">-
+                                        </button>
+                                    </div>
+                                </div>
+                            </template>
+                            <button class="btn btn-sm btn-primary float-right" type="button"
+                                    @click="addItem">添加
+                            </button>
+                        </div>
                         <button type="submit" class="btn btn-success btn-sm">
-                            <i class="far fa-trash-alt"></i> 开始任务
+                            <i class="far fa-trash-alt"></i> 开始开发
                         </button>
                     </form>
                 </div>
             </div>
 
-        @elseif($requirement->status==='已开始')
+        @elseif($requirement->status==='开发中')
             <div class="col-12">
                 <div class="text-center m-4">
                     <form action="{{ route('requirements.finish',$requirement->id) }}" method="post"
-                          style="display: inline-block;">
+                          style="display: inline-block;"
+                          onsubmit="return confirm('您确定要完成开发吗?');">
                         {{ csrf_field() }}
                         <div class="form-group">
-                            <template v-for="(item,i) in items">
+                            @foreach($requirement->workers as $worker)
                                 <div class="row">
-                                   <div class="col-5 mb-4">
-                                       <select class="form-control" :name="'users['+i+'][name]'"
-                                               required {{ $requirement->workers->count()>0 ? 'disabled' :''}}>
-                                           <option value="" hidden disabled selected>请选择用户
-                                           </option>
-                                           @foreach ($workers as $value)
-                                               <option
-                                                   value="{{ $value->id }}">
-                                                   {{ $value->name }}
-                                               </option>
-                                           @endforeach
-                                       </select>
-                                   </div>
+                                    <div class="col-5 mb-4">
+                                        <input class="form-control" disabled value="{{ $worker->name }}"></input>
+                                        <input class="form-control" hidden
+                                               :name="'users['+ {{ $loop->index }} +'][name]'"
+                                               value="{{ $worker->id }}"></input>
+                                    </div>
                                     <div class="col-5 mb-4">
                                         <input class="form-control" type="number"
-                                               :name="'users['+i+'][score]'"
+                                               :name="'users['+ {{ $loop->index }} +'][score]'"
                                                placeholder="请填写分数"
                                                required></input>
                                     </div>
-                                    <div v-if="i!==0" class="col-1 mb-4 mt-1">
-                                        <button class="btn btn-sm btn-primary float-right" type="button"
-                                                @click="items.splice(i,1)">-
-                                        </button>
-                                    </div>
                                 </div>
-                            </template>
-                            <div>
-                                <button class="btn btn-sm btn-primary float-right" type="button"
-                                        @click="addItem">添加
-                                </button>
-                            </div>
+                            @endforeach
                         </div>
                         <div class="well well-sm">
-                            <button type="submit" class="btn btn-primary"> 完结需求</button>
+                            <button type="submit" class="btn btn-primary"> 完成开发</button>
                         </div>
                     </form>
                 </div>
             </div>
-        @elseif($requirement->status==='已完成')
+        @elseif($requirement->status==='待验收')
             <div class="col-12 text-center">
                 @foreach($requirement->workers as $worker)
                     <div class="row">
                         <div class="col-5 m-4">姓名: {{ $worker->name }}</div>
                         <div class="col-5 m-4">分数:{{ $worker->pivot->score }}</div>
                     </div>
+                @endforeach
+            </div>
+            <div class="m-4">
+                <form action="{{ route('requirements.review',$requirement->id) }}" method="post"
+                      style="display: inline-block;"
+                      onsubmit="return confirm('您确定要完成验收吗?');">
+                    {{ csrf_field() }}
+                    <input type="number" name="flag" hidden :value="reviewFlag">
+
+                        <button @click="reviewFlag=1" type="submit" class="btn btn-primary"> 验收通过</button>
+
 
+                        <button @click="reviewFlag=0" type="submit" class="btn btn-danger"> 验收未通过</button>
+
+                </form>
+            </div>
+        @elseif($requirement->status==='验收通过')
+            <div class="col-12 text-center">
+                    @foreach($requirement->workers as $worker)
+                        <div class="row">
+                            <div class="col-5 m-4">姓名: {{ $worker->name }}</div>
+                            <div class="col-5 m-4">分数:{{ $worker->pivot->score }}</div>
+                        </div>
+                    @endforeach
+            </div>
+        @elseif($requirement->status==='验收未通过')
+            <div class="col-12 text-center">
+                @foreach($requirement->workers as $worker)
+                    <div class="row">
+                        <div class="col-5 m-4">姓名: {{ $worker->name }}</div>
+                        <div class="col-5 m-4">分数:{{ $worker->pivot->score }}</div>
+                    </div>
                 @endforeach
             </div>
+            <div class="m-4">
+                <form action="{{ route('requirements.againReview',$requirement->id) }}" method="post"
+                      style="display: inline-block;"
+                      onsubmit="return confirm('您确定要再次申请验收流程吗?');">
+                    {{ csrf_field() }}
+                    <button type="submit" class="btn btn-primary"> 再次申请验收流程</button>
 
+                </form>
+            </div>
         @endif
-    </div>
 @endsection
 @section('lastScript')
     <script>
@@ -119,6 +168,7 @@
             el: "#list",
             data: {
                 items: [{}],
+                reviewFlag: 0,
                 @if($requirement->id)
                 workers: {!! $workers !!},
                 @endif

+ 2 - 0
routes/web.php

@@ -1005,6 +1005,8 @@ Route::group(['middleware'=>'auth'],function ($route){
         Route::patch('{requirement}','RequirementController@update')->name('requirements.update');
         Route::get('{requirement}','RequirementController@show')->name('requirements.show');
         Route::get('{requirement}/edit','RequirementController@edit')->name('requirements.edit');
+        Route::post('{requirement}/review','RequirementController@review')->name('requirements.review');
+        Route::post('{requirement}/againReview','RequirementController@againReview')->name('requirements.againReview');
     });
 
 });