Selaa lähdekoodia

需求发布系统

ANG YU 4 vuotta sitten
vanhempi
commit
9ed13ea138

+ 96 - 0
app/Filters/RequirementFilters.php

@@ -0,0 +1,96 @@
+<?php
+
+
+namespace App\Filters;
+
+use App\Order;
+use App\RequirementUser;
+use App\Services\UserService;
+use Illuminate\Http\Request;
+use Illuminate\Support\Carbon;
+use Illuminate\Support\Str;
+use phpDocumentor\Reflection\Types\Boolean;
+
+class RequirementFilters
+{
+    protected $request;
+    protected $queryBuilder;
+    protected $filters = [
+        'title',
+        'creator_id',
+        'worker_ids',
+        'began_at_start',
+        'began_at_end',
+        'finished_at_start',
+        'finished_at_end',
+        'created_at_start',
+        'created_at_end',
+    ];
+
+    public function __construct(Request $request)
+    {
+        $this->request = $request;
+    }
+
+    public function apply($builder)
+    {
+        $this->queryBuilder = $builder;
+        $filters = array_filter($this->request->only($this->filters));
+        foreach ($filters as $filter => $value) {
+            if (method_exists($this, $filter)) {
+                $this->$filter($value, $this->queryBuilder);
+            }
+        }
+        return $this->queryBuilder;
+    }
+
+    public function creator_id($creator_id)
+    {
+        $this->queryBuilder->where('user_id', $creator_id);
+    }
+
+    private function worker_ids($worker_ids)
+    {
+        if (strpos($worker_ids, ',') || strpos($worker_ids, ',') || strpos($worker_ids, ' ')) {
+            $arr = array_filter(preg_split('/[,, ]+/is', $worker_ids));
+            $this->queryBuilder->whereIn('id', RequirementUser::query()->select('requirement_id')->whereIn('user_id', $arr));
+        } else {
+            $this->queryBuilder->whereIn('id', RequirementUser::query()->select('requirement_id')->where('user_id', $worker_ids));
+        }
+    }
+
+    public function began_at_start($began_at_start)
+    {
+        $this->queryBuilder->where('begin_at', '>=', \Carbon\Carbon::parse($began_at_start)->startOfDay());
+    }
+
+    public function began_at_end($began_at_end)
+    {
+        $this->queryBuilder->where('begin_at', '<=', \Carbon\Carbon::parse($began_at_end)->endOfDay());
+    }
+
+    public function finished_at_start($finished_at_start)
+    {
+        $this->queryBuilder->where('finished_at', '>=', \Carbon\Carbon::parse($finished_at_start)->startOfDay());
+    }
+
+    public function finished_at_end($finished_at_end)
+    {
+        $this->queryBuilder->where('finished_at', '<=', \Carbon\Carbon::parse($finished_at_end)->endOfDay());
+    }
+
+    public function created_at_start($created_at_start)
+    {
+        $this->queryBuilder->where('created_at', '>=', \Carbon\Carbon::parse($created_at_start)->startOfDay());
+    }
+
+    public function created_at_end($created_at_end)
+    {
+        $this->queryBuilder->where('created_at', '<=', \Carbon\Carbon::parse($created_at_end)->endOfDay());
+    }
+
+    public function title($title)
+    {
+        $this->queryBuilder->where('title', 'like', $title.'%');
+    }
+}

+ 100 - 0
app/Http/Controllers/RequirementController.php

