作者 赵彬吉

task

<?php
namespace App\Http\Controllers\Aside\Task;
use App\Http\Controllers\Aside\BaseController;
use App\Http\Logic\Aside\Task\TaskFollowLogic;
use App\Http\Logic\Aside\Task\TaskLogic;
use App\Http\Requests\Aside\Task\TaskFollowRequest;
use App\Http\Requests\Aside\Task\TaskRequest;
use Illuminate\Support\Facades\Request;
/**
* 工单管理
* Class TaskController
* @package App\Http\Controllers\Aside\Task
* @author zbj
* @date 2023/4/27
*/
class TaskController extends BaseController
{
public function list(TaskLogic $logic)
{
$map = [];
if(!empty($this->param['search'])){
$map[] = ['title', 'like', "%{$this->param['search']}%"];
}
$sort = ['id' => 'desc'];
$data = $logic->getList($map, $sort);
return view("admin.task", ["list" => $data]);
}
public function info(Request $request, TaskLogic $logic){
$request->validate([
'id'=>'required'
],[
'id.required' => 'ID不能为空'
]);
$data = $logic->getInfo($this->param['id']);
return $this->success($data);
}
public function save(TaskRequest $request, TaskLogic $logic)
{
$data = $logic->save($this->param);
return $this->success($data);
}
/**
* 修改状态
* @param Request $request
* @param TaskLogic $logic
* @author zbj
* @date 2023/4/27
*/
public function status(Request $request, TaskLogic $logic){
$request->validate([
'id'=>'required'
],[
'id.required' => 'ID不能为空'
]);
//todo 多人任务
$data = $logic->status($this->param);
return $this->success($data);
}
/**
* 添加跟进记录
* @param TaskFollowRequest $request
* @param TaskFollowLogic $logic
* @author zbj
* @date 2023/4/27
*/
public function save_follow(TaskFollowRequest $request, TaskFollowLogic $logic){
//todo 任务是否分配给该用户
$data = $logic->save($this->param);
return $this->success($data);
}
}
... ...
<?php
namespace App\Http\Logic\Aside\Task;
use App\Http\Logic\Aside\BaseLogic;
use App\Models\Task\TaskFollow;
/**
* Class TaskFollowLogic
* @package App\Http\Logic\Aside\Task
* @author zbj
* @date 2023/4/27
*/
class TaskFollowLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new TaskFollow();
}
}
... ...
<?php
namespace App\Http\Logic\Aside\Task;
use App\Helper\Arr;
use App\Http\Logic\Aside\BaseLogic;
use App\Models\Task\Task;
use App\Models\Task\TaskOwner;
use Illuminate\Support\Facades\DB;
/**
* Class TaskLogic
* @package App\Http\Logic\Aside\Task
* @author zbj
* @date 2023/4/27
*/
class TaskLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new Task();
}
public function save($param){
DB::beginTransaction();
try {
$res = parent::save($param);
$data['task_id'] = $res['id'];
//支持分配多人
$owner = Arr::splitFilterToArray($param['owner']);
foreach ($owner as $manage_id){
$data['manage_ids'][] = $manage_id;
}
(new TaskOwnerLogic)->save($data);
DB::commit();
}catch (\Exception $e){
DB::rollBack();
errorLog('工单保存失败', $param, $e);
$this->fail('保存失败');
}
return $this->success();
}
/**
* 修改状态
* @param $param
* @return array
* @throws \App\Exceptions\AsideGlobalException
* @throws \App\Exceptions\BsideGlobalException
* @author zbj
* @date 2023/4/27
*/
public function status($param){
$data = [
'id' => $param['id'],
'status' => $param['status'],
];
parent::save($data);
return $this->success();
}
}
... ...
<?php
namespace App\Http\Logic\Aside\Task;
use App\Http\Logic\Aside\BaseLogic;
use App\Models\Task\TaskOwner;
/**
* Class TaskOwnerLogic
* @package App\Http\Logic\Aside\Task
* @author zbj
* @date 2023/4/27
*/
class TaskOwnerLogic extends BaseLogic
{
public function __construct()
{
parent::__construct();
$this->model = new TaskOwner();
}
public function save($param){
//获取已分配了的
$manage_ids = $this->model->where('task_id', $param['task_id'])->pluck('manage_id', 'id');
//待删除的
$del_manage_ids = array_diff($manage_ids, $param['manage_ids']);
$this->delete(array_keys($del_manage_ids));
//新增的
$add_manage_ids = array_diff($param['manage_ids'], $manage_ids);
foreach ($add_manage_ids as $add_manage_id){
$data = [
'task_id' => $param['task_id'],
'manage_id' => $add_manage_id
];
parent::save($data);
}
return $this->success();
}
}
... ...
<?php
namespace App\Http\Requests\Aside\Task;
use Illuminate\Foundation\Http\FormRequest;
/**
* Class TaskFollowRequest
* @package App\Http\Requests\Aside\product
* @author zbj
* @date 2023/4/27
*/
class TaskFollowRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'task_id' => 'required|exists:gl_task,id',
'content' => 'required',
'attachment' => 'max:200',
];
}
public function messages()
{
return [
'task_id.required' => '工单ID不能为空',
'task_id.exists' => '工单不存在',
'content.required' => '请输入跟进内容',
];
}
}
... ...
<?php
namespace App\Http\Requests\Aside\Task;
use App\Helper\Arr;
use Illuminate\Foundation\Http\FormRequest;
/**
* Class TaskRequest
* @package App\Http\Requests\Aside\product
* @author zbj
* @date 2023/4/27
*/
class TaskRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'project_id' => 'required|exists:gl_project,id',
'owner' => 'required',
'workload' => 'integer|max:5',
'priority' => 'integer|max:5',
'content' => 'required',
'attachment' => 'max:200',
'end_at' => 'date_format:Y-m-d H:i:s',
];
}
public function messages()
{
return [
'project_id.required' => '项目ID不能为空',
'project_id.exists' => '项目不存在',
'owner.required' => '请选择负责人',
'workload.max' => '工作量最多5星',
'priority.max' => '紧急程度最多5星',
'content' => '请输入工单内容',
'end_at.date_format' => '截止时间格式不正确',
];
}
}
... ...
<?php
namespace App\Models\Task;
use App\Models\Base;
use App\Services\Facades\Upload;
class Task extends Base
{
//设置关联表名
protected $table = 'gl_task';
const STATUS_WAIT = 0;
const STATUS_DONGING = 1;
const STATUS_DOWN = 2;
public static function statusMap(){
return [
self::STATUS_WAIT => '未开始',
self::STATUS_DONGING => '进行中',
self::STATUS_DOWN => '已完成',
];
}
public function setAttachmentAttribute($value){
$this->attributes['attachment'] = Upload::url2path($value);
}
public function getAttachmentAttribute($value){
return Upload::path2url($value);
}
}
... ...
<?php
namespace App\Models\Task;
use App\Http\Logic\Aside\LoginLogic;
use App\Models\Base;
use App\Services\Facades\Upload;
class TaskFollow extends Base
{
//设置关联表名
protected $table = 'gl_task_follow';
const STATUS_WAIT = 0;
const STATUS_DONGING = 1;
const STATUS_DOWN = 2;
public static function statusMap(){
return [
self::STATUS_WAIT => '未开始',
self::STATUS_DONGING => '进行中',
self::STATUS_DOWN => '已完成',
];
}
public function setAttachmentAttribute($value){
$this->attributes['attachment'] = Upload::url2path($value);
}
public function getAttachmentAttribute($value){
return Upload::path2url($value);
}
public function setManageIdAttribute($value){
$this->attributes['manage_id'] = LoginLogic::manage('id');
}
}
... ...
<?php
namespace App\Models\Task;
use App\Models\Base;
class TaskOwner extends Base
{
//设置关联表名
protected $table = 'gl_task_owner';
const STATUS_WAIT = 0;
const STATUS_DONGING = 1;
const STATUS_DOWN = 2;
public static function statusMap(){
return [
self::STATUS_WAIT => '未开始',
self::STATUS_DONGING => '进行中',
self::STATUS_DOWN => '已完成',
];
}
}
... ...
... ... @@ -49,6 +49,15 @@ Route::middleware(['web'])->group(function (){ //admin用渲染默认要加上w
Route::post('/save', [Aside\Project\ProjectController::class, 'save'])->name('admin.project_save');
});
//工单管理
Route::prefix('task')->group(function () {
Route::get('/', [Aside\Task\TaskController::class, 'list'])->name('admin.task');
Route::get('/info', [Aside\Task\TaskController::class, 'info'])->name('admin.task_info');
Route::post('/save', [Aside\Task\TaskController::class, 'save'])->name('admin.task_save');
Route::post('/status', [Aside\Task\TaskController::class, 'status'])->name('admin.task_status');
Route::post('/save_follow', [Aside\Task\TaskController::class, 'save_follow'])->name('admin.task_save_follow');
});
//运维
Route::prefix('devops')->group(function () {
//服务器配置
... ...