Files
xk-api-yii/common/forms/ImMessageForm.php

213 lines
7.6 KiB
PHP
Raw Normal View History

2024-09-19 11:32:39 +08:00
<?php
namespace common\forms;
use common\core\BaseModel;
use common\enums\ImMessageSendTypeEnum;
use common\enums\ImSessionStatusEnum;
use common\enums\ImSessionTypeEnum;
use common\enums\UserRoleEnum;
use common\jobs\MessageSendJob;
2024-12-19 19:20:27 +08:00
use common\models\oldDb\ImMessage;
use common\models\oldDb\ImMessageSession;
use common\models\oldDb\ServiceUser;
use common\models\oldDb\User;
2024-09-19 11:32:39 +08:00
use yii\base\Exception;
class ImMessageForm extends BaseModel
{
public $ims_id;
public $from_id;
public $to_id;
public $content;
public $type;
public function rules()
{
return [
[['ims_id','from_id','content'],'required'],
['type','default','value'=>ImMessageSendTypeEnum::USER_SEND],//区分是user_id发给service_id还是service_id发给user_id
['to_id','default','value'=>0],//发给导医和客服可能有会话id,没有接收人
];
}
public function attributeLabels()
{
return [
'ims_id' => '会话id',
'from_id' => '发送人',
'to_id' => '接收人',
'content' => '消息内容',
];
}
/**
* @param $canOffline bool 是否可发送离线消息 如果在线会发送在线消息
* @return array
* @throws Exception
*/
public function sendMessage($canOffline = false)
{
if (!$this->validate()) {
throw new Exception($this->getErrorMsg());
}
$imMessageSession = ImMessageSession::find()->where([
'id' => $this->ims_id,
'is_delete' => 0,
])->one();
switch($this->type){
case 0:
//user_id发
$user_id = $this->from_id;
$service_id = $this->to_id;
//检查用户信息
switch($imMessageSession->type) {
case ImSessionTypeEnum::USER_USER:
$to = User::findOne($service_id);
if(!$to){
throw new Exception('该用户不存在');
}
$to_role = UserRoleEnum::USER;
break;
case ImSessionTypeEnum::USER_DOC:
$to = ServiceUser::findOne($service_id);
if(!$to || $to->is_delete || $to->status!=2){
throw new Exception('该'.UserRoleEnum::NAME[$to->role].'不存在');
}
$to_role = $to->role;
break;
case ImSessionTypeEnum::USER_LEAD:
if($service_id){
$to = ServiceUser::findOne($service_id);
if(!$to || $to->is_delete || $to->status!=2){
throw new Exception('该'.UserRoleEnum::NAME[$to->role].'不存在');
}
$to_role = $to->role;
}else{
//说明新创建的会话,没人接入,群发
$to_role = UserRoleEnum::LEADER;
}
break;
case ImSessionTypeEnum::DOC_SERV:
case ImSessionTypeEnum::DRUG_SERV:
case ImSessionTypeEnum::LEAD_SERV:
if($service_id){
$to = ServiceUser::findOne($service_id);
if(!$to || $to->is_delete || $to->status!=2){
throw new Exception('该'.UserRoleEnum::NAME[$to->role].'不存在');
}
$to_role = $to->role;
}else{
//说明新创建的会话,没人接入,群发
$to_role = UserRoleEnum::SERVICE;
}
break;
}
break;
case 1:
//service_id发
$user_id = $this->to_id;
$service_id = $this->from_id;
//检查用户信息
switch($imMessageSession->type) {
case ImSessionTypeEnum::USER_USER:
case ImSessionTypeEnum::USER_DOC:
case ImSessionTypeEnum::USER_LEAD:
$to = User::findOne($user_id);
if(!$to){
throw new Exception('该用户不存在');
}
$to_role = UserRoleEnum::USER;
break;
case ImSessionTypeEnum::DOC_SERV:
case ImSessionTypeEnum::DRUG_SERV:
case ImSessionTypeEnum::LEAD_SERV:
$to = ServiceUser::findOne($user_id);
if(!$to || $to->is_delete || $to->status!=2){
throw new Exception('该'.UserRoleEnum::NAME[$to->role].'不存在');
}
$to_role = $to->role;
break;
}
break;
default:
throw new Exception('不支持的消息');
break;
}
if(!$imMessageSession || $imMessageSession->user_id!=$user_id || $imMessageSession->service_id!=$service_id){
throw new Exception('会话不存在');
}
// if($imMessageSession->status == ImSessionStatusEnum::END){
// //会话已结束
// throw new Exception('会话已结束,无法发送消息');
// }
// $ims_id = $imMessageSession->id;
//
// $t = \Yii::$app->db->beginTransaction();
// try {
// ImMessage::sendMessage($ims_id,$user_id,$service_id,$this->content,$this->type);
//
// \Yii::$app->queue->delay(0)->push(new MessageSendJob([
// 'ims_id' => $ims_id,
// 'to_id' => $this->to_id,
// 'to_role' => $to_role,
// 'content' => $this->content,
// ]));
//
// $t->commit();
// }catch (\Exception $exception){
// $t->rollBack();
// throw new Exception('发送失败:'.$exception->getMessage());
// }
// return [];
$isEnd = $imMessageSession->status == ImSessionStatusEnum::END;
if(!$canOffline && $isEnd){
//会话已结束
throw new Exception('会话已结束,无法发送消息');
}
$ims_id = $imMessageSession->id;
$t = \Yii::$app->db->beginTransaction();
try {
ImMessage::sendMessage($ims_id,$user_id,$service_id,$this->content,$this->type);
if (!$canOffline || !$isEnd) {
\Yii::$app->queue->delay(0)->push(new MessageSendJob([
'ims_id' => $ims_id,
'to_id' => $this->to_id,
'to_role' => $to_role,
'content' => $this->content,
]));
}
$t->commit();
}catch (\Exception $exception){
$t->rollBack();
throw new Exception('发送失败:'.$exception->getMessage());
}
return [];
}
//接入的消息发送
public function sessionIn($ims_id,$to_id = 0,$to_role,$message)
{
\Yii::$app->queue->delay(0)->push(new MessageSendJob([
'ims_id' => $ims_id,
'to_id' => $to_id,
'to_role' => $to_role,
'content' => $message,
]));
}
}