LoginServiceImpl.java 5.48 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.clientcustomerservice.ClientCustomerHospitalRecordHospitalStatusEnum;
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.LoginService;
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.WxMiniProgramHttpClient;
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 WxMiniProgramHttpClient wxMiniProgramHttpClient;
    private final WOperatorServiceRpcClient wOperatorServiceRpcClient;

    @Override
    public SaTokenInfo login(LoginDto loginDto) {
        if (loginDto.isShouldLoginWithOpenCode()) {
            final var wxUserOpenIdDto = wxMiniProgramHttpClient.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());
                    }
                }
            }
            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();
        }
    }
}