|
@@ -1,21 +1,40 @@
|
|
|
package com.usoftchina.saas.account.service.impl;
|
|
package com.usoftchina.saas.account.service.impl;
|
|
|
|
|
|
|
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
import com.github.pagehelper.PageHelper;
|
|
import com.github.pagehelper.PageHelper;
|
|
|
import com.github.pagehelper.PageInfo;
|
|
import com.github.pagehelper.PageInfo;
|
|
|
import com.usoftchina.saas.account.cache.AccountCache;
|
|
import com.usoftchina.saas.account.cache.AccountCache;
|
|
|
|
|
+import com.usoftchina.saas.account.dto.AccountAddDTO;
|
|
|
import com.usoftchina.saas.account.dto.AccountRoleDTO;
|
|
import com.usoftchina.saas.account.dto.AccountRoleDTO;
|
|
|
import com.usoftchina.saas.account.mapper.AccountCompanyMapper;
|
|
import com.usoftchina.saas.account.mapper.AccountCompanyMapper;
|
|
|
import com.usoftchina.saas.account.mapper.AccountMapper;
|
|
import com.usoftchina.saas.account.mapper.AccountMapper;
|
|
|
import com.usoftchina.saas.account.mapper.AccountRoleMapper;
|
|
import com.usoftchina.saas.account.mapper.AccountRoleMapper;
|
|
|
import com.usoftchina.saas.account.mapper.RoleResourceMapper;
|
|
import com.usoftchina.saas.account.mapper.RoleResourceMapper;
|
|
|
import com.usoftchina.saas.account.po.Account;
|
|
import com.usoftchina.saas.account.po.Account;
|
|
|
|
|
+import com.usoftchina.saas.account.po.Company;
|
|
|
import com.usoftchina.saas.account.po.Role;
|
|
import com.usoftchina.saas.account.po.Role;
|
|
|
import com.usoftchina.saas.account.po.RoleResource;
|
|
import com.usoftchina.saas.account.po.RoleResource;
|
|
|
import com.usoftchina.saas.account.service.AccountService;
|
|
import com.usoftchina.saas.account.service.AccountService;
|
|
|
|
|
+import com.usoftchina.saas.account.service.CompanyService;
|
|
|
import com.usoftchina.saas.account.service.RoleService;
|
|
import com.usoftchina.saas.account.service.RoleService;
|
|
|
|
|
+import com.usoftchina.saas.base.Result;
|
|
|
import com.usoftchina.saas.commons.dto.ListReqDTO;
|
|
import com.usoftchina.saas.commons.dto.ListReqDTO;
|
|
|
|
|
+import com.usoftchina.saas.commons.dto.ShareAddDTO;
|
|
|
import com.usoftchina.saas.context.BaseContextHolder;
|
|
import com.usoftchina.saas.context.BaseContextHolder;
|
|
|
|
|
+import com.usoftchina.saas.exception.BizException;
|
|
|
|
|
+import com.usoftchina.saas.exception.ExceptionCode;
|
|
|
import com.usoftchina.saas.page.PageRequest;
|
|
import com.usoftchina.saas.page.PageRequest;
|
|
|
|
|
+import com.usoftchina.saas.sms.api.SmsApi;
|
|
|
|
|
+import com.usoftchina.saas.sms.cache.SmsCache;
|
|
|
|
|
+import com.usoftchina.saas.sms.dto.SmsDTO;
|
|
|
|
|
+import com.usoftchina.saas.utils.BeanMapper;
|
|
|
|
|
+import com.usoftchina.saas.utils.StringUtils;
|
|
|
|
|
+import com.usoftchina.sso.api.SsoUserApi;
|
|
|
|
|
+import com.usoftchina.sso.api.SsoUserSpaceApi;
|
|
|
|
|
+import com.usoftchina.sso.dto.SsoCheckMobile;
|
|
|
|
|
+import com.usoftchina.sso.dto.SsoResult;
|
|
|
|
|
+import com.usoftchina.sso.dto.SsoUserSpace;
|
|
|
|
|
+import com.usoftchina.sso.dto.SsoUserSpaceList;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
@@ -23,6 +42,7 @@ import org.springframework.util.DigestUtils;
|
|
|
|
|
|
|
|
import java.util.Date;
|
|
import java.util.Date;
|
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
|
|
+import java.util.Optional;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* @author yingp
|
|
* @author yingp
|
|
@@ -33,18 +53,25 @@ public class AccountServiceImpl implements AccountService {
|
|
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private AccountMapper accountMapper;
|
|
private AccountMapper accountMapper;
|
|
|
-
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private AccountCompanyMapper accountCompanyMapper;
|
|
private AccountCompanyMapper accountCompanyMapper;
|
|
|
-
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private AccountRoleMapper accountRoleMapper;
|
|
private AccountRoleMapper accountRoleMapper;
|
|
|
-
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private RoleService roleService;
|
|
private RoleService roleService;
|
|
|
-
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private RoleResourceMapper roleResourceMapper;
|
|
private RoleResourceMapper roleResourceMapper;
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private CompanyService companyService;
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private SsoUserSpaceApi ssoUserSpaceApi;
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private SsoUserApi ssoUserApi;
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private SmsApi smsApi;
|
|
|
|
|
+
|
|
|
|
|
+ //注册短信模板
|
|
|
|
|
+ private final String msgTemplateCode = "SMS_152288990";
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
public boolean save(Account account) {
|
|
public boolean save(Account account) {
|
|
@@ -214,4 +241,154 @@ public class AccountServiceImpl implements AccountService {
|
|
|
accountMapper.updateBindCompanyStatus(accountId, companyId, status);
|
|
accountMapper.updateBindCompanyStatus(accountId, companyId, status);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public Result addAccount(AccountAddDTO accountAddDTO){
|
|
|
|
|
+ Account account = new Account();
|
|
|
|
|
+ // 根据手机号、邮箱、用户名片段判断是否已注册
|
|
|
|
|
+ boolean checked = findByUsernameOrMobileOrEmail(accountAddDTO.getUsername(), accountAddDTO.getMobile(), accountAddDTO.getEmail());
|
|
|
|
|
+ //不存在 ——> 保存 , 存在 ——> 更新
|
|
|
|
|
+ addOrUpdate(checked, accountAddDTO);
|
|
|
|
|
+
|
|
|
|
|
+ account = findByMobile(accountAddDTO.getMobile());
|
|
|
|
|
+ //绑定企业
|
|
|
|
|
+ bindCompany(account.getId(), BaseContextHolder.getCompanyId());
|
|
|
|
|
+ //绑定角色
|
|
|
|
|
+ bindRoles(account.getId(), accountAddDTO.getRoleIds());
|
|
|
|
|
+ clearCache(account.getId());
|
|
|
|
|
+ return Result.success();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 保存账户: 存在则更新,不存在自动注册
|
|
|
|
|
+ * @param checked
|
|
|
|
|
+ * @param accountAddDTO
|
|
|
|
|
+ */
|
|
|
|
|
+ private void addOrUpdate(boolean checked, AccountAddDTO accountAddDTO){
|
|
|
|
|
+ Account account = new Account();
|
|
|
|
|
+ if (!checked) {
|
|
|
|
|
+ account = BeanMapper.map(accountAddDTO, Account.class);
|
|
|
|
|
+ account.setEnabled(true);
|
|
|
|
|
+ save(account);
|
|
|
|
|
+ if (!accountAddDTO.isHasRegister()) {
|
|
|
|
|
+ //用户未注册优软云
|
|
|
|
|
+ registerAccount(accountAddDTO.getMobile(), accountAddDTO.getRealname());
|
|
|
|
|
+ }
|
|
|
|
|
+ }else{
|
|
|
|
|
+ Account accountTemp = findByMobile(accountAddDTO.getMobile());
|
|
|
|
|
+ if (accountTemp == null){
|
|
|
|
|
+ accountTemp = findByEmail(accountAddDTO.getEmail());
|
|
|
|
|
+ }
|
|
|
|
|
+ account = BeanMapper.map(accountAddDTO, Account.class);
|
|
|
|
|
+ account.setEnabled(true);
|
|
|
|
|
+ account.setId(accountTemp.getId());
|
|
|
|
|
+ updateByPrimaryKeySelective(account);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 用户未注册优软云,后台自动注册
|
|
|
|
|
+ * @param mobile
|
|
|
|
|
+ * @param realname
|
|
|
|
|
+ */
|
|
|
|
|
+ private void registerAccount(String mobile, String realname){
|
|
|
|
|
+ //1.添加至优软云
|
|
|
|
|
+ String password = StringUtils.createInitPassword(mobile.substring(mobile.length() - 3, mobile.length()));
|
|
|
|
|
+ Company company = companyService.findByPrimaryKey(BaseContextHolder.getCompanyId());
|
|
|
|
|
+ String companyName = company.getName();
|
|
|
|
|
+
|
|
|
|
|
+ //可能存在开通企业时UU号同步到优软云出错的情况,再重新同步一次
|
|
|
|
|
+ if (company.getUu() == null) {
|
|
|
|
|
+ Account accountTmp = findByPrimaryKey(company.getCreatorId());
|
|
|
|
|
+ ssoUserSpaceApi.registerLogin(companyName, company.getBusinessCode(), accountTmp.getUu());
|
|
|
|
|
+ SsoUserSpaceList ssoUserSpaceList = ssoUserApi.getUserSpacesByMobile(accountTmp.getMobile());
|
|
|
|
|
+ List<SsoUserSpace> ssoUserSpaces = ssoUserSpaceList.getSpaces();
|
|
|
|
|
+ if (ssoUserSpaces.size() > 0) {
|
|
|
|
|
+ for (SsoUserSpace ssoUserspace : ssoUserSpaces) {
|
|
|
|
|
+ if (companyName.equals(ssoUserspace.getSpaceName())) {
|
|
|
|
|
+ company.setUu(ssoUserspace.getSpaceUU());
|
|
|
|
|
+ companyService.updateUUByPrimaryKey(company.getId(), ssoUserspace.getSpaceUU());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ SsoResult result = ssoUserApi.add("add", "sp", realname, mobile, password, company.getUu());
|
|
|
|
|
+ //2.调用短信服务,将密码以短信的形式发送到用户的手机上
|
|
|
|
|
+ if (result.isSuccess()) {
|
|
|
|
|
+ SmsDTO smsDTO = new SmsDTO();
|
|
|
|
|
+ smsDTO.setMobile(mobile);
|
|
|
|
|
+ smsDTO.setSignName("优软云");
|
|
|
|
|
+ smsDTO.setTemplateCode(msgTemplateCode);
|
|
|
|
|
+ JSONObject jsonObject = new JSONObject();
|
|
|
|
|
+ jsonObject.put("password", password);
|
|
|
|
|
+ smsDTO.setTemplateParam(jsonObject.toJSONString());
|
|
|
|
|
+ smsApi.sendMsg(smsDTO);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 分享加入
|
|
|
|
|
+ * @param shareAddDTO
|
|
|
|
|
+ */
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void shareJoin(ShareAddDTO shareAddDTO) {
|
|
|
|
|
+ String mobile = shareAddDTO.getMobile();
|
|
|
|
|
+ String realname = shareAddDTO.getUsername();
|
|
|
|
|
+ Long companyId = shareAddDTO.getCompanyId();
|
|
|
|
|
+ //1.校验短信验证码是否正确
|
|
|
|
|
+ validSmsCode(shareAddDTO.getMobile(), shareAddDTO.getValidCode());
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ //2.开通
|
|
|
|
|
+ //2.1构造AccountAddDTO对象
|
|
|
|
|
+ AccountAddDTO accountAddDTO = new AccountAddDTO();
|
|
|
|
|
+ accountAddDTO.setUsername(mobile);
|
|
|
|
|
+ accountAddDTO.setMobile(mobile);
|
|
|
|
|
+ accountAddDTO.setRealname(realname);
|
|
|
|
|
+ accountAddDTO.setRoleIds(shareAddDTO.getRoleId());
|
|
|
|
|
+ //2.2增加用户
|
|
|
|
|
+ //根据手机号、邮箱、用户名片段判断是否已注册
|
|
|
|
|
+ boolean checked = findByUsernameOrMobileOrEmail(accountAddDTO.getUsername(), accountAddDTO.getMobile(), accountAddDTO.getEmail());
|
|
|
|
|
+ if (!checked){
|
|
|
|
|
+ SsoCheckMobile ssoCheckMobile = ssoUserApi.checkMobile(mobile);
|
|
|
|
|
+ if (ssoCheckMobile.isHasRegister()){
|
|
|
|
|
+ accountAddDTO.setHasRegister(true);
|
|
|
|
|
+ }
|
|
|
|
|
+ }else {
|
|
|
|
|
+ /* 是否已加入企业 */
|
|
|
|
|
+ Account account = findByMobile(mobile);
|
|
|
|
|
+ boolean hasBind = companyService.hasBind(account.getId(), companyId);
|
|
|
|
|
+ if (hasBind){
|
|
|
|
|
+ throw new BizException(ExceptionCode.HAS_BIND_COMPANY);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //不存在 ——> 保存 , 存在 ——> 更新
|
|
|
|
|
+ addOrUpdate(checked, accountAddDTO);
|
|
|
|
|
+
|
|
|
|
|
+ Account account = findByMobile(accountAddDTO.getMobile());
|
|
|
|
|
+ //绑定企业
|
|
|
|
|
+ bindCompany(account.getId(), companyId);
|
|
|
|
|
+ //绑定角色
|
|
|
|
|
+ bindRoles(account.getId(), accountAddDTO.getRoleIds());
|
|
|
|
|
+ //清除缓存
|
|
|
|
|
+ clearCache(account.getId());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 校验短信验证码准确性
|
|
|
|
|
+ * @param mobile
|
|
|
|
|
+ * @param smsCode
|
|
|
|
|
+ */
|
|
|
|
|
+ private void validSmsCode(String mobile, String smsCode){
|
|
|
|
|
+ SmsCache smsCache = SmsCache.of(mobile);
|
|
|
|
|
+ Optional<String> optional = smsCache.getCache();
|
|
|
|
|
+ if (!optional.isPresent()){
|
|
|
|
|
+ throw new BizException(ExceptionCode.SMS_VALIDCODE_EXPIRE);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!optional.get().equals(smsCode)){
|
|
|
|
|
+ throw new BizException(ExceptionCode.SMS_VALIDCODE_ERROR);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
}
|
|
}
|