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 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 page(SysUserPageDto sysUser, PageRequest pageRequest) { Page sysUserPage = new Page<>(pageRequest.getPageNo(), pageRequest.getPageSize()); IPage result = sysUserMapper.pageModel(sysUserPage, sysUser); List 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.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.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 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 pageStaff(StaffDto staffDto, PageRequest pageRequest) { Page page = new Page<>(pageRequest.getPageNo(), pageRequest.getPageSize()); return sysUserMapper.pageStaff(page, staffDto); } @Override public IPage pageAdmin(AdminDto adminDto, PageRequest pageRequest) { Page page = new Page<>(pageRequest.getPageNo(), pageRequest.getPageSize()); return sysUserMapper.pageAdmin(page, adminDto); } @Override public IPage pageSysUser(SysUserDto sysUserDto, PageRequest pageRequest) { Page page = new Page<>(pageRequest.getPageNo(), pageRequest.getPageSize()); return sysUserMapper.pageSysUser(page, sysUserDto); } @Override public IPage pageMechanismConfig(MechanismConfigPageDto pageDto, PageRequest pageRequest) { Page 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 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 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() .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 customerList = customerService.list(new LambdaQueryWrapper() .eq(Customer::getPhone, userDetail.getPhone())); if (customerList != null && customerList.size() > 0) { List idLists = customerList.stream().map(Customer::getId).collect(Collectors.toList()); customerMapper.deleteBatchIds(idLists); logout.info("日志编号" + logNumber + "注销手机号" + userDetail.getPhone() + "注销customer申请记录列表:{}", customerList); } UserUtil.removeUserByToken(token); return "注销成功"; } }