@@ -0,0 +1,100 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Filters\RequirementFilters;
+use App\Http\Requests\RequirementRequest;
+use App\Requirement;
+use App\Role;
+use Illuminate\Http\Request;
+use Illuminate\Http\Response;
+use Illuminate\Support\Facades\Auth;
+
+class RequirementController extends Controller
+{
+
+    public function index(Request $request, RequirementFilters $filters)
+    {
+        $requirements = Requirement::query()->filter($filters)
+            ->with(['creator', 'workers'])
+            ->orderByDesc('created_at')
+            ->paginate($request->paginate ?? 50);
+        $canCreateRequirementUsers = Role::query()->where('name', '创建需求')->first()->users;
+
+        $canWorkRequirementUsers = Role::query()->where('name', '执行需求')->first()->users;
+        $paginateParams = $request->paginateParams;
+        return view('requirement.index', compact('canWorkRequirementUsers', 'canCreateRequirementUsers', 'requirements', 'paginateParams'));
+    }
+
+    public function create(Requirement $requirement)
+    {
+        return view('requirement.create_and_edit', compact('requirement'));
+    }
+
+    public function store(RequirementRequest $request, Requirement $requirement)
+    {
+        $requirement->fill($request->all());
+        $requirement->user_id = Auth::id();
+        $requirement->status = '已发布';
+        $requirement->save();
+        return redirect()->route('requirements.index', $requirement->id)->with('success', '需求创建成功!');
+    }
+
+
+    public function show(Requirement $requirement)
+    {
+        $requirement->loadMissing(['creator', 'workers']);
+        $creators = Role::query()->where('name', '创建需求')->first()->users;
+        $workers = Role::query()->where('name', '执行需求')->first()->users;
+        return view('requirement.show', compact('requirement', 'creators', 'workers'));
+    }
+
+
+    public function edit(Requirement $requirement)
+    {
+        $requirement->loadMissing(['creator', 'workers']);
+        $creators = Role::query()->where('name', '创建需求')->first()->users;
+        $workers = Role::query()->where('name', '执行需求')->first()->users;
+        return view('requirement.create_and_edit', compact('requirement', 'creators', 'workers'));
+    }
+
+
+    public function update(Request $request, Requirement $requirement)
+    {
+        $requirement->update($request->all());
+        return redirect()->route('requirements.show', $requirement->id)->with('success', '编辑成功');
+    }
+
+
+    public function destroy(Requirement $requirement)
+    {
+        $this->authorize('destroy', $requirement);
+        $requirement->delete();
+        return redirect()->route('requirements.index', $requirement->id)->with('success', '删除需求成功!');
+
+    }
+
+    public function begin(Requirement $requirement)
+    {
+        $this->authorize('begin', $requirement);
+        $requirement->status = '已开始';
+        $requirement->began_at = now();
+        $requirement->save();
+        return redirect()->route('requirements.show', $requirement->id)->with('success', '需求已开始执行');
+    }
+
+    public function finish(Request $request, Requirement $requirement)
+    {
+        $requirement->status = '已完成';
+        if (count($request->users) > 0) {
+            $attachData = [];
+            foreach ($request->users as $worker) {
+                $attachData[$worker['name']] = ['score' => $worker['score']];
+            }
+            $requirement->workers()->sync($attachData);
+        }
+        $requirement->finished_at = now();
+        $requirement->save();
+        return redirect()->route('requirements.show', $requirement->id)->with('success', '需求已完成');
+    }
+}

+ 85 - 0
app/Http/Controllers/RequirementUserController.php

@@ -0,0 +1,85 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\RequirementUser;
+use Illuminate\Http\Request;
+
+class RequirementUserController extends Controller
+{
+    /**
+     * Display a listing of the resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function index()
+    {
+        //
+    }
+
+    /**
+     * Show the form for creating a new resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function create()
+    {
+        //
+    }
+
+    /**
+     * Store a newly created resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return \Illuminate\Http\Response
+     */
+    public function store(Request $request)
+    {
+        //
+    }
+
+    /**
+     * Display the specified resource.
+     *
+     * @param  \App\RequirementUser  $requirementUser
+     * @return \Illuminate\Http\Response
+     */
+    public function show(RequirementUser $requirementUser)
+    {
+        //
+    }
+
+    /**
+     * Show the form for editing the specified resource.
+     *
+     * @param  \App\RequirementUser  $requirementUser
+     * @return \Illuminate\Http\Response
+     */
+    public function edit(RequirementUser $requirementUser)
+    {
+        //
+    }
+
+    /**
+     * Update the specified resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \App\RequirementUser  $requirementUser
+     * @return \Illuminate\Http\Response
+     */
+    public function update(Request $request, RequirementUser $requirementUser)
+    {
+        //
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     *
+     * @param  \App\RequirementUser  $requirementUser
+     * @return \Illuminate\Http\Response
+     */
+    public function destroy(RequirementUser $requirementUser)
+    {
+        //
+    }
+}

+ 39 - 0
app/Http/Requests/RequirementRequest.php

@@ -0,0 +1,39 @@
+<?php
+
+namespace App\Http\Requests;
+
+
+class RequirementRequest extends Request
+{
+    public function rules()
+    {
+        switch($this->method())
+        {
+            case 'POST':
+            case 'PUT':
+            case 'PATCH':
+            {
+                return [
+                    'content'       => 'required|min:3',
+                    'title'       => 'required|min:3',
+                    'score' => 'required|numeric',
+                ];
+            }
+            case 'GET':
+            case 'DELETE':
+            default:
+            {
+                return [];
+            }
+        }
+    }
+
+    public function messages()
+    {
+        return [
+            'content.min' => '内容至少为3个字符',
+            'title.min' => '内容至少为3个字符',
+            'score.numeric' => '分数必须为数字',
+        ];
+    }
+}

+ 37 - 0
app/Policies/RequirementPolicy.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace App\Policies;
+
+use App\User;
+use Illuminate\Auth\Access\HandlesAuthorization;
+
+class RequirementPolicy
+{
+    use HandlesAuthorization;
+
+    /**
+     * Create a new policy instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        //
+    }
+
+    public function update(User $user, \App\Requirement $requirement)
+    {
+        // return $owner_sundry_fee_detail->user_id == $user->id;
+        return true;
+    }
+
+    public function destroy(User $user, \App\Requirement $requirement)
+    {
+        return $requirement->status != '已完成';
+    }
+
+    public function begin(User $user ,\App\Requirement $requirement)
+    {
+        return $requirement->status == '已发布';
+    }
+}

+ 4 - 0
app/Providers/AppServiceProvider.php

@@ -153,6 +153,8 @@ use App\Services\DeliveryTypeService;
 use App\Services\ErrorPushService;
 use App\Services\MaterialBoxModelService;
 use App\Services\HandInStorageService;
+use App\Services\RequirementService;
+use App\Services\RequirementUserService;
 
 class AppServiceProvider extends ServiceProvider
 {
@@ -326,6 +328,8 @@ class AppServiceProvider extends ServiceProvider
         app()->singleton('RejectedBillItemService', RejectedBillItemService::class);
         app()->singleton('RejectedBillService', RejectedBillService::class);
         app()->singleton('RejectedService', RejectedService::class);
+        app()->singleton('RequirementService',RequirementService::class);
+        app()->singleton('RequirementUserService',RequirementUserService::class);
         app()->singleton('RoleService',RoleService::class);
         app()->singleton('SettlementBillsAreaFeeService',SettlementBillsAreaFeeService::class);
         app()->singleton('ShopService', ShopService::class);

+ 1 - 0
app/Providers/AuthServiceProvider.php

@@ -23,6 +23,7 @@ class AuthServiceProvider extends ServiceProvider
      */
     protected $policies = [
 		 \App\OwnerSundryFeeDetail::class => \App\Policies\OwnerSundryFeeDetailPolicy::class,
+		 \App\Requirement::class => \App\Policies\RequirementPolicy::class,
         // 'App\Model' => 'App\Policies\ModelPolicy',
         CustomerLog::class => CustomerLogPolice::class,
 

+ 79 - 0
app/Requirement.php

@@ -0,0 +1,79 @@
+<?php
+
+namespace App;
+
+use Illuminate\Database\Eloquent\Model;
+
+use App\Traits\ModelLogChanging;
+use Illuminate\Database\Eloquent\Relations\BelongsTo;
+use Illuminate\Database\Eloquent\Relations\BelongsToMany;
+
+class Requirement extends Model
+{
+    use ModelLogChanging;
+
+    use \App\Traits\ModelTimeFormat;
+
+    use \Illuminate\Database\Eloquent\SoftDeletes;
+
+    //
+    public $fillable = [
+        'user_id',//状态
+        'content', //内容
+        'title', //标题
+        'score', //分数
+        'status',//状态
+        'began_at',//开始时间
+        'finished_at',//完成时间
+    ];
+
+    public $dates = [
+        'began_at',//开始时间
+        'finished_at',//完成时间
+    ];
+
+    static public $enums=[
+        'status'=>[
+            ''=>0,
+            '已发布'=>1,
+            '已开始'=>2,
+            '已完成'=>3,
+        ],
+    ];
+    function __construct(array $attributes = [])
+    {
+        foreach (self::$enums as &$enum) {
+            $enum=$enum+array_flip($enum);
+        }
+        parent::__construct($attributes);
+    }
+
+    public function getStatusAttribute($value)
+    {
+        if(!$value)return '';
+        return self::$enums['status'][$value];
+    }
+    public function setStatusAttribute($value)
+    {
+        if(!$value)return 0;
+        $this->attributes['status']=self::$enums['status'][$value];
+    }
+
+
+    public function creator(): BelongsTo
+    {
+        return $this->belongsTo(User::class,'user_id','id');
+    }
+
+    public function workers(): BelongsToMany
+    {
+        return $this->belongsToMany(User::class)
+            ->using(RequirementUser::class)
+            ->withPivot(['score']);
+    }
+
+    public function scopeFilter($query, $filters)
+    {
+        return $filters->apply($query);
+    }
+}

+ 18 - 0
app/RequirementUser.php

@@ -0,0 +1,18 @@
+<?php
+
+namespace App;
+
+
+use App\Traits\ModelLogChanging;
+use Illuminate\Database\Eloquent\Relations\Pivot;
+
+class RequirementUser extends Pivot
+{
+    use ModelLogChanging;
+
+    public $fillable = ['score'];
+
+    public $incrementing = true;
+
+    public $timestamps = false;
+}

+ 13 - 0
app/Services/RequirementService.php

@@ -0,0 +1,13 @@
+<?php 
+
+namespace App\Services;
+
+use App\Traits\ServiceAppAop;
+use App\Requirement;
+
+class RequirementService
+{
+    use ServiceAppAop;
+    protected $modelClass=Requirement::class;
+
+}

+ 13 - 0
app/Services/RequirementUserService.php

@@ -0,0 +1,13 @@
+<?php 
+
+namespace App\Services;
+
+use App\Traits\ServiceAppAop;
+use App\RequirementUser;
+
+class RequirementUserService
+{
+    use ServiceAppAop;
+    protected $modelClass=RequirementUser::class;
+
+}

+ 12 - 0
database/factories/RequirementFactory.php

@@ -0,0 +1,12 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\Requirement;
+use Faker\Generator as Faker;
+
+$factory->define(Requirement::class, function (Faker $faker) {
+    return [
+        //
+    ];
+});

+ 12 - 0
database/factories/RequirementUserFactory.php

@@ -0,0 +1,12 @@
+<?php
+
+/** @var \Illuminate\Database\Eloquent\Factory $factory */
+
+use App\RequirementUser;
+use Faker\Generator as Faker;
+
+$factory->define(RequirementUser::class, function (Faker $faker) {
+    return [
+        //
+    ];
+});

+ 41 - 0
database/migrations/2021_07_28_115218_create_requirements_table.php

@@ -0,0 +1,41 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateRequirementsTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('requirements', function (Blueprint $table) {
+            $table->id();
+            $table->integer('user_id')->comment('创建者');
+            $table->decimal('score')->comment('');
+            $table->timestamp('began_at')->nullable()->comment('任务开始时间');
+            $table->timestamp('finished_at')->nullable()->comment('完结时间');
+            $table->text('title')->nullable()->comment('标题');
+            $table->text('content')->nullable()->comment('内容');
+            $table->tinyInteger('status')->comment('状态');
+            $table->softDeletes();
+            $table->timestamps();
+
+            $table->index(['title']);
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('requirements');
+    }
+}

+ 33 - 0
database/migrations/2021_07_28_115724_create_requirement_user_table.php

@@ -0,0 +1,33 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateRequirementUserTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('requirement_user', function (Blueprint $table) {
+            $table->id();
+            $table->integer('user_id')->comment('用户ID');
+            $table->integer('requirement_id')->comment('需求ID');
+            $table->decimal('score')->comment('分数');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('requirement_user');
+    }
+}

+ 16 - 0
database/seeds/RequirementSeeder.php

@@ -0,0 +1,16 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class RequirementSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        //
+    }
+}

+ 16 - 0
database/seeds/RequirementUserSeeder.php

@@ -0,0 +1,16 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class RequirementUserSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        //
+    }
+}

