package com.nb.im.service; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.nb.app.msg.enums.MsgEnum; import com.nb.auth.bean.LoginUser; import com.nb.auth.utils.SecurityUtil; import com.nb.common.crud.BaseService; import com.nb.im.entity.ImRoomEntity; import com.nb.im.enums.ImMsgType; import com.nb.im.enums.ImStatusEnum; import com.nb.im.enums.SponsorEnum; import com.nb.im.mapper.ImRoomMapper; import com.nb.im.room.ImRoomOperator; import com.nb.im.room.ImRoomOperatorManager; import com.nb.im.service.dto.ImRoomDto; import com.nb.im.utils.ImUtils; import com.nb.im.ws.PubMsgInfo; import com.nb.web.api.feign.IPatientClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * @author lifang * @version 1.0.0 * @ClassName LocalImRoomService.java * @Description TODO * @createTime 2022年08月16日 09:30:00 */ @Service public class LocalImRoomService extends BaseService { @Autowired @Lazy private LocalImRoomUserService chatRoomUserService; @Autowired @Lazy private IPatientClient patientClient; @Autowired @Lazy private ImUtils imUtils; @Autowired @Lazy private ImRoomOperatorManager roomOperatorManager; @Override public void validateBeforeSave(ImRoomEntity entity) { if(entity.getManageType()==null&& StrUtil.isNotEmpty(entity.getPatientId())){ entity.setManageType(patientClient.getManageType(entity.getPatientId())); } } @Override public void validateBeforeUpdate(ImRoomEntity entity) { } @Override public void validateBeforeDelete(String id) { } /** * 描述: 创建聊天室 * @author lifang * @date 2022/8/16 16:46 * @param source * @return void */ @Transactional(rollbackFor = Exception.class) public ImRoomEntity createChatRoom(ImRoomDto source) { ImRoomEntity result = new ImRoomEntity(); result.setAssistId(source.getAssistId()); result.setPatientId(source.getPatientId()); result.setPatientAge(source.getPatientAge()); result.setPatientCode(source.getPatientCode()); result.setPatientName(source.getPatientName()); result.setPatientSex(source.getPatientSex()); result.setDoctorId(source.getDoctorId()); result.setSponsorType(source.getSponsorType()); result.setTotalCount(0); //等待医生确认 result.setStatus(source.getStatus()); this.save(result); chatRoomUserService.createRoomUser(result.getId(),source.getAssistId(),SponsorEnum.assist); chatRoomUserService.createRoomUser(result.getId(),source.getDoctorId(),SponsorEnum.doctor); return result; } /** * 描述: 与看护人成功建立联系 * @author lifang * @date 2022/8/16 16:48 * @param chatRoomId * @param doctorId * @return void */ @Transactional(rollbackFor = Exception.class) public void successChatRoom(String chatRoomId,String doctorId) { this.update(new UpdateWrapper() .lambda() .eq(ImRoomEntity::getId,chatRoomId) .set(ImRoomEntity::getSuccessTime,new Date()) .set(ImRoomEntity::getStatus,ImStatusEnum.SUCCESS) ); } /** * 描述: 找到当前聊天室最大的信息序号 * @author lifang * @date 2022/8/18 19:47 * @param roomId * @return long */ public long getMasSort(String roomId) { Long result = this.baseMapper.maxSort(roomId); return result==null?0L:result; } public Boolean finished(String roomId) { boolean result = this.update(new UpdateWrapper() .lambda() .eq(ImRoomEntity::getId, roomId) .set(ImRoomEntity::getStatus, ImStatusEnum.DOCTOR_LIFT)); if(result){ ImRoomOperator roomOperator = roomOperatorManager.getRoomOperator(roomId); imUtils.send(roomId, PubMsgInfo.builder() .key(IdWorker.getIdStr()) .roomId(roomId) .payload("医生已关闭聊天") .senderType(SponsorEnum.doctor) .senderId(roomOperator.getDoctorId()) .msgType(ImMsgType.txt) .operationType(MsgEnum.FINISHED) .build()); roomOperator.close(); } return result; } }