优化 AbstractModel::transaction
This commit is contained in:
parent
f74b660d4a
commit
6a0bc37645
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user