+ 70 - 0
resources/views/requirement/create_and_edit.blade.php

@@ -0,0 +1,70 @@
+@extends('layouts.app')
+@section('content')
+    <div class="container" id="list">
+        <div class="col-md-10 offset-md-1">
+            <div class="card ">
+
+                <div class="card-body">
+                    <h2 class="">
+                        @if($requirement->id)
+                            编辑需求
+                        @else
+                            新建需求
+                        @endif
+                    </h2>
+                    <hr>
+                    @if($requirement->id)
+                        <form action="{{ route('requirements.update', $requirement->id) }}" method="POST"
+                              accept-charset="UTF-8">
+                            <input type="hidden" name="_method" value="PATCH">
+                            @else
+                                <form action="{{ route('requirements.store') }}" method="POST" accept-charset="UTF-8">
+                                    @endif
+                                    <input type="hidden" name="_token" value="{{ csrf_token() }}">
+                                    @include('shared._error')
+                                    <div class="form-group">
+                                        <label class="form-group" for="title">标题</label>
+                        <textarea name="title" class="form-control" rows="2" id="title"
+                                  placeholder="请填入至少三个字符的内容。"
+                                  required>{{ old('title', $requirement->title ) }}</textarea>
+                                    </div>
+                                    <div class="form-group">
+                                        <label class="form-group" for="content">内容</label>
+                                        <textarea name="content" class="form-control" rows="6" id="content"
+                                  placeholder="请填入至少三个字符的内容。"
+                                  required>{{ old('content', $requirement->content ) }}</textarea>
+                                    </div>
+                                    <div class="form-group">
+                                        <label class="form-group" for="score">分数</label>
+
+                                        <input class="form-control" type="number" name="score" id="score"
+                                               value="{{ old('score', $requirement->score ) }}" placeholder="请填写分数"
+                                               required></input>
+                                    </div>
+                                    <div class="well well-sm">
+                                        <button type="submit" class="btn btn-primary"> 保存</button>
+                                    </div>
+                                </form>
+                </div>
+            </div>
+        </div>
+    </div>
+@endsection
+@section('lastScript')
+    <script>
+        let vue = new Vue({
+            el: "#list",
+            data: {
+                items: [{}],
+                @if($requirement->id)
+                workers: {!! $workers !!},
+                @endif
+            },
+            methods: {
+                addItem() {
+                    this.items.push({});
+                }
+            }
+        })
+    </script>
+@endsection

