diff --git a/app/Http/Controllers/Api/DialogController.php b/app/Http/Controllers/Api/DialogController.php index 27f4227d8..ed5011423 100755 --- a/app/Http/Controllers/Api/DialogController.php +++ b/app/Http/Controllers/Api/DialogController.php @@ -2180,35 +2180,39 @@ class DialogController extends AbstractController return Base::retError('内容最大不能超过200000字'); } // - $userid = $user->userid; - if ($uuid) { - $dialogMsg = WebSocketDialogMsg::whereDialogId($dialog_id) - ->whereType('word-chain') - ->orderByDesc('created_at') - ->where('msg', 'like', "%$uuid%") - ->value('msg'); - $list = array_reverse(array_merge($dialogMsg['list'] ?? [], $list)); - $list = array_reduce($list, function ($result, $item) { - $fieldValue = $item['id']; // 指定字段名 - if (!isset($result[$fieldValue])) { - $result[$fieldValue] = $item; - } - return $result; - }, []); - $list = array_reverse(array_values($list)); - } - // - usort($list, function($a, $b) { - return $a['id'] - $b['id']; + return AbstractModel::transaction(function () use ($user, $uuid, $dialog_id, $list, $text) { + if ($uuid) { + $dialogMsg = WebSocketDialogMsg::whereDialogId($dialog_id) + ->lockForUpdate() + ->whereType('word-chain') + ->orderByDesc('created_at') + ->where('msg', 'like', "%$uuid%") + ->value('msg'); + $list = array_reverse(array_merge($dialogMsg['list'] ?? [], $list)); + $list = array_reduce($list, function ($result, $item) { + $fieldValue = $item['id']; // 指定字段名 + if (!isset($result[$fieldValue])) { + $result[$fieldValue] = $item; + } + return $result; + }, []); + $list = array_reverse(array_values($list)); + } else { + $uuid = Base::generatePassword(36); + } + // + usort($list, function ($a, $b) { + return $a['id'] - $b['id']; + }); + // + $msgData = [ + 'text' => $text, + 'list' => $list, + 'userid' => $user->userid, + 'uuid' => $uuid, + ]; + return WebSocketDialogMsg::sendMsg(null, $dialog_id, 'word-chain', $msgData, $user->userid); }); - // - $msgData = [ - 'text' => $text, - 'list' => $list, - 'userid' => $userid, - 'uuid' => $uuid ?: Base::generatePassword(36), - ]; - return WebSocketDialogMsg::sendMsg(null, $dialog_id, 'word-chain', $msgData, $user->userid); } /** @@ -2249,8 +2253,6 @@ class DialogController extends AbstractController WebSocketDialog::checkDialog($dialog_id); // $action = null; - $userid = $user->userid; - $result = []; if ($type != 'create') { if ($type == 'vote' && empty($votes)) { return Base::retError('参数错误'); @@ -2258,42 +2260,50 @@ class DialogController extends AbstractController if (empty($uuid)) { return Base::retError('参数错误'); } - $dialogMsgs = WebSocketDialogMsg::whereDialogId($dialog_id) - ->whereType('vote') - ->orderByDesc('created_at') - ->where('msg', 'like', "%$uuid%") - ->get(); - // - if ($type == 'again') { - $res = WebSocketDialogMsg::sendMsg(null, $dialog_id, 'vote', $dialogMsgs[0]->msg, $user->userid); - if (Base::isError($res)) { - return $res; - } - $result[] = $res['data']; - } else { - foreach ($dialogMsgs as $dialogMsg) { - $action = "change-{$dialogMsg->id}"; - $msgData = $dialogMsg->msg; - if ($type == 'finish') { - $msgData['state'] = 0; - } else { - $msgDataVotes = $msgData['votes'] ?? []; - if (in_array($userid, array_column($msgDataVotes, 'userid'))) { - return Base::retError('不能重复投票'); - } - $msgDataVotes[] = [ - 'userid' => $userid, - 'votes' => $votes, - ]; - $msgData['votes'] = $msgDataVotes; - } - $res = WebSocketDialogMsg::sendMsg($action, $dialog_id, 'vote', $msgData, $user->userid); + return AbstractModel::transaction(function () use ($user, $uuid, $dialog_id, $type, $votes) { + // + $dialogMsgs = WebSocketDialogMsg::whereDialogId($dialog_id) + ->lockForUpdate() + ->whereType('vote') + ->orderByDesc('created_at') + ->where('msg', 'like', "%$uuid%") + ->get(); + // + $result = []; + if ($type == 'again') { + $res = WebSocketDialogMsg::sendMsg(null, $dialog_id, 'vote', $dialogMsgs[0]->msg, $user->userid); if (Base::isError($res)) { return $res; } $result[] = $res['data']; + } else { + foreach ($dialogMsgs as $dialogMsg) { + $action = "change-{$dialogMsg->id}"; + $msgData = $dialogMsg->msg; + if ($type == 'finish') { + $msgData['state'] = 0; + } else { + $msgDataVotes = $msgData['votes'] ?? []; + if (in_array($user->userid, array_column($msgDataVotes, 'userid'))) { + return Base::retError('不能重复投票'); + } + $msgDataVotes[] = [ + 'userid' => $user->userid, + 'votes' => $votes, + ]; + $msgData['votes'] = $msgDataVotes; + } + // + $res = WebSocketDialogMsg::sendMsg($action, $dialog_id, 'vote', $msgData, $user->userid); + if (Base::isError($res)) { + return $res; + } + $result[] = $res['data']; + } } - } + // + return Base::retSuccess('发送成功', $result); + }); } else { $strlen = mb_strlen($text); $noimglen = mb_strlen(preg_replace("/]*?>/i", "", $text)); @@ -2306,7 +2316,7 @@ class DialogController extends AbstractController $msgData = [ 'text' => $text, 'list' => $list, - 'userid' => $userid, + 'userid' => $user->userid, 'uuid' => $uuid ?: Base::generatePassword(36), 'multiple' => $multiple, 'anonymous' => $anonymous, @@ -2317,9 +2327,8 @@ class DialogController extends AbstractController if (Base::isError($res)) { return $res; } - $result[] = $res['data']; + return Base::retSuccess('发送成功', [$res['data']]); } - return Base::retSuccess('发送成功', $result); } /** diff --git a/resources/assets/js/pages/manage/components/DialogView.vue b/resources/assets/js/pages/manage/components/DialogView.vue index 91b9482f3..a06a07227 100644 --- a/resources/assets/js/pages/manage/components/DialogView.vue +++ b/resources/assets/js/pages/manage/components/DialogView.vue @@ -97,7 +97,7 @@ {{ $L('投票') }} {{ msgData.msg.multiple == 1 ? $L('多选') : $L('单选')}} - {{ msgData.msg.multiple == 1 ? $L('匿名') : $L('实名')}} + {{ msgData.msg.anonymous == 1 ? $L('匿名') : $L('实名')}}