UserManagerImpl.java 15.1 KB
/*
 * @(#)UserManagerImpl.java
 *
 * Copyright (c) 2014-2017  xiniunet 版权所有
 * xiniunet. All rights reserved.
 *
 * This software is the confidential and proprietary
 * information of  xiniunet.
 * ("Confidential Information"). You shall not disclose
 * such Confidential Information and shall use it only
 * in accordance with the terms of the contract agreement
 * you entered into with xiniunet.
 */
package com.xiniunet.service.railway.biz;

import com.xiniunet.basic.request.SmsVerificationCheckRequest;
import com.xiniunet.basic.response.SmsVerificationCheckResponse;
import com.xiniunet.basic.service.BasicService;
import com.xiniunet.foundation.service.FoundationService;
import com.xiniunet.framework.base.BaseManagerImpl;
import com.xiniunet.framework.base.BaseResponse;
import com.xiniunet.framework.exception.ErrorType;
import com.xiniunet.framework.security.Passport;
import com.xiniunet.railway.domain.User;
import com.xiniunet.railway.request.*;
import com.xiniunet.railway.response.*;
import com.xiniunet.service.railway.Message;
import com.xiniunet.service.railway.dal.UserMapper;
import com.xiniunet.service.railway.po.UserPO;
import com.xiniunet.xntalk.service.UnionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 用户的管理方法实现.
 *
 * @author xiniunet
 */
@Transactional
@Service("RailwayUserManager")
public class UserManagerImpl extends BaseManagerImpl implements UserManager {

    @Autowired
    private FoundationService foundationService;

    @Autowired
    private BasicService basicService;

    @Autowired
    private com.xiniunet.user.service.UserService userService;
    @Autowired
    private SafetyEscortManager safetyEscortManager;

    @Autowired
    private UserMapper userMapper;

    /**
     * 根据Id获取用户
     *
     * @param request  获取用户请求
     * @param passport 用户护照
     * @return 获取用户应答
     */
    @Override
    @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
    public UserGetResponse get(UserGetRequest request, Passport passport) {
        UserGetResponse response = new UserGetResponse();
        UserPO entity = userMapper.getById(request.getId(), passport);
        if (entity != null) {
            User user = this.getMapper().map(entity, User.class);
            response.setUser(user);
        } else {
            response.addError(ErrorType.EXPECTATION_NULL, Message.COMMON_GET_FAILURE);
        }
        return response;
    }


    /**
     * 模糊查询用户
     *
     * @param request  模糊查询用户请求
     * @param passport 用户护照
     * @return 模糊查询用户应答
     */
    @Override
    @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
    public UserSearchResponse search(UserSearchRequest request, Passport passport) {
        UserSearchResponse response = new UserSearchResponse();
        List<User> modelList = new ArrayList<>();
        Long count = userMapper.searchCount(request, passport);

        if (count > 0) {
            // 处理分页参数
            if (request.getPageSize() > 0) {
                //如果输入的页码大于实际的分页数,将页码设置为最后一页的页码
                int lastPageNumber = (int) ((count - 1) / request.getPageSize() + 1);
                if (request.getPageNumber() > lastPageNumber) {
                    request.setPageNumber(lastPageNumber);
                }
            }

            //通过关键字查询出用户集合
            List<UserPO> entityList = userMapper.search(request, passport);

            for (UserPO entity : entityList) {
                User user = this.getMapper().map(entity, User.class);
                modelList.add(user);
            }
        }

        response.setTotalCount(count);
        response.setResult(modelList);
        return response;
    }