+ 185 - 0
resources/views/requirement/index.blade.php

@@ -0,0 +1,185 @@
+@extends('layouts.app')
+@section('title','需求发布')
+@section('content')
+    @include('shared._messages')
+    @include('shared._error')
+    <div id="list" class="d-none">
+        <div class="container-fluid">
+            <div id="form_div"></div>
+            <div class="form-inline" id="btn"></div>
+            <table class="table table-striped table-sm text-nowrap table-hover" id="table">
+                <tr v-for="(requirement,i) in requirements"
+                    @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.creator.name }}</td>
+                    <td>@{{ requirement.title }}</td>
+                    <td>@{{ requirement.content }}</td>
+                    <td><span :class="calStatusClass(requirement.status)">@{{ requirement.status }}</span></td>
+                    <td>@{{ requirement.began_at }}</td>
+                    <td>@{{ requirement.finished_at }}</td>
+                    <td>@{{ requirement.created_at }}</td>
+                    <td>
+                        <form v-if="requirement.status!=='已完成'" :action="targetUrl(requirement.id)" method="post"
+                              style="display: inline-block;"
+                              onsubmit="return confirm('您确定要删除吗?');">
+                            {{ csrf_field() }}
+                            {{ method_field('DELETE') }}
+                            <button type="submit" class="btn btn-outline-danger btn-sm">
+                                <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>
+                    </td>
+                </tr>
+            </table>
+            <div class="text-info h5 btn btn">{{$requirements->count()}}
+                /{{$requirements->total()}}</div>
+            {{$requirements->appends($paginateParams)->links()}}
+        </div>
+        <textarea id="clipboardDiv" style="opacity:0"></textarea>
+    </div>
+@endsection
+@section('lastScript')
+    <script type="text/javascript" src="{{mix('js/queryForm/export.js')}}"></script>
+    <script type="text/javascript" src="{{mix('js/queryForm/queryForm.js')}}"></script>
+    <script type="text/javascript" src="{{mix('js/queryForm/header.js')}}"></script>{{--新版2--}}
+    <script>
+        let vue = new Vue({
+            el: "#list",
+            data: {
+                requirements: [@foreach($requirements as $requirement){!! $requirement !!},@endforeach],
+                selectTr: 0,
+                creators: [@foreach($canCreateRequirementUsers as $creator){
+                    name: '{{ $creator->id }}',
+                    value: '{{ $creator->name }}'
+                },@endforeach],
+                workers: [@foreach($canWorkRequirementUsers as $worker){
+                    name: '{{ $worker->id }}',
+                    value: '{{ $worker->name }}'
+                },@endforeach]
+            },
+            created() {
+            },
+            mounted() {
+                $('#list').removeClass('d-none');
+                let _this = this;
+                $(".up").slideUp();
+                let data = [
+                    [
+                        {
+                            name: 'creator_id',
+                            type: 'select',
+                            tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的状态'],
+                            placeholder: '发布人',
+                            data: this.creators
+                        },
+                        {
+                            name: 'title',
+                            type: 'input',
+                            tip: '输入标题搜索',
+                            placeholder: '标题'
+                        },
+                        {
+                            name: 'worker_ids',
+                            type: 'select_multiple_select',
+                            tip: ['输入关键词快速定位下拉列表,回车确定', '选择要显示的货主'],
+                            placeholder: ['执行人', '定位或多选'],
+                            data: this.workers
+                        },
+                        {
+                            name: 'began_at_start',
+                            type: 'dateTime',
+                            tip: '选择任务开始的起始时间'
+                        },
+                        {
+                            name: 'began_at_end',
+                            type: 'dateTime',
+                            tip: '选择任务开始的截止时间'
+                        },
+
+                    ],
+                    [
+                        {
+                            name: 'finished_at_start',
+                            type: 'dateTime',
+                            tip: '选择任务完成的起始时间'
+                        },
+                        {
+                            name: 'finished_at_end',
+                            type: 'dateTime',
+                            tip: '选择任务完成的截止时间'
+                        },
+                        {
+                            name: 'created_at_start',
+                            type: 'dateTime',
+                            tip: '选择任务创建的起始时间'
+                        },
+                        {
+                            name: 'created_at_end',
+                            type: 'dateTime',
+                            tip: '选择任务创建的截止时间'
+                        }
+                    ]
+                ];
+                _this.form = new query({
+                    el: '#form_div',
+                    condition: data,
+                });
+                _this.form.init();
+                let column = [
+                    {name: 'index', value: '序号', neglect: true},
+                    {name: 'creator_name', value: '创建人'},
+                    {name: 'title', value: '标题'},
+                    {name: 'content', value: '内容'},
+                    {name: 'status', value: '状态'},
+                    {name: 'began_at', value: '开始时间'},
+                    {name: 'finished_at', value: '完成时间'},
+                    {name: 'created_at', value: '创建时间'},
+                    {name: 'operation', value: '操作'},
+                ];
+                new Header({
+                    el: "table",
+                    name: "requirements",
+                    column: column,
+                    data: this.requirements,
+                    restorationColumn: 'addtime',
+                    fixedTop: ($('#form_div').height()) + ($('#btn').height()) + 1,
+                }).init();
+
+            },
+            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 '已开始':
+                            return "badge badge-warning";
+                        case '已完成':
+                            return "badge badge-success";
+
+                    }
+                }
+            },
+            filters: {},
+        });
+    </script>
+@endsection

