LoginServiceImpl.java 5.17 KB
package com.infoloop.tianting.service.impl;

import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import com.infoloop.tianting.COperatorServiceProtoRpcGrpc;
import com.infoloop.tianting.clientcustomerservice.ClientCustomerHospitalRecordHospitalStatusEnum;
import com.infoloop.tianting.clientcustomerservice.GetClientCustomerByIdRpcRequest;
import com.infoloop.tianting.clientcustomerservice.SingleClientCustomerRpcResponse;
import com.infoloop.tianting.constant.CommonConstants;
import com.infoloop.tianting.exception.ClientEndExceptions;
import com.infoloop.tianting.exception.ErrorCodeEnum;
import com.infoloop.tianting.model.dto.PermissionDTO.LoginDto;
import com.infoloop.tianting.service.ClientCustomerService;
import com.infoloop.tianting.service.LoginService;
import com.infoloop.tianting.service.WxMiniProgramService;
import com.infoloop.tianting.service.client.ClientCustomerServiceRpcClient;
import com.infoloop.tianting.service.client.OperatorServiceRpcClient;
import com.infoloop.tianting.service.client.WOperatorServiceRpcClient;
import com.infoloop.tianting.service.client.WxMiniProgramClient;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Slf4j
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class LoginServiceImpl implements LoginService {

  private final ClientCustomerServiceRpcClient clientCustomerServiceRpcClient;
  private final OperatorServiceRpcClient operatorServiceRpcClient;
  private final WxMiniProgramClient wxMiniProgramClient;
  private final WOperatorServiceRpcClient wOperatorServiceRpcClient;

  @Override
  public SaTokenInfo login(LoginDto loginDto) {
    if (loginDto.isShouldLoginWithOpenCode()) {
      final var wxUserOpenIdDto = wxMiniProgramClient.getUserOpenIdByCode(loginDto.getOpenCode());
      StpUtil.login(
          wxUserOpenIdDto.getOpenid(),
          SaLoginModel.create()
              .setExtra(CommonConstants.ENTERPRISE_ID, loginDto.getEnterpriseId())
              .setExtra(CommonConstants.LOGIN_SOURCE, loginDto.getLoginSourceEnum().getValue())
              .build());
      return StpUtil.getTokenInfo();
    } else if (loginDto.isShouldLoginWithHisCustomerId()) {
      var customer =
          clientCustomerServiceRpcClient
              .getClientCustomerByHISCustomerId(loginDto.getHisCustomerId())
              .getResponse();
      if (customer.getId() == 0) {
        // 根据hisCustomerId拿不到用户的话再去根据合同号去his查一次,即认为是月子中心客户
        customer =
            clientCustomerServiceRpcClient
                .getClientCustomerByContactNo(loginDto.getHisCustomerId())
                .getResponse();
        if (customer.getId() == 0) {
          throw ClientEndExceptions.IncorrectRequestValue.build(ErrorCodeEnum.VALIDATE_FAILED.name());
        } else {
          var record =
              clientCustomerServiceRpcClient.getClientCustomerHospitalRecordsByCustomerId(
                  customer.getEnterpriseId(), customer.getId());
          if (!record.hasResponse()
              || record.getResponse().getHospitalStatus()
                  != ClientCustomerHospitalRecordHospitalStatusEnum.CURRENT) {
            throw ClientEndExceptions.IncorrectRequestValue.build(
                ErrorCodeEnum.VALIDATE_FAILED.name());
          }
        }
      } else {

      }
      StpUtil.login(
          customer.getId(),
          SaLoginModel.create()
              .setExtra(CommonConstants.ENTERPRISE_ID, customer.getEnterpriseId())
              .setExtra(CommonConstants.LOGIN_SOURCE, loginDto.getLoginSourceEnum().getValue())
              .build());
      return StpUtil.getTokenInfo();
    } else if (loginDto.isShouldLoginWithOperatorPhone()) {
      final var operator =
          operatorServiceRpcClient.getCOperatorByMobileOrEmail(loginDto.getOperatorPhone());
      if (operator.getId() == 0) {
        throw ClientEndExceptions.AuthenticationFailure.build(ErrorCodeEnum.UNAUTHORIZED.name());
      }
      StpUtil.login(
          operator.getId(),
          SaLoginModel.create()
              .setExtra(CommonConstants.ENTERPRISE_ID, operator.getEnterpriseId())
              .setExtra(CommonConstants.LOGIN_SOURCE, loginDto.getLoginSourceEnum().getValue())
              .build());
      return StpUtil.getTokenInfo();
    } else {
      final var operator =
          wOperatorServiceRpcClient.getWOperatorByEmail(loginDto.getEmail()).getResponse();
      if (operator.getId() == 0) {
        throw ClientEndExceptions.AuthenticationFailure.build(ErrorCodeEnum.UNAUTHORIZED.name());
      }
//      if (!operator.getPassword().equals(loginDto.getPassword())) {
//        throw ClientEndExceptions.AuthenticationFailure.build(ErrorCodeEnum.VALIDATE_FAILED.name());
//      }
      StpUtil.login(
          operator.getId(),
          SaLoginModel.create()
              .setExtra(CommonConstants.ENTERPRISE_ID, operator.getEnterpriseId())
              .setExtra(CommonConstants.LOGIN_SOURCE, loginDto.getLoginSourceEnum().getValue())
              .build());
      return StpUtil.getTokenInfo();
    }
  }
}