提交 e50f1f0a 编写于 作者: rushui.chen's avatar rushui.chen

20191029 接口幂等性

上级 d7475b2a
流水线 #16439 已失败 于阶段
in 0 second
...@@ -48,7 +48,6 @@ public class PasswordController extends AccountBaseController { ...@@ -48,7 +48,6 @@ public class PasswordController extends AccountBaseController {
@PostMapping(value = "/modify") @PostMapping(value = "/modify")
public PicaResponse modifyPassword(@RequestBody EncryptEntity entity) throws Exception { public PicaResponse modifyPassword(@RequestBody EncryptEntity entity) throws Exception {
Long doctorId= super.getDoctorIdByToken(); Long doctorId= super.getDoctorIdByToken();
// AESUtil.encryptV0(picaUser.getMobile())
Doctor doctorInfo = doctorService.getDoctorInfo(doctorId.intValue()); Doctor doctorInfo = doctorService.getDoctorInfo(doctorId.intValue());
String mobile = doctorInfo.getMobilePhone(); String mobile = doctorInfo.getMobilePhone();
AccountInfoEntity accountInfoEntity = accountInfoDetailMapper.selectByMobile(mobile); AccountInfoEntity accountInfoEntity = accountInfoDetailMapper.selectByMobile(mobile);
......
...@@ -29,7 +29,7 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -29,7 +29,7 @@ import org.springframework.web.bind.annotation.RestController;
public class RegisterController extends AccountBaseController { public class RegisterController extends AccountBaseController {
private final String REPEAT_REGISTER_PREFIX = "repeat-register—";
@Autowired @Autowired
private RegisterService registerService; private RegisterService registerService;
...@@ -47,32 +47,18 @@ public class RegisterController extends AccountBaseController { ...@@ -47,32 +47,18 @@ public class RegisterController extends AccountBaseController {
BaseRequest request = CryptoUtil.decrypt(entity, BaseRequest.class); BaseRequest request = CryptoUtil.decrypt(entity, BaseRequest.class);
String mobile = request.getMobile(); String mobile = request.getMobile();
//接口幂等性处理(redis中没有就进行注册逻辑,如果已经存在,就不处理) //接口幂等性处理(redis中没有就进行注册逻辑,如果已经存在,就不处理)
String exist = redisClient.get(REPEAT_REGISTER_PREFIX + mobile); String authCode = request.getAuthCode();
if (StringUtils.isBlank(exist)) { String flag = AccountTypeEnum.SYSCODE_TYPE_REGISTER.getCode() + "";
String authCode = request.getAuthCode(); accountUtils.checkMobilePhoneAndAuthCode(mobile, flag, authCode);
String flag = AccountTypeEnum.SYSCODE_TYPE_REGISTER.getCode() + ""; accountUtils.checkPassword(request.getPassword());
accountUtils.checkMobilePhoneAndAuthCode(mobile, flag, authCode);
accountUtils.checkPassword(request.getPassword()); LoginResult result = null;
redisClient.set(REPEAT_REGISTER_PREFIX + mobile, mobile, 30); request.setFlag(AccountTypeEnum.SYSCODE_TYPE_REGISTER.getCode());
LoginResult result = null; request.setProductType(super.getProductType());
try { request.setSourceType(super.getSourceType());
request.setFlag(AccountTypeEnum.SYSCODE_TYPE_REGISTER.getCode()); request.setLoginIp(super.getIpAddr());
request.setProductType(super.getProductType()); result = registerService.register(request);
request.setSourceType(super.getSourceType()); return PicaResponse.toResponse(result);
request.setLoginIp(super.getIpAddr());
result = registerService.register(request);
} catch (Exception e) {
//向上抛出异常,让异常处理框架捕获到
throw new AccountException(AccountExceptionEnum.PICA_REGISTER_FAIL);
} finally {
//如果在注册过程中抛出异常,就删除redis中的注册标记
redisClient.del(REPEAT_REGISTER_PREFIX + mobile);
}
redisClient.del(REPEAT_REGISTER_PREFIX + mobile);
return PicaResponse.toResponse(result);
} else {
return PicaResponse.toResponse(null, AccountExceptionEnum.PICA_ALREADY_REGISTER.getCode(), "正在注册中,请勿重复提交");
}
} }
//"sourceType":6 表示长海项目 //"sourceType":6 表示长海项目
......
...@@ -16,10 +16,13 @@ import com.pica.cloud.account.account.server.util.AESUtil; ...@@ -16,10 +16,13 @@ import com.pica.cloud.account.account.server.util.AESUtil;
import com.pica.cloud.account.account.server.util.AccountUtils; import com.pica.cloud.account.account.server.util.AccountUtils;
import com.pica.cloud.account.account.server.util.ExecutorServiceUtils; import com.pica.cloud.account.account.server.util.ExecutorServiceUtils;
import com.pica.cloud.account.account.server.util.TokenUtils; import com.pica.cloud.account.account.server.util.TokenUtils;
import com.pica.cloud.foundation.entity.PicaResponse;
import com.pica.cloud.foundation.redis.ICacheClient;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
...@@ -31,6 +34,8 @@ import java.util.concurrent.ExecutorService; ...@@ -31,6 +34,8 @@ import java.util.concurrent.ExecutorService;
@Service @Service
public class RegisterServiceImpl implements RegisterService { public class RegisterServiceImpl implements RegisterService {
private final String REPEAT_REGISTER_PREFIX = "repeat-register—";
private Logger logger = LoggerFactory.getLogger(this.getClass()); private Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired @Autowired
...@@ -61,7 +66,8 @@ public class RegisterServiceImpl implements RegisterService { ...@@ -61,7 +66,8 @@ public class RegisterServiceImpl implements RegisterService {
private AgreementLogEntityMapper agreementLogEntityMapper; private AgreementLogEntityMapper agreementLogEntityMapper;
@Autowired @Autowired
private DoctorMapper doctorMapper; @Qualifier("cacheMigrateClient")
private ICacheClient redisClient;
/** /**
* 1)注册功能:默认未完善信息; * 1)注册功能:默认未完善信息;
...@@ -74,83 +80,99 @@ public class RegisterServiceImpl implements RegisterService { ...@@ -74,83 +80,99 @@ public class RegisterServiceImpl implements RegisterService {
@Override @Override
public LoginResult register(BaseRequest baseRequest) { public LoginResult register(BaseRequest baseRequest) {
String mobile = baseRequest.getMobile(); String mobile = baseRequest.getMobile();
String mobileEncrypt = AESUtil.encryptV0(mobile); //对注册接口做幂等性处理:注册成功,删除缓存,注册失败提示用户
AccountInfoEntity accountInfoEntity = accountInfoDetailMapper.selectByMobile(mobileEncrypt); String exist = redisClient.get(REPEAT_REGISTER_PREFIX + mobile);
if (accountInfoEntity == null) { if (StringUtils.isBlank(exist)) {
Date currentTime = new Date(); String mobileEncrypt = AESUtil.encryptV0(mobile);
int productType = baseRequest.getProductType(); AccountInfoEntity accountInfoEntity = accountInfoDetailMapper.selectByMobile(mobileEncrypt);
int sourceType = baseRequest.getSourceType(); if (accountInfoEntity == null) {
String password = baseRequest.getPassword(); redisClient.set(REPEAT_REGISTER_PREFIX + mobile, mobile, 30);
AccountInfoEntity accountInfo = new AccountInfoEntity(); try {
accountInfo.setMobilePhone(mobileEncrypt); Date currentTime = new Date();
if (StringUtils.isEmpty(password)) { int productType = baseRequest.getProductType();
password = ""; int sourceType = baseRequest.getSourceType();
} String password = baseRequest.getPassword();
accountInfo.setPassword(password); AccountInfoEntity accountInfo = new AccountInfoEntity();
accountInfo.setCreatedTime(currentTime); accountInfo.setMobilePhone(mobileEncrypt);
accountInfo.setCreatedId(0); if (StringUtils.isEmpty(password)) {
accountInfo.setModifiedId(0); password = "";
accountInfo.setModifiedTime(currentTime); }
accountInfo.setRegTime(currentTime); accountInfo.setPassword(password);
accountInfo.setDeleteFlag(1); accountInfo.setCreatedTime(currentTime);
accountInfo.setSex(0); accountInfo.setCreatedId(0);
accountInfo.setRegisterProduct(productType); accountInfo.setModifiedId(0);
accountInfo.setRegisterSource(sourceType); accountInfo.setModifiedTime(currentTime);
accountInfoDetailMapper.insertSelective(accountInfo); accountInfo.setRegTime(currentTime);
Integer acctId = accountInfo.getId(); accountInfo.setDeleteFlag(1);
accountInfoDetailMapper.updateCreateInfo(acctId); accountInfo.setSex(0);
if (productType == AccountTypeEnum.PRODUCT_TYPE_HEALTH.getCode()) { accountInfo.setRegisterProduct(productType);
AccountPatientInfoEntity accountPatientInfoEntity = new AccountPatientInfoEntity(); accountInfo.setRegisterSource(sourceType);
accountPatientInfoEntity.setAcctId(acctId); accountInfoDetailMapper.insertSelective(accountInfo);
accountPatientInfoEntity.setDeleteFlag(1); Integer acctId = accountInfo.getId();
accountPatientInfoEntity.setCreateId(acctId); accountInfoDetailMapper.updateCreateInfo(acctId);
accountPatientInfoEntity.setModifyId(acctId); if (productType == AccountTypeEnum.PRODUCT_TYPE_HEALTH.getCode()) {
accountPatientInfoEntity.setCreateTime(currentTime); AccountPatientInfoEntity accountPatientInfoEntity = new AccountPatientInfoEntity();
accountPatientInfoEntity.setModifyTime(currentTime); accountPatientInfoEntity.setAcctId(acctId);
accountUserInfoMapper.insertSelective(accountPatientInfoEntity); accountPatientInfoEntity.setDeleteFlag(1);
accountPatientInfoEntity.setCreateId(acctId);
accountPatientInfoEntity.setModifyId(acctId);
accountPatientInfoEntity.setCreateTime(currentTime);
accountPatientInfoEntity.setModifyTime(currentTime);
accountUserInfoMapper.insertSelective(accountPatientInfoEntity);
} else {
Account account = new Account();
account.setAcctId(acctId);
account.setMobilePhone(mobileEncrypt);
account.setDeleteFlag(1);
account.setCreatId(0L);
account.setModifyId(0L);
account.setCreatTime(currentTime);
account.setModifyTime(currentTime);
account.setFirstLoginTime(currentTime);
account.setLastLoginTime(currentTime);
account.setPassword(password);
accountMapper.insertSelective(account);
}
Long userId = accountUtils.getUserIdByAcctId(productType, acctId);
Account account = new Account();
account.setId(userId);
account.setAcctId(acctId);
account.setCreatTime(currentTime);
account.setMobilePhone(mobile);
account.setRegisterSource(sourceType);
String newToken = tokenUtils.generateToken(account);
LoginResult result = new LoginResult();
result.setToken(newToken);
result.setUserId(userId);
result.setEntireFlag(1);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
try {
dos.writeLong(userId);
} catch (IOException e) {
e.printStackTrace();
}
queueProducer.send(bos.toByteArray());
LogLoginEntity entity = AccountLogEntityUtils.getLogLoginEntity(acctId, productType, baseRequest.getSourceType(),
AccountTypeEnum.LOGIN_REGISTER.getCode(), baseRequest.getLoginIp(), AccountTypeEnum.LOGIN_STATUS_SUCCESS.getCode(),
AccountTypeEnum.LOG_TYPE_LOGIN.getCode());
picaLogUtils.info(entity);
processAgreement(userId);
redisClient.del(REPEAT_REGISTER_PREFIX + mobile);
return result;
} catch (Exception e) {
//向上抛出异常,让异常处理框架捕获到
throw new AccountException(AccountExceptionEnum.PICA_REGISTER_FAIL);
} finally {
//如果在注册过程中抛出异常,就删除redis中的注册标记
redisClient.del(REPEAT_REGISTER_PREFIX + mobile);
}
} else { } else {
Account account = new Account(); throw new AccountException(AccountExceptionEnum.PICA_ALREADY_REGISTER);
account.setAcctId(acctId);
account.setMobilePhone(mobileEncrypt);
account.setDeleteFlag(1);
account.setCreatId(0L);
account.setModifyId(0L);
account.setCreatTime(currentTime);
account.setModifyTime(currentTime);
account.setFirstLoginTime(currentTime);
account.setLastLoginTime(currentTime);
account.setPassword(password);
accountMapper.insertSelective(account);
}
Long userId = accountUtils.getUserIdByAcctId(productType, acctId);
Account account = new Account();
account.setId(userId);
account.setAcctId(acctId);
account.setCreatTime(currentTime);
account.setMobilePhone(mobile);
account.setRegisterSource(sourceType);
String newToken = tokenUtils.generateToken(account);
LoginResult result = new LoginResult();
result.setToken(newToken);
result.setUserId(userId);
result.setEntireFlag(1);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
try {
dos.writeLong(userId);
} catch (IOException e) {
e.printStackTrace();
} }
queueProducer.send(bos.toByteArray());
LogLoginEntity entity = AccountLogEntityUtils.getLogLoginEntity(acctId, productType, baseRequest.getSourceType(),
AccountTypeEnum.LOGIN_REGISTER.getCode(), baseRequest.getLoginIp(), AccountTypeEnum.LOGIN_STATUS_SUCCESS.getCode(),
AccountTypeEnum.LOG_TYPE_LOGIN.getCode());
picaLogUtils.info(entity);
processAgreement(userId);
return result;
} else { } else {
throw new AccountException(AccountExceptionEnum.PICA_ALREADY_REGISTER); throw new AccountException(AccountExceptionEnum.PICA_ALREADY_REGISTER);
} }
} }
...@@ -204,7 +226,7 @@ public class RegisterServiceImpl implements RegisterService { ...@@ -204,7 +226,7 @@ public class RegisterServiceImpl implements RegisterService {
doctorServiceClient.prefectInfo(prefectInfoReq); doctorServiceClient.prefectInfo(prefectInfoReq);
*/ */
} else { } else {
throw new AccountException(AccountExceptionEnum.PICA_ALREADY_REGISTER.getCode(), AccountExceptionEnum.PICA_ALREADY_REGISTER.getCode()); throw new AccountException(AccountExceptionEnum.PICA_ALREADY_REGISTER.getCode(), AccountExceptionEnum.PICA_ALREADY_REGISTER.getCode());
} }
} }
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册