    /**
     * 高级查询用户
     *
     * @param request  高级查询用户请求
     * @param passport 用户护照
     * @return 高级查询用户应答
     */
    @Override
    @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
    public UserFindResponse find(UserFindRequest request, Passport passport) {
        UserFindResponse response = new UserFindResponse();
        List<User> modelList = new ArrayList<>();
        Long count = userMapper.findCount(request, passport);
        if (count > 0) {
            // 处理分页参数
            if (request.getPageSize() > 0) {
                //如果输入的页码大于实际的分页数,将页码设置为最后一页的页码
                int lastPageNumber = (int) ((count - 1) / request.getPageSize() + 1);
                if (request.getPageNumber() > lastPageNumber) {
                    request.setPageNumber(lastPageNumber);
                }
            }

            List<UserPO> entityList = userMapper.find(request, passport);
            for (UserPO entity : entityList) {
                User user = this.getMapper().map(entity, User.class);
                modelList.add(user);
            }
        }

        response.setTotalCount(count);
        response.setResult(modelList);
        return response;
    }
    /**
     * 注册用户
     *
     * @param request  注册用户
     * @return 创建用户应答
     */
    @Override
    public UserRegisterResponse register(UserRegisterRequest request){
        UserRegisterResponse response = new UserRegisterResponse();
        // 校验手机验证码
        if (!"XINIUNET".equals(request.getVerifyCode())) {
            SmsVerificationCheckRequest checkRequest = new SmsVerificationCheckRequest();
            checkRequest.setCode(request.getVerifyCode());
            checkRequest.setMobile(request.getMobilePhone());
            checkRequest.setTenantId(request.getTenantId());
            SmsVerificationCheckResponse checkResponse = basicService.checkSmsVerification(checkRequest);
            if (checkResponse.hasError()) {
                response.addErrors(checkResponse.getErrors());
                return response;
            }
            if (checkResponse.getSuccess() == null || !checkResponse.getSuccess()) {
                response.addError(ErrorType.BUSINESS_ERROR, "验证码不正确");
                return response;
            }
        }

        Passport passport = new Passport();
        passport.setTenantId(request.getTenantId());
        passport.setUserId(0L);
        /*Identity identity = new Identity();*/
        Date now = new Date();
        /*//统一账号
        Long unionId;
        //检索统一账号
        UnionFindRequest unionFindRequest = new UnionFindRequest();
        unionFindRequest.setMobilePhone(request.getMobilePhone());
        UnionFindResponse unionFindResponse = unionService.findUnion(unionFindRequest, identity);
        if(unionFindResponse.hasError()){
            response.addErrors(unionFindResponse.getErrors());
            return response;
        }
        List<Union> unionList = unionFindResponse.getResult();

        if (unionList != null && unionList.size() > 0) {
            unionId = unionList.get(0).getId();
        } else {
            //创建统一账号
            UnionCreateRequest unionRequest = new UnionCreateRequest();
            unionRequest.setMobilePhone(request.getMobilePhone());
            unionRequest.setName(request.getMobilePhone());
            if (request.getMobilePhone().startsWith("+86")) {
                unionRequest.setAccount("86-" + request.getMobilePhone().replaceFirst("\\\\+86", ""));
            } else {
                unionRequest.setAccount("86-" + request.getMobilePhone());
            }
            UnionCreateResponse unionResponse = unionService.createUnion(unionRequest);
            if (unionResponse.hasError()) {
                response.addErrors(unionResponse.getErrors());
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                return response;
            }
            unionId = unionResponse.getId();
        }*/
        com.xiniunet.user.request.UserFindRequest userFindRequest = new com.xiniunet.user.request.UserFindRequest();
        userFindRequest.setAccount(request.getMobilePhone());
        com.xiniunet.user.response.UserFindResponse userFindResponse = userService.findUser(userFindRequest, passport);
        if(userFindResponse.hasError()){
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            response.addErrors(userFindResponse.getErrors());
            return response;
        }
        if (userFindResponse.getResult() != null || userFindResponse.getResult().size() > 0) {
            response.addError(ErrorType.UNIQUENESS_ERROR, "当前账号已经注册");
            return response;
        }

        //创建sys_user用户
        com.xiniunet.user.request.UserCreateRequest userUserCreateRequest = new com.xiniunet.user.request.UserCreateRequest();
        userUserCreateRequest.setAccount(request.getMobilePhone());
        userUserCreateRequest.setName(request.getMobilePhone());
        userUserCreateRequest.setMobilePhone(request.getMobilePhone());
        userUserCreateRequest.setIsMobileBind(true);
        userUserCreateRequest.setIsActive(true);
        userUserCreateRequest.setActiveDate(now);
        userUserCreateRequest.setPassword(request.getPassword());
        com.xiniunet.user.response.UserCreateResponse createResponse = userService.createUser(userUserCreateRequest, passport);
        passport = createResponse.getPassport();
        // TODO: 2018/3/22 如果创建失败,sys_user 回滚不了
        if (createResponse.hasError()) {
            response.addError(ErrorType.EXPECTATION_NULL, Message.COMMON_CREATE_FAILURE);
            response.addErrors(createResponse.getErrors());
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return response;
        }
        //创建rw_user用户
        UserCreateRequest userCreateRequest = new UserCreateRequest();
        userCreateRequest.setId(createResponse.getId());
        UserCreateResponse userCreateResponse = this.create(userCreateRequest,passport);
        if(userCreateResponse.hasError()){
            response.addErrors(userCreateResponse.getErrors());
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return response;
        }
        //创建护航员
        SafetyEscortCreateRequest safetyEscortCreateRequest = new SafetyEscortCreateRequest();
        safetyEscortCreateRequest.setAutoLaid(true);
        safetyEscortCreateRequest.setIsLaid(true);
        safetyEscortCreateRequest.setUserId(createResponse.getId());
        SafetyEscortCreateResponse safetyEscortCreateResponse = safetyEscortManager.create(safetyEscortCreateRequest,passport);
        if(safetyEscortCreateResponse.hasError()){
            response.addErrors(safetyEscortCreateResponse.getErrors());
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return response;
        }
        response.setId(createResponse.getId());
        response.setPassport(passport);
        return response;
    }

