diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/CallStatusEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/CallStatusEnum.java new file mode 100644 index 000000000..03f88f11e --- /dev/null +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/CallStatusEnum.java @@ -0,0 +1,25 @@ +package com.cool.store.enums; + +public enum CallStatusEnum { + + PENDING_CALL(0, "待呼叫"), + CALL_ANSWERED(1, "呼叫接听"), + CALL_MISSED(2, "呼叫未接听"), + CALL_FAILED(3, "呼叫失败"); + + private final int code; + private final String message; + + CallStatusEnum(int code, String message) { + this.code = code; + this.message = message; + } + + public int getCode() { + return code; + } + + public String getMessage() { + return message; + } +} \ No newline at end of file diff --git a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java index 6fa5bc10e..d7dfa88a2 100644 --- a/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java +++ b/coolstore-partner-common/src/main/java/com/cool/store/enums/ErrorCodeEnum.java @@ -78,6 +78,8 @@ public enum ErrorCodeEnum { INTERVIEW_INTERVIEW_TIME_IS_UNUSABLE(1021114, "当前预约时间不可用,请和线索用户协商其他时间后确定预约时间\n面试人:{0} 手机号:{1}", null), INTERVIEW_PARTNER_NOT_EXIST(1021115, "线索下的加盟商不存在!", null), ROOM_STATUS_ERROR(10211156, "当前面试房间状态不允许进行该操作!", null), + MOBILE_APP_NOT_ONLINE_ERROR(10211157, "拨出手机APP不在线!", null), + CALL_UP_ERROR(10211158, "拨出电话异常!", null), CONTENT_DUPLICATED(10211200, "动态标题重复!", null), SIGN_FAIL(600000, "验签失败", null), GET_ACCESSTOKEN_ERROR(600001, "获取小程序TOKEN错误!", null), diff --git a/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CallRecordMapper.java b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CallRecordMapper.java new file mode 100644 index 000000000..399a1f4a7 --- /dev/null +++ b/coolstore-partner-dao/src/main/java/com/cool/store/mapper/CallRecordMapper.java @@ -0,0 +1,24 @@ +package com.cool.store.mapper; + +import com.cool.store.entity.CallRecordDO; + +/** + * @author zhangchenbiao + * @date 2023-08-11 01:03 + */ +public interface CallRecordMapper { + /** + * + * 默认插入方法,只会给有值的字段赋值 + * 会对传进来的字段做判空处理,如果字段为空,则使用数据库默认字段或者null + * dateTime:2023-08-11 01:03 + */ + int insertSelective(CallRecordDO record); + + /** + * + * 默认更新方法,根据主键更新,不会把null值更新到数据库,避免覆盖之前有值的 + * dateTime:2023-08-11 01:03 + */ + int updateByPrimaryKeySelective(CallRecordDO record); +} \ No newline at end of file diff --git a/coolstore-partner-dao/src/main/resources/mapper/CallRecordMapper.xml b/coolstore-partner-dao/src/main/resources/mapper/CallRecordMapper.xml new file mode 100644 index 000000000..82399a7aa --- /dev/null +++ b/coolstore-partner-dao/src/main/resources/mapper/CallRecordMapper.xml @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, partner_line_id, trans_no, outgoing_mobile, outgoing_user_id, incoming_mobile, + incoming_user_id, call_start_time, call_end_time, record_url, call_status, fail_reason, + creater, create_time, updater, update_time, remark + + + insert into call_record + + + partner_line_id, + + + trans_no, + + + outgoing_mobile, + + + outgoing_user_id, + + + incoming_mobile, + + + incoming_user_id, + + + call_start_time, + + + call_end_time, + + + record_url, + + + call_status, + + + fail_reason, + + + creater, + + + create_time, + + + updater, + + + update_time, + + + remark, + + + + + #{partnerLineId}, + + + #{transNo}, + + + #{outgoingMobile}, + + + #{outgoingUserId}, + + + #{incomingMobile}, + + + #{incomingUserId}, + + + #{callStartTime}, + + + #{callEndTime}, + + + #{recordUrl}, + + + #{callStatus}, + + + #{failReason}, + + + #{creater}, + + + #{createTime}, + + + #{updater}, + + + #{updateTime}, + + + #{remark}, + + + + + update call_record + + + partner_line_id = #{partnerLineId}, + + + trans_no = #{transNo}, + + + outgoing_mobile = #{outgoingMobile}, + + + outgoing_user_id = #{outgoingUserId}, + + + incoming_mobile = #{incomingMobile}, + + + incoming_user_id = #{incomingUserId}, + + + call_start_time = #{callStartTime}, + + + call_end_time = #{callEndTime}, + + + record_url = #{recordUrl}, + + + call_status = #{callStatus}, + + + fail_reason = #{failReason}, + + + creater = #{creater}, + + + create_time = #{createTime}, + + + updater = #{updater}, + + + update_time = #{updateTime}, + + + remark = #{remark}, + + + where id = #{id} + + \ No newline at end of file diff --git a/coolstore-partner-model/src/main/java/com/cool/store/dto/call/CallUpDTO.java b/coolstore-partner-model/src/main/java/com/cool/store/dto/call/CallUpDTO.java new file mode 100644 index 000000000..2fd1a415e --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/dto/call/CallUpDTO.java @@ -0,0 +1,16 @@ +package com.cool.store.dto.call; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @Author: young.yu + * @Date: 2023-08-11 15:24 + * @Description: + */ +@Data +public class CallUpDTO { + private String transNo; + private String outgoingMobile; + private String incomingMobile; +} diff --git a/coolstore-partner-model/src/main/java/com/cool/store/entity/CallRecordDO.java b/coolstore-partner-model/src/main/java/com/cool/store/entity/CallRecordDO.java new file mode 100644 index 000000000..38fa1abb5 --- /dev/null +++ b/coolstore-partner-model/src/main/java/com/cool/store/entity/CallRecordDO.java @@ -0,0 +1,71 @@ +package com.cool.store.entity; + +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.util.Date; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * + * @author zhangchenbiao + * @date 2023-08-11 01:03 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CallRecordDO implements Serializable { + @ApiModelProperty("id") + private Long id; + + @ApiModelProperty("线索id") + private Long partnerLineId; + + @ApiModelProperty("请求编号") + private String transNo; + + @ApiModelProperty("呼出人手机号") + private String outgoingMobile; + + @ApiModelProperty("呼出人用户id") + private String outgoingUserId; + + @ApiModelProperty("接听人手机号") + private String incomingMobile; + + @ApiModelProperty("接听人用户id") + private String incomingUserId; + + @ApiModelProperty("通话开始时间") + private Date callStartTime; + + @ApiModelProperty("通话结束时间") + private Date callEndTime; + + @ApiModelProperty("录音地址") + private String recordUrl; + + @ApiModelProperty("0.待呼叫1.呼叫接听2.呼叫未接听3.呼叫失败") + private Integer callStatus; + + @ApiModelProperty("失败原因") + private String failReason; + + @ApiModelProperty("创建人") + private String creater; + + @ApiModelProperty("创建时间") + private Date createTime; + + @ApiModelProperty("更新人") + private String updater; + + @ApiModelProperty("更新时间") + private Date updateTime; + + @ApiModelProperty("备注") + private String remark; +} \ No newline at end of file diff --git a/coolstore-partner-service/src/main/java/com/cool/store/handler/WebSocketServer.java b/coolstore-partner-service/src/main/java/com/cool/store/handler/WebSocketServer.java index 8c81b69d9..ef16a6cb8 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/handler/WebSocketServer.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/handler/WebSocketServer.java @@ -117,25 +117,32 @@ public class WebSocketServer { * 实现服务 * 器主动推送 */ - public void sendMessage(String message) { + public boolean sendMessage(String message) { + boolean flag = false; try { this.session.getBasicRemote().sendText(message); + flag = true; } catch (IOException e) { + log.error("发送消息失败:" + this.tenantId + ",原因:" + e.getMessage()); e.printStackTrace(); } + return flag; } /** * 发送自定 * 义消息 **/ - public static void sendInfo(String message, String tenantId) { + public static boolean sendInfo(String message, String tenantId) { + boolean flag = false; log.info("发送消息到:" + tenantId + ",报文:" + message); if (StringUtils.isNotBlank(tenantId) && webSocketMap.containsKey(tenantId)) { webSocketMap.get(tenantId).sendMessage(message); + flag = true; } else { log.error("用户" + tenantId + ",不在线!"); } + return flag; } /** @@ -163,4 +170,13 @@ public class WebSocketServer { public static synchronized void subOnlineCount() { WebSocketServer.onlineCount--; } + + /** + * 判断用户是否在线 + * @param tenantId + * @return + */ + public static boolean isOnline(String tenantId) { + return webSocketMap.containsKey(tenantId); + } } \ No newline at end of file diff --git a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/CallServiceImpl.java b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/CallServiceImpl.java index d849573e3..7f2c8f05f 100644 --- a/coolstore-partner-service/src/main/java/com/cool/store/service/impl/CallServiceImpl.java +++ b/coolstore-partner-service/src/main/java/com/cool/store/service/impl/CallServiceImpl.java @@ -1,10 +1,21 @@ package com.cool.store.service.impl; +import cn.hutool.core.lang.UUID; +import com.alibaba.fastjson.JSON; +import com.cool.store.dto.call.CallUpDTO; +import com.cool.store.entity.CallRecordDO; +import com.cool.store.enums.CallStatusEnum; +import com.cool.store.enums.ErrorCodeEnum; import com.cool.store.exception.ApiException; +import com.cool.store.handler.WebSocketServer; +import com.cool.store.mapper.CallRecordMapper; import com.cool.store.request.CallUpReq; import com.cool.store.service.CallService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Date; + /** * @Author: young.yu * @Date: 2023-08-10 18:58 @@ -13,8 +24,40 @@ import org.springframework.stereotype.Service; @Service public class CallServiceImpl implements CallService { + @Autowired + private CallRecordMapper callRecordMapper; @Override public void callUp(CallUpReq request) throws ApiException { + //校验拨出手机号APP是否在线 + boolean isOnline = WebSocketServer.isOnline(request.getOutgoingMobile()); + if(!isOnline){ + throw new ApiException(ErrorCodeEnum.MOBILE_APP_NOT_ONLINE_ERROR); + } + CallRecordDO callRecordDO = new CallRecordDO(); + callRecordDO.setOutgoingMobile(request.getOutgoingMobile()); + callRecordDO.setIncomingMobile(request.getIncomingMobile()); + callRecordDO.setOutgoingUserId(request.getOutgoingUserId()); + callRecordDO.setIncomingUserId(request.getIncomingUserId()); + callRecordDO.setPartnerLineId(Long.valueOf(request.getLineId())); + //请求id + String transNo = UUID.fastUUID().toString(); + callRecordDO.setTransNo(transNo); + callRecordDO.setCreater(request.getOutgoingUserId()); + callRecordDO.setCreateTime(new Date()); + callRecordDO.setCallStatus(CallStatusEnum.PENDING_CALL.getCode()); + + //发起app通话请求 + CallUpDTO callUpDTO = new CallUpDTO(); + callUpDTO.setTransNo(transNo); + callUpDTO.setOutgoingMobile(request.getOutgoingMobile()); + callUpDTO.setIncomingMobile(request.getIncomingMobile()); + boolean sendFlag = WebSocketServer.sendInfo(JSON.toJSONString(callUpDTO),callRecordDO.getOutgoingMobile()); + if(!sendFlag){ + throw new ApiException(ErrorCodeEnum.CALL_UP_ERROR); + } + + //保存通话记录 + callRecordMapper.insertSelective(callRecordDO); } }