package com.nova.sankuai.service.impl;
|
|
|
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.util.IdUtil;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.nova.sankuai.domain.dto.*;
|
import com.nova.sankuai.domain.entity.Customer;
|
import com.nova.sankuai.domain.entity.CustomerUser;
|
import com.nova.sankuai.domain.entity.SysUser;
|
import com.nova.sankuai.domain.enums.*;
|
import com.nova.sankuai.domain.vo.WelcomePageHistory;
|
import com.nova.sankuai.domain.vo.WelcomePageVo;
|
import com.nova.sankuai.domain.vo.common.MessageCode;
|
import com.nova.sankuai.domain.vo.sysuser.AdminVo;
|
import com.nova.sankuai.domain.vo.sysuser.MechanismConfigVo;
|
import com.nova.sankuai.domain.vo.sysuser.MechanismVo;
|
import com.nova.sankuai.domain.vo.sysuser.StaffVo;
|
import com.nova.sankuai.infra.config.CommonException;
|
import com.nova.sankuai.infra.constants.Constants;
|
import com.nova.sankuai.infra.mapper.CustomerMapper;
|
import com.nova.sankuai.infra.mapper.CustomerUserMapper;
|
import com.nova.sankuai.infra.mapper.DeductionRecordMapper;
|
import com.nova.sankuai.infra.mapper.SysUserMapper;
|
import com.nova.sankuai.infra.utils.*;
|
import com.nova.sankuai.security.JwtUtils;
|
import com.nova.sankuai.security.UserDetail;
|
import com.nova.sankuai.security.UserDetailUtil;
|
import com.nova.sankuai.service.*;
|
import lombok.AllArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import javax.servlet.http.HttpServletRequest;
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.stream.Collectors;
|
|
/**
|
* @author weikangdi
|
*/
|
@Service
|
@AllArgsConstructor
|
@Slf4j
|
public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements ISysUserService {
|
|
private final JwtUtils jwtUtils;
|
|
private final SysUserMapper sysUserMapper;
|
|
private final MessageSendUtil messageSendUtil;
|
|
private final ICustomerService customerService;
|
|
private final PageUtil pageUtil;
|
|
private final DeductionRecordMapper deductionRecordMapper;
|
|
private final UserDetailUtil userDetailUtil;
|
|
private final IRoleUserService roleUserService;
|
|
private final ICustomerUserService customerUserService;
|
|
private static final Logger logger = LoggerFactory.getLogger("loginLogger");
|
|
private final IChannelMechanismConfigService channelMechanismConfigService;
|
|
private static final Logger logout = LoggerFactory.getLogger("logoutLogger");
|
|
private final CustomerMapper customerMapper;
|
|
private final CustomerUserMapper customerUserMapper;
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void add(SysUser sysUser) {
|
checkUser(sysUser);
|
sysUser.setCreationDate(new Date());
|
sysUser.setProduct(sysUser.getCompanyName());
|
sysUser.setAmountLimit(100000);
|
sysUser.setAnnualInterestRate(17.42);
|
sysUser.setServiceSpeed(0);
|
save(sysUser);
|
roleUserService.setDefaultRole(sysUser.getId(), sysUser.getType());
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void edit(SysUser sysUser) {
|
SysUser user = getById(sysUser.getId());
|
if (user == null) {
|
throw new CommonException("该用户不存在");
|
}
|
checkUser(sysUser);
|
updateById(sysUser);
|
}
|
|
private void checkUser(SysUser sysUser) {
|
SysUser sysUserDb = lambdaQuery().eq(SysUser::getUserPhone, sysUser.getUserPhone()).one();
|
if (sysUserDb != null) {
|
if (sysUser.getId() == null) {
|
throw new CommonException("该手机号已经被使用");
|
} else if (sysUser.getId() != null && !sysUserDb.getId().equals(sysUser.getId())) {
|
throw new CommonException("该手机号已经被使用");
|
}
|
}
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void invalidUser(Long id, Integer status) {
|
SysUser user = getById(id);
|
if (user == null) {
|
throw new CommonException("该用户不存在");
|
}
|
user.setStatus(status);
|
updateById(user);
|
}
|
|
|
@Override
|
public IPage<MechanismVo> page(SysUserPageDto sysUser, PageRequest pageRequest) {
|
Page<SysUser> sysUserPage = new Page<>(pageRequest.getPageNo(), pageRequest.getPageSize());
|
IPage<MechanismVo> result = sysUserMapper.pageModel(sysUserPage, sysUser);
|
List<MechanismVo> records = new ArrayList<>();
|
for (MechanismVo record : result.getRecords()) {
|
record.setProductType(ProductTypeEnum.getValues(record.getProductType()));
|
record.setProductAttributes(ProductAttributesEnum.getValues(record.getProductAttributes()));
|
record.setProfessionInfo(ProfessionInfoEnum.getValues(record.getProfessionInfo()));
|
records.add(record);
|
}
|
result.setRecords(records);
|
return result;
|
}
|
|
@Override
|
public MechanismVo selectOne(Long id) {
|
SysUser sysUser = lambdaQuery().eq(SysUser::getId, id)
|
.eq(SysUser::getType, UserTypeEnum.USER.getCode()).one();
|
if (sysUser == null) {
|
throw new CommonException("该用户不存在");
|
}
|
return MechanismVo.parse(sysUser);
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public JSONObject smsLogin(LoginUserDto userDto) {
|
JSONObject params = getJsonObject(userDto, false);
|
return params;
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public JSONObject otherSmsLogin(LoginUserDto userDto) {
|
JSONObject params = getJsonObject(userDto, true);
|
|
return params;
|
}
|
|
private JSONObject getJsonObject(LoginUserDto userDto, boolean isOther) {
|
// 于2022-10-20修改:新增了测试手机 13182271165 是测试号 13828761749 是登录后台超级管理员,密码 686868
|
if (("13868686868".equals(userDto.getPhone()) || "13182271165".equals(userDto.getPhone())
|
|| "13828761749".equals(userDto.getPhone()) || "15289944944".equals(userDto.getPhone())
|
|| "15289944674".equals(userDto.getPhone()) || "13520295299".equals(userDto.getPhone())
|
|| "15108937627".equals(userDto.getPhone()) || "15501883525".equals(userDto.getPhone())
|
|| userDto.getPhone().contains("8888")
|
)
|
&& "686868".equals(userDto.getVerificationCode())) {
|
logger.info("使用测试账号登录" + userDto);
|
} else if (!Constants.SANDBOX_KEY.equals(userDto.getAppId())) {
|
MessageCodeUtil.checkCode(userDto.getPhone(), userDto.getVerificationCode());
|
}
|
UserDetail userDetail = null;
|
|
boolean hasRecord = false;// 用来专门处理小凌登录用的,别的用不到
|
if (SourceTypeEnum.ADMIN.getCode().equals(userDto.getSource())) {
|
SysUser sysUser = lambdaQuery().eq(SysUser::getUserPhone, userDto.getPhone()).eq(SysUser::getDefaultFlag, 0).one();
|
if (sysUser != null) {
|
if (Constants.UserStatus.DISABLE.equals(sysUser.getStatus())) {
|
throw new CommonException("该账号已经被禁用");
|
}
|
userDetail = userDetailUtil.parse(sysUser);
|
sysUser.setLastLoginTime(new Date());
|
saveOrUpdate(sysUser);
|
}
|
} else {
|
CustomerUser customerUser = customerUserService.getUser(userDto);
|
|
if (isOther) {
|
// 判断是否有记录
|
Customer user = customerService.getUser(userDto);
|
hasRecord = user != null ? true : false;
|
}
|
|
if (userDto.getLoginSource() != null && CustomerUser.H5 == userDto.getLoginSource()) {
|
customerUser.setH5LastUpdatedDate(new Date());
|
customerUserService.update(Wrappers.<CustomerUser>lambdaUpdate()
|
.set(CustomerUser::getH5LastUpdatedDate, customerUser.getH5LastUpdatedDate())
|
.eq(CustomerUser::getId, customerUser.getId()));
|
} else if (userDto.getLoginSource() != null && CustomerUser.APP == userDto.getLoginSource()){
|
customerUser.setAppLastUpdatedDate(new Date());
|
customerUserService.update(Wrappers.<CustomerUser>lambdaUpdate()
|
.set(CustomerUser::getAppLastUpdatedDate, customerUser.getAppLastUpdatedDate())
|
.eq(CustomerUser::getId, customerUser.getId()));
|
}
|
userDetail = userDetailUtil.parseCustomer(customerUser);
|
}
|
if (userDetail == null) {
|
throw new CommonException("该账号不存在");
|
}
|
String token = jwtUtils.generateToken(userDetail);
|
UserUtil.setUser(token, userDetail);
|
JSONObject params = userDetailUtil.getUserJson(userDetail, token);
|
MessageCodeUtil.CODE_LIST.remove(userDto.getPhone());
|
|
// 若是专门给小凌登录用的
|
if (isOther) {
|
params.put("hasRecord", hasRecord);
|
}
|
return params;
|
}
|
|
@Override
|
public void getCode(String phone, Integer source, String ip) {
|
if (SourceTypeEnum.ADMIN.getCode().equals(source)) {
|
SysUser sysUser = lambdaQuery().eq(SysUser::getUserPhone, phone).one();
|
if (sysUser == null) {
|
throw new CommonException("该账号不存在");
|
}
|
}
|
logger.info("发送验证码" + phone);
|
boolean verify = MessageCodeUtil.sendVerify(phone, ip, logger);
|
logger.info("发送验证码校验" + verify);
|
if (!verify) {
|
return;
|
}
|
MessageCode messageCode = MessageCodeUtil.createCode(phone);
|
MessageCodeUtil.setCode(phone, messageCode);
|
MessageCodeUtil.setIpVerify(phone, ip);
|
MessageCodeUtil.setPhoneVerify(phone, ip);
|
boolean success = messageSendUtil.sendCode(phone, messageCode.getCode(), source, ip);
|
if (!success) {
|
throw new CommonException("验证码发送失败");
|
}
|
}
|
|
@Override
|
public WelcomePageVo welcomePage(Long userId) {
|
WelcomePageVo pageVo = sysUserMapper.welcomePage(userId);
|
Double expendAmount = deductionRecordMapper.getAllExpendAmount(userId);
|
pageVo.setExpendAmount(expendAmount);
|
pageVo.setAvailableAmount(pageVo.getUseAmount() - pageVo.getExpendAmount());
|
pageVo.setGiftAmount(pageVo.getUseAmount() - pageVo.getRechargeAmount());
|
Integer count = customerService.lambdaQuery().eq(Customer::getMechanismId, userId).count();
|
pageVo.setCustomerCount(count != null ? count : 0);
|
return pageVo;
|
}
|
|
@Override
|
public IPage<WelcomePageHistory> welcomePageList(UserDetail user, WelcomePageDto pageDto, PageRequest pageRequest) {
|
if (pageDto.getStartDate() == null && pageDto.getEndDate() == null) {
|
pageDto.setEndDate(DateUtil.endOfDay(new Date()));
|
pageDto.setStartDate(DateUtil.beginOfDay(DateUtil.offsetDay(new Date(), -5)));
|
}
|
return deductionRecordMapper.welcomePageList(pageUtil.getPage(pageRequest), pageDto, user.getId());
|
}
|
|
@Override
|
public IPage<StaffVo> pageStaff(StaffDto staffDto, PageRequest pageRequest) {
|
Page<SysUser> page = new Page<>(pageRequest.getPageNo(), pageRequest.getPageSize());
|
return sysUserMapper.pageStaff(page, staffDto);
|
}
|
|
@Override
|
public IPage<AdminVo> pageAdmin(AdminDto adminDto, PageRequest pageRequest) {
|
Page<SysUser> page = new Page<>(pageRequest.getPageNo(), pageRequest.getPageSize());
|
return sysUserMapper.pageAdmin(page, adminDto);
|
}
|
|
@Override
|
public IPage<SysUserDto> pageSysUser(SysUserDto sysUserDto, PageRequest pageRequest) {
|
Page<SysUser> page = new Page<>(pageRequest.getPageNo(), pageRequest.getPageSize());
|
return sysUserMapper.pageSysUser(page, sysUserDto);
|
}
|
|
@Override
|
public IPage<MechanismConfigVo> pageMechanismConfig(MechanismConfigPageDto pageDto, PageRequest pageRequest) {
|
Page<SysUser> sysUserPage = new Page<>(pageRequest.getPageNo(), pageRequest.getPageSize());
|
return sysUserMapper.pageMechanismConfig(sysUserPage, pageDto);
|
}
|
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void editMechanismConfig(MechanismConfigVo configVo) {
|
SysUser sysUser = getById(configVo.getMechanismId());
|
if (sysUser == null) {
|
throw new CommonException("机构不存在");
|
}
|
sysUser.setProduct(configVo.getProduct());
|
sysUser.setIconUrl(configVo.getIconUrl());
|
sysUser.setAmountLimit(configVo.getAmountLimit());
|
sysUser.setAnnualInterestRate(configVo.getAnnualInterestRate());
|
sysUser.setServiceSpeed(configVo.getServiceSpeed());
|
updateById(sysUser);
|
}
|
|
@Override
|
public List<MechanismVo> getAssignableMechanism() {
|
return sysUserMapper.getAssignableMechanism();
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void editMechanism(MechanismDto mechanismDto) {
|
SysUser sysUser = mechanismDto.parseUser(mechanismDto);
|
SysUser user = getById(sysUser.getId());
|
if (user == null) {
|
throw new CommonException("该用户不存在");
|
}
|
checkUser(sysUser);
|
updateById(sysUser);
|
channelMechanismConfigService.updateConfig(mechanismDto);
|
}
|
|
@Override
|
public MechanismVo getMechanismById(Long mechanismId) {
|
MechanismVo result = sysUserMapper.selectMechanismById(mechanismId);
|
List<Long> channelIds = channelMechanismConfigService.getChannelsByMechanismId(result.getId());
|
result.setChannelIds(channelIds);
|
return result;
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public String logoutUser(HttpServletRequest request) {
|
String logNumber = IdUtil.randomUUID();
|
String token = request.getHeader("Authorization");
|
UserDetail userDetail = UserUtil.getUser(token);
|
if (userDetail == null) {
|
throw new CommonException("用户Token无效");
|
}
|
logout.info("日志编号" + logNumber + "注销用户开始:手机号为:{}", userDetail.getPhone());
|
CustomerUser customerUser = customerUserService.getOne(new LambdaQueryWrapper<CustomerUser>()
|
.eq(CustomerUser::getPhone, userDetail.getPhone()));
|
if (customerUser == null) {
|
logout.error("日志编号" + logNumber + "注销手机号" + userDetail.getPhone() + "注销失败:用户不存在");
|
throw new CommonException("该用户不存在");
|
}
|
customerUserMapper.deleteById(customerUser.getId());
|
logout.info("日志编号" + logNumber + "注销手机号" + userDetail.getPhone()
|
+ "注销customerUser记录:{}", customerUser);
|
|
List<Customer> customerList = customerService.list(new LambdaQueryWrapper<Customer>()
|
.eq(Customer::getPhone, userDetail.getPhone()));
|
if (customerList != null && customerList.size() > 0) {
|
List<Long> idLists = customerList.stream().map(Customer::getId).collect(Collectors.toList());
|
customerMapper.deleteBatchIds(idLists);
|
logout.info("日志编号" + logNumber + "注销手机号" + userDetail.getPhone()
|
+ "注销customer申请记录列表:{}", customerList);
|
}
|
UserUtil.removeUserByToken(token);
|
return "注销成功";
|
}
|
|
}
|