feat: 一些调整

This commit is contained in:
曹鹏飞 2025-02-22 23:15:54 +08:00
parent e3fa535b95
commit 0fbc9000f7
27 changed files with 646 additions and 166 deletions

View File

@ -6,6 +6,7 @@ import com.nflg.mobilebroken.admin.annotation.ApiMark;
import com.nflg.mobilebroken.admin.service.WXQRCodeService;
import com.nflg.mobilebroken.common.constant.Constant;
import com.nflg.mobilebroken.common.constant.STATE;
import com.nflg.mobilebroken.common.constant.UserState;
import com.nflg.mobilebroken.common.exception.NflgException;
import com.nflg.mobilebroken.common.pojo.ApiResult;
import com.nflg.mobilebroken.common.pojo.PageData;
@ -37,8 +38,10 @@ import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.Base64;
import java.util.List;
import java.util.Objects;
/**
* 账号相关接口
@ -112,7 +115,7 @@ public class AdminUserController extends ControllerBase {
String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_ACTIVATION, Constant.DEFAULT_LANGUAGE_CODE);
String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_ACCOUNT_ACTIVATION_NOTIFY, Constant.DEFAULT_LANGUAGE_CODE)
.replace("${loginName}",adminUser.getLoginName())
.replace("${url}",activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString(email.getBytes()))
.replace("${url}",activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString((email+"|0").getBytes()))
.replace("${password}",request.getPassword())
.replace("${website}",websiteUrl);
emailService.sendEmail(email, subject, content);
@ -126,11 +129,42 @@ public class AdminUserController extends ControllerBase {
* 更新账号
* @param request 请求参数
*/
@Transactional
@PostMapping("updateAccount")
@MethodInfoMark(value = "更新账号", menuName = "账号管理")
@ApiMark(moduleName = "账号管理", apiName = "更新账号")
public ApiResult<Void> updateAccount(@Valid @RequestBody AccountUpdateRequest request) {
adminUserService.update(request);
public ApiResult<Void> updateAccount(@Valid @RequestBody AccountUpdateRequest request) throws MessagingException {
AdminUser user=adminUserService.getById(request.getId());
if (!StrUtil.equals(user.getLoginName(),request.getLoginName())){
VUtils.trueThrowBusinessError(adminUserService.lambdaQuery()
.eq(AdminUser::getLoginName, request.getLoginName())
.ne(AdminUser::getId, request.getId())
.exists())
.throwMessage("已存在相同的登录名");
user.setState(UserState.ToBeActivated.getState());
String code= RandomUtil.randomString(6);
redisTemplate.opsForValue().set(Constant.REDIS_KEY_CHANGE_EMAIL_CODE + user.getLoginName(), code, Duration.ofHours(72));
redisTemplate.opsForValue().set(Constant.REDIS_KEY_CHANGE_EMAIL_CODE + code, request.getLoginName(), Duration.ofHours(72));
String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_CHANGE_EMAIL, Constant.DEFAULT_LANGUAGE_CODE);
String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_CHANGE_EMAIL, Constant.DEFAULT_LANGUAGE_CODE)
.replace("${email}", user.getLoginName())
.replace("${url}", activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString((user.getLoginName()+"|1").getBytes()))
.replace("${password}", code);
emailService.sendEmail(request.getLoginName(), subject, content);
} else {
if (Objects.nonNull(request.getEnable())) {
user.setState(request.getEnable() ? UserState.Activated.getState() : UserState.Disabled.getState());
}
}
user.setUserCode(request.getUserCode())
.setUserName(request.getUserName())
.setAvatar(request.getAvatar())
.setDepartmentId(request.getDepartmentId())
.setPhone(request.getPhone())
.setTitleId(request.getTitleId())
.setUpdateBy(AdminUserUtil.getUserId())
.setUpdateTime(LocalDateTime.now());
adminUserService.updateById(user);
return ApiResult.success();
}
@ -184,7 +218,7 @@ public class AdminUserController extends ControllerBase {
String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_RESET_PASSWORD, Constant.DEFAULT_LANGUAGE_CODE);
String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_RESET_PASSWORD_NOTIFY, Constant.DEFAULT_LANGUAGE_CODE)
.replace("${loginName}",adminUser.getLoginName())
.replace("${url}",activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString(adminUser.getEmail().getBytes()))
.replace("${url}",activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString((adminUser.getEmail()+"|0").getBytes()))
.replace("${password}",password);
emailService.sendEmail(adminUser.getEmail(), subject, content);
}
@ -208,7 +242,7 @@ public class AdminUserController extends ControllerBase {
String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_RESET_PASSWORD, Constant.DEFAULT_LANGUAGE_CODE);
String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_RESET_PASSWORD_NOTIFY, Constant.DEFAULT_LANGUAGE_CODE)
.replace("${loginName}",adminUser.getLoginName())
.replace("${url}",activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString(email.getBytes()))
.replace("${url}",activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString((email+"|0").getBytes()))
.replace("${password}",password);
emailService.sendEmail(email, subject, content);
} catch (Exception ex) {
@ -302,4 +336,15 @@ public class AdminUserController extends ControllerBase {
AdminUserVO adminUserVO = adminUserService.getInfo(AdminUserUtil.getUserId());
return ApiResult.success(adminUserVO);
}
/**
* 删除账号
* @param request 请求参数
**/
@PostMapping("deleteAccount")
@ApiMark(moduleName = "账号管理", apiName = "删除账号")
public ApiResult<Void> deleteAccount(@Valid @RequestBody DeleteRequest request){
adminUserService.deleteAccount(request.getId());
return ApiResult.success();
}
}

View File

@ -1,22 +1,28 @@
package com.nflg.mobilebroken.admin.controller;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.nflg.mobilebroken.admin.annotation.ApiMark;
import com.nflg.mobilebroken.common.constant.AppUserApplyforType;
import com.nflg.mobilebroken.common.constant.Constant;
import com.nflg.mobilebroken.common.constant.STATE;
import com.nflg.mobilebroken.common.constant.UserState;
import com.nflg.mobilebroken.common.exception.NflgException;
import com.nflg.mobilebroken.common.pojo.ApiResult;
import com.nflg.mobilebroken.common.pojo.PageData;
import com.nflg.mobilebroken.common.pojo.request.*;
import com.nflg.mobilebroken.common.pojo.vo.*;
import com.nflg.mobilebroken.common.util.VUtils;
import com.nflg.mobilebroken.repository.entity.AppUser;
import com.nflg.mobilebroken.repository.entity.AppUserApplyfor;
import com.nflg.mobilebroken.repository.entity.TBaseCustomer;
import com.nflg.mobilebroken.repository.service.*;
import com.nflg.mobilebroken.starter.annotation.MethodInfoMark;
import com.nflg.mobilebroken.starter.service.EmailService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
@ -25,8 +31,13 @@ import javax.mail.MessagingException;
import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.Base64;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* 代理商相关接口
@ -61,24 +72,29 @@ public class AppUserController extends ControllerBase {
@Resource
private IDictionaryItemTranslateService dictionaryItemTranslateService;
@Resource
private RedisTemplate<String, String> redisTemplate;
/**
* 获取公司列表
* @param userId 用户id
* @return 部门列表
*/
@PostMapping("getSimpleCompanys")
@GetMapping("getSimpleCompanys")
@ApiMark(moduleName = "代理商管理", apiName = "获取公司列表")
public ApiResult<List<CompanySimpleVO>> getSimpleCompanys() {
return ApiResult.success(customerService.getSimpleCompanys());
public ApiResult<List<CompanySimpleVO>> getSimpleCompanys(@Valid @RequestParam Integer userId) {
return ApiResult.success(customerService.getSimpleCompanysFromAdmin(userId));
}
/**
* 获取区域列表
* @param userId 用户id
* @return 部门列表
*/
@PostMapping("getSimpleAreas")
@GetMapping("getSimpleAreas")
@ApiMark(moduleName = "代理商管理", apiName = "获取区域列表")
public ApiResult<List<AreaSimpleVO>> getSimpleAreas() {
return ApiResult.success(areaService.getSimpleAreas());
public ApiResult<List<AreaSimpleVO>> getSimpleAreas(@Valid @RequestParam Integer userId) {
return ApiResult.success(appUserService.getSimpleAreas(userId));
}
/**
@ -90,15 +106,15 @@ public class AppUserController extends ControllerBase {
@ApiMark(moduleName = "代理商管理", apiName = "添加代理商主账号")
public ApiResult<Void> addPrimaryAppUser(@Valid @RequestBody PrimaryAppUserAddRequest request) {
request.setPassword(RandomUtil.randomNumbers(6));
AppUser appUser =appUserService.addPrimaryAppUser(request);
AppUser appUser = appUserService.addPrimaryAppUser(request);
try {
String email = request.getEmail();
String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_ACTIVATION, appUser.getLanguageCode());
String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_ACCOUNT_ACTIVATION_NOTIFY, appUser.getLanguageCode())
.replace("${loginName}",appUser.getLoginName())
.replace("${url}",activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString(email.getBytes()))
.replace("${password}",request.getPassword())
.replace("${website}",websiteUrl);
.replace("${loginName}", appUser.getLoginName())
.replace("${url}", activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString((email+"|0").getBytes()))
.replace("${password}", request.getPassword())
.replace("${website}", websiteUrl);
emailService.sendEmail(email, subject, content);
} catch (MessagingException e) {
log.error("发送邮件失败", e);
@ -107,17 +123,102 @@ public class AppUserController extends ControllerBase {
}
/**
* 更新代理商账号
* 更新代理商账号
* @param request 请求参数
*/
@PostMapping("updatePrimaryAppUser")
@MethodInfoMark(value = "更新代理商主账号", menuName = "代理商管理")
@ApiMark(moduleName = "代理商管理", apiName = "更新代理商主账号")
public ApiResult<Void> updatePrimaryAppUser(@Valid @RequestBody PrimaryAppUserUpdateRequest request) {
appUserService.updatePrimaryAppUser(request);
@PostMapping("updateAppUser")
@MethodInfoMark(value = "更新代理商账号", menuName = "代理商管理")
@ApiMark(moduleName = "代理商管理", apiName = "更新代理商账号")
public ApiResult<Void> updateAppUser(@Valid @RequestBody AppUserUpdateRequest request) throws MessagingException {
AppUser user=appUserService.getById(request.getId());
if (user.getIsPrimary()){
updatePrimaryAppUser(user,request);
}else {
updateAppUser(user,request);
}
return ApiResult.success();
}
public void updateAppUser(AppUser user,AppUserUpdateRequest request) throws MessagingException {
if (!StrUtil.equals(user.getLoginName(), request.getLoginName())){
VUtils.trueThrowBusinessError(appUserService.lambdaQuery()
.eq(AppUser::getLoginName, request.getLoginName())
.ne(AppUser::getId, request.getId())
.exists())
.throwMessage("登录名已存在");
user.setState(UserState.ToBeActivated.getState());
String code= RandomUtil.randomString(6);
redisTemplate.opsForValue().set(Constant.REDIS_KEY_CHANGE_EMAIL_CODE + user.getId(), code, Duration.ofHours(72));
redisTemplate.opsForValue().set(Constant.REDIS_KEY_CHANGE_EMAIL_CODE + code, request.getLoginName(), Duration.ofHours(72));
String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_CHANGE_EMAIL, Constant.DEFAULT_LANGUAGE_CODE);
String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_CHANGE_EMAIL, Constant.DEFAULT_LANGUAGE_CODE)
.replace("${email}", user.getLoginName())
.replace("${url}", activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString((user.getLoginName()+"|1").getBytes()))
.replace("${password}", code);
emailService.sendEmail(request.getLoginName(), subject, content);
}else {
if (Objects.nonNull(request.getEnable())) {
user.setState(request.getEnable() ? UserState.Activated.getState() : UserState.Disabled.getState());
}
}
user.setName(request.getUserName())
.setPhone(request.getPhone())
.setAreaId(request.getAreaId())
.setTitleId(request.getTitleId())
.setCompanyId(StrUtil.join(",", request.getCompanyIds()))
.setUpdateTime(LocalDateTime.now());
appUserService.updateById(user);
}
public void updatePrimaryAppUser(AppUser user,AppUserUpdateRequest request) throws MessagingException {
List<Integer> companyIds = appUserService.lambdaQuery()
.select(AppUser::getCompanyId)
.eq(AppUser::getIsPrimary, true)
.ne(AppUser::getId, request.getId())
.list()
.stream()
.map(AppUser::getCompanyId)
.flatMap(s -> Arrays.stream(s.split(",")))
.map(Integer::parseInt)
.collect(Collectors.toList());
List<Integer> cIds = request.getCompanyIds().stream()
.filter(companyIds::contains)
.collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(cIds)) {
VUtils.trueThrowBusinessError(true)
.throwMessage("以下公司已设置主账号:" + StrUtil.join(",", customerService.listByIds(cIds).stream()
.map(TBaseCustomer::getAgencyCompanyName).collect(Collectors.toList())));
}
if (!StrUtil.equals(user.getLoginName(), request.getLoginName())){
VUtils.trueThrowBusinessError(appUserService.lambdaQuery()
.eq(AppUser::getLoginName, request.getLoginName())
.ne(AppUser::getId, request.getId())
.exists())
.throwMessage("登录名已存在");
user.setState(UserState.ToBeActivated.getState());
String code= RandomUtil.randomString(6);
redisTemplate.opsForValue().set(Constant.REDIS_KEY_CHANGE_EMAIL_CODE + user.getLoginName(), code, Duration.ofHours(72));
redisTemplate.opsForValue().set(Constant.REDIS_KEY_CHANGE_EMAIL_CODE + code, request.getLoginName(), Duration.ofHours(72));
String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_CHANGE_EMAIL, Constant.DEFAULT_LANGUAGE_CODE);
String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_CHANGE_EMAIL, Constant.DEFAULT_LANGUAGE_CODE)
.replace("${email}", user.getLoginName())
.replace("${url}", activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString((user.getLoginName()+"|1").getBytes()))
.replace("${password}", code);
emailService.sendEmail(request.getLoginName(), subject, content);
}else {
if (Objects.nonNull(request.getEnable())) {
user.setState(request.getEnable() ? UserState.Activated.getState() : UserState.Disabled.getState());
}
}
user.setName(request.getUserName())
.setPhone(request.getPhone())
.setAreaId(request.getAreaId())
.setTitleId(request.getTitleId())
.setCompanyId(StrUtil.join(",", request.getCompanyIds()))
.setUpdateTime(LocalDateTime.now());
appUserService.updateById(user);
}
/**
* 获取代理商子账号审核详情
* @param id 审批id
@ -144,7 +245,7 @@ public class AppUserController extends ControllerBase {
String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_ACTIVATION, applyfor.getLanguageCode());
String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_ACCOUNT_ACTIVATION_NOTIFY, applyfor.getLanguageCode())
.replace("${loginName}",applyfor.getUserEmail())
.replace("${url}",activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString(applyfor.getUserEmail().getBytes()))
.replace("${url}",activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString((applyfor.getUserEmail()+"|0").getBytes()))
.replace("${password}",request.getPassword())
.replace("${website}",websiteUrl);
emailService.sendEmail(applyfor.getUserEmail(), subject, content);
@ -168,13 +269,13 @@ public class AppUserController extends ControllerBase {
}
/**
* 搜索代理商子账号列表(根据公司名称或主账号)
* @param request 请求参数
* 获取代理商子账号列表
* @param id 主账号id
*/
@PostMapping("searchSimpleUsers")
@ApiMark(moduleName = "代理商管理", apiName = "搜索代理商子账号列表(根据公司名称或主账号)")
public ApiResult<List<CompanyVO>> searchSimpleUsers(@Valid @RequestBody SimpleUsersSearchRequest request) {
return ApiResult.success(appUserService.searchSimpleUsers(request));
@GetMapping("getSimpleUsers")
@ApiMark(moduleName = "代理商管理", apiName = "获取代理商子账号列表")
public ApiResult<List<CompanyVO>> getSimpleUsers(@Valid @RequestParam @NotNull Integer id) {
return ApiResult.success(appUserService.getSimpleUsers(id));
}
/**
@ -237,7 +338,7 @@ public class AppUserController extends ControllerBase {
String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_RESET_PASSWORD, appUser.getLanguageCode());
String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_RESET_PASSWORD_NOTIFY, appUser.getLanguageCode())
.replace("${loginName}",appUser.getLoginName())
.replace("${url}",activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString(appUser.getEmail().getBytes()))
.replace("${url}",activateUrl + "?code=" + Base64.getUrlEncoder().encodeToString((appUser.getEmail()+"|0").getBytes()))
.replace("${password}",password);
emailService.sendEmail(appUser.getEmail(), subject, content);
}
@ -246,4 +347,23 @@ public class AppUserController extends ControllerBase {
}
return ApiResult.success();
}
/**
* 判断是否存在子账号
* @param id 主账号id
*/
@GetMapping("hasChildren")
public ApiResult<Boolean> hasChildren(@Valid @RequestParam Integer id) {
return ApiResult.success(appUserService.hasChildren(id));
}
/**
* 删除代理商
* @param request 请求参数
*/
@PostMapping("deleteAppUser")
public ApiResult<Void> deleteAppUser(@Valid @RequestBody DeleteRequest request){
appUserService.deleteAppUser(request.getId());
return ApiResult.success();
}
}

View File

@ -174,6 +174,17 @@ public class TicketController extends ControllerBase {
return ApiResult.success();
}
/**
* 获取工单处理人
* @param id 工单id
* @return 工单处理人列表
*/
@GetMapping("getTicketHandle")
@ApiMark(moduleName = "工单管理", apiName = "获取工单处理人")
public ApiResult<List<AdminUserSimpleVO>> getTicketHandle(@Valid @RequestParam @NotNull(message = "工单编号不能为空") Integer id){
return ApiResult.success(ticketService.getTicketHandle(id));
}
/**
* 添加工单处理人
* @param request 请求参数

View File

@ -1,12 +1,12 @@
package com.nflg.mobilebroken.admin.event;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.util.StrUtil;
import com.nflg.mobilebroken.common.constant.Constant;
import com.nflg.mobilebroken.common.constant.MessageSubType;
import com.nflg.mobilebroken.common.constant.MessageType;
import com.nflg.mobilebroken.repository.entity.AdminMessage;
import com.nflg.mobilebroken.repository.entity.AdminUser;
import com.nflg.mobilebroken.repository.entity.AppMessage;
import com.nflg.mobilebroken.repository.entity.Ticket;
import com.nflg.mobilebroken.repository.entity.*;
import com.nflg.mobilebroken.repository.service.*;
import com.nflg.mobilebroken.starter.service.EmailService;
import lombok.extern.slf4j.Slf4j;
@ -14,8 +14,12 @@ import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEvent;
import javax.mail.MessagingException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
public class TicketCompleteEvent extends ApplicationEvent implements ApplicationContextAware {
@ -48,6 +52,7 @@ public class TicketCompleteEvent extends ApplicationEvent implements Application
public void send(){
sendUserMessage();
sendEmail();
}
private void sendUserMessage(){
@ -72,4 +77,41 @@ public class TicketCompleteEvent extends ApplicationEvent implements Application
.setIsRead(false)
.setCreateTime(LocalDateTime.now()));
}
private void sendEmail(){
try {
List<Integer> cqmUserIds=deviceTypeService.getCqmsByDeviceType(ticket.getDeviceNo());
if (CollectionUtil.isNotEmpty(cqmUserIds)) {
List<AdminUser> cqmUsers = adminUserService.listByIds(cqmUserIds);
if (CollectionUtil.isNotEmpty(cqmUsers)) {
List<Integer> handleUserIds = Arrays.stream(ticket.getHandle().split(",")).filter(StrUtil::isNotBlank).map(Integer::parseInt).collect(Collectors.toList());
List<AdminUser> handleUsers = adminUserService.listByIds(handleUserIds);
AppUser appUser = appUserService.getById(ticket.getUserId());
String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_ASSIGNED, Constant.DEFAULT_LANGUAGE_CODE);
String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY, Constant.DEFAULT_LANGUAGE_CODE)
.replace("${no}", ticket.getNo())
.replace("${title}", ticket.getTitle())
.replace("${createUser}", appUser.getName())
.replace("${handleUser}", StrUtil.join(",", handleUsers.stream().map(AdminUser::getUserName).collect(Collectors.toList())))
.replace("${createTime}", ticket.getCreateTime().format(FORMATTER))
.replace("${msg}", subject);
sendEmail(cqmUsers, subject, content);
}
}
}catch(Exception ex){
log.error("邮件发送失败", ex);
}
}
private void sendEmail(List<AdminUser> adminUsers,String subject,String content){
if (CollectionUtil.isNotEmpty(adminUsers)){
for (AdminUser adminUser:adminUsers) {
try {
emailService.sendEmail(adminUser.getEmail(),subject,content);
} catch (MessagingException e) {
log.error("邮件发送失败", e);
}
}
}
}
}

View File

@ -0,0 +1,55 @@
package com.nflg.mobilebroken.admin.task;
import cn.hutool.core.collection.CollectionUtil;
import com.nflg.mobilebroken.common.constant.UserState;
import com.nflg.mobilebroken.repository.entity.AppUser;
import com.nflg.mobilebroken.repository.service.IAppUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
@Component
@Slf4j
public class AppUserScheduledTasks {
@Resource
private IAppUserService appUserService;
/**
* 禁用已过期代理商
* 每天午夜12点执行一次
*/
@Transactional
@Scheduled(cron = "0 0 0 * * ?")
public void disableExpiredAppUser() {
List<AppUser> primaryAppUsers=appUserService.lambdaQuery()
.eq(AppUser::getIsPrimary, true)
.lt(AppUser::getExpireTime, LocalDateTime.now().toLocalDate())
.list();
if (CollectionUtil.isNotEmpty(primaryAppUsers)){
appUserService.lambdaUpdate()
.set(AppUser::getState, UserState.Disabled.getState())
.set(AppUser::getUpdateTime, LocalDateTime.now())
.ne(AppUser::getState, UserState.Disabled.getState())
.in(AppUser::getId, primaryAppUsers.stream().map(AppUser::getId).collect(Collectors.toList()))
.update();
for (AppUser primaryUser : primaryAppUsers) {
List<AppUser> children=appUserService.getChildren(primaryUser);
if (CollectionUtil.isNotEmpty(children)){
appUserService.lambdaUpdate()
.set(AppUser::getState, UserState.Disabled.getState())
.set(AppUser::getUpdateTime, LocalDateTime.now())
.ne(AppUser::getState, UserState.Disabled.getState())
.in(AppUser::getId, children.stream().map(AppUser::getId).collect(Collectors.toList()))
.update();
}
}
}
}
}

View File

@ -22,6 +22,8 @@ public class Constant {
public static final String REDIS_KEY_MESSAGECONFIG_APP = "appNotifyEnabled";
public static final String REDIS_KEY_CHANGE_EMAIL_CODE = "changeEmail:";
public static final String WX_TOKEN_URL = "http://sfc.nflg.net:8071/api/crm_api!getYdpAccessToken.action";
public static final String WX_QRCODE = "https://api.weixin.qq.com/cgi-bin/qrcode/create";
@ -32,6 +34,8 @@ public class Constant {
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_ASSIGNED="TitleTicketAssigned";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_CHANGE_EMAIL="TitleChangeEmail";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_REPLY="TitleTicketReply";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_TICKET_TIMEOUT="TitleTicketTimeout";
@ -40,6 +44,8 @@ public class Constant {
public static final String DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY="TicketNotify";
public static final String DICTIONARY_ITEM_EMAIL_CONTENT_CHANGE_EMAIL="ChangeEmail";
public static final String DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_INVITE_COMMENT="InviteComment";
public static final String DICTIONARY_ITEM_EMAIL_TITLE_ACCOUNT_RESET_PASSWORD="TitleResetPassword";

View File

@ -5,7 +5,7 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = false)
@Data
public class PrimaryAppUserUpdateRequest extends PrimaryAppUserAddRequest {
public class AppUserUpdateRequest extends PrimaryAppUserAddRequest {
private Integer id;

View File

@ -0,0 +1,9 @@
package com.nflg.mobilebroken.common.pojo.request;
import lombok.Data;
@Data
public class DeleteRequest {
private Integer id;
}

View File

@ -50,4 +50,7 @@ public class PrimaryAppUserAddRequest {
@JsonIgnore
private String password;
//职位id
private Integer titleId;
}

View File

@ -0,0 +1,19 @@
package com.nflg.mobilebroken.common.pojo.vo;
import lombok.Data;
@Data
public class AdminUserSimpleVO {
// 用户ID
private Integer userId;
// 用户名
private String userName;
// 部门名称
private String departmentName;
// 用户编号
private String userCode;
}

View File

@ -55,6 +55,10 @@
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-crypto</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
</dependencies>
<build>

View File

@ -103,4 +103,9 @@ public class AdminUser implements Serializable {
* 最后更新时间
*/
private LocalDateTime updateTime;
/**
* 删除状态0未删除1已删除
*/
private Boolean isDel;
}

View File

@ -129,4 +129,9 @@ public class AppUser implements Serializable {
* 过期时间
*/
private LocalDate expireTime;
/**
* 删除状态0未删除1已删除
*/
private Boolean isDel;
}

View File

@ -1,6 +1,7 @@
package com.nflg.mobilebroken.repository.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.nflg.mobilebroken.common.pojo.vo.AdminUserSimpleVO;
import com.nflg.mobilebroken.repository.entity.AdminUser;
import java.util.List;
@ -16,4 +17,6 @@ import java.util.List;
public interface AdminUserMapper extends BaseMapper<AdminUser> {
List<AdminUser> getByRoleCode(String roleCode);
List<AdminUserSimpleVO> getSimples(List<Integer> userIds);
}

View File

@ -3,6 +3,7 @@ package com.nflg.mobilebroken.repository.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nflg.mobilebroken.common.pojo.PageData;
import com.nflg.mobilebroken.common.pojo.request.*;
import com.nflg.mobilebroken.common.pojo.vo.AdminUserSimpleVO;
import com.nflg.mobilebroken.common.pojo.vo.AdminUserVO;
import com.nflg.mobilebroken.repository.entity.AdminUser;
@ -22,8 +23,6 @@ public interface IAdminUserService extends IService<AdminUser> {
AdminUser add(AccountAddRequest request);
void update(AccountUpdateRequest request);
void enable(EnableAccountRequest request);
PageData<AdminUserVO> search(SearchAccountRequest request);
@ -47,4 +46,8 @@ public interface IAdminUserService extends IService<AdminUser> {
List<AdminUser> getForAccountReview();
AdminUserVO getInfo(Integer userId);
List<AdminUserSimpleVO> getSimples(List<Integer> userIds);
void deleteAccount(Integer id);
}

View File

@ -6,6 +6,7 @@ import com.nflg.mobilebroken.common.pojo.PageData;
import com.nflg.mobilebroken.common.pojo.request.*;
import com.nflg.mobilebroken.common.pojo.vo.AppUserForAdminVO;
import com.nflg.mobilebroken.common.pojo.vo.AppUserVO;
import com.nflg.mobilebroken.common.pojo.vo.AreaSimpleVO;
import com.nflg.mobilebroken.common.pojo.vo.CompanyVO;
import com.nflg.mobilebroken.repository.entity.AppUser;
@ -35,8 +36,6 @@ public interface IAppUserService extends IService<AppUser> {
AppUser addPrimaryAppUser(PrimaryAppUserAddRequest request);
void updatePrimaryAppUser(PrimaryAppUserUpdateRequest request);
void migrate(MigrateAppUserRequest request);
PageData<AppUserForAdminVO> searchAppUserForAdmin(SearchAppUserForAdminRequest request);
@ -54,4 +53,14 @@ public interface IAppUserService extends IService<AppUser> {
AppUser forgetPassword(String email, String password);
AppUser getPrimaryByCompanyId(String companyId);
List<AppUser> getChildren(AppUser primaryUser);
Boolean hasChildren(Integer id);
List<CompanyVO> getSimpleUsers(Integer id);
void deleteAppUser(Integer id);
List<AreaSimpleVO> getSimpleAreas(Integer userId);
}

View File

@ -3,7 +3,6 @@ package com.nflg.mobilebroken.repository.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nflg.mobilebroken.common.pojo.query.PageBaseQuery;
import com.nflg.mobilebroken.common.pojo.vo.AreaSimpleVO;
import com.nflg.mobilebroken.common.pojo.vo.TBaseAreaVO;
import com.nflg.mobilebroken.repository.entity.TBaseArea;
import org.apache.ibatis.annotations.Param;
@ -28,6 +27,4 @@ public interface ITBaseAreaService extends IService<TBaseArea> {
Integer getCount();
List<AreaSimpleVO> getSimpleAreas();
}

View File

@ -27,4 +27,6 @@ public interface ITBaseCustomerService extends IService<TBaseCustomer> {
List<CompanySimpleVO> getSimpleCompanys(Integer userId);
List<CompanySimpleVO> getSimpleCompanys();
List<CompanySimpleVO> getSimpleCompanysFromAdmin(Integer userId);
}

View File

@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.nflg.mobilebroken.common.pojo.dto.UserDTO;
import com.nflg.mobilebroken.common.pojo.request.*;
import com.nflg.mobilebroken.common.pojo.vo.AdminTicketVO;
import com.nflg.mobilebroken.common.pojo.vo.AdminUserSimpleVO;
import com.nflg.mobilebroken.common.pojo.vo.TicketVO;
import com.nflg.mobilebroken.repository.entity.Ticket;
@ -47,4 +48,6 @@ public interface ITicketService extends IService<Ticket> {
Ticket addTicketHandle(TicketHandleAddRequest request);
List<Ticket> getNonComment(int days);
List<AdminUserSimpleVO> getTicketHandle(Integer id);
}

View File

@ -12,6 +12,7 @@ import com.nflg.mobilebroken.common.constant.UserState;
import com.nflg.mobilebroken.common.exception.NflgException;
import com.nflg.mobilebroken.common.pojo.PageData;
import com.nflg.mobilebroken.common.pojo.request.*;
import com.nflg.mobilebroken.common.pojo.vo.AdminUserSimpleVO;
import com.nflg.mobilebroken.common.pojo.vo.AdminUserVO;
import com.nflg.mobilebroken.common.pojo.vo.RoleSimpleVO;
import com.nflg.mobilebroken.common.util.AdminUserUtil;
@ -19,6 +20,7 @@ import com.nflg.mobilebroken.common.util.VUtils;
import com.nflg.mobilebroken.repository.entity.*;
import com.nflg.mobilebroken.repository.mapper.AdminUserMapper;
import com.nflg.mobilebroken.repository.service.*;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
@ -55,6 +57,9 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
@Resource
private IAdminUserRoleMapService adminUserRoleMapService;
@Resource
private RedisTemplate<String, String> redisTemplate;
@Override
public AdminUser getUser(String userName, String password) {
AdminUser user = lambdaQuery()
@ -86,26 +91,6 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
return user;
}
@Override
public void update(AccountUpdateRequest request) {
AdminUser user = new AdminUser()
.setId(request.getId())
.setUserCode(request.getUserCode())
.setUserName(request.getUserName())
.setAvatar(request.getAvatar())
.setDepartmentId(request.getDepartmentId())
.setEmail(request.getEmail())
.setLoginName(request.getLoginName())
.setPhone(request.getPhone())
.setTitleId(request.getTitleId())
.setUpdateBy(AdminUserUtil.getUserId())
.setUpdateTime(LocalDateTime.now());
if (Objects.nonNull(request.getEnable())){
user.setState(request.getEnable() ? UserState.Activated.getState() : UserState.Disabled.getState());
}
updateById(user);
}
@Override
public void enable(EnableAccountRequest request) {
lambdaUpdate()
@ -117,6 +102,7 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
@Override
public PageData<AdminUserVO> search(SearchAccountRequest request) {
IPage<AdminUser> page = lambdaQuery()
.eq(AdminUser::getIsDel,false)
.eq(Objects.nonNull(request.getState()), AdminUser::getState, request.getState())
.eq(Objects.nonNull(request.getDepartmentId()), AdminUser::getDepartmentId, request.getDepartmentId())
.like(StrUtil.isNotBlank(request.getLoginName()), AdminUser::getLoginName, request.getLoginName())
@ -161,6 +147,7 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
return Collections.emptyList();
}
return lambdaQuery()
.eq(AdminUser::getIsDel,false)
.eq(AdminUser::getTitleId, position.getId())
.list();
}
@ -206,32 +193,52 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
@Override
public void activateUser(UserActivateRequest request) {
String email="";
String code="";
try {
email=StrUtil.str(Base64.getUrlDecoder().decode(request.getCode()), Charset.defaultCharset());
code=StrUtil.str(Base64.getUrlDecoder().decode(request.getCode()), Charset.defaultCharset());
}catch (IllegalArgumentException ex){
log.error("无效的code:"+request.getCode());
throw new NflgException(STATE.ParamErr,"无效的code:"+request.getCode());
}
AdminUser adminUser = lambdaQuery()
.eq(AdminUser::getLoginName, email)
.one();
VUtils.trueThrowBusinessError(Objects.isNull(adminUser)).throwMessage("用户不存");
VUtils.trueThrowBusinessError(!Objects.equals(adminUser.getState(), UserState.ToBeActivated.getState()))
.throwMessage("当前状态不允许激活");
VUtils.trueThrowBusinessError(PASSWORDENCODER.matches(request.getCode(), adminUser.getPassword()))
.throwMessage("随机码不正确");
adminUser.setState(UserState.Activated.getState());
adminUser.setPassword(PASSWORDENCODER.encode(request.getPassword()));
adminUser.setUpdateTime(LocalDateTime.now());
updateById(adminUser);
String email=code.split("\\|")[0];
String type=code.split("\\|")[1];
if (StrUtil.equals("0", type)) {
AdminUser adminUser = lambdaQuery()
.eq(AdminUser::getLoginName, email)
.one();
VUtils.trueThrowBusinessError(Objects.isNull(adminUser)).throwMessage("用户不存");
VUtils.trueThrowBusinessError(!Objects.equals(adminUser.getState(), UserState.ToBeActivated.getState()))
.throwMessage("当前状态不允许激活");
VUtils.trueThrowBusinessError(PASSWORDENCODER.matches(request.getCode(), adminUser.getPassword()))
.throwMessage("随机码不正确");
adminUser.setState(UserState.Activated.getState());
adminUser.setPassword(PASSWORDENCODER.encode(request.getPassword()));
adminUser.setUpdateTime(LocalDateTime.now());
updateById(adminUser);
}else if (StrUtil.equals("1", type)){
//修改邮箱
code=redisTemplate.opsForValue().get(Constant.REDIS_KEY_CHANGE_EMAIL_CODE + email);
VUtils.trueThrowBusinessError(!StrUtil.equals(code, request.getRandomCode()))
.throwMessage("无效的激活码");
String email1=redisTemplate.opsForValue().get(Constant.REDIS_KEY_CHANGE_EMAIL_CODE + code);
VUtils.trueThrowBusinessError(StrUtil.isBlank(email1))
.throwMessage("无效的激活码");
lambdaUpdate()
.set(AdminUser::getEmail, email1)
.set(AdminUser::getState, UserState.Activated.getState())
.set(AdminUser::getUpdateTime,LocalDateTime.now())
.eq(AdminUser::getLoginName, email)
.update();
}
}
@Override
public AdminUser forgetPassword(String email, String password) {
String encodePassword = PASSWORDENCODER.encode(password);
AdminUser user = lambdaQuery().eq(AdminUser::getLoginName, email).one();
VUtils.trueThrowBusinessError(Objects.isNull(user)).throwMessage("用户不存在");
VUtils.trueThrowBusinessError(Objects.isNull(user))
.throwMessage("用户不存在");
VUtils.trueThrowBusinessError(user.getIsDel()).throwMessage("已删除的账号不能重设密码");
VUtils.trueThrowBusinessError(Objects.equals(user.getState(), UserState.Disabled.getState()))
.throwMessage("禁用状态不能重设密码");
user.setState(UserState.ToBeActivated.getState());
@ -255,6 +262,7 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
return Collections.emptyList();
}
return lambdaQuery()
.eq(AdminUser::getIsDel,false)
.eq(AdminUser::getState, UserState.Activated.getState())
.in(AdminUser::getTitleId, titleIds)
.list();
@ -279,6 +287,19 @@ public class AdminUserServiceImpl extends ServiceImpl<AdminUserMapper, AdminUser
.setDepartmentName(getDepartmentName(user.getDepartmentId()));
}
@Override
public List<AdminUserSimpleVO> getSimples(List<Integer> userIds) {
return baseMapper.getSimples(userIds);
}
@Override
public void deleteAccount(Integer id) {
lambdaUpdate()
.set(AdminUser::getIsDel, true)
.eq(AdminUser::getId, id)
.update();
}
private String getDepartmentName(Long departmentId) {
TBaseDepartment department = departmentService.lambdaQuery()
.eq(TBaseDepartment::getId, departmentId)

View File

@ -155,6 +155,7 @@ public class AppUserApplyforServiceImpl extends ServiceImpl<AppUserApplyforMappe
.setAreaName(area.getAreaName())
.setSalesUserName(appUser.getSalesUserName())
.setState(1)
.setTitle(Objects.isNull(appUser.getTitleId()) ? "" : positionService.getById(appUser.getTitleId()).getPositionName())
.setExpireTime(appUser.getExpireTime())
.setEmail(appUser.getEmail())
.setName(appUser.getName())

View File

@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.mobilebroken.common.constant.AppUserApplyForState;
import com.nflg.mobilebroken.common.constant.Constant;
import com.nflg.mobilebroken.common.constant.STATE;
import com.nflg.mobilebroken.common.constant.UserState;
import com.nflg.mobilebroken.common.exception.NflgException;
@ -14,6 +15,7 @@ import com.nflg.mobilebroken.common.pojo.PageData;
import com.nflg.mobilebroken.common.pojo.request.*;
import com.nflg.mobilebroken.common.pojo.vo.AppUserForAdminVO;
import com.nflg.mobilebroken.common.pojo.vo.AppUserVO;
import com.nflg.mobilebroken.common.pojo.vo.AreaSimpleVO;
import com.nflg.mobilebroken.common.pojo.vo.CompanyVO;
import com.nflg.mobilebroken.common.util.AppUserUtil;
import com.nflg.mobilebroken.common.util.PageUtil;
@ -21,6 +23,7 @@ import com.nflg.mobilebroken.common.util.VUtils;
import com.nflg.mobilebroken.repository.entity.*;
import com.nflg.mobilebroken.repository.mapper.AppUserMapper;
import com.nflg.mobilebroken.repository.service.*;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
@ -64,9 +67,13 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> impl
@Resource
private ITBaseAreaService adminAreaService;
@Resource
private RedisTemplate<String, String> redisTemplate;
@Override
public AppUser getUser(String userName, String password) {
AppUser user = lambdaQuery()
.eq(AppUser::getIsDel, false)
.eq(AppUser::getLoginName, userName)
.one();
if (Objects.nonNull(user) && PASSWORDENCODER.matches(password, user.getPassword())) {
@ -158,6 +165,7 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> impl
.setEmail(request.getEmail())
.setPhone(request.getPhone())
.setAreaId(request.getAreaId())
.setTitleId(request.getTitleId())
.setPassword(encodePassword)
.setCompanyId(StrUtil.join(",", request.getCompanyIds()))
.setIsPrimary(true)
@ -172,45 +180,103 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> impl
}
@Override
public void updatePrimaryAppUser(PrimaryAppUserUpdateRequest request) {
VUtils.trueThrowBusinessError(lambdaQuery()
.eq(AppUser::getLoginName, request.getLoginName())
.ne(AppUser::getId, request.getId())
.exists())
.throwMessage("登录名已存在");
List<Integer> companyIds = lambdaQuery()
.select(AppUser::getCompanyId)
.eq(AppUser::getIsPrimary, true)
.ne(AppUser::getId, request.getId())
.list()
.stream()
.map(AppUser::getCompanyId)
.flatMap(s -> Arrays.stream(s.split(",")))
.map(Integer::parseInt)
.collect(Collectors.toList());
List<Integer> cIds = request.getCompanyIds().stream()
.filter(companyIds::contains)
.collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(cIds)) {
VUtils.trueThrowBusinessError(true)
.throwMessage("以下公司已设置主账号:" + StrUtil.join(",", customerService.listByIds(cIds).stream()
.map(TBaseCustomer::getAgencyCompanyName).collect(Collectors.toList())));
public List<AppUser> getChildren(AppUser primaryUser) {
String[] companyIds = primaryUser.getCompanyId().split(",");
LambdaQueryWrapper<AppUser> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(AppUser::getIsDel, false);
queryWrapper.eq(AppUser::getIsPrimary, false);
queryWrapper.and(wrapper -> {
for (String companyId : companyIds) {
wrapper.or().eq(AppUser::getCompanyId, companyId);
}
});
return baseMapper.selectList(queryWrapper);
}
@Override
public Boolean hasChildren(Integer id) {
AppUser primaryUser=getById(id);
VUtils.trueThrowBusinessError(!primaryUser.getIsPrimary()).throwMessage("不是主账号");
String[] companyIds = primaryUser.getCompanyId().split(",");
LambdaQueryWrapper<AppUser> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(AppUser::getIsDel, false);
queryWrapper.eq(AppUser::getIsPrimary, false);
queryWrapper.and(wrapper -> {
for (String companyId : companyIds) {
wrapper.or().eq(AppUser::getCompanyId, companyId);
}
});
return baseMapper.exists(queryWrapper);
}
@Override
public List<CompanyVO> getSimpleUsers(Integer id) {
AppUser primaryUser=getById(id);
List<Integer> companyIds = Arrays.stream(primaryUser.getCompanyId().split(",")).map(Integer::parseInt).collect(Collectors.toList());
List<CompanyVO> datas=new ArrayList<>();
for (Integer companyId : companyIds){
TBaseCustomer customer = customerService.getById(companyId);
CompanyVO companyVO = new CompanyVO()
.setId(customer.getId())
.setName(customer.getAgencyCompanyName())
.setUsers(getByCompanyId(companyId));
datas.add(companyVO);
}
AppUser user = new AppUser()
.setId(request.getId())
.setLoginName(request.getLoginName())
.setName(request.getUserName())
.setEmail(request.getEmail())
.setPhone(request.getPhone())
.setAreaId(request.getAreaId())
.setCompanyId(StrUtil.join(",", request.getCompanyIds()))
.setIsPrimary(true)
// .setUpdateBy(AdminUserUtil.getUserId())
.setUpdateTime(LocalDateTime.now());
if (Objects.nonNull(request.getEnable())){
user.setState(request.getEnable() ? UserState.Activated.getState() : UserState.Disabled.getState());
return datas;
}
@Transactional
@Override
public void deleteAppUser(Integer id) {
lambdaUpdate()
.set(AppUser::getIsDel, true)
.set(AppUser::getUpdateTime, LocalDateTime.now())
.eq(AppUser::getId, id)
.update();
AppUser primaryUser=getById(id);
List<AppUser> children=getChildren(primaryUser);
if (CollectionUtil.isNotEmpty(children)){
lambdaUpdate()
.set(AppUser::getIsDel, true)
.set(AppUser::getUpdateTime, LocalDateTime.now())
.in(AppUser::getId, children.stream().map(AppUser::getId).collect(Collectors.toList()))
.update();
}
updateById(user);
}
@Override
public List<AreaSimpleVO> getSimpleAreas(Integer userId) {
if (Objects.isNull(userId)){
List<TBaseArea> datas = adminAreaService.lambdaQuery().eq(TBaseArea::getAreaState, 1).eq(TBaseArea::getParentAreaRowId, 0).list();
List<AreaSimpleVO> vos = datas.stream().map(d -> new AreaSimpleVO().setId(d.getId()).setName(d.getAreaName())).collect(Collectors.toList());
vos.forEach(this::bindChildren);
return vos;
}else {
AppUser user=getById(userId);
if (user.getIsPrimary()){
List<TBaseArea> datas = adminAreaService.lambdaQuery().eq(TBaseArea::getAreaState, 1).eq(TBaseArea::getParentAreaRowId, 0).list();
List<AreaSimpleVO> vos = datas.stream().map(d -> new AreaSimpleVO().setId(d.getId()).setName(d.getAreaName())).collect(Collectors.toList());
vos.forEach(this::bindChildren);
return vos;
}else {
List<AppArea> datas = appAreaService.lambdaQuery().eq(AppArea::getEnable, true).eq(AppArea::getParentId, 0).list();
List<AreaSimpleVO> vos = datas.stream().map(d -> new AreaSimpleVO().setId(d.getId()).setName(d.getName())).collect(Collectors.toList());
vos.forEach(this::bindChildren1);
return vos;
}
}
}
private void bindChildren1(AreaSimpleVO vo) {
List<AppArea> datas = appAreaService.lambdaQuery().eq(AppArea::getParentId, vo.getId()).eq(AppArea::getEnable, true).list();
List<AreaSimpleVO> vos = datas.stream().map(d -> new AreaSimpleVO().setId(d.getId()).setName(d.getName())).collect(Collectors.toList());
vos.forEach(this::bindChildren1);
}
private void bindChildren(AreaSimpleVO vo) {
List<TBaseArea> datas = adminAreaService.lambdaQuery().eq(TBaseArea::getParentAreaRowId, vo.getId()).eq(TBaseArea::getAreaState, 1).list();
List<AreaSimpleVO> vos = datas.stream().map(d -> new AreaSimpleVO().setId(d.getId()).setName(d.getAreaName())).collect(Collectors.toList());
vos.forEach(this::bindChildren);
}
@Transactional
@ -224,6 +290,7 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> impl
// .set(AppUser::getUpdateBy, AdminUserUtil.getUserId())
.set(AppUser::getAreaId, null)
.set(AppUser::getUpdateTime, LocalDateTime.now())
.eq(AppUser::getIsDel, false)
.eq(AppUser::getIsPrimary, false)
.in(AppUser::getId, request.getUserIds())
.update();
@ -232,6 +299,7 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> impl
@Override
public PageData<AppUserForAdminVO> searchAppUserForAdmin(SearchAppUserForAdminRequest request) {
IPage<AppUser> page = lambdaQuery()
.eq(AppUser::getIsDel, false)
.eq(AppUser::getIsPrimary, true)
.eq(Objects.nonNull(request.getUserState()), AppUser::getState, request.getUserState())
.like(StrUtil.isNotBlank(request.getLoginName()), AppUser::getLoginName, request.getLoginName())
@ -290,12 +358,14 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> impl
lambdaUpdate()
.set(AppUser::getState, UserState.Activated.getState())
.set(AppUser::getUpdateTime, LocalDateTime.now())
.eq(AppUser::getIsDel, false)
.in(AppUser::getId, request.getIds())
.update();
} else {
lambdaUpdate()
.set(AppUser::getState, UserState.Disabled.getState())
.set(AppUser::getUpdateTime, LocalDateTime.now())
.eq(AppUser::getIsDel, false)
.in(AppUser::getId, request.getIds())
.update();
//禁用子账号
@ -307,6 +377,7 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> impl
lambdaUpdate()
.set(AppUser::getState, UserState.Disabled.getState())
.set(AppUser::getUpdateTime, LocalDateTime.now())
.eq(AppUser::getIsDel, false)
.eq(AppUser::getIsPrimary, false)
.in(AppUser::getCompanyId, companyIds)
.update();
@ -319,6 +390,7 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> impl
VUtils.trueThrowBusinessError(Objects.isNull(appUser)).throwMessage("主账号不存在");
String[] companyIds = appUser.getCompanyId().split(",");
LambdaQueryWrapper<AppUser> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(AppUser::getIsDel, false);
queryWrapper.eq(AppUser::getIsPrimary, false);
queryWrapper.and(wrapper -> {
for (String companyId : companyIds) {
@ -393,29 +465,16 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> impl
LocalDateTime now = LocalDateTime.now();
request.getIds().forEach(id -> {
AppUser appUser = getById(id);
VUtils.trueThrowBusinessError(Objects.isNull(appUser)).throwMessage("用户不存在");
VUtils.trueThrowBusinessError(!Objects.equals(appUser.getState(), UserState.Activated.getState())).throwMessage(id + "非启用状态");
VUtils.trueThrowBusinessError(Objects.equals(appUser.getIsPrimary(), false)).throwMessage(id + "不是主账号");
VUtils.trueThrowBusinessError(Objects.isNull(appUser))
.throwMessage("用户不存在");
VUtils.trueThrowBusinessError(Objects.equals(appUser.getState(), UserState.ToBeActivated.getState()))
.throwMessage(id + "未激活不能续期");
VUtils.trueThrowBusinessError(Objects.equals(appUser.getIsPrimary(), false))
.throwMessage(id + "不是主账号");
appUser.setExpireTime(appUser.getExpireTime().plusMonths(request.getMonth()));
// appUser.setUpdateBy(AdminUserUtil.getUserId());
appUser.setUpdateTime(now);
updateById(appUser);
// List<String> companys = StrUtil.split(",", appUser.getCompanyId());
// companys.forEach(c -> {
// List<AppUser> users = lambdaQuery()
// .eq(AppUser::getState, UserState.Activated.getState())
// .eq(AppUser::getIsPrimary, false)
// .eq(AppUser::getCompanyId, "," + c + ",")
// .list();
// if (CollectionUtil.isNotEmpty(users)) {
// users.forEach(u -> {
// u.setExpireTime(u.getExpireTime().plusMonths(request.getMonth()));
// u.setUpdateBy(AdminUserUtil.getUserId());
// u.setUpdateTime(now);
// });
// updateBatchById(users);
// }
// });
});
}
@ -458,31 +517,53 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> impl
@Override
public void activateUser(UserActivateRequest request) {
String email="";
String code="";
try {
email=StrUtil.str(Base64.getUrlDecoder().decode(request.getCode()), Charset.defaultCharset());
code=StrUtil.str(Base64.getUrlDecoder().decode(request.getCode()), Charset.defaultCharset());
}catch (IllegalArgumentException ex){
log.error("无效的code:"+request.getCode());
throw new NflgException(STATE.ParamErr,"无效的code:"+request.getCode());
}
AppUser appUser = lambdaQuery()
.eq(AppUser::getLoginName, email)
.one();
VUtils.trueThrowBusinessError(Objects.isNull(appUser)).throwMessage("用户不存在或随机码不正确");
VUtils.trueThrowBusinessError(!Objects.equals(appUser.getState(), UserState.ToBeActivated.getState()))
.throwMessage("当前状态不允许激活");
VUtils.trueThrowBusinessError(PASSWORDENCODER.matches(request.getCode(), appUser.getPassword()))
.throwMessage("随机码不正确");
appUser.setState(UserState.Activated.getState());
appUser.setPassword(PASSWORDENCODER.encode(request.getPassword()));
appUser.setUpdateTime(LocalDateTime.now());
updateById(appUser);
String email=code.split("\\|")[0];
String type=code.split("\\|")[1];
if (StrUtil.equals("0", type)) {
AppUser appUser = lambdaQuery()
.eq(AppUser::getIsDel, false)
.eq(AppUser::getLoginName, email)
.one();
VUtils.trueThrowBusinessError(Objects.isNull(appUser)).throwMessage("用户不存在或随机码不正确");
VUtils.trueThrowBusinessError(!Objects.equals(appUser.getState(), UserState.ToBeActivated.getState()))
.throwMessage("当前状态不允许激活");
VUtils.trueThrowBusinessError(PASSWORDENCODER.matches(request.getCode(), appUser.getPassword()))
.throwMessage("随机码不正确");
appUser.setState(UserState.Activated.getState());
appUser.setPassword(PASSWORDENCODER.encode(request.getPassword()));
appUser.setUpdateTime(LocalDateTime.now());
updateById(appUser);
}else if (StrUtil.equals("1", type)){
//修改邮箱
code=redisTemplate.opsForValue().get(Constant.REDIS_KEY_CHANGE_EMAIL_CODE + email);
VUtils.trueThrowBusinessError(!StrUtil.equals(code, request.getRandomCode()))
.throwMessage("无效的激活码");
String email1=redisTemplate.opsForValue().get(Constant.REDIS_KEY_CHANGE_EMAIL_CODE + code);
VUtils.trueThrowBusinessError(StrUtil.isBlank(email1))
.throwMessage("无效的激活码");
lambdaUpdate()
.set(AppUser::getEmail, email1)
.set(AppUser::getState, UserState.Activated.getState())
.set(AppUser::getUpdateTime,LocalDateTime.now())
.eq(AppUser::getLoginName, email)
.update();
}
}
@Override
public AppUser forgetPassword(String email, String password) {
String encodePassword = PASSWORDENCODER.encode(password);
AppUser user = lambdaQuery().eq(AppUser::getLoginName, email).one();
AppUser user = lambdaQuery()
.eq(AppUser::getIsDel,false)
.eq(AppUser::getLoginName, email)
.one();
VUtils.trueThrowBusinessError(Objects.isNull(user)).throwMessage("用户不存在");
VUtils.trueThrowBusinessError(Objects.equals(user.getState(), UserState.Disabled.getState()))
.throwMessage("禁用状态不能重设密码");
@ -496,6 +577,7 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> impl
@Override
public AppUser getPrimaryByCompanyId(String companyId) {
LambdaQueryWrapper<AppUser> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(AppUser::getIsDel,false);
queryWrapper.eq(AppUser::getIsPrimary, true);
queryWrapper.apply("FIND_IN_SET({0}, company_id)>0", companyId);
return getBaseMapper().selectOne(queryWrapper);
@ -503,6 +585,7 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> impl
private List<AppUserVO> getByCompanyId(Integer companyId) {
return lambdaQuery()
.eq(AppUser::getIsDel,false)
.eq(AppUser::getCompanyId, companyId.toString())
.eq(AppUser::getState, UserState.Activated.getState())
.eq(AppUser::getIsPrimary, false)

View File

@ -3,7 +3,6 @@ package com.nflg.mobilebroken.repository.service.impl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nflg.mobilebroken.common.pojo.query.PageBaseQuery;
import com.nflg.mobilebroken.common.pojo.vo.AreaSimpleVO;
import com.nflg.mobilebroken.common.pojo.vo.TBaseAreaVO;
import com.nflg.mobilebroken.repository.entity.TBaseArea;
import com.nflg.mobilebroken.repository.mapper.TBaseAreaMapper;
@ -12,7 +11,6 @@ import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
/**
* <p>
@ -43,17 +41,4 @@ public class TBaseAreaServiceImpl extends ServiceImpl<TBaseAreaMapper, TBaseArea
return this.getBaseMapper().getCount();
}
@Override
public List<AreaSimpleVO> getSimpleAreas() {
List<TBaseArea> datas = lambdaQuery().eq(TBaseArea::getAreaState, 1).eq(TBaseArea::getParentAreaRowId, 0).list();
List<AreaSimpleVO> vos = datas.stream().map(d -> new AreaSimpleVO().setId(d.getId()).setName(d.getAreaName())).collect(Collectors.toList());
vos.forEach(this::bindChildren);
return vos;
}
private void bindChildren(AreaSimpleVO vo) {
List<TBaseArea> datas = lambdaQuery().eq(TBaseArea::getParentAreaRowId, vo.getId()).eq(TBaseArea::getAreaState, 1).list();
List<AreaSimpleVO> vos = datas.stream().map(d -> new AreaSimpleVO().setId(d.getId()).setName(d.getAreaName())).collect(Collectors.toList());
vos.forEach(this::bindChildren);
}
}

View File

@ -70,4 +70,35 @@ public class TBaseCustomerServiceImpl extends ServiceImpl<TBaseCustomerMapper, T
.setName(d.getAgencyCompanyName()))
.collect(Collectors.toList());
}
@Override
public List<CompanySimpleVO> getSimpleCompanysFromAdmin(Integer userId) {
List<TBaseCustomer> datas;
if (Objects.isNull(userId)){
datas = lambdaQuery()
.eq(TBaseCustomer::getEnableState, 1)
.eq(TBaseCustomer::getDelIs, 0)
.list();
}else {
AppUser appUser = appUserService.getById(userId);
VUtils.trueThrowBusinessError(Objects.isNull(appUser)).throwMessage("用户不存在");
if (appUser.getIsPrimary()){
datas = lambdaQuery()
.eq(TBaseCustomer::getEnableState, 1)
.eq(TBaseCustomer::getDelIs, 0)
.list();
}else {
datas = lambdaQuery()
.eq(TBaseCustomer::getEnableState, 1)
.eq(TBaseCustomer::getDelIs, 0)
.in(TBaseCustomer::getId, StrUtil.split(appUser.getCompanyId(), ",").stream().map(Integer::parseInt).collect(Collectors.toList()))
.list();
}
}
return datas.stream()
.map(d -> new CompanySimpleVO()
.setId(d.getId())
.setName(d.getAgencyCompanyName()))
.collect(Collectors.toList());
}
}

View File

@ -9,6 +9,7 @@ import com.nflg.mobilebroken.common.constant.TicketUrgency;
import com.nflg.mobilebroken.common.pojo.dto.UserDTO;
import com.nflg.mobilebroken.common.pojo.request.*;
import com.nflg.mobilebroken.common.pojo.vo.AdminTicketVO;
import com.nflg.mobilebroken.common.pojo.vo.AdminUserSimpleVO;
import com.nflg.mobilebroken.common.pojo.vo.TicketVO;
import com.nflg.mobilebroken.common.util.AdminUserUtil;
import com.nflg.mobilebroken.common.util.AppUserUtil;
@ -287,4 +288,11 @@ public class TicketServiceImpl extends ServiceImpl<TicketMapper, Ticket> impleme
.lt(Ticket::getUpdateTime, LocalDateTime.now().minusDays(days-1))
.list();
}
@Override
public List<AdminUserSimpleVO> getTicketHandle(Integer id) {
Ticket ticket=getById(id);
List<Integer> handles=Arrays.stream(ticket.getHandle().split(",")).map(Integer::parseInt).collect(Collectors.toList());
return adminUserService.getSimples(handles);
}
}

View File

@ -6,7 +6,17 @@
SELECT u.*
FROM admin_role r
INNER JOIN admin_user_role_map urm ON r.id=urm.role_id
INNER JOIN admin_user u ON urm.user_id=u.id
INNER JOIN admin_user u ON urm.user_id=u.id AND u.is_del=0
WHERE r.`code`=#{roleCode}
</select>
<select id="getSimples" resultType="com.nflg.mobilebroken.common.pojo.vo.AdminUserSimpleVO">
SELECT au.id AS 'userId',au.user_code,au.user_name,dp.dept_name AS 'departmentName'
FROM admin_user au
LEFT JOIN t_base_department dp ON au.department_id=dp.id
WHERE au.id IN
<foreach collection="userIds" item="userId" separator="," open="(" close=")">
#{userId}
</foreach>
</select>
</mapper>

View File

@ -9,7 +9,7 @@
INNER JOIN app_area a ON u.area_id=a.id
LEFT JOIN app_user uc ON u.create_by=uc.id
LEFT JOIN app_user uu ON u.update_by=uu.id
WHERE u.is_primary=false AND u.company_id IN
WHERE u.is_del=0 AND u.is_primary=false AND u.company_id IN
<foreach collection="request.companyIds" item="companyId" open="(" separator="," close=")">
#{companyId}
</foreach>
@ -64,7 +64,7 @@
LEFT JOIN app_user uc ON u.create_by=uc.id
LEFT JOIN app_user uu ON u.update_by=uu.id
LEFT JOIN t_base_position p ON u.title_id=p.id
WHERE u.is_primary=false AND u.company_id=#{companyId}
WHERE u.is_del=0 AND u.is_primary=false AND u.company_id=#{companyId}
<if test="state != null">
AND u.state = #{state}
</if>