优化 AbstractModel::transaction

This commit is contained in:
kuaifan 2021-06-18 19:32:50 +08:00
parent f74b660d4a
commit 6a0bc37645
7 changed files with 86 additions and 97 deletions

View File

@ -2,6 +2,7 @@
namespace App\Http\Controllers\Api;
use App\Exceptions\ApiException;
use App\Models\AbstractModel;
use App\Models\Project;
use App\Models\ProjectColumn;
@ -217,7 +218,7 @@ class ProjectController extends AbstractController
return Base::retError('你不是项目负责人');
}
//
return AbstractModel::transaction(function() use ($project, $userid) {
$deleteUser = AbstractModel::transaction(function() use ($project, $userid) {
$array = [];
foreach ($userid as $uid) {
if ($project->joinProject($uid)) {
@ -229,10 +230,12 @@ class ProjectController extends AbstractController
$delete->delete();
$project->syncDialogUser();
$project->addLog("修改项目成员");
$project->pushMsg('delete', null, $deleteUser->toArray());
$project->pushMsg('detail');
return Base::retSuccess('修改成功', ['id' => $project->id]);
return $deleteUser->toArray();
});
//
$project->pushMsg('delete', null, $deleteUser);
$project->pushMsg('detail');
return Base::retSuccess('修改成功', ['id' => $project->id]);
}
/**
@ -257,7 +260,7 @@ class ProjectController extends AbstractController
return Base::retError('会员不存在');
}
//
return AbstractModel::transaction(function() use ($owner_userid, $project) {
AbstractModel::transaction(function() use ($owner_userid, $project) {
ProjectUser::whereProjectId($project->id)->update(['owner' => 0]);
ProjectUser::updateInsert([
'project_id' => $project->id,
@ -267,10 +270,10 @@ class ProjectController extends AbstractController
]);
$project->syncDialogUser();
$project->addLog("移交项目给会员ID" . $owner_userid);
$project->pushMsg('detail');
//
return Base::retSuccess('移交成功', ['id' => $project->id]);
});
//
$project->pushMsg('detail');
return Base::retSuccess('移交成功', ['id' => $project->id]);
}
/**
@ -343,13 +346,13 @@ class ProjectController extends AbstractController
return Base::retError('项目负责人无法退出项目');
}
//
return AbstractModel::transaction(function() use ($user, $project) {
AbstractModel::transaction(function() use ($user, $project) {
ProjectUser::whereProjectId($project->id)->whereUserid($user->userid)->delete();
$project->syncDialogUser();
$project->addLog("会员ID" . $user->userid . " 退出项目");
$project->pushMsg('delete', null, $user->userid);
return Base::retSuccess('退出成功', ['id' => $project->id]);
});
return Base::retSuccess('退出成功', ['id' => $project->id]);
}
/**
@ -368,10 +371,8 @@ class ProjectController extends AbstractController
return Base::retError('你不是项目负责人');
}
//
if ($project->deleteProject()) {
return Base::retSuccess('删除成功', ['id' => $project->id]);
}
return Base::retError('删除失败');
$project->deleteProject();
return Base::retSuccess('删除成功', ['id' => $project->id]);
}
/**
@ -472,7 +473,8 @@ class ProjectController extends AbstractController
return Base::retError('项目不存在或不在成员列表内');
}
//
return $column->deleteColumn();
$column->deleteColumn();
return Base::retSuccess('删除成功', $column->toArray());
}
/**
@ -709,26 +711,24 @@ class ProjectController extends AbstractController
if ($task->complete_at) {
return Base::retError('任务已完成');
}
$result = $task->completeTask(Carbon::now());
$task->completeTask(Carbon::now());
$updateComplete = true;
} elseif (Arr::exists($data, 'complete_at')) {
// 标记未完成
if (!$task->complete_at) {
return Base::retError('未完成任务');
}
$result = $task->completeTask(null);
$task->completeTask(null);
$updateComplete = true;
} else {
// 更新任务
$result = $task->updateTask($data, $updateContent);
$task->updateTask($data, $updateContent);
}
if (Base::isSuccess($result)) {
$result['data'] = $task->toArray();
$result['data']['is_update_complete'] = $updateComplete;
$result['data']['is_update_content'] = $updateContent;
$task->pushMsg('update', $result['data']);
}
return $result;
$data = $task->toArray();
$data['is_update_complete'] = $updateComplete;
$data['is_update_content'] = $updateContent;
$task->pushMsg('update', $data);
return Base::retSuccess('修改成功', $data);
}
/**
@ -804,7 +804,7 @@ class ProjectController extends AbstractController
return Base::retError('子任务不支持此功能');
}
//
return AbstractModel::transaction(function() use ($task) {
AbstractModel::transaction(function() use ($task) {
if (empty($task->dialog_id)) {
$task->lockForUpdate();
$dialog = WebSocketDialog::createGroup(null, $task->relationUserids(), 'task');
@ -814,14 +814,15 @@ class ProjectController extends AbstractController
}
}
if (empty($task->dialog_id)) {
return Base::retError('创建聊天失败');
throw new ApiException('创建聊天失败');
}
$task->pushMsg('dialog');
return Base::retSuccess('success', [
'id' => $task->id,
'dialog_id' => $task->dialog_id,
]);
});
//
$task->pushMsg('dialog');
return Base::retSuccess('success', [
'id' => $task->id,
'dialog_id' => $task->dialog_id,
]);
}
/**
@ -841,7 +842,8 @@ class ProjectController extends AbstractController
return Base::retError('子任务不支持此功能');
}
//
return $task->archivedTask(Carbon::now());
$task->archivedTask(Carbon::now());
return Base::retSuccess('保存成功', $task);
}
/**
@ -857,7 +859,8 @@ class ProjectController extends AbstractController
//
$task = ProjectTask::userTask($task_id);
//
return $task->deleteTask();
$task->deleteTask();
return Base::retSuccess('删除成功', $task);
}
/**

View File

@ -113,9 +113,8 @@ class AbstractModel extends Model
*/
public static function updateData($where, $updateArray)
{
$isUpdate = false;
if ($updateArray) {
$result = self::transaction(function () use ($updateArray, $where) {
self::transaction(function () use ($updateArray, $where) {
$list = static::where($where)->get();
if ($list->isNotEmpty()) {
foreach ($list AS $row) {
@ -124,9 +123,9 @@ class AbstractModel extends Model
}
}
});
$isUpdate = Base::isSuccess($result);
return true;
}
return $isUpdate;
return false;
}
/**
@ -154,7 +153,7 @@ class AbstractModel extends Model
/**
* 用于Model的事务处理
* @param \Closure $closure
* @return array
* @return mixed
*/
public static function transaction(\Closure $closure)
{

View File

@ -152,18 +152,15 @@ class Project extends AbstractModel
public function getDialogIdAttribute($value)
{
if ($value === 0) {
$result = AbstractModel::transaction(function() {
return AbstractModel::transaction(function() {
$this->lockForUpdate();
$dialog = WebSocketDialog::createGroup(null, $this->relationUserids(), 'project');
if ($dialog) {
$this->dialog_id = $dialog->id;
$this->save();
}
return Base::retSuccess('success', $dialog->id);
return $dialog->id;
});
if (Base::isSuccess($result)) {
$value = $result['data'];
}
}
return $value;
}
@ -261,7 +258,7 @@ class Project extends AbstractModel
*/
public function deleteProject()
{
$result = AbstractModel::transaction(function () {
AbstractModel::transaction(function () {
WebSocketDialog::whereId($this->dialog_id)->delete();
$columns = ProjectColumn::whereProjectId($this->id)->get();
foreach ($columns as $column) {
@ -269,10 +266,9 @@ class Project extends AbstractModel
}
$this->delete();
$this->addLog("删除项目");
$this->pushMsg('delete');
return Base::retSuccess('删除成功', $this->toArray());
});
return Base::isSuccess($result);
$this->pushMsg('delete');
return true;
}
/**

View File

@ -62,22 +62,22 @@ class ProjectColumn extends AbstractModel
/**
* 删除列表
* @param bool $pushMsg 是否推送
* @return array
* @return bool
*/
public function deleteColumn($pushMsg = true)
{
return AbstractModel::transaction(function () use ($pushMsg) {
AbstractModel::transaction(function () use ($pushMsg) {
$tasks = ProjectTask::whereColumnId($this->id)->get();
foreach ($tasks as $task) {
$task->deleteTask($pushMsg);
}
$this->delete();
$this->addLog("删除列表:" . $this->name);
if ($pushMsg) {
$this->pushMsg("delete");
}
return Base::retSuccess('删除成功', $this->toArray());
});
if ($pushMsg) {
$this->pushMsg("delete");
}
return true;
}
/**

View File

@ -309,7 +309,7 @@ class ProjectTask extends AbstractModel
$task->sort = intval(self::whereColumnId($task->column_id)->orderByDesc('sort')->value('sort')) + 1;
}
//
$result = AbstractModel::transaction(function() use ($subtasks, $content, $owner, $task) {
return AbstractModel::transaction(function() use ($subtasks, $content, $owner, $task) {
$task->save();
if ($owner) {
ProjectTaskUser::createInstance([
@ -336,29 +336,25 @@ class ProjectTask extends AbstractModel
}
}
$task->addLog("创建{任务}" . $task->name);
return Base::retSuccess('success', $task);
return $task;
});
if (Base::isError($result)) {
throw new ApiException($result);
}
return $result['data'];
}
/**
* 修改任务
* @param $data
* @param $updateContent
* @return array
* @return bool
*/
public function updateTask($data, &$updateContent)
{
return AbstractModel::transaction(function () use ($data, &$updateContent) {
AbstractModel::transaction(function () use ($data, &$updateContent) {
// 标题
if (Arr::exists($data, 'name') && $this->name != $data['name']) {
if (empty($data['name'])) {
return Base::retError('任务描述不能为空');
throw new ApiException('任务描述不能为空');
} elseif (mb_strlen($data['name']) > 255) {
return Base::retError('任务描述最多只能设置255个字');
throw new ApiException('任务描述最多只能设置255个字');
}
$this->name = $data['name'];
$this->addLog("修改{任务}标题:{$this->name} => {$data['name']}");
@ -369,7 +365,7 @@ class ProjectTask extends AbstractModel
$owner = intval($data['owner']);
if ($row->userid != $owner) {
if (empty($this->useridInTheProject($owner))) {
return Base::retError('请选择正确的负责人');
throw new ApiException('请选择正确的负责人');
}
$row->owner = 0;
$row->save();
@ -460,8 +456,8 @@ class ProjectTask extends AbstractModel
$this->save();
if ($this->start_at instanceof \DateTimeInterface) $this->start_at = $this->start_at->format('Y-m-d H:i:s');
if ($this->end_at instanceof \DateTimeInterface) $this->end_at = $this->end_at->format('Y-m-d H:i:s');
return Base::retSuccess('修改成功');
});
return true;
}
/**
@ -536,11 +532,11 @@ class ProjectTask extends AbstractModel
/**
* 标记已完成、未完成
* @param Carbon|null $complete_at 完成时间
* @return array|bool
* @return bool
*/
public function completeTask($complete_at)
{
return AbstractModel::transaction(function () use ($complete_at) {
AbstractModel::transaction(function () use ($complete_at) {
if ($complete_at === null) {
// 标记未完成
$this->complete_at = null;
@ -549,25 +545,25 @@ class ProjectTask extends AbstractModel
// 标记已完成
if ($this->parent_id == 0) {
if (self::whereParentId($this->id)->whereCompleteAt(null)->exists()) {
return Base::retError('子任务未完成');
throw new ApiException('子任务未完成');
}
}
$this->complete_at = $complete_at;
$this->addLog("{任务}标记已完成:" . $this->name);
}
$this->save();
return Base::retSuccess('修改成功');
});
return true;
}
/**
* 归档任务、取消归档
* @param Carbon|null $archived_at 归档时间
* @return array
* @return bool
*/
public function archivedTask($archived_at)
{
return AbstractModel::transaction(function () use ($archived_at) {
AbstractModel::transaction(function () use ($archived_at) {
if ($archived_at === null) {
// 取消归档
$this->archived_at = null;
@ -579,28 +575,28 @@ class ProjectTask extends AbstractModel
$this->pushMsg('archived');
}
$this->save();
return Base::retSuccess('保存成功', $this->toArray());
});
return true;
}
/**
* 删除任务
* @param bool $pushMsg 是否推送
* @return array
* @return bool
*/
public function deleteTask($pushMsg = true)
{
return AbstractModel::transaction(function () use ($pushMsg) {
AbstractModel::transaction(function () {
if ($this->dialog_id) {
WebSocketDialog::whereId($this->dialog_id)->delete();
}
$this->delete();
$this->addLog("删除{任务}" . $this->name);
if ($pushMsg) {
$this->pushMsg('delete');
}
return Base::retSuccess('删除成功', $this->toArray());
});
if ($pushMsg) {
$this->pushMsg('delete');
}
return true;
}
/**

View File

@ -120,7 +120,7 @@ class WebSocketDialog extends AbstractModel
*/
public static function createGroup($name, $userid, $group_type = '')
{
$result = AbstractModel::transaction(function () use ($userid, $group_type, $name) {
return AbstractModel::transaction(function () use ($userid, $group_type, $name) {
$dialog = self::createInstance([
'type' => 'group',
'name' => $name ?: '',
@ -135,9 +135,8 @@ class WebSocketDialog extends AbstractModel
])->save();
}
}
return Base::retSuccess('success', $dialog);
return $dialog;
});
return Base::isSuccess($result) ? $result['data'] : null;
}
/**
@ -152,7 +151,7 @@ class WebSocketDialog extends AbstractModel
if (empty($dialog)) {
return false;
}
$result = AbstractModel::transaction(function () use ($dialog, $userid) {
AbstractModel::transaction(function () use ($dialog, $userid) {
foreach (is_array($userid) ? $userid : [$userid] as $value) {
if ($value > 0) {
WebSocketDialogUser::createInstance([
@ -162,7 +161,7 @@ class WebSocketDialog extends AbstractModel
}
}
});
return Base::isSuccess($result);
return true;
}
/**
@ -197,7 +196,7 @@ class WebSocketDialog extends AbstractModel
if ($dialogUser->count() >= 2) {
return $dialogUser[0];
}
$result = AbstractModel::transaction(function () use ($userid2, $userid) {
return AbstractModel::transaction(function () use ($userid2, $userid) {
$dialog = self::createInstance([
'type' => 'user',
]);
@ -210,9 +209,8 @@ class WebSocketDialog extends AbstractModel
'dialog_id' => $dialog->id,
'userid' => $userid2,
])->save();
return Base::retSuccess('success', $dialog);
return $dialog;
});
return Base::isSuccess($result) ? $result['data'] : null;
}
}

View File

@ -2,6 +2,7 @@
namespace App\Models;
use App\Exceptions\ApiException;
use App\Module\Base;
use App\Tasks\PushTask;
use App\Tasks\WebSocketDialogMsgTask;
@ -91,7 +92,7 @@ class WebSocketDialogMsg extends AbstractModel
if (empty($userid)) {
return false;
}
$result = self::transaction(function() use ($userid) {
self::transaction(function() use ($userid) {
$msgRead = WebSocketDialogMsgRead::whereMsgId($this->id)->whereUserid($userid)->lockForUpdate()->first();
if (empty($msgRead)) {
$msgRead = WebSocketDialogMsgRead::createInstance([
@ -121,7 +122,7 @@ class WebSocketDialogMsg extends AbstractModel
]);
}
});
return Base::isSuccess($result);
return true;
}
/**
@ -140,22 +141,18 @@ class WebSocketDialogMsg extends AbstractModel
'msg' => $msg,
'read' => 0,
]);
$result = AbstractModel::transaction(function () use ($dialog_id, $msg, $dialogMsg) {
AbstractModel::transaction(function () use ($dialog_id, $msg, $dialogMsg) {
$dialog = WebSocketDialog::find($dialog_id);
if (empty($dialog)) {
return Base::retError('获取会话失败');
throw new ApiException('获取会话失败');
}
$dialog->last_at = Carbon::now();
$dialog->save();
$dialogMsg->send = 1;
$dialogMsg->dialog_id = $dialog->id;
$dialogMsg->save();
//
return Base::retSuccess('发送成功', $dialogMsg->toArray());
});
if (Base::isSuccess($result)) {
Task::deliver(new WebSocketDialogMsgTask($dialogMsg->id));
}
return $result;
Task::deliver(new WebSocketDialogMsgTask($dialogMsg->id));
return Base::retSuccess('发送成功', $dialogMsg);
}
}