+ 130 - 0
resources/views/requirement/show.blade.php

@@ -0,0 +1,130 @@
+@extends('layouts.app')
+
+@section('title', '详情')
+@section('content')
+    @include('shared._messages')
+    @include('shared._error')
+    <div class="row" id="list">
+        <div class="col-12">
+            <div class="card ">
+                <div class="card-body">
+                    <div class="text-center">
+                        发布人:{{ $requirement->creator->name }}
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="col-12">
+            <div class="card">
+                <div class="card-body">
+                    <h1 class="text-center mt-3 mb-3">
+                        {{ $requirement->title }}
+                    </h1>
+                    <div class="text-center mt-4 mb-4">
+                        {{ $requirement->content }}
+                    </div>
+                </div>
+            </div>
+        </div>
+        @if($requirement->status==='已发布')
+            <div class="col-12 text-center mt-4">
+                <form action="{{ route('requirements.edit',$requirement->id) }}" method="get"
+                      style="display: inline-block;"
+                      onsubmit="return">
+                    <button type="submit" class="btn btn-warning btn-sm">
+                        <i class="far fa-trash-alt"></i> 编辑
+                    </button>
+                </form>
+            </div>
+            <div class="col-12">
+                <div class="text-center m-4">
+                    <form action="{{ route('requirements.begin', $requirement->id) }}" method="post"
+                          style="display: inline-block;"
+                          onsubmit="return confirm('您确定要开始吗?');">
+                        {{ csrf_field() }}
+                        <button type="submit" class="btn btn-success btn-sm">
+                            <i class="far fa-trash-alt"></i> 开始任务
+                        </button>
+                    </form>
+                </div>
+            </div>
+
+        @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;">
+                        {{ csrf_field() }}
+                        <div class="form-group">
+                            <template v-for="(item,i) in items">
+                                <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" type="number"
+                                               :name="'users['+i+'][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>
+                        </div>
+                        <div class="well well-sm">
+                            <button type="submit" class="btn btn-primary"> 完结需求</button>
+                        </div>
+                    </form>
+                </div>
+            </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>
+
+        @endif
+    </div>
+@endsection
+@section('lastScript')
+    <script>
+        let vue = new Vue({
+            el: "#list",
+            data: {
+                items: [{}],
+                @if($requirement->id)
+                workers: {!! $workers !!},
+                @endif
+            },
+            methods: {
+                addItem() {
+                    this.items.push({});
+                }
+            }
+        })
+    </script>
+@endsection

+ 15 - 0
routes/web.php

@@ -919,4 +919,19 @@ Route::group(['middleware'=>'auth'],function ($route){
     $route->group(['prefix'=>'demand'],function (){
         Route::get('/','DemandController@index');
     });
+
+    /** 需求 */
+    Route::group(['prefix'=>'requirements'],function (){
+        Route::get('/','RequirementController@index')->name('requirements.index');
+        Route::post('{requirement}/begin','RequirementController@begin')->name('requirements.begin');
+        Route::post('{requirement}/finish','RequirementController@finish')->name('requirements.finish');
+        Route::get('create','RequirementController@create')->name('requirements.create');
+        Route::post('store','RequirementController@store')->name('requirements.store');
+        Route::patch('{requirement}','RequirementController@update')->name('requirements.update');
+        Route::delete('{requirement}','RequirementController@destroy')->name('requirements.destroy');
+        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');
+    });
+
 });