    /**
     * 用户登录
     *
     * @param request  用户登录
     * @return 用户登录应答
     */
    @Override
    public UserLoginResponse login(UserLoginRequest request){
        UserLoginResponse response = new UserLoginResponse();
        com.xiniunet.user.request.UserLoginRequest userLoginRequest =this.getMapper().map(request,com.xiniunet.user.request.UserLoginRequest.class);
        //// TODO: 2018/3/22 接口必传,此处传默认值
        userLoginRequest.setIp("0.0.0.0");
        com.xiniunet.user.response.UserLoginResponse userLoginResponse = userService.loginUser(userLoginRequest);
        if(userLoginResponse.hasError()){
            response.addErrors(userLoginResponse.getErrors());
            return response;
        }
        response = this.getMapper().map(userLoginResponse,UserLoginResponse.class);
        //此处获取私有的信息
        UserGetRequest userGetRequest = new UserGetRequest();
        userGetRequest.setId(response.getPassport().getUserId());
        UserGetResponse userGetResponse = this.get(userGetRequest,response.getPassport());
        if(userGetResponse.hasError()){
            response.addErrors(userGetResponse.getErrors());
            return response;
        }
        response.setUser(userGetResponse.getUser());
        return response;
    }
    /**
     * 创建用户
     *
     * @param request  创建用户请求
     * @param passport 用户护照
     * @return 创建用户应答
     */
    @Override
    public UserCreateResponse create(UserCreateRequest request, Passport passport) {
        UserCreateResponse response = new UserCreateResponse();

        UserPO entity = this.getMapper().map(request, UserPO.class);
        if (entity.getId() == null) {
            long id = foundationService.getNewId();
            entity.setId(id);
        }

        // 先检查关键数据是否有重复,在检查通过后才能做插入操作
        checkValidate(entity, passport, response);
        if (response.hasError()) {
            return response;
        }

        if (userMapper.insert(entity, passport) == 0) {
            response.addError(ErrorType.EXPECTATION_NULL, Message.COMMON_CREATE_FAILURE);
            return response;
        }

        response.setId(entity.getId());
        return response;
    }

    /**
     * 更新用户
     *
     * @param request  更新用户请求
     * @param passport 用户护照
     * @return 更新用户应答
     */
    @Override
    public UserUpdateResponse update(UserUpdateRequest request, Passport passport) {
        UserUpdateResponse response = new UserUpdateResponse();

        UserPO entity = this.getMapper().map(request, UserPO.class);
        // 先检查关键数据是否有重复,在检查通过后才能做插入操作
        checkValidate(entity, passport, response);
        if (response.hasError()) {
            return response;
        }

        Long result = userMapper.update(entity, passport);
        if (result != 1) {
            response.addError(ErrorType.BUSINESS_ERROR, Message.COMMON_UPDATE_FAILURE);
            return response;
        }
        response.setResult(result);
        return response;
    }

    /**
     * 删除用户
     *
     * @param request  删除用户请求
     * @param passport 用户护照
     * @return 删除用户应答
     */
    @Override
    public UserDeleteResponse delete(UserDeleteRequest request, Passport passport) {
        UserDeleteResponse response = new UserDeleteResponse();
        Long result = userMapper.delete(request.getId(), passport);
        response.setResult(result);
        return response;
    }


    /**
     * 验证对象
     *
     * @param user     用户
     * @param passport 用户护照
     */
    private void checkValidate(UserPO user, Passport passport, BaseResponse response) {
        // TODO
    }
}