Commit e234dd6c authored by 王亮's avatar 王亮

Feature disable user 20230105

parent bc21a908
...@@ -7,6 +7,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; ...@@ -7,6 +7,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableAsync;
...@@ -24,6 +25,7 @@ import org.springframework.scheduling.annotation.EnableAsync; ...@@ -24,6 +25,7 @@ import org.springframework.scheduling.annotation.EnableAsync;
@EnableAspectJAutoProxy @EnableAspectJAutoProxy
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableConfigurationProperties({SequencerProperties.class}) @EnableConfigurationProperties({SequencerProperties.class})
@EnableFeignClients
public class Bootstrap { public class Bootstrap {
public static void main(String[] args) { public static void main(String[] args) {
......
...@@ -80,7 +80,6 @@ public class HttpConfig { ...@@ -80,7 +80,6 @@ public class HttpConfig {
DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT); DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
return builder; return builder;
} }
@Bean @Bean
public ConverterRegistry defaultConversionService() { public ConverterRegistry defaultConversionService() {
FormattingConversionService conversionService = new DefaultFormattingConversionService(); FormattingConversionService conversionService = new DefaultFormattingConversionService();
......
...@@ -21,6 +21,7 @@ public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter { ...@@ -21,6 +21,7 @@ public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter {
/** /**
* 快速校验参数. 第一个出错后面的不用再校验了 * 快速校验参数. 第一个出错后面的不用再校验了
*
* @return * @return
*/ */
@Bean @Bean
...@@ -34,4 +35,9 @@ public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter { ...@@ -34,4 +35,9 @@ public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter {
postProcessor.setValidator(validator); postProcessor.setValidator(validator);
return postProcessor; return postProcessor;
} }
// @Override
// public void addInterceptors(InterceptorRegistry registry) {
// registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/innerapi/user/**");
// }
} }
\ No newline at end of file
package cn.quantgroup.xyqb.controller.internal.user; package cn.quantgroup.xyqb.controller.internal.user;
import cn.quantgroup.user.enums.*; import static cn.quantgroup.xyqb.constant.UserConstant.USER_ERROR_OR_ENABLE_ERROR;
import cn.quantgroup.user.enums.BizType;
import cn.quantgroup.user.enums.EducationEnum;
import cn.quantgroup.user.enums.IncomeEnum;
import cn.quantgroup.user.enums.IncomeRangeEnum;
import cn.quantgroup.user.enums.MaritalStatus;
import cn.quantgroup.user.enums.OccupationEnum;
import cn.quantgroup.user.enums.Relation;
import cn.quantgroup.xyqb.Constants; import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.aspect.accessable.IpValidator; import cn.quantgroup.xyqb.aspect.accessable.IpValidator;
import cn.quantgroup.xyqb.aspect.forbidden.AccessForbiddenValidator; import cn.quantgroup.xyqb.aspect.forbidden.AccessForbiddenValidator;
import cn.quantgroup.xyqb.controller.IBaseController; import cn.quantgroup.xyqb.controller.IBaseController;
import cn.quantgroup.xyqb.controller.internal.user.resp.UserFullResp; import cn.quantgroup.xyqb.controller.internal.user.resp.UserFullResp;
import cn.quantgroup.xyqb.entity.*; import cn.quantgroup.xyqb.entity.Address;
import cn.quantgroup.xyqb.entity.Contact;
import cn.quantgroup.xyqb.entity.Merchant;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.entity.UserBtRegister;
import cn.quantgroup.xyqb.entity.UserDetail;
import cn.quantgroup.xyqb.entity.UserDisableRecord;
import cn.quantgroup.xyqb.entity.UserExtInfo;
import cn.quantgroup.xyqb.entity.UserSpouse;
import cn.quantgroup.xyqb.entity.WechatUserInfo;
import cn.quantgroup.xyqb.event.DisableActiveEvent; import cn.quantgroup.xyqb.event.DisableActiveEvent;
import cn.quantgroup.xyqb.event.UserDisableRecordEvent;
import cn.quantgroup.xyqb.event.UserExtInfoSaveEvent; import cn.quantgroup.xyqb.event.UserExtInfoSaveEvent;
import cn.quantgroup.xyqb.exception.UserNotExistException; import cn.quantgroup.xyqb.exception.UserNotExistException;
import cn.quantgroup.xyqb.model.AddressRet;
import cn.quantgroup.xyqb.model.ContactInfo;
import cn.quantgroup.xyqb.model.ContactRet;
import cn.quantgroup.xyqb.model.Gender; import cn.quantgroup.xyqb.model.Gender;
import cn.quantgroup.xyqb.model.IdCardInfo;
import cn.quantgroup.xyqb.model.IdType; import cn.quantgroup.xyqb.model.IdType;
import cn.quantgroup.xyqb.model.*; import cn.quantgroup.xyqb.model.JsonResult;
import cn.quantgroup.xyqb.model.LoginUserContext;
import cn.quantgroup.xyqb.model.OauthResult;
import cn.quantgroup.xyqb.model.Tuple;
import cn.quantgroup.xyqb.model.UserAssociation;
import cn.quantgroup.xyqb.model.UserAssociationModel;
import cn.quantgroup.xyqb.model.UserDetailRet;
import cn.quantgroup.xyqb.model.UserDisableRecordModel;
import cn.quantgroup.xyqb.model.UserExtInfoRet;
import cn.quantgroup.xyqb.model.UserFullInfo;
import cn.quantgroup.xyqb.model.UserInfo;
import cn.quantgroup.xyqb.model.UserRet;
import cn.quantgroup.xyqb.model.UserSpouseRet;
import cn.quantgroup.xyqb.model.UserStatistics;
import cn.quantgroup.xyqb.remote.StmsRemoteService;
import cn.quantgroup.xyqb.repository.IUserDisableRecordRepository;
import cn.quantgroup.xyqb.service.api.IUserApiService; import cn.quantgroup.xyqb.service.api.IUserApiService;
import cn.quantgroup.xyqb.service.auth.IIdCardService; import cn.quantgroup.xyqb.service.auth.IIdCardService;
import cn.quantgroup.xyqb.service.merchant.IMerchantService; import cn.quantgroup.xyqb.service.merchant.IMerchantService;
...@@ -20,10 +57,25 @@ import cn.quantgroup.xyqb.service.register.IUserDeregisterService; ...@@ -20,10 +57,25 @@ import cn.quantgroup.xyqb.service.register.IUserDeregisterService;
import cn.quantgroup.xyqb.service.register.IUserRegisterService; import cn.quantgroup.xyqb.service.register.IUserRegisterService;
import cn.quantgroup.xyqb.service.session.ISessionService; import cn.quantgroup.xyqb.service.session.ISessionService;
import cn.quantgroup.xyqb.service.sms.ISmsService; import cn.quantgroup.xyqb.service.sms.ISmsService;
import cn.quantgroup.xyqb.service.user.*; import cn.quantgroup.xyqb.service.user.CleanDataService;
import cn.quantgroup.xyqb.service.user.IAddressService;
import cn.quantgroup.xyqb.service.user.IContactService;
import cn.quantgroup.xyqb.service.user.IOauthLoginInfoService;
import cn.quantgroup.xyqb.service.user.ITenantService;
import cn.quantgroup.xyqb.service.user.IUserBtRegisterService;
import cn.quantgroup.xyqb.service.user.IUserDetailService;
import cn.quantgroup.xyqb.service.user.IUserExtInfoService;
import cn.quantgroup.xyqb.service.user.IUserService;
import cn.quantgroup.xyqb.service.user.IUserSpouseService;
import cn.quantgroup.xyqb.service.user.vo.UserDetailVO; import cn.quantgroup.xyqb.service.user.vo.UserDetailVO;
import cn.quantgroup.xyqb.service.wechat.IWechatService; import cn.quantgroup.xyqb.service.wechat.IWechatService;
import cn.quantgroup.xyqb.util.*; import cn.quantgroup.xyqb.util.AesUtil;
import cn.quantgroup.xyqb.util.BctyptPasswordUtil;
import cn.quantgroup.xyqb.util.IpUtil;
import cn.quantgroup.xyqb.util.MqUtils;
import cn.quantgroup.xyqb.util.PasswordUtil;
import cn.quantgroup.xyqb.util.TenantUtil;
import cn.quantgroup.xyqb.util.ValidationUtil;
import cn.quantgroup.xyqb.util.encrypt.Md5Util; import cn.quantgroup.xyqb.util.encrypt.Md5Util;
import cn.quantgroup.xyqb.validator.ChineseName; import cn.quantgroup.xyqb.validator.ChineseName;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
...@@ -31,27 +83,40 @@ import com.alibaba.fastjson.JSONObject; ...@@ -31,27 +83,40 @@ import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference; import com.alibaba.fastjson.TypeReference;
import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils; import org.apache.commons.lang3.math.NumberUtils;
import org.apache.http.HttpStatus; import org.apache.http.HttpStatus;
import org.hibernate.validator.constraints.Length;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisher;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import javax.annotation.Resource; import org.springframework.web.bind.annotation.PostMapping;
import javax.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.RequestHeader;
import javax.validation.constraints.Min; import org.springframework.web.bind.annotation.RequestMapping;
import javax.validation.constraints.NotNull; import org.springframework.web.bind.annotation.RequestMethod;
import java.io.UnsupportedEncodingException; import org.springframework.web.bind.annotation.RequestParam;
import java.text.ParseException; import org.springframework.web.bind.annotation.RestController;
import java.util.*;
import java.util.stream.Collectors;
import static cn.quantgroup.xyqb.constant.UserConstant.USER_ERROR_OR_ENABLE_ERROR;
/** /**
...@@ -96,7 +161,8 @@ public class InnerController implements IBaseController { ...@@ -96,7 +161,8 @@ public class InnerController implements IBaseController {
@Resource @Resource
private CleanDataService cleanDataService; private CleanDataService cleanDataService;
@Autowired
private StmsRemoteService stmsRemoteService;
@Autowired @Autowired
private ITenantService tenantService; private ITenantService tenantService;
...@@ -106,7 +172,8 @@ public class InnerController implements IBaseController { ...@@ -106,7 +172,8 @@ public class InnerController implements IBaseController {
@Autowired @Autowired
private IUserDeregisterService userDeregisterService; private IUserDeregisterService userDeregisterService;
@Autowired
private IUserDisableRecordRepository iUserDisableRecordRepository;
private static final String RESET_PWD_TOKEN = "ecf75c1f-2ccb-4661-8e4b-2874c0f45a2b"; private static final String RESET_PWD_TOKEN = "ecf75c1f-2ccb-4661-8e4b-2874c0f45a2b";
private static final String MODIFY_CONTACT_TOKEN = "@qwsdedad131323213w!"; private static final String MODIFY_CONTACT_TOKEN = "@qwsdedad131323213w!";
...@@ -144,7 +211,7 @@ public class InnerController implements IBaseController { ...@@ -144,7 +211,7 @@ public class InnerController implements IBaseController {
if (tenantId != null && !TenantUtil.TENANT_DEFAULT.equals(tenantId)) { if (tenantId != null && !TenantUtil.TENANT_DEFAULT.equals(tenantId)) {
// userId 查询对应productLogin 获取手机号和customerId // userId 查询对应productLogin 获取手机号和customerId
user = tenantService.getTenantUser(user, tenantId); user = tenantService.getTenantUser(user, tenantId);
if (user == null ) { if (user == null) {
return JsonResult.buildErrorStateResult("查无此人", null); return JsonResult.buildErrorStateResult("查无此人", null);
} }
} }
...@@ -165,7 +232,7 @@ public class InnerController implements IBaseController { ...@@ -165,7 +232,7 @@ public class InnerController implements IBaseController {
if (tenantId != null && !TenantUtil.TENANT_DEFAULT.equals(tenantId)) { if (tenantId != null && !TenantUtil.TENANT_DEFAULT.equals(tenantId)) {
// userId 查询对应productLogin 获取手机号和customerId // userId 查询对应productLogin 获取手机号和customerId
user = tenantService.getTenantUser(user, tenantId); user = tenantService.getTenantUser(user, tenantId);
if (user == null ) { if (user == null) {
return JsonResult.buildErrorStateResult("查无此人", null); return JsonResult.buildErrorStateResult("查无此人", null);
} }
} }
...@@ -218,7 +285,7 @@ public class InnerController implements IBaseController { ...@@ -218,7 +285,7 @@ public class InnerController implements IBaseController {
if (tenantId != null && !TenantUtil.TENANT_DEFAULT.equals(tenantId)) { if (tenantId != null && !TenantUtil.TENANT_DEFAULT.equals(tenantId)) {
// userId 查询对应productLogin 获取手机号和customerId // userId 查询对应productLogin 获取手机号和customerId
user = tenantService.getTenantUser(user, tenantId); user = tenantService.getTenantUser(user, tenantId);
if (user == null ) { if (user == null) {
return JsonResult.buildErrorStateResult("", null); return JsonResult.buildErrorStateResult("", null);
} }
} }
...@@ -275,7 +342,8 @@ public class InnerController implements IBaseController { ...@@ -275,7 +342,8 @@ public class InnerController implements IBaseController {
* @yapi http://yapi.quantgroups.com/project/17/interface/api/205 * @yapi http://yapi.quantgroups.com/project/17/interface/api/205
*/ */
@RequestMapping("/user/getPhoneByUserIds") @RequestMapping("/user/getPhoneByUserIds")
public JsonResult findByIds(@RequestParam(value = "userIds") String userIdsString, @RequestParam(required = false) Integer tenantId) { public JsonResult findByIds(@RequestParam(value = "userIds") String userIdsString,
@RequestParam(required = false) Integer tenantId) {
log.info("批量查询用户的手机号列表, userIdsString:" + userIdsString + ", tenantId:" + tenantId); log.info("批量查询用户的手机号列表, userIdsString:" + userIdsString + ", tenantId:" + tenantId);
//默认羊小咩租户 //默认羊小咩租户
if (TenantUtil.validationTenantIdIsNullOrZero(tenantId)) { if (TenantUtil.validationTenantIdIsNullOrZero(tenantId)) {
...@@ -333,17 +401,20 @@ public class InnerController implements IBaseController { ...@@ -333,17 +401,20 @@ public class InnerController implements IBaseController {
} }
/** /**
* 保存用户详细信息 * 保存用户详细信息 适用于:创建 或 修改
* 适用于:创建 或 修改 *
* @yapi http://yapi.quantgroups.com/project/17/interface/api/285 * @yapi http://yapi.quantgroups.com/project/17/interface/api/285
*/ */
@RequestMapping("/user_detail/save") @RequestMapping("/user_detail/save")
public JsonResult saveUserDetail(@Min(value = 1, message = "用户id为空") @RequestParam Long userId, public JsonResult saveUserDetail(
@Min(value = 1, message = "用户id为空") @RequestParam Long userId,
String phoneNo, String phoneNo,
@ChineseName @RequestParam String name, @ChineseName @RequestParam String name,
String idNo, String idNo,
String email, String qq) { String email, String qq) {
log.info("保存用户详细信息,[saveUserDetail] userId:{},phoneNo:{},name:{},idNo:{},email:{},qq:{}", userId, phoneNo, name, idNo, email, qq); log.info(
"保存用户详细信息,[saveUserDetail] userId:{},phoneNo:{},name:{},idNo:{},email:{},qq:{}",
userId, phoneNo, name, idNo, email, qq);
//参数验证 //参数验证
if (Objects.isNull(userId)) { if (Objects.isNull(userId)) {
return JsonResult.buildErrorStateResult("userId为空.", null); return JsonResult.buildErrorStateResult("userId为空.", null);
...@@ -397,7 +468,8 @@ public class InnerController implements IBaseController { ...@@ -397,7 +468,8 @@ public class InnerController implements IBaseController {
userDetail.setEmail(email); userDetail.setEmail(email);
userDetail.setQq(qq); userDetail.setQq(qq);
userDetail = userDetailService.saveUserDetail(userDetail); userDetail = userDetailService.saveUserDetail(userDetail);
log.info("InnerController saveUserDetail, userId:{}, phoneNo:{}, name:{}", user.getId(), phoneNo, name); log.info("InnerController saveUserDetail, userId:{}, phoneNo:{}, name:{}", user.getId(),
phoneNo, name);
if (userDetail != null) { if (userDetail != null) {
return JsonResult.buildSuccessResult(null, UserDetailRet.getUserDetail(userDetail)); return JsonResult.buildSuccessResult(null, UserDetailRet.getUserDetail(userDetail));
} }
...@@ -406,6 +478,7 @@ public class InnerController implements IBaseController { ...@@ -406,6 +478,7 @@ public class InnerController implements IBaseController {
/** /**
* 根据用户id查询用户的详细信息 * 根据用户id查询用户的详细信息
*
* @yapi http://yapi.quantgroups.com/project/17/interface/api/237 * @yapi http://yapi.quantgroups.com/project/17/interface/api/237
*/ */
@AccessForbiddenValidator @AccessForbiddenValidator
...@@ -439,7 +512,7 @@ public class InnerController implements IBaseController { ...@@ -439,7 +512,7 @@ public class InnerController implements IBaseController {
if (tenantId != null && !TenantUtil.TENANT_DEFAULT.equals(tenantId)) { if (tenantId != null && !TenantUtil.TENANT_DEFAULT.equals(tenantId)) {
// userId 查询对应productLogin 获取手机号和customerId // userId 查询对应productLogin 获取手机号和customerId
user = tenantService.getTenantUser(user, tenantId); user = tenantService.getTenantUser(user, tenantId);
if (user == null ) { if (user == null) {
return JsonResult.buildErrorStateResult("查无此人", null); return JsonResult.buildErrorStateResult("查无此人", null);
} }
} }
...@@ -554,13 +627,16 @@ public class InnerController implements IBaseController { ...@@ -554,13 +627,16 @@ public class InnerController implements IBaseController {
} }
@RequestMapping("/contact/save/contacts") @RequestMapping("/contact/save/contacts")
public JsonResult save2Contact(Long userId, @RequestParam(value = "contacts") String contactsStr) { public JsonResult save2Contact(Long userId,
@RequestParam(value = "contacts") String contactsStr) {
if (Objects.isNull(userId) || StringUtils.isBlank(contactsStr)) { if (Objects.isNull(userId) || StringUtils.isBlank(contactsStr)) {
log.warn("保存用户联系人:参数不完整:userId:{}, contacts:{}", userId, contactsStr); log.warn("保存用户联系人:参数不完整:userId:{}, contacts:{}", userId, contactsStr);
return JsonResult.buildErrorStateResult("参数不完整", String.valueOf(userId).concat(":").concat(contactsStr)); return JsonResult.buildErrorStateResult("参数不完整",
String.valueOf(userId).concat(":").concat(contactsStr));
} }
log.info("保存用户联系人:userId:{}, contacts:{}", userId, contactsStr); log.info("保存用户联系人:userId:{}, contacts:{}", userId, contactsStr);
List<Contact> contacts = JSONObject.parseObject(contactsStr, new TypeReference<List<Contact>>() { List<Contact> contacts = JSONObject.parseObject(contactsStr,
new TypeReference<List<Contact>>() {
}); });
if (CollectionUtils.isEmpty(contacts)) { if (CollectionUtils.isEmpty(contacts)) {
log.info("联系人不能为空"); log.info("联系人不能为空");
...@@ -568,7 +644,8 @@ public class InnerController implements IBaseController { ...@@ -568,7 +644,8 @@ public class InnerController implements IBaseController {
} }
for (Contact contact : contacts) { for (Contact contact : contacts) {
if (!contact.valid()) { if (!contact.valid()) {
log.info("用户手机号或姓名错误, phoneNo:{},name:{}", contact.getPhoneNo(), contact.getName()); log.info("用户手机号或姓名错误, phoneNo:{},name:{}", contact.getPhoneNo(),
contact.getName());
return JsonResult.buildErrorStateResult("用户手机号或姓名错误", contact); return JsonResult.buildErrorStateResult("用户手机号或姓名错误", contact);
} }
} }
...@@ -577,7 +654,8 @@ public class InnerController implements IBaseController { ...@@ -577,7 +654,8 @@ public class InnerController implements IBaseController {
} }
@RequestMapping("/contact/update/contact") @RequestMapping("/contact/update/contact")
public JsonResult updateContact(@RequestParam Long contactId, @RequestParam(required = false) String name, public JsonResult updateContact(@RequestParam Long contactId,
@RequestParam(required = false) String name,
@RequestParam(required = false) String phoneNo, @RequestParam(required = false) String phoneNo,
@RequestParam(required = false) Relation relation, String key, @RequestParam(required = false) Relation relation, String key,
@RequestParam String reason, HttpServletRequest request) { @RequestParam String reason, HttpServletRequest request) {
...@@ -603,7 +681,8 @@ public class InnerController implements IBaseController { ...@@ -603,7 +681,8 @@ public class InnerController implements IBaseController {
return JsonResult.buildErrorStateResult("修改联系人不存在", null); return JsonResult.buildErrorStateResult("修改联系人不存在", null);
} }
contact = contactService.saveContact(name, phoneNo, relation, contact); contact = contactService.saveContact(name, phoneNo, relation, contact);
log.info("修改后联系人信息:{},修改原因:{},操作ip:{}", contact, reason, IpUtil.getRemoteIP(request)); log.info("修改后联系人信息:{},修改原因:{},操作ip:{}", contact, reason,
IpUtil.getRemoteIP(request));
return JsonResult.buildSuccessResult("修改联系人成功", contact); return JsonResult.buildSuccessResult("修改联系人成功", contact);
} }
...@@ -624,9 +703,13 @@ public class InnerController implements IBaseController { ...@@ -624,9 +703,13 @@ public class InnerController implements IBaseController {
public JsonResult saveAddress( public JsonResult saveAddress(
Long userId, Long provinceCode, Long cityCode, String city, Long userId, Long provinceCode, Long cityCode, String city,
Long districtCode, String district, String address, String province) { Long districtCode, String district, String address, String province) {
log.info("保存地址详情:city:{},province:{},district:{}, address:{},userId:{}", city, province, district, address, userId); log.info("保存地址详情:city:{},province:{},district:{}, address:{},userId:{}", city, province,
if (userId == null || provinceCode == null || cityCode == null || StringUtils.isBlank(address)) { district, address, userId);
log.info("错误保存地址详情,其中参数不能为空:city:{},province:{},district:{}, address:{},userId:{}", city, province, district, address, userId); if (userId == null || provinceCode == null || cityCode == null || StringUtils.isBlank(
address)) {
log.info(
"错误保存地址详情,其中参数不能为空:city:{},province:{},district:{}, address:{},userId:{}",
city, province, district, address, userId);
return JsonResult.buildErrorStateResult("参数不能为空", null); return JsonResult.buildErrorStateResult("参数不能为空", null);
} }
Address addressObj = addressService.findByUserId(userId); Address addressObj = addressService.findByUserId(userId);
...@@ -650,7 +733,8 @@ public class InnerController implements IBaseController { ...@@ -650,7 +733,8 @@ public class InnerController implements IBaseController {
public JsonResult updateMarryStatus( public JsonResult updateMarryStatus(
Long userId, IncomeEnum incomeEnum, IncomeRangeEnum incomeRangeEnum, Long userId, IncomeEnum incomeEnum, IncomeRangeEnum incomeRangeEnum,
OccupationEnum occupationEnum, EducationEnum educationEnum, Boolean hasCar, OccupationEnum occupationEnum, EducationEnum educationEnum, Boolean hasCar,
Boolean hasSocialSecurity, Boolean hasHouse, Boolean hasCreditCard, MaritalStatus maritalStatus) { Boolean hasSocialSecurity, Boolean hasHouse, Boolean hasCreditCard,
MaritalStatus maritalStatus) {
if (null == userId) { if (null == userId) {
return JsonResult.buildErrorStateResult("用户ID不能为空", null); return JsonResult.buildErrorStateResult("用户ID不能为空", null);
} }
...@@ -663,14 +747,16 @@ public class InnerController implements IBaseController { ...@@ -663,14 +747,16 @@ public class InnerController implements IBaseController {
info.setIncomeEnum(cn.quantgroup.user.enums.IncomeEnum.valueOf(incomeEnum.name())); info.setIncomeEnum(cn.quantgroup.user.enums.IncomeEnum.valueOf(incomeEnum.name()));
} }
if (incomeRangeEnum != null) { if (incomeRangeEnum != null) {
info.setIncomeRangeEnum(cn.quantgroup.user.enums.IncomeRangeEnum.valueOf(incomeRangeEnum.name())); info.setIncomeRangeEnum(
cn.quantgroup.user.enums.IncomeRangeEnum.valueOf(incomeRangeEnum.name()));
} }
if (occupationEnum != null) { if (occupationEnum != null) {
if (occupationEnum == OccupationEnum.STUDENT) {//如果是学生那么转成其他 if (occupationEnum == OccupationEnum.STUDENT) {//如果是学生那么转成其他
occupationEnum = OccupationEnum.OTHER; occupationEnum = OccupationEnum.OTHER;
} }
//不明白为啥这么写 为啥不直接用还要valueof //不明白为啥这么写 为啥不直接用还要valueof
info.setOccupationEnum(cn.quantgroup.user.enums.OccupationEnum.valueOf(occupationEnum.name())); info.setOccupationEnum(
cn.quantgroup.user.enums.OccupationEnum.valueOf(occupationEnum.name()));
} }
if (educationEnum != null) { if (educationEnum != null) {
info.setEducationEnum(cn.quantgroup.user.enums.EducationEnum.valueOf(educationEnum.name())); info.setEducationEnum(cn.quantgroup.user.enums.EducationEnum.valueOf(educationEnum.name()));
...@@ -686,7 +772,6 @@ public class InnerController implements IBaseController { ...@@ -686,7 +772,6 @@ public class InnerController implements IBaseController {
info.setHasSocialSecurity(hasSocialSecurity); info.setHasSocialSecurity(hasSocialSecurity);
} }
if (hasHouse != null) { if (hasHouse != null) {
info.setHasHouse(hasHouse); info.setHasHouse(hasHouse);
} }
...@@ -709,8 +794,10 @@ public class InnerController implements IBaseController { ...@@ -709,8 +794,10 @@ public class InnerController implements IBaseController {
*/ */
@AccessForbiddenValidator @AccessForbiddenValidator
@RequestMapping("/user_detail/search_list") @RequestMapping("/user_detail/search_list")
public JsonResult<List<UserDetailVO>> searchUserDetailList(String name, String phoneNo, String idNo) { public JsonResult<List<UserDetailVO>> searchUserDetailList(String name, String phoneNo,
log.info("searchUserDetailList ,param.name:{},phone:{},idNo:{},ip:{}", name, phoneNo, idNo, getIp()); String idNo) {
log.info("searchUserDetailList ,param.name:{},phone:{},idNo:{},ip:{}", name, phoneNo, idNo,
getIp());
if (StringUtils.isBlank(name) && StringUtils.isBlank(phoneNo) && StringUtils.isBlank(idNo)) { if (StringUtils.isBlank(name) && StringUtils.isBlank(phoneNo) && StringUtils.isBlank(idNo)) {
return JsonResult.buildErrorStateResult("至少必须满足一个条件不为空", null); return JsonResult.buildErrorStateResult("至少必须满足一个条件不为空", null);
} }
...@@ -730,7 +817,8 @@ public class InnerController implements IBaseController { ...@@ -730,7 +817,8 @@ public class InnerController implements IBaseController {
public JsonResult<List<UserDetail>> fuzzyQueryUserDetailList(String phoneNo, public JsonResult<List<UserDetail>> fuzzyQueryUserDetailList(String phoneNo,
String idNo, String idNo,
String userName) { String userName) {
log.info("fuzzyQueryUserDetailList, phone:{},idNo:{},userName:{},ip:{}", phoneNo, idNo, userName, getIp()); log.info("fuzzyQueryUserDetailList, phone:{},idNo:{},userName:{},ip:{}", phoneNo, idNo,
userName, getIp());
if (StringUtils.isBlank(phoneNo) && StringUtils.isBlank(idNo)) { if (StringUtils.isBlank(phoneNo) && StringUtils.isBlank(idNo)) {
return JsonResult.buildErrorStateResult("查询条件不能为空", null); return JsonResult.buildErrorStateResult("查询条件不能为空", null);
} }
...@@ -739,8 +827,10 @@ public class InnerController implements IBaseController { ...@@ -739,8 +827,10 @@ public class InnerController implements IBaseController {
//最多掩码身份证后五位 //最多掩码身份证后五位
int idNoMaskSize = 13; int idNoMaskSize = 13;
int idNoFullSize = 18; int idNoFullSize = 18;
boolean phoneNoValid = StringUtils.isBlank(phoneNo) ? false : (phoneNo.length() >= phoneNoMaskSize || ValidationUtil.validatePhoneNo(phoneNo)); boolean phoneNoValid = StringUtils.isBlank(phoneNo) ? false
boolean idNoValid = StringUtils.isBlank(idNo) ? false : (idNo.length() >= idNoMaskSize || Objects.equals(idNo.length(), idNoFullSize)); : (phoneNo.length() >= phoneNoMaskSize || ValidationUtil.validatePhoneNo(phoneNo));
boolean idNoValid = StringUtils.isBlank(idNo) ? false
: (idNo.length() >= idNoMaskSize || Objects.equals(idNo.length(), idNoFullSize));
if (!phoneNoValid && !idNoValid) { if (!phoneNoValid && !idNoValid) {
return JsonResult.buildErrorStateResult("查询条件不规范!", null); return JsonResult.buildErrorStateResult("查询条件不规范!", null);
} }
...@@ -754,7 +844,9 @@ public class InnerController implements IBaseController { ...@@ -754,7 +844,9 @@ public class InnerController implements IBaseController {
} }
// 如果传入姓名,则只过滤匹配项 // 如果传入姓名,则只过滤匹配项
if (!CollectionUtils.isEmpty(userDetailList) && StringUtils.isNotBlank(userName)) { if (!CollectionUtils.isEmpty(userDetailList) && StringUtils.isNotBlank(userName)) {
userDetailList = userDetailList.stream().filter(userDetail -> Objects.equals(userName, userDetail.getName())).collect(Collectors.toList()); userDetailList = userDetailList.stream()
.filter(userDetail -> Objects.equals(userName, userDetail.getName()))
.collect(Collectors.toList());
} }
return JsonResult.buildSuccessResult("success", userDetailList); return JsonResult.buildSuccessResult("success", userDetailList);
} }
...@@ -790,11 +882,7 @@ public class InnerController implements IBaseController { ...@@ -790,11 +882,7 @@ public class InnerController implements IBaseController {
* @param id - 用户表主键 * @param id - 用户表主键
* @param phoneNo - 用户账号 * @param phoneNo - 用户账号
* @param uuid - 用户全球唯一键(uuid) * @param uuid - 用户全球唯一键(uuid)
* @return 详细信息包含: * @return 详细信息包含: { 账号信息 个人信息 }
* {
* 账号信息
* 个人信息
* }
*/ */
@RequestMapping("/user-association/search") @RequestMapping("/user-association/search")
public JsonResult findUserAssociationModel(Long id, String phoneNo, String uuid) { public JsonResult findUserAssociationModel(Long id, String phoneNo, String uuid) {
...@@ -821,14 +909,7 @@ public class InnerController implements IBaseController { ...@@ -821,14 +909,7 @@ public class InnerController implements IBaseController {
* 查询用户综合信息模型 * 查询用户综合信息模型
* *
* @param user - 用户User * @param user - 用户User
* @return 综合信息模型包含: * @return 综合信息模型包含: { 账号信息 个人信息 扩展信息 地址信息 联系人信息 }
* {
* 账号信息
* 个人信息
* 扩展信息
* 地址信息
* 联系人信息
* }
*/ */
private UserAssociationModel findUserAssociationModelByUser(User user) { private UserAssociationModel findUserAssociationModelByUser(User user) {
if (Objects.isNull(user) || Objects.isNull(user.getId()) || user.getId() < 1) { if (Objects.isNull(user) || Objects.isNull(user.getId()) || user.getId() < 1) {
...@@ -854,15 +935,20 @@ public class InnerController implements IBaseController { ...@@ -854,15 +935,20 @@ public class InnerController implements IBaseController {
UserExtInfo extInfo = userExtInfoService.findByUserId(user.getId()); UserExtInfo extInfo = userExtInfoService.findByUserId(user.getId());
if (Objects.nonNull(extInfo)) { if (Objects.nonNull(extInfo)) {
// 婚姻状态 // 婚姻状态
bean.setMarryStatus(Optional.ofNullable(extInfo.getMarryStatus()).orElse(cn.quantgroup.user.enums.MaritalStatus.UNKNOWN).getDesc()); bean.setMarryStatus(Optional.ofNullable(extInfo.getMarryStatus())
.orElse(cn.quantgroup.user.enums.MaritalStatus.UNKNOWN).getDesc());
// 受教育程度 // 受教育程度
bean.setEducationEnum(Optional.ofNullable(extInfo.getEducationEnum()).orElse(cn.quantgroup.user.enums.EducationEnum.UNKNOWN).getName()); bean.setEducationEnum(Optional.ofNullable(extInfo.getEducationEnum())
.orElse(cn.quantgroup.user.enums.EducationEnum.UNKNOWN).getName());
// 职业 // 职业
bean.setOccupationEnum(Optional.ofNullable(extInfo.getOccupationEnum()).orElse(cn.quantgroup.user.enums.OccupationEnum.UNKNOWN).getName()); bean.setOccupationEnum(Optional.ofNullable(extInfo.getOccupationEnum())
.orElse(cn.quantgroup.user.enums.OccupationEnum.UNKNOWN).getName());
// 收入水平范围 // 收入水平范围
bean.setIncomeRangeEnum(Optional.ofNullable(extInfo.getIncomeRangeEnum()).orElse(cn.quantgroup.user.enums.IncomeRangeEnum.UNKNOWN).getDesc()); bean.setIncomeRangeEnum(Optional.ofNullable(extInfo.getIncomeRangeEnum())
.orElse(cn.quantgroup.user.enums.IncomeRangeEnum.UNKNOWN).getDesc());
// 收入方式 // 收入方式
bean.setIncomeEnum(Optional.ofNullable(extInfo.getIncomeEnum()).orElse(cn.quantgroup.user.enums.IncomeEnum.UNKNOWN).getDesc()); bean.setIncomeEnum(Optional.ofNullable(extInfo.getIncomeEnum())
.orElse(cn.quantgroup.user.enums.IncomeEnum.UNKNOWN).getDesc());
// 是否有车 // 是否有车
bean.setHasCar(Optional.ofNullable(extInfo.getHasCar()).orElse(false)); bean.setHasCar(Optional.ofNullable(extInfo.getHasCar()).orElse(false));
// 是否有社保 // 是否有社保
...@@ -874,23 +960,28 @@ public class InnerController implements IBaseController { ...@@ -874,23 +960,28 @@ public class InnerController implements IBaseController {
} }
Address address = addressService.findByUserId(user.getId()); Address address = addressService.findByUserId(user.getId());
if (!Objects.isNull(address)) { if (!Objects.isNull(address)) {
log.info("[findUserAssociationModelByUser]获取用户地址address:{}", JSON.toJSONString(address)); log.info("[findUserAssociationModelByUser]获取用户地址address:{}",
JSON.toJSONString(address));
bean.putAddressList(Collections.singletonList(address)); bean.putAddressList(Collections.singletonList(address));
} }
List<Contact> contacts = contactService.findByUserIdAndBizType(user.getId(), BizType.CASH, true); List<Contact> contacts = contactService.findByUserIdAndBizType(user.getId(), BizType.CASH,
true);
if (!Objects.isNull(contacts)) { if (!Objects.isNull(contacts)) {
bean.putContactList(contacts); bean.putContactList(contacts);
} }
return bean; return bean;
} }
@RequestMapping(path = "/user-association/search/userId", method = {RequestMethod.GET, RequestMethod.POST}) @RequestMapping(path = "/user-association/search/userId", method = {RequestMethod.GET,
public JsonResult findUserAssociationModelByUserId( @RequestParam(name = "userId", required = false) Long userId, RequestMethod.POST})
public JsonResult findUserAssociationModelByUserId(
@RequestParam(name = "userId", required = false) Long userId,
@RequestParam(name = "phoneNo", required = false) String phoneNo) { @RequestParam(name = "phoneNo", required = false) String phoneNo) {
boolean userIdOk = Objects.nonNull(userId) && userId > 0; boolean userIdOk = Objects.nonNull(userId) && userId > 0;
boolean phoneNoOk = ValidationUtil.validatePhoneNo(phoneNo); boolean phoneNoOk = ValidationUtil.validatePhoneNo(phoneNo);
if (!userIdOk && !phoneNoOk) { if (!userIdOk && !phoneNoOk) {
return JsonResult.buildErrorStateResult("params invalid", String.valueOf(userId).concat(":").concat(phoneNo)); return JsonResult.buildErrorStateResult("params invalid",
String.valueOf(userId).concat(":").concat(phoneNo));
} }
UserAssociationModel bean = null; UserAssociationModel bean = null;
User user = userIdOk ? userService.findById(userId) : userService.findByPhoneWithCache(phoneNo); User user = userIdOk ? userService.findById(userId) : userService.findByPhoneWithCache(phoneNo);
...@@ -935,7 +1026,8 @@ public class InnerController implements IBaseController { ...@@ -935,7 +1026,8 @@ public class InnerController implements IBaseController {
UserAssociation bean = new UserAssociation(); UserAssociation bean = new UserAssociation();
if (null != userDetail) { if (null != userDetail) {
Address address = addressService.findByUserId(userDetail.getUserId()); Address address = addressService.findByUserId(userDetail.getUserId());
List<Contact> contacts = contactService.findByUserIdAndBizType(userDetail.getUserId(), BizType.CASH, true); List<Contact> contacts = contactService.findByUserIdAndBizType(userDetail.getUserId(),
BizType.CASH, true);
UserExtInfo extInfo = userExtInfoService.findByUserId(userDetail.getUserId()); UserExtInfo extInfo = userExtInfoService.findByUserId(userDetail.getUserId());
bean.setUserId(userDetail.getUserId()); bean.setUserId(userDetail.getUserId());
bean.setPhoneNo(userDetail.getPhoneNo()); bean.setPhoneNo(userDetail.getPhoneNo());
...@@ -1007,7 +1099,8 @@ public class InnerController implements IBaseController { ...@@ -1007,7 +1099,8 @@ public class InnerController implements IBaseController {
return JsonResult.buildErrorStateResult("手机号格式错误", null); return JsonResult.buildErrorStateResult("手机号格式错误", null);
} }
WechatUserInfo wechatUserInfo = wechatService.findWechatUserInfoByPhoneNo(phoneNo); WechatUserInfo wechatUserInfo = wechatService.findWechatUserInfoByPhoneNo(phoneNo);
return JsonResult.buildSuccessResult(null, null == wechatUserInfo ? null : wechatUserInfo.getOpenId()); return JsonResult.buildSuccessResult(null,
null == wechatUserInfo ? null : wechatUserInfo.getOpenId());
} }
/** /**
...@@ -1036,12 +1129,13 @@ public class InnerController implements IBaseController { ...@@ -1036,12 +1129,13 @@ public class InnerController implements IBaseController {
// 禁用微信 // 禁用微信
wechatService.forbiddenUserWeChat(userId); wechatService.forbiddenUserWeChat(userId);
} }
applicationEventPublisher.publishEvent(new DisableActiveEvent(this,user)); applicationEventPublisher.publishEvent(new DisableActiveEvent(this, user));
return Objects.equals(enable, user.getEnable()); return Objects.equals(enable, user.getEnable());
} }
@RequestMapping("/user/spouse/save") @RequestMapping("/user/spouse/save")
public JsonResult saveSpouse(Long userId, MaritalStatus status, String spousePhone, String spouseName) { public JsonResult saveSpouse(Long userId, MaritalStatus status, String spousePhone,
String spouseName) {
if (userId == null || userId == 0) { if (userId == null || userId == 0) {
return JsonResult.buildErrorStateResult("用户不能为空", null); return JsonResult.buildErrorStateResult("用户不能为空", null);
} }
...@@ -1089,7 +1183,8 @@ public class InnerController implements IBaseController { ...@@ -1089,7 +1183,8 @@ public class InnerController implements IBaseController {
if (phones.size() <= MAX_SIZE) { if (phones.size() <= MAX_SIZE) {
List<User> users = userService.findByPhones(phones); List<User> users = userService.findByPhones(phones);
if (org.apache.commons.collections.CollectionUtils.isNotEmpty(users)) { if (org.apache.commons.collections.CollectionUtils.isNotEmpty(users)) {
return JsonResult.buildSuccessResult(null, users.stream().collect(Collectors.toMap(User::getPhoneNo, User::getId))); return JsonResult.buildSuccessResult(null,
users.stream().collect(Collectors.toMap(User::getPhoneNo, User::getId)));
} else { } else {
return JsonResult.buildSuccessResult(null, null); return JsonResult.buildSuccessResult(null, null);
} }
...@@ -1141,7 +1236,10 @@ public class InnerController implements IBaseController { ...@@ -1141,7 +1236,10 @@ public class InnerController implements IBaseController {
* 保存用户信息,其中地址信息和联系人信息为非必要条件;注意:如果同时提供了province和address字段则需要保证Address的完整 * 保存用户信息,其中地址信息和联系人信息为非必要条件;注意:如果同时提供了province和address字段则需要保证Address的完整
*/ */
@RequestMapping("/user/save_multi") @RequestMapping("/user/save_multi")
public JsonResult saveMulti(String registeredFrom, String channelId, String phoneNo, String name, String idNo, String provinceCode, String province, String cityCode, String city, String districtCode, String district, String address, String contacts, @RequestParam(defaultValue = "0", required = false) Long btRegisterChannelId) { public JsonResult saveMulti(String registeredFrom, String channelId, String phoneNo, String name,
String idNo, String provinceCode, String province, String cityCode, String city,
String districtCode, String district, String address, String contacts,
@RequestParam(defaultValue = "0", required = false) Long btRegisterChannelId) {
if (!NumberUtils.isDigits(registeredFrom)) { if (!NumberUtils.isDigits(registeredFrom)) {
return JsonResult.buildErrorStateResult("注册渠道异常.", null); return JsonResult.buildErrorStateResult("注册渠道异常.", null);
} }
...@@ -1212,7 +1310,8 @@ public class InnerController implements IBaseController { ...@@ -1212,7 +1310,8 @@ public class InnerController implements IBaseController {
} }
} }
} }
user = userRegisterService.register(Long.valueOf(registeredFrom), Long.valueOf(channelId), phoneNo, name, idNo, addressObj, contacts, contactList, btRegisterChannelId); user = userRegisterService.register(Long.valueOf(registeredFrom), Long.valueOf(channelId),
phoneNo, name, idNo, addressObj, contacts, contactList, btRegisterChannelId);
UserRet userRet = new UserRet(user); UserRet userRet = new UserRet(user);
return JsonResult.buildSuccessResult(null, userRet); return JsonResult.buildSuccessResult(null, userRet);
} }
...@@ -1228,9 +1327,7 @@ public class InnerController implements IBaseController { ...@@ -1228,9 +1327,7 @@ public class InnerController implements IBaseController {
} }
/** /**
* 技术网关 - 验证手机号和验证码是否匹配 * 技术网关 - 验证手机号和验证码是否匹配 仅供可信任的内部服务调用,不执行限次记数、销毁等安全策略 注意:只使用于快速登录类似场景调用
* 仅供可信任的内部服务调用,不执行限次记数、销毁等安全策略
* 注意:只使用于快速登录类似场景调用
* *
* @param phoneNo 手机号 * @param phoneNo 手机号
* @param verificationCode 验证码(短信/语音) * @param verificationCode 验证码(短信/语音)
...@@ -1245,7 +1342,10 @@ public class InnerController implements IBaseController { ...@@ -1245,7 +1342,10 @@ public class InnerController implements IBaseController {
@RequestParam(required = false, defaultValue = "xyqb") String key, @RequestParam(required = false, defaultValue = "xyqb") String key,
@RequestParam(required = false) Long btRegisterChannelId, @RequestParam(required = false) Long btRegisterChannelId,
@RequestParam(required = false) String dimension) { @RequestParam(required = false) String dimension) {
log.info("/innerapi/verifyPhoneAndCode -> phoneNo:{},verificationCode:{},channelId:{},appChannel:{},createdFrom:{},btRegisterChannelId:{},key:{},dimension:{}", phoneNo, verificationCode, channelId, appChannel, createdFrom, btRegisterChannelId, key, dimension); log.info(
"/innerapi/verifyPhoneAndCode -> phoneNo:{},verificationCode:{},channelId:{},appChannel:{},createdFrom:{},btRegisterChannelId:{},key:{},dimension:{}",
phoneNo, verificationCode, channelId, appChannel, createdFrom, btRegisterChannelId, key,
dimension);
// 验证接入方 // 验证接入方
Merchant merchant = merchantService.findMerchantByName(key); Merchant merchant = merchantService.findMerchantByName(key);
if (merchant == null) { if (merchant == null) {
...@@ -1273,7 +1373,8 @@ public class InnerController implements IBaseController { ...@@ -1273,7 +1373,8 @@ public class InnerController implements IBaseController {
} }
// 用户不存在时自动注册 // 用户不存在时自动注册
if (Objects.isNull(user)) { if (Objects.isNull(user)) {
user = userRegisterService.register(phoneNo, channelId, createdFrom, appChannel, btRegisterChannelId, dimension); user = userRegisterService.register(phoneNo, channelId, createdFrom, appChannel,
btRegisterChannelId, dimension);
// 注册失败 // 注册失败
if (Objects.isNull(user)) { if (Objects.isNull(user)) {
return JsonResult.buildErrorStateResult("用户不存在", ""); return JsonResult.buildErrorStateResult("用户不存在", "");
...@@ -1358,51 +1459,104 @@ public class InnerController implements IBaseController { ...@@ -1358,51 +1459,104 @@ public class InnerController implements IBaseController {
} }
/** /**
* 激活/启用 用户 * 激活/启用 用户 -- 供内部系统免密调用
* -- 供内部系统免密调用
* *
* @param userId * @param userId
* @return * @return
*/ */
@RequestMapping(path = "/user/active", method = RequestMethod.POST) @RequestMapping(path = "/user/active", method = RequestMethod.POST)
public JsonResult activeUser(Long userId) { public JsonResult activeUser(Long userId,
@RequestHeader(value = "Access-Token", required = false) String accessToken) {
boolean flushed = flushUserStatus(userId, true); boolean flushed = flushUserStatus(userId, true);
UserDisableRecord userDisableRecord = new UserDisableRecord();
userDisableRecord.setUserId(userId);
if (StringUtils.isNotEmpty(accessToken)) {
LoginUserContext loginUserContext = getLoginUserContextFromStms(accessToken);
userDisableRecord.setCreatedBy(loginUserContext.getUserName());
userDisableRecord.setUpdatedBy(loginUserContext.getUserName());
}
userDisableRecord.setOperation_type((short) 1);
applicationEventPublisher.publishEvent(new UserDisableRecordEvent(this, userDisableRecord));
log.info("激活/启用 用户,userId:[{}],result:[{}]", userId, flushed); log.info("激活/启用 用户,userId:[{}],result:[{}]", userId, flushed);
return JsonResult.buildSuccessResult("用户已激活.", flushed); return JsonResult.buildSuccessResult("用户已激活.", flushed);
} }
/** /**
* 注销/禁用 用户 * 注销/禁用 用户 -- 供内部系统免密调用
* -- 供内部系统免密调用
* *
* @param userId * @param userId
* @return * @return
*/ */
@RequestMapping(path = "/user/disable", method = RequestMethod.POST) @RequestMapping(path = "/user/disable", method = RequestMethod.POST)
public JsonResult forbiddenUser(Long userId) { public JsonResult forbiddenUser(Long userId,
@Length(max = 10, message = "原因不能大于10个字符") String reason,
@RequestHeader(value = "Access-Token", required = false) String accessToken) {
boolean flushed = flushUserStatus(userId, false); boolean flushed = flushUserStatus(userId, false);
UserDisableRecord userDisableRecord = new UserDisableRecord();
userDisableRecord.setUserId(userId);
if (StringUtils.isNotEmpty(accessToken)) {
LoginUserContext loginUserContext = getLoginUserContextFromStms(accessToken);
userDisableRecord.setCreatedBy(loginUserContext.getUserName());
userDisableRecord.setUpdatedBy(loginUserContext.getUserName());
}
userDisableRecord.setReason(reason);
userDisableRecord.setOperation_type((short) 0);
applicationEventPublisher.publishEvent(new UserDisableRecordEvent(this, userDisableRecord));
log.info("注销/禁用 用户,userId:[{}],result:[{}]", userId, flushed); log.info("注销/禁用 用户,userId:[{}],result:[{}]", userId, flushed);
return JsonResult.buildSuccessResult("用户已禁用.", flushed); return JsonResult.buildSuccessResult("用户已禁用.", flushed);
} }
/** /**
* 重置用户实名信息接口 * 根据用户id获取操作用户冻结记录列表
* -- 供内部系统免密调用 *
* @param userId 用户id
* @return List<UserDisableRecord>
*/
@RequestMapping(path = "/user/records/{userId}", method = RequestMethod.POST)
public JsonResult disableRecordList(@PathVariable("userId") Long userId,
@RequestParam(value = "page", defaultValue = "0") Integer page,
@RequestParam(value = "size", defaultValue = "20") Integer size) {
Pageable pageable = new PageRequest(page, size);
return JsonResult.buildSuccessResultGeneric(
iUserDisableRecordRepository.findByUserIdOrderByCreatedAtDesc(
userId, pageable).map(UserDisableRecordModel::from));
}
private LoginUserContext getLoginUserContextFromStms(String accessToken) {
LoginUserContext loginUserContext = new LoginUserContext();
OauthResult oauthResult = stmsRemoteService.checkToken(accessToken);
if (oauthResult == null || !Objects.equals(2000,
oauthResult.getCode())) {
throw new UserNotExistException("stms用户异常,请检查token");
} else {
LinkedHashMap onlineUser = (LinkedHashMap) oauthResult.getData();
loginUserContext.setUserId(onlineUser.get("id").toString());
loginUserContext.setUserName(String.valueOf(onlineUser.get("account")));
}
return loginUserContext;
}
/**
* 重置用户实名信息接口 -- 供内部系统免密调用
* *
* @param userId - 用户主键 * @param userId - 用户主键
* @param idNo - 身份证号 * @param idNo - 身份证号
* @param name - 姓名 * @param name - 姓名
*/ */
@RequestMapping(path = "/userDetail/reset/{userId}", method = RequestMethod.POST) @RequestMapping(path = "/userDetail/reset/{userId}", method = RequestMethod.POST)
public JsonResult resetName(@PathVariable("userId") Long userId, @RequestParam("name") String name, @RequestParam("idNo") String idNo) { public JsonResult resetName(@PathVariable("userId") Long userId,
@RequestParam("name") String name, @RequestParam("idNo") String idNo) {
log.info("重置用户实名信息 userId:{},name:{},idNo:{}", userId, name, idNo); log.info("重置用户实名信息 userId:{},name:{},idNo:{}", userId, name, idNo);
if (Objects.nonNull(userId) && ValidationUtil.validateChinese(name)) { if (Objects.nonNull(userId) && ValidationUtil.validateChinese(name)) {
try { try {
User user = userService.findById(userId); User user = userService.findById(userId);
int rows = userDetailService.updateNameAndIdCard(name, idNo, user.getPhoneNo()); int rows = userDetailService.updateNameAndIdCard(name, idNo, user.getPhoneNo());
log.info("重置用户实名信息,userId:{},name:{},idNo:{},result:[{}]", userId, name, idNo, rows); log.info("重置用户实名信息,userId:{},name:{},idNo:{},result:[{}]", userId, name, idNo,
rows);
if (rows > 0) { if (rows > 0) {
return JsonResult.buildSuccessResult("用户实名信息已重置.", name.concat(",").concat(idNo).concat(",").concat(userId.toString())); return JsonResult.buildSuccessResult("用户实名信息已重置.",
name.concat(",").concat(idNo).concat(",").concat(userId.toString()));
} }
} catch (Exception e) { } catch (Exception e) {
log.error("用户实名信息重置失败,userId[{}],name[{}],err:[{}]", userId, name, e); log.error("用户实名信息重置失败,userId[{}],name[{}],err:[{}]", userId, name, e);
...@@ -1414,11 +1568,11 @@ public class InnerController implements IBaseController { ...@@ -1414,11 +1568,11 @@ public class InnerController implements IBaseController {
} }
/** /**
* 重置密码接口 * 重置密码接口 -- 供内部系统免密调用
* -- 供内部系统免密调用
*/ */
@RequestMapping(path = "/user/password/reset", method = RequestMethod.POST) @RequestMapping(path = "/user/password/reset", method = RequestMethod.POST)
public JsonResult resetPassword(@RequestParam("phone") String phone, @RequestParam(required = false) String password) { public JsonResult resetPassword(@RequestParam("phone") String phone,
@RequestParam(required = false) String password) {
if (ValidationUtil.validatePhoneNo(phone)) { if (ValidationUtil.validatePhoneNo(phone)) {
// 默认重置的密码是123456 // 默认重置的密码是123456
if (StringUtils.isBlank(password)) { if (StringUtils.isBlank(password)) {
...@@ -1440,11 +1594,11 @@ public class InnerController implements IBaseController { ...@@ -1440,11 +1594,11 @@ public class InnerController implements IBaseController {
} }
/** /**
* 修改实名信息接口 * 修改实名信息接口 -- 供内部人员使用(例如绝影)
* -- 供内部人员使用(例如绝影)
*/ */
@RequestMapping("/updateIdCard") @RequestMapping("/updateIdCard")
public JsonResult updateIdCard(@RequestParam(required = false) String name, @RequestParam(required = false) String idNo, public JsonResult updateIdCard(@RequestParam(required = false) String name,
@RequestParam(required = false) String idNo,
@RequestParam String phoneNo, @RequestParam String reason, @RequestParam String content) { @RequestParam String phoneNo, @RequestParam String reason, @RequestParam String content) {
//密文 //密文
if (null != content) { if (null != content) {
...@@ -1467,9 +1621,11 @@ public class InnerController implements IBaseController { ...@@ -1467,9 +1621,11 @@ public class InnerController implements IBaseController {
log.info("重置用户实名信息 phoneNo:{},name:{},idNo:{}", phoneNo, name, idNo); log.info("重置用户实名信息 phoneNo:{},name:{},idNo:{}", phoneNo, name, idNo);
try { try {
int rows = userDetailService.updateNameAndIdCard(name, idNo, phoneNo); int rows = userDetailService.updateNameAndIdCard(name, idNo, phoneNo);
log.info("重置用户实名信息,phoneNo:{},name:{},idNo:{},result:[{}],操作的理由reason:{}", phoneNo, name, idNo, rows, reason); log.info("重置用户实名信息,phoneNo:{},name:{},idNo:{},result:[{}],操作的理由reason:{}",
phoneNo, name, idNo, rows, reason);
if (rows > 0) { if (rows > 0) {
return JsonResult.buildSuccessResult("用户实名信息已重置.", phoneNo.concat(",").concat(name).concat(",").concat(idNo)); return JsonResult.buildSuccessResult("用户实名信息已重置.",
phoneNo.concat(",").concat(name).concat(",").concat(idNo));
} }
} catch (Exception e) { } catch (Exception e) {
log.error("用户实名信息重置失败,phoneNo[{}],name[{}],err:[{}]", phoneNo, name, e); log.error("用户实名信息重置失败,phoneNo[{}],name[{}],err:[{}]", phoneNo, name, e);
...@@ -1478,11 +1634,11 @@ public class InnerController implements IBaseController { ...@@ -1478,11 +1634,11 @@ public class InnerController implements IBaseController {
} }
/** /**
* 重置密码接口 * 重置密码接口 -- 供内部人员使用(例如绝影)
* -- 供内部人员使用(例如绝影)
*/ */
@RequestMapping("/user/password/reset/{key}/{phone}") @RequestMapping("/user/password/reset/{key}/{phone}")
public JsonResult resetPasswordByKey(@PathVariable("key") String key, @PathVariable("phone") String phone) { public JsonResult resetPasswordByKey(@PathVariable("key") String key,
@PathVariable("phone") String phone) {
log.info("密码重置请求,phone:[{}]", phone); log.info("密码重置请求,phone:[{}]", phone);
if (!RESET_PWD_TOKEN.equalsIgnoreCase(key)) { if (!RESET_PWD_TOKEN.equalsIgnoreCase(key)) {
log.error("密码重置失败,key错误!@!,phone:[{}]", phone); log.error("密码重置失败,key错误!@!,phone:[{}]", phone);
...@@ -1492,8 +1648,7 @@ public class InnerController implements IBaseController { ...@@ -1492,8 +1648,7 @@ public class InnerController implements IBaseController {
} }
/** /**
* 注销/禁用 用户 * 注销/禁用 用户 -- 供内部人员使用(例如绝影)
* -- 供内部人员使用(例如绝影)
* *
* @param phoneNo * @param phoneNo
* @param enable * @param enable
...@@ -1513,7 +1668,8 @@ public class InnerController implements IBaseController { ...@@ -1513,7 +1668,8 @@ public class InnerController implements IBaseController {
} }
String str = AesUtil.decryptAfterBase64Decode(content, Constants.AES_KEY); String str = AesUtil.decryptAfterBase64Decode(content, Constants.AES_KEY);
if (null == str || !str.equals(phoneNo)) { if (null == str || !str.equals(phoneNo)) {
log.info("[forbiddenUserOrNot][禁用或激活用户]:解密有误, phoneNo:{},aes:{}", phoneNo, AesUtil.encryptAndBase64Encode(phoneNo, Constants.AES_KEY)); log.info("[forbiddenUserOrNot][禁用或激活用户]:解密有误, phoneNo:{},aes:{}", phoneNo,
AesUtil.encryptAndBase64Encode(phoneNo, Constants.AES_KEY));
return JsonResult.buildErrorStateResult("解密有误", null); return JsonResult.buildErrorStateResult("解密有误", null);
} }
if (!ValidationUtil.validatePhoneNo(phoneNo)) { if (!ValidationUtil.validatePhoneNo(phoneNo)) {
...@@ -1529,13 +1685,14 @@ public class InnerController implements IBaseController { ...@@ -1529,13 +1685,14 @@ public class InnerController implements IBaseController {
// 禁用微信 // 禁用微信
wechatService.forbiddenUserWeChat(user.getId()); wechatService.forbiddenUserWeChat(user.getId());
} }
log.info("[forbiddenUserOrNot][禁用或激活用户]:理由:reason:{},手机号phoneNo:{},受影响的行数affectedRows:{}", reason, phoneNo, affectedRows); log.info(
"[forbiddenUserOrNot][禁用或激活用户]:理由:reason:{},手机号phoneNo:{},受影响的行数affectedRows:{}",
reason, phoneNo, affectedRows);
return JsonResult.buildSuccessResult("用户禁用或重启成功成功", affectedRows); return JsonResult.buildSuccessResult("用户禁用或重启成功成功", affectedRows);
} }
/** /**
* 清除微信关联 * 清除微信关联 -- 供内部人员使用(例如绝影)
* -- 供内部人员使用(例如绝影)
* *
* @param userId * @param userId
* @param reason * @param reason
...@@ -1543,7 +1700,8 @@ public class InnerController implements IBaseController { ...@@ -1543,7 +1700,8 @@ public class InnerController implements IBaseController {
* @return * @return
*/ */
@RequestMapping("/forbiddenUserWeChat") @RequestMapping("/forbiddenUserWeChat")
public JsonResult forbiddenUserWeChat(@RequestParam Long userId, @RequestParam String reason, @RequestParam String content) { public JsonResult forbiddenUserWeChat(@RequestParam Long userId, @RequestParam String reason,
@RequestParam String content) {
if (StringUtils.isBlank(reason) || null == userId || userId <= 0) { if (StringUtils.isBlank(reason) || null == userId || userId <= 0) {
return JsonResult.buildErrorStateResult("参数有误", null); return JsonResult.buildErrorStateResult("参数有误", null);
} }
...@@ -1556,12 +1714,13 @@ public class InnerController implements IBaseController { ...@@ -1556,12 +1714,13 @@ public class InnerController implements IBaseController {
return JsonResult.buildErrorStateResult("解密有误", null); return JsonResult.buildErrorStateResult("解密有误", null);
} }
int affectedRows = wechatService.forbiddenUserWeChat(userId); int affectedRows = wechatService.forbiddenUserWeChat(userId);
log.info("用户微信禁用,userId:{},禁用的原因reason:{},受影响的行数affectedRows:{}", userId, reason, affectedRows); log.info("用户微信禁用,userId:{},禁用的原因reason:{},受影响的行数affectedRows:{}", userId,
reason, affectedRows);
return JsonResult.buildSuccessResult("用户禁用微信成功", affectedRows); return JsonResult.buildSuccessResult("用户禁用微信成功", affectedRows);
} }
// @RequestMapping("/clean") // @RequestMapping("/clean")
public JsonResult clean(){ public JsonResult clean() {
cleanDataService.cleanData(); cleanDataService.cleanData();
return JsonResult.buildSuccessResult("已经开始清洗"); return JsonResult.buildSuccessResult("已经开始清洗");
} }
...@@ -1587,11 +1746,12 @@ public class InnerController implements IBaseController { ...@@ -1587,11 +1746,12 @@ public class InnerController implements IBaseController {
/** /**
* 测试定时删除注销记录 * 测试定时删除注销记录
*
* @return * @return
*/ */
@PostMapping("/user/deleteDeregister") @PostMapping("/user/deleteDeregister")
public JsonResult<?> deleteDeregister() { public JsonResult<?> deleteDeregister() {
userDeregisterService.executeTask(); userDeregisterService.executeTask();
return JsonResult.buildSuccessResult("用户销户成功1231" , true); return JsonResult.buildSuccessResult("用户销户成功1231", true);
} }
} }
\ No newline at end of file
...@@ -10,6 +10,7 @@ import java.util.List; ...@@ -10,6 +10,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import javax.annotation.Resource; import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.hibernate.validator.constraints.Length;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisher;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
...@@ -18,6 +19,7 @@ import org.springframework.web.bind.annotation.PostMapping; ...@@ -18,6 +19,7 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
/** /**
......
package cn.quantgroup.xyqb.entity;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import lombok.Data;
@Data
@Entity
@Table(name = "user_disable_record")
public class UserDisableRecord extends BaseEntity implements Serializable {
@Column(name = "user_id")
private Long userId;
@Column(name="operation_type")
private short operation_type;
@Column(name="reason")
private String reason;
@Column(name="created_by")
private String createdBy;
@Column(name = "updated_by")
private String updatedBy;
}
package cn.quantgroup.xyqb.event;
import cn.quantgroup.xyqb.entity.UserDisableRecord;
import lombok.Getter;
import org.springframework.context.ApplicationEvent;
@Getter
public class UserDisableRecordEvent extends ApplicationEvent {
private UserDisableRecord userDisableRecord;
public UserDisableRecordEvent(Object source) {
super(source);
}
public UserDisableRecordEvent(Object source, UserDisableRecord userDisableRecord) {
super(source);
this.userDisableRecord = userDisableRecord;
}
}
\ No newline at end of file
package cn.quantgroup.xyqb.event;
import cn.quantgroup.xyqb.repository.IUserDisableRecordRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
@Component
@Async
public class UserDisableRecordListener implements ApplicationListener<UserDisableRecordEvent> {
@Autowired
private IUserDisableRecordRepository iUserDisableRecordRepository;
@Override
public void onApplicationEvent(UserDisableRecordEvent userDisableRecordEvent) {
iUserDisableRecordRepository.save(userDisableRecordEvent.getUserDisableRecord());
}
}
\ No newline at end of file
package cn.quantgroup.xyqb.model;
import lombok.Data;
import org.springframework.stereotype.Component;
@Component
@Data
public class LoginUserContext {
private String userId;
private String userName;
}
package cn.quantgroup.xyqb.model;
import lombok.Data;
@Data
public class OauthResult implements java.io.Serializable {
private Integer code;
/** 业务异常相应码,前端需要依据这个做相应处理 **/
private Integer businessCode;
/** 消息 **/
private String msg;
/** 详细消息 **/
private String detail;
/** 数据 **/
private Object data;
}
package cn.quantgroup.xyqb.model;
import cn.quantgroup.xyqb.entity.UserDisableRecord;
import java.time.format.DateTimeFormatter;
import lombok.Data;
/**
* 只是为了兼容时间格式化问题,后续用户中心升级后,该model不需要
*/
@Data
public class UserDisableRecordModel{
private Long id;
private Long userId;
private short operation_type;
private String reason;
private String createdBy;
private String updatedBy;
private String createdAt;
private String updatedAt;
public static UserDisableRecordModel from(UserDisableRecord userDisableRecord){
UserDisableRecordModel userDisableRecordModel = new UserDisableRecordModel();
userDisableRecordModel.setUserId(userDisableRecord.getUserId());
userDisableRecordModel.setId(userDisableRecord.getId());
userDisableRecordModel.setReason(userDisableRecord.getReason());
userDisableRecordModel.setOperation_type(userDisableRecord.getOperation_type());
userDisableRecordModel.setCreatedAt(userDisableRecord.getCreatedAt().toLocalDateTime().format(
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
userDisableRecordModel.setUpdatedAt(userDisableRecord.getUpdatedAt().toLocalDateTime().format(
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
userDisableRecordModel.setCreatedBy(userDisableRecord.getCreatedBy());
userDisableRecordModel.setUpdatedBy(userDisableRecord.getUpdatedBy());
return userDisableRecordModel;
}
}
package cn.quantgroup.xyqb.remote;
import cn.quantgroup.xyqb.model.OauthResult;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestHeader;
@FeignClient(name = "stms", url = "${stms.https}")
public interface StmsRemoteService {
@PostMapping("/v2/oauth/currentuserinfo")
OauthResult checkToken(@RequestHeader("Access-Token") String accessToken);
}
package cn.quantgroup.xyqb.repository;
import cn.quantgroup.xyqb.entity.UserDisableRecord;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
public interface IUserDisableRecordRepository
extends JpaRepository<UserDisableRecord, Long>, JpaSpecificationExecutor<UserDisableRecord> {
Page<UserDisableRecord> findByUserIdOrderByCreatedAtDesc(Long userId, Pageable pageable);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment