feat: 一些调整

This commit is contained in:
曹鹏飞 2025-02-20 20:43:55 +08:00
parent 0224018087
commit e41216f9c4
24 changed files with 187 additions and 157 deletions

View File

@ -55,21 +55,19 @@ public class FileController extends ControllerBase {
,@Valid @NotNull @RequestParam("source") Byte source
,@Valid @NotNull @RequestParam("sourceId") Integer sourceId) {
try {
String url=fileUploadService.upload(buildFilePath(file), file);
fileUploadRecordService.save(buildFileUploadRecord(source,sourceId,file,url));
String fileName=file.getOriginalFilename().substring(0,file.getOriginalFilename().lastIndexOf("."));
String fileType=file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
String url=fileUploadService.upload(buildFilePath(fileName,fileType), file);
fileUploadRecordService.save(buildFileUploadRecord(source,sourceId,fileName,fileType,url));
return ApiResult.success(url);
} catch (Exception ex) {
throw new NflgException(STATE.BusinessError, "上传文件失败:" + ex.getMessage());
}
}
private String buildFilePath(MultipartFile file) {
return StrUtil.format("admin/{}/{}/{}{}", LocalDateTime.now().format(FORMATTER), AdminUserUtil.getUserId(),
RandomUtil.randomString(6),getExtensions(file));
}
private String getExtensions(MultipartFile file){
return file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
private String buildFilePath(String fileName, String fileType) {
return StrUtil.format("admin/{}/{}/{}/{}{}", LocalDateTime.now().format(FORMATTER), AdminUserUtil.getUserId()
, RandomUtil.randomString(4), fileName, fileType);
}
/**
@ -87,10 +85,12 @@ public class FileController extends ControllerBase {
try {
List<String> list = new ArrayList<>();
List<FileUploadRecord> records = new ArrayList<>();
for (MultipartFile f : files) {
String url=fileUploadService.upload(buildFilePath(f), f);
for (MultipartFile file : files) {
String fileName=file.getOriginalFilename().substring(0,file.getOriginalFilename().lastIndexOf("."));
String fileType=file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
String url=fileUploadService.upload(buildFilePath(fileName,fileType), file);
list.add(url);
records.add(buildFileUploadRecord(source,sourceId,f,url));
records.add(buildFileUploadRecord(source,sourceId,fileName,fileType,url));
}
fileUploadRecordService.saveBatch(records);
return ApiResult.success(list);
@ -107,7 +107,9 @@ public class FileController extends ControllerBase {
@PostMapping("uploadSingleFile1")
public ApiResult<String> uploadSingleFile1(@Valid @NotNull @RequestParam("file") MultipartFile file) {
try {
String url=fileUploadService.upload(buildFilePath(file), file);
String fileName=file.getOriginalFilename().substring(0,file.getOriginalFilename().lastIndexOf("."));
String fileType=file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
String url=fileUploadService.upload(buildFilePath(fileName,fileType), file);
return ApiResult.success(url);
}catch (Exception ex){
throw new NflgException(STATE.BusinessError,"上传文件失败:"+ex.getMessage());
@ -115,10 +117,10 @@ public class FileController extends ControllerBase {
}
private FileUploadRecord buildFileUploadRecord(Byte source,Integer sourceId,MultipartFile file, String url){
private FileUploadRecord buildFileUploadRecord(Byte source,Integer sourceId,String fileName,String fileType, String url){
return new FileUploadRecord()
.setFileName(file.getOriginalFilename())
.setFileType(file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")))
.setFileName(fileName)
.setFileType(fileType)
.setFrom("admin")
.setCreateTime(LocalDateTime.now())
.setSource(source)

View File

@ -125,7 +125,10 @@ public class TicketController extends ControllerBase {
@PostMapping("searchTicket")
@ApiMark(moduleName = "工单管理", apiName = "搜索工单")
public ApiResult<PageData<AdminTicketVO>> searchTicket(@Valid @RequestBody AdminTicketSearchRequest request) {
return ApiResult.success(PageUtil.convert(ticketService.searchPage(request), d -> d));
return ApiResult.success(PageUtil.convert(ticketService.searchPage(request), d -> {
d.setEvaluate(getTicketEvaluate(d.getId()));
return d;
}));
}
/**
@ -167,6 +170,20 @@ public class TicketController extends ControllerBase {
} catch (IOException e) {
log.error("发送SSE消息出错", e);
}
ticketEventPublisher.publishTicketAssignedEvent(ticket,request.getUserIds());
return ApiResult.success();
}
/**
* 添加工单处理人
* @param request 请求参数
*/
@PostMapping("addTicketHandle")
@MethodInfoMark(value = "添加工单处理人", menuName = "工单管理")
@ApiMark(moduleName = "工单管理", apiName = "添加工单处理人")
public ApiResult<Void> addTicketHandle(@Valid @RequestBody TicketHandleAddRequest request){
Ticket ticket=ticketService.addTicketHandle(request);
ticketEventPublisher.publishTicketAssignedEvent(ticket,request.getUserIds());
return ApiResult.success();
}
@ -180,7 +197,7 @@ public class TicketController extends ControllerBase {
public ApiResult<Void> completeTicket(@Valid @RequestBody @NotEmpty List<Integer> ids) {
for (Integer id : ids){
Ticket ticket=ticketService.completeTicket(id);
ticketEventPublisher.publishTicketCompleteEvent(ticket,MultilingualUtil.getLanguage(),MultilingualUtil.getZone());
ticketEventPublisher.publishTicketCompleteEvent(ticket);
TicketChatDTO message=new TicketChatDTO()
.setTicketId(ticket.getId())
.setMessages(Collections.singletonList(new ChatMessageDTO()
@ -212,7 +229,7 @@ public class TicketController extends ControllerBase {
@ApiMark(moduleName = "工单管理", apiName = "关闭工单")
public ApiResult<Void> closeTicket(@Valid @RequestBody TicketCloseRequest request) {
Ticket ticket=ticketService.closeTicket(request);
ticketEventPublisher.publishTicketCloseEvent(ticket,MultilingualUtil.getLanguage(),MultilingualUtil.getZone());
ticketEventPublisher.publishTicketCloseEvent(ticket);
TicketChatDTO message=new TicketChatDTO()
.setTicketId(ticket.getId())
.setMessages(Collections.singletonList(new ChatMessageDTO()
@ -493,7 +510,7 @@ public class TicketController extends ControllerBase {
} catch (IOException e) {
log.error("发送SSE消息出错", e);
}
ticketEventPublisher.publishTicketReplyEvent(ticket, MultilingualUtil.getLanguage(), MultilingualUtil.getZone());
ticketEventPublisher.publishTicketReplyEvent(ticket);
return ApiResult.success();
}
}

View File

@ -1,4 +1,4 @@
package com.nflg.mobilebroken.cfs.event;
package com.nflg.mobilebroken.admin.event;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DatePattern;
@ -22,10 +22,7 @@ import org.springframework.context.ApplicationEvent;
import javax.mail.MessagingException;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@ -34,19 +31,17 @@ public class TicketAssignedEvent extends ApplicationEvent implements Application
private static final DateTimeFormatter FORMATTER= DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
private final Ticket ticket;
private final String language;
private final String zone;
private final List<Integer> userIds;
private IDictionaryItemTranslateService dictionaryItemTranslateService;
private IAppUserService appUserService;
private EmailService emailService;
private IAdminUserService adminUserService;
private IAdminMessageService adminMessageService;
public TicketAssignedEvent(Object source, Ticket ticket, String language, String zone) {
public TicketAssignedEvent(Object source, Ticket ticket, List<Integer> userIds) {
super(source);
this.ticket = ticket;
this.language = language;
this.zone = zone;
this.userIds = userIds;
}
@Override
@ -65,7 +60,6 @@ public class TicketAssignedEvent extends ApplicationEvent implements Application
private void sendUserMessage(){
//我的待办
List<Integer> userIds=Arrays.stream(ticket.getHandle().split(",")).filter(StrUtil::isNotBlank).map(Integer::parseInt).collect(Collectors.toList());
List<AdminUser> adminUsers=adminUserService.listByIds(userIds);
if (CollectionUtil.isNotEmpty(adminUsers)){
adminUsers.forEach(c -> adminMessageService.add(
@ -84,17 +78,16 @@ public class TicketAssignedEvent extends ApplicationEvent implements Application
private void sendEmail(){
try {
List<Integer> userIds = Arrays.stream(ticket.getHandle().split(",")).filter(StrUtil::isNotBlank).map(Integer::parseInt).collect(Collectors.toList());
List<AdminUser> adminUsers = adminUserService.listByIds(userIds);
if (CollectionUtil.isNotEmpty(adminUsers)) {
AppUser appUser=appUserService.getById(ticket.getUserId());
String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_ASSIGNED, language);
String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY, language)
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(",",adminUsers.stream().map(AdminUser::getUserName).collect(Collectors.toList())))
.replace("${createTime}", toTimeString(ticket.getCreateTime()))
.replace("${createTime}", ticket.getCreateTime().format(FORMATTER))
.replace("${msg}", subject);
sendEmail(adminUsers, subject, content);
}
@ -110,11 +103,4 @@ public class TicketAssignedEvent extends ApplicationEvent implements Application
}
}
}
private String toTimeString(LocalDateTime time){
return time.atZone(ZoneOffset.UTC)
.withZoneSameInstant(ZoneId.of(zone))
.toLocalDateTime()
.format(FORMATTER);
}
}

View File

@ -26,8 +26,6 @@ public class TicketCloseEvent extends ApplicationEvent implements ApplicationCon
private static final DateTimeFormatter FORMATTER= DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
private final Ticket ticket;
private final String language;
private final String zone;
private IDictionaryItemTranslateService dictionaryItemTranslateService;
private IAppUserService appUserService;
private EmailService emailService;
@ -35,11 +33,9 @@ public class TicketCloseEvent extends ApplicationEvent implements ApplicationCon
private IAdminUserService adminUserService;
private IAdminMessageService adminMessageService;
public TicketCloseEvent(Object source,Ticket ticket, String language, String zone) {
public TicketCloseEvent(Object source,Ticket ticket) {
super(source);
this.ticket = ticket;
this.language = language;
this.zone = zone;
}
@Override

View File

@ -22,8 +22,6 @@ public class TicketCompleteEvent extends ApplicationEvent implements Application
private static final DateTimeFormatter FORMATTER= DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
private final Ticket ticket;
private final String language;
private final String zone;
private IDictionaryItemTranslateService dictionaryItemTranslateService;
private IAppUserService appUserService;
private EmailService emailService;
@ -32,11 +30,9 @@ public class TicketCompleteEvent extends ApplicationEvent implements Application
private IAdminMessageService adminMessageService;
private IAppMessageService appMessageService;
public TicketCompleteEvent(Object source,Ticket ticket, String language, String zone) {
public TicketCompleteEvent(Object source,Ticket ticket) {
super(source);
this.ticket = ticket;
this.language = language;
this.zone = zone;
}
@Override

View File

@ -18,8 +18,6 @@ import org.springframework.context.ApplicationEvent;
import javax.mail.MessagingException;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;
@ -30,8 +28,6 @@ public class TicketReplyEvent extends ApplicationEvent implements ApplicationCon
private static final DateTimeFormatter FORMATTER= DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
private final Ticket ticket;
private final String language;
private final String zone;
private IDictionaryItemTranslateService dictionaryItemTranslateService;
private IAppUserService appUserService;
private EmailService emailService;
@ -40,11 +36,9 @@ public class TicketReplyEvent extends ApplicationEvent implements ApplicationCon
private IAdminMessageService adminMessageService;
private IAppMessageService appMessageService;
public TicketReplyEvent(Object source,Ticket ticket, String language, String zone) {
public TicketReplyEvent(Object source,Ticket ticket) {
super(source);
this.ticket = ticket;
this.language = language;
this.zone = zone;
}
@Override
@ -79,13 +73,13 @@ public class TicketReplyEvent extends ApplicationEvent implements ApplicationCon
List<AdminUser> adminUsers = adminUserService.listByIds(userIds);
if (CollectionUtil.isNotEmpty(adminUsers)) {
AppUser appUser=appUserService.getById(ticket.getUserId());
String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_REPLY, language);
String content = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_CONTENT_TICKET_NOTIFY, language)
String subject = dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_EMAIL_NOTIFY, Constant.DICTIONARY_ITEM_EMAIL_TITLE_TICKET_REPLY, 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(",",adminUsers.stream().map(AdminUser::getUserName).collect(Collectors.toList())))
.replace("${createTime}", toTimeString(ticket.getCreateTime()))
.replace("${createTime}", ticket.getCreateTime().format(FORMATTER))
.replace("${msg}", subject);
//发送给提交人
sendEmail(appUser, subject, content);
@ -98,11 +92,4 @@ public class TicketReplyEvent extends ApplicationEvent implements ApplicationCon
private void sendEmail(AppUser appUser,String subject,String content) throws MessagingException {
emailService.sendEmail(appUser.getEmail(),subject,content);
}
private String toTimeString(LocalDateTime time){
return time.atZone(ZoneOffset.UTC)
.withZoneSameInstant(ZoneId.of(zone))
.toLocalDateTime()
.format(FORMATTER);
}
}

View File

@ -1,5 +1,6 @@
package com.nflg.mobilebroken.admin.listener;
import com.nflg.mobilebroken.admin.event.TicketAssignedEvent;
import com.nflg.mobilebroken.admin.event.TicketCloseEvent;
import com.nflg.mobilebroken.admin.event.TicketCompleteEvent;
import com.nflg.mobilebroken.admin.event.TicketReplyEvent;
@ -10,6 +11,12 @@ import org.springframework.stereotype.Component;
@Component
public class TicketEventListener {
@Async
@EventListener
public void handleTicketAssignedEvent(TicketAssignedEvent event) {
event.send();
}
@Async
@EventListener
public void handleTicketReplyEvent(TicketReplyEvent event) {

View File

@ -1,5 +1,6 @@
package com.nflg.mobilebroken.admin.publisher;
import com.nflg.mobilebroken.admin.event.TicketAssignedEvent;
import com.nflg.mobilebroken.admin.event.TicketCloseEvent;
import com.nflg.mobilebroken.admin.event.TicketCompleteEvent;
import com.nflg.mobilebroken.admin.event.TicketReplyEvent;
@ -9,6 +10,7 @@ import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class TicketEventPublisher {
@ -19,20 +21,26 @@ public class TicketEventPublisher {
@Resource
private ApplicationContext applicationContext;
public void publishTicketReplyEvent(Ticket ticket, String language, String zone) {
TicketReplyEvent event = new TicketReplyEvent(this, ticket, language, zone);
public void publishTicketAssignedEvent(Ticket ticket, List<Integer> userIds) {
TicketAssignedEvent event = new TicketAssignedEvent(this, ticket,userIds);
event.setApplicationContext(applicationContext);
eventPublisher.publishEvent(event);
}
public void publishTicketCompleteEvent(Ticket ticket, String language, String zone) {
TicketCompleteEvent event = new TicketCompleteEvent(this, ticket, language, zone);
public void publishTicketReplyEvent(Ticket ticket) {
TicketReplyEvent event = new TicketReplyEvent(this, ticket);
event.setApplicationContext(applicationContext);
eventPublisher.publishEvent(event);
}
public void publishTicketCloseEvent(Ticket ticket, String language, String zone) {
TicketCloseEvent event = new TicketCloseEvent(this, ticket, language, zone);
public void publishTicketCompleteEvent(Ticket ticket) {
TicketCompleteEvent event = new TicketCompleteEvent(this, ticket);
event.setApplicationContext(applicationContext);
eventPublisher.publishEvent(event);
}
public void publishTicketCloseEvent(Ticket ticket) {
TicketCloseEvent event = new TicketCloseEvent(this, ticket);
event.setApplicationContext(applicationContext);
eventPublisher.publishEvent(event);
}

View File

@ -54,8 +54,8 @@ public class AdminController extends ControllerBase {
@Valid @NotBlank(message = "密码不能为空") @RequestParam("password") String password) {
AdminUser user=adminUserService.getUser(userName,password);
VUtils.trueThrow(Objects.isNull(user)).throwMessage(STATE.PassportErr,"用户名或密码错误");
VUtils.trueThrow(Objects.equals(user.getState(), UserState.Disabled.getState())).throwMessage(STATE.PassportErr, "被禁用,请联系管理员");
VUtils.trueThrow(Objects.equals(user.getState(), UserState.ToBeActivated.getState())).throwMessage(STATE.PassportErr, "未激活");
VUtils.trueThrow(Objects.equals(user.getState(), UserState.Disabled.getState())).throwMessage(STATE.PassportErr, "被禁用,请联系管理员");
VUtils.trueThrow(Objects.equals(user.getState(), UserState.ToBeActivated.getState())).throwMessage(STATE.PassportErr, "未激活");
List<RoleVO> roleCodes = adminUserRoleMapService.getRoleList(user.getId());
SaTokenAdminUtil.login(user.getId(), SaLoginConfig
.setExtra("from", "admin")

View File

@ -3,6 +3,7 @@ package com.nflg.mobilebroken.auth.controller;
import cn.dev33.satoken.stp.SaLoginConfig;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.hutool.core.util.StrUtil;
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.pojo.ApiResult;
@ -11,6 +12,7 @@ import com.nflg.mobilebroken.common.util.SaTokenAppUtil;
import com.nflg.mobilebroken.common.util.VUtils;
import com.nflg.mobilebroken.repository.entity.AppUser;
import com.nflg.mobilebroken.repository.service.IAppUserService;
import com.nflg.mobilebroken.repository.service.IDictionaryItemTranslateService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@ -30,7 +32,10 @@ import java.util.stream.Collectors;
public class AppController extends ControllerBase {
@Resource
IAppUserService appUserService;
private IAppUserService appUserService;
@Resource
private IDictionaryItemTranslateService dictionaryItemTranslateService;
/**
* 用户端登录
@ -41,10 +46,16 @@ public class AppController extends ControllerBase {
@GetMapping("login")
public ApiResult<AppLoginVO> login(String userName, String password) {
AppUser user=appUserService.getUser(userName,password);
VUtils.trueThrow(Objects.isNull(user)).throwMessage(STATE.PassportErr,"用户名或密码错误");
VUtils.trueThrow(Objects.equals(user.getState(), UserState.Disabled.getState())).throwMessage(STATE.PassportErr, "账户被禁用,请联系管理员");
VUtils.trueThrow(Objects.equals(user.getState(), UserState.ToBeActivated.getState())).throwMessage(STATE.PassportErr, "账户未激活");
VUtils.trueThrow(user.getExpireTime().isBefore(ChronoLocalDate.from(LocalDateTime.now()))).throwMessage(STATE.PassportErr, "用户已过期,请联系管理员");
VUtils.trueThrow(Objects.isNull(user))
.throwMessage(STATE.PassportErr,dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_SYSTEMERROR,Constant.DICTIONARY_ITEM_INCORRECTUSERNAMEORPASSWORD,Constant.DEFAULT_LANGUAGE_CODE));
VUtils.trueThrow(Objects.equals(user.getState(), UserState.Disabled.getState()))
.throwMessage(STATE.PassportErr, dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_SYSTEMERROR,Constant.DICTIONARY_ITEM_ACCOUNT_DISABLED,user.getLanguageCode()));
VUtils.trueThrow(Objects.equals(user.getState(), UserState.ToBeActivated.getState()))
.throwMessage(STATE.PassportErr, dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_SYSTEMERROR,Constant.DICTIONARY_ITEM_ACCOUNT_NOT_ACTIVATED,user.getLanguageCode()));
VUtils.trueThrow(user.getExpireTime().isBefore(ChronoLocalDate.from(LocalDateTime.now())) && user.getIsPrimary())
.throwMessage(STATE.PassportErr, dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_SYSTEMERROR,Constant.DICTIONARY_ITEM_ACCOUNT_HAS_EXPIRED_PRIMARY,user.getLanguageCode()));
VUtils.trueThrow(user.getExpireTime().isBefore(ChronoLocalDate.from(LocalDateTime.now())) && !user.getIsPrimary())
.throwMessage(STATE.PassportErr, dictionaryItemTranslateService.getValueByCode(Constant.DICTIONARY_SYSTEMERROR,Constant.DICTIONARY_ITEM_ACCOUNT_HAS_EXPIRED,user.getLanguageCode()));
SaTokenAppUtil.login(user.getId(), SaLoginConfig
.setExtra("from", "app")
.setExtra("name", user.getName())

View File

@ -53,21 +53,19 @@ public class FileController extends ControllerBase {
,@Valid @NotNull @RequestParam("source") Byte source
,@Valid @NotNull @RequestParam("sourceId") Integer sourceId) {
try {
String url=fileUploadService.upload(buildFilePath(file), file);
fileUploadRecordService.save(buildFileUploadRecord(source,sourceId,file,url));
String fileName=file.getOriginalFilename().substring(0,file.getOriginalFilename().lastIndexOf("."));
String fileType=file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
String url=fileUploadService.upload(buildFilePath(fileName,fileType), file);
fileUploadRecordService.save(buildFileUploadRecord(source,sourceId,fileName,fileType,url));
return ApiResult.success(url);
}catch (Exception ex){
throw new NflgException(STATE.BusinessError,"上传文件失败:"+ex.getMessage());
}
}
private String buildFilePath(MultipartFile file) {
return StrUtil.format("cfs/{}/{}/{}{}", LocalDateTime.now().format(FORMATTER), AppUserUtil.getUserId(),
RandomUtil.randomString(6),getExtensions(file));
}
private String getExtensions(MultipartFile file){
return file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
private String buildFilePath(String fileName,String fileType) {
return StrUtil.format("cfs/{}/{}/{}/{}{}", LocalDateTime.now().format(FORMATTER), AppUserUtil.getUserId()
, RandomUtil.randomString(4), fileName,fileType);
}
/**
@ -84,10 +82,12 @@ public class FileController extends ControllerBase {
try {
List<String> list = new ArrayList<>();
List<FileUploadRecord> records = new ArrayList<>();
for (MultipartFile f : files) {
String url=fileUploadService.upload(buildFilePath(f), f);
for (MultipartFile file : files) {
String fileName=file.getOriginalFilename().substring(0,file.getOriginalFilename().lastIndexOf("."));
String fileType=file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
String url=fileUploadService.upload(buildFilePath(fileName,fileType), file);
list.add(url);
records.add(buildFileUploadRecord(source,sourceId,f,url));
records.add(buildFileUploadRecord(source,sourceId,fileName,fileType,url));
}
fileUploadRecordService.saveBatch(records);
return ApiResult.success(list);
@ -104,17 +104,19 @@ public class FileController extends ControllerBase {
@PostMapping("uploadSingleFile1")
public ApiResult<String> uploadSingleFile1(@Valid @NotNull @RequestParam("file") MultipartFile file) {
try {
String url=fileUploadService.upload(buildFilePath(file), file);
String fileName=file.getOriginalFilename().substring(0,file.getOriginalFilename().lastIndexOf("."));
String fileType=file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
String url=fileUploadService.upload(buildFilePath(fileName,fileType), file);
return ApiResult.success(url);
}catch (Exception ex){
throw new NflgException(STATE.BusinessError,"上传文件失败:"+ex.getMessage());
}
}
private FileUploadRecord buildFileUploadRecord(Byte source,Integer sourceId,MultipartFile file,String url){
private FileUploadRecord buildFileUploadRecord(Byte source,Integer sourceId,String fileName,String fileType,String url){
return new FileUploadRecord()
.setFileName(file.getOriginalFilename())
.setFileType(file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")))
.setFileName(fileName)
.setFileType(fileType)
.setFrom("app")
.setCreateTime(LocalDateTime.now())
.setSource(source)

View File

@ -1,6 +1,5 @@
package com.nflg.mobilebroken.cfs.listener;
import com.nflg.mobilebroken.cfs.event.TicketAssignedEvent;
import com.nflg.mobilebroken.cfs.event.TicketCreateEvent;
import com.nflg.mobilebroken.cfs.event.TicketReplyEvent;
import com.nflg.mobilebroken.cfs.event.TicketRevokeEvent;
@ -17,12 +16,6 @@ public class TicketEventListener {
event.send();
}
@Async
@EventListener
public void handleTicketAssignedEvent(TicketAssignedEvent event) {
event.send();
}
@Async
@EventListener
public void handleTicketReplyEvent(TicketReplyEvent event) {

View File

@ -1,6 +1,9 @@
package com.nflg.mobilebroken.cfs.publisher;
import com.nflg.mobilebroken.cfs.event.*;
import com.nflg.mobilebroken.cfs.event.TicketCreateEvent;
import com.nflg.mobilebroken.cfs.event.TicketReopenEvent;
import com.nflg.mobilebroken.cfs.event.TicketReplyEvent;
import com.nflg.mobilebroken.cfs.event.TicketRevokeEvent;
import com.nflg.mobilebroken.repository.entity.Ticket;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationEventPublisher;
@ -23,12 +26,6 @@ public class TicketEventPublisher {
eventPublisher.publishEvent(event);
}
public void publishTicketAssignedEvent(Ticket ticket, String language, String zone) {
TicketAssignedEvent event = new TicketAssignedEvent(this, ticket, language, zone);
event.setApplicationContext(applicationContext);
eventPublisher.publishEvent(event);
}
public void publishTicketReplyEvent(Ticket ticket, String language, String zone) {
TicketReplyEvent event = new TicketReplyEvent(this, ticket, language, zone);
event.setApplicationContext(applicationContext);

View File

@ -6,18 +6,12 @@ public class Constant {
public static final String DICTIONARY_TYPE_SERVICE_EVALUATION = "ServiceEvaluation";
// public static final String DICTIONARY_TYPE_SERVICE_EVALUATION_SELECT = "ServiceEvaluationSelect";
public static final String DICTIONARY_TYPE_EXPERIENCE_EVALUATION = "ExperienceEvaluation";
// public static final String DICTIONARY_TYPE_EXPERIENCE_EVALUATION_SELECT = "ExperienceEvaluationSelect";
public static final String DICTIONARY_TYPE_TITLE_CQM = "CQM";
public static final String DICTIONARY_ITEM_DEVICECOMPONENT = "modelComponents";
public static final String REDIS_KEY_USER_RESETPASSWORD_RANDOM_CODE_APP = "app:kaptcha:user:resetpassword:{}";
public static final String REDIS_KEY_USER_UPDATE_KAPTCHA_APP = "app:kaptcha:user:update:{}";
public static final String REDIS_KEY_USER_UPDATE_KAPTCHA_ADMIN = "admin:kaptcha:user:update:{}";
@ -81,4 +75,16 @@ public class Constant {
* 角色 账号审核
*/
public static final String ROLE_CODE_ACCOUNT_REVIEW = "AccountReview";
public static final String DICTIONARY_SYSTEMERROR ="SystemErrorMessage";
public static final String DICTIONARY_ITEM_INCORRECTUSERNAMEORPASSWORD="IncorrectUsernameOrPassword";
public static final String DICTIONARY_ITEM_ACCOUNT_DISABLED="AccountDisabled";
public static final String DICTIONARY_ITEM_ACCOUNT_NOT_ACTIVATED="AccountNotActivated";
public static final String DICTIONARY_ITEM_ACCOUNT_HAS_EXPIRED_PRIMARY="AccountHasExpiredPrimary";
public static final String DICTIONARY_ITEM_ACCOUNT_HAS_EXPIRED="AccountHasExpired";
}

View File

@ -2,14 +2,18 @@ package com.nflg.mobilebroken.common.pojo.request;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
public class MigrateAppUserRequest {
// 新公司id
@NotNull
private Integer companyId;
// 用户id集合
@NotEmpty
private List<Integer> userIds;
}

View File

@ -0,0 +1,19 @@
package com.nflg.mobilebroken.common.pojo.request;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
public class TicketHandleAddRequest {
//工单id
@NotNull
private Integer ticketId;
//用户id列表
@NotEmpty
private List<Integer> userIds;
}

View File

@ -148,4 +148,8 @@ public class AdminTicketVO {
public String getFollowedDesc() {
return followed ? "已关注" : "未关注";
}
//评价
@IgnoreExport
private TicketEvaluateVO evaluate;
}

View File

@ -3,7 +3,6 @@ package com.nflg.mobilebroken.repository.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.nflg.mobilebroken.common.pojo.PageData;
import com.nflg.mobilebroken.common.pojo.request.AdminMessageSearchRequest;
import com.nflg.mobilebroken.common.pojo.vo.AdminMessageVO;
import com.nflg.mobilebroken.repository.entity.AdminMessage;
@ -20,5 +19,5 @@ public interface AdminMessageMapper extends BaseMapper<AdminMessage> {
IPage<AdminMessageVO> search(Integer userId, AdminMessageSearchRequest request, IPage<AdminMessageVO> page);
PageData<AdminMessageVO> getNotReadMessage(Integer userId, Integer num, Page<?> page);
IPage<AdminMessageVO> getNotReadMessage(Integer userId, Integer num, Page<?> page);
}

View File

@ -2,11 +2,9 @@ package com.nflg.mobilebroken.repository.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nflg.mobilebroken.common.pojo.PageData;
import com.nflg.mobilebroken.common.pojo.request.AdminMessageSearchRequest;
import com.nflg.mobilebroken.common.pojo.vo.AdminMessageVO;
import com.nflg.mobilebroken.repository.entity.AdminMessage;
import com.nflg.mobilebroken.repository.entity.Ticket;
import java.util.List;
@ -26,9 +24,7 @@ public interface IAdminMessageService extends IService<AdminMessage> {
void setNotRead(List<Integer> ids);
void addCQMNotify(Ticket ticket);
void add(AdminMessage message);
PageData<AdminMessageVO> getNotReadMessage(Integer userId, Integer num);
IPage<AdminMessageVO> getNotReadMessage(Integer userId, Integer num);
}

View File

@ -43,4 +43,6 @@ public interface ITicketService extends IService<Ticket> {
Ticket revoked(Integer id);
Ticket reopen(Integer id);
Ticket addTicketHandle(TicketHandleAddRequest request);
}

View File

@ -4,11 +4,9 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.pojo.PageData;
import com.nflg.mobilebroken.common.pojo.request.AdminMessageSearchRequest;
import com.nflg.mobilebroken.common.pojo.vo.AdminMessageVO;
import com.nflg.mobilebroken.repository.entity.AdminMessage;
import com.nflg.mobilebroken.repository.entity.Ticket;
import com.nflg.mobilebroken.repository.mapper.AdminMessageMapper;
import com.nflg.mobilebroken.repository.service.IAdminMessageService;
import org.springframework.stereotype.Service;
@ -48,30 +46,6 @@ public class AdminMessageServiceImpl extends ServiceImpl<AdminMessageMapper, Adm
.update();
}
@Transactional
@Override
public void addCQMNotify(Ticket ticket) {
// List<Integer> cqms=deviceTypeService.getCqmsByDeviceType(ticket.getDeviceNo());
// if (CollectionUtil.isEmpty(cqms)){
// log.warn("该设备尚未设置CQM负责人:"+ticket.getDeviceNo());
// }else {
// List<AdminUser> cqmUsers = adminUserService.listByIds(cqms);
// if (CollectionUtil.isNotEmpty(cqmUsers)) {
// cqmUsers.forEach(c -> add(
// new AdminMessage()
// .setNo(ticket.getNo())
// .setUserId(c.getId())
// .setSourceId(ticket.getId())
// .setSource(0)
// .setType(MessageType.WorkOrderAssignment.getState())
// .setSubType(MessageSubType.TicketToBeAssigned.getState())
// .setIsRead(false)
// .setCreateTime(LocalDateTime.now()))
// );
// }
// }
}
@Transactional
public void add(AdminMessage message){
remove(new LambdaQueryWrapper<AdminMessage>()
@ -82,7 +56,7 @@ public class AdminMessageServiceImpl extends ServiceImpl<AdminMessageMapper, Adm
}
@Override
public PageData<AdminMessageVO> getNotReadMessage(Integer userId, Integer num) {
public IPage<AdminMessageVO> getNotReadMessage(Integer userId, Integer num) {
return baseMapper.getNotReadMessage(userId, num, new Page<>(1, num));
}
}

View File

@ -55,6 +55,9 @@ public class AppUserApplyforServiceImpl extends ServiceImpl<AppUserApplyforMappe
@Resource
private ITBaseCustomerService customerService;
@Resource
private ITBaseAreaService baseAreaService;
@Override
public AppUserApplyfor add(AddUserRequest request) {
VUtils.trueThrowBusinessError(appUserService.lambdaQuery().eq(AppUser::getEmail, request.getEmail()).exists())
@ -127,23 +130,25 @@ public class AppUserApplyforServiceImpl extends ServiceImpl<AppUserApplyforMappe
applyfor.setAreaId(appUser.getAreaId());
applyfor.setTitleId(appUser.getTitleId());
List<TBaseCustomer> customers =customerService.listByIds(Arrays.stream(appUser.getCompanyId().split(",")).map(Integer::parseInt).collect(Collectors.toList()));
applyforInfo.setCompanyName(StrUtil.join(",",customers.stream().map(TBaseCustomer::getAgencyCompanyName).collect(Collectors.toList())));
applyforInfo
.setCompanyName(StrUtil.join(",",customers.stream().map(TBaseCustomer::getAgencyCompanyName).collect(Collectors.toList())))
.setPhone(appUser.getPhone())
.setUserName(appUser.getName())
.setEmail(appUser.getEmail());
}
AppArea area = appAreaService.getById(applyfor.getAreaId());
applyforInfo.setAreaName(area.getName());
if (Objects.nonNull(applyfor.getAreaId())) {
AppArea area = appAreaService.getById(applyfor.getAreaId());
applyforInfo.setAreaName(area.getName());
}
if (Objects.nonNull(applyfor.getTitleId())) {
TBasePosition position = positionService.getById(applyfor.getTitleId());
applyforInfo.setTitleName(position.getPositionName());
}
vo.setApplyfor(applyforInfo);
appUser = appUserService.getById(applyfor.getCreateBy());
area = appAreaService.getById(appUser.getAreaId());
TBaseArea area = baseAreaService.getById(appUser.getAreaId());
vo.setUser(new AppUserVO()
.setAreaName(area.getName())
.setAreaName(area.getAreaName())
.setSalesUserName(appUser.getSalesUserName())
.setState(1)
.setExpireTime(appUser.getExpireTime())

View File

@ -213,6 +213,7 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> impl
updateById(user);
}
@Transactional
@Override
public void migrate(MigrateAppUserRequest request) {
AppUser appUser = getPrimaryByCompanyId(request.getCompanyId().toString());
@ -221,6 +222,7 @@ public class AppUserServiceImpl extends ServiceImpl<AppUserMapper, AppUser> impl
.set(AppUser::getCompanyId, request.getCompanyId())
.set(AppUser::getExpireTime, appUser.getExpireTime())
// .set(AppUser::getUpdateBy, AdminUserUtil.getUserId())
.set(AppUser::getAreaId, null)
.set(AppUser::getUpdateTime, LocalDateTime.now())
.eq(AppUser::getIsPrimary, false)
.in(AppUser::getId, request.getUserIds())

View File

@ -111,7 +111,7 @@ public class TicketServiceImpl extends ServiceImpl<TicketMapper, Ticket> impleme
public Ticket assignmentTicket(AssignmentTicketRequest request) {
Ticket ticket = getById(request.getTicketId());
VUtils.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("未找到工单");
VUtils.trueThrowBusinessError(ticket.getState() != TicketState.PendingProcessing.getState().byteValue()).throwMessage("工单状态异常");
VUtils.trueThrowBusinessError(!Objects.equals(ticket.getState(), TicketState.PendingProcessing.getState())).throwMessage("工单状态异常");
// VUtils.trueThrowBusinessError(Objects.nonNull(ticket.getCqm()) && !Objects.equals(ticket.getCqm(), AdminUserUtil.getUserId()))
// .throwMessage("当前工单已归属别的CQM负责人");
ticket.setUrgency(TicketUrgency.findByValue(request.getUrgency()).getState());
@ -256,4 +256,21 @@ public class TicketServiceImpl extends ServiceImpl<TicketMapper, Ticket> impleme
updateById(ticket);
return ticket;
}
@Override
public Ticket addTicketHandle(TicketHandleAddRequest request) {
Ticket ticket = getById(request.getTicketId());
VUtils.trueThrowBusinessError(Objects.isNull(ticket)).throwMessage("未找到工单");
VUtils.trueThrowBusinessError(!Objects.equals(ticket.getState(), TicketState.Processing.getState())).throwMessage("工单状态异常");
VUtils.trueThrowBusinessError(!Objects.equals(ticket.getCqm(), AdminUserUtil.getUserId())
&& Arrays.stream(ticket.getHandle().split(","))
.map(Integer::parseInt)
.noneMatch(uid -> Objects.equals(uid, AdminUserUtil.getUserId())))
.throwMessage("你无权添加处理人");
ticket.setHandle(ticket.getHandle().concat(",").concat(StrUtil.join(",", request.getUserIds())));
ticket.setHandleName(ticket.getHandleName().concat(",").concat(StrUtil.join(",", adminUserService.listByIds(request.getUserIds()).stream().map(AdminUser::getUserName).collect(Collectors.toList()))));
ticket.setUpdateTime(LocalDateTime.now());
updateById(ticket);
return ticket;
}
}