refactor(ticket): 重构工单相关功能

- 优化了工单详情、PDF生成、Excel导出等功能中的文件处理逻辑
- 使用 FileUploadRecordService 替代直接操作附件 URL
- 移除了冗余的 FileInfo 类,简化了文件相关数据结构
-重构了文件上传和更新逻辑,提高了代码可读性和维护性
This commit is contained in:
曹鹏飞 2025-04-14 20:41:23 +08:00
parent c20c100054
commit 5c81feeb62
6 changed files with 76 additions and 57 deletions

View File

@ -15,7 +15,6 @@ import com.nflg.mobilebroken.common.exception.NflgException;
import com.nflg.mobilebroken.common.pojo.ApiResult; import com.nflg.mobilebroken.common.pojo.ApiResult;
import com.nflg.mobilebroken.common.pojo.PageData; import com.nflg.mobilebroken.common.pojo.PageData;
import com.nflg.mobilebroken.common.pojo.dto.ChatMessageDTO; import com.nflg.mobilebroken.common.pojo.dto.ChatMessageDTO;
import com.nflg.mobilebroken.common.pojo.dto.FileInfo;
import com.nflg.mobilebroken.common.pojo.request.*; import com.nflg.mobilebroken.common.pojo.request.*;
import com.nflg.mobilebroken.common.pojo.vo.*; import com.nflg.mobilebroken.common.pojo.vo.*;
import com.nflg.mobilebroken.common.util.*; import com.nflg.mobilebroken.common.util.*;
@ -123,6 +122,9 @@ public class TicketController extends ControllerBase {
@Resource @Resource
private ITBaseDeviceTypeService deviceTypeService; private ITBaseDeviceTypeService deviceTypeService;
@Resource
private IFileUploadRecordService fileUploadRecordService;
/** /**
* 获取问题类型 * 获取问题类型
* @return 问题类型列表 * @return 问题类型列表
@ -478,21 +480,17 @@ public class TicketController extends ControllerBase {
List<AdminUser> adminUsers = adminUserService.listByIds(Arrays.stream(handle.split(",")).map(Integer::parseInt).collect(Collectors.toList())); List<AdminUser> adminUsers = adminUserService.listByIds(Arrays.stream(handle.split(",")).map(Integer::parseInt).collect(Collectors.toList()));
handle = adminUsers.stream().map(AdminUser::getUserName).collect(Collectors.joining(",")); handle = adminUsers.stream().map(AdminUser::getUserName).collect(Collectors.joining(","));
} }
List<FileInfo> images = new ArrayList<>(); List<Integer> fileIds=CollectionUtil.addAll(StrUtil.split(ticket.getAttachments(),","), StrUtil.split(ticket.getImages(),","))
List<FileInfo> files = new ArrayList<>(); .stream()
if (StrUtil.isNotBlank(ticket.getAttachments())) { .map(Integer::parseInt)
StrUtil.split(ticket.getAttachments(), ",").forEach(item -> { .collect(Collectors.toList());
if (item.endsWith(".jpg") || item.endsWith(".png") || item.endsWith(".jpeg")) { List<String> images = new ArrayList<>();
images.add(new FileInfo(item.substring(item.lastIndexOf("/")+1),urlEncode(item))); if (CollectionUtil.isNotEmpty(fileIds)){
} else { images=fileUploadRecordService.listByIds(fileIds)
files.add(new FileInfo(item.substring(item.lastIndexOf("/")+1),urlEncode(item))); .stream()
} .map(FileUploadRecord::getUrl)
}); .filter(url->url.endsWith(".jpg") || url.endsWith(".png") || url.endsWith(".jpeg"))
} .collect(Collectors.toList());
if (StrUtil.isNotBlank(ticket.getImages())) {
StrUtil.split(ticket.getImages(), ",").forEach(item -> {
images.add(new FileInfo(item.substring(item.lastIndexOf("/")+1),item));
});
} }
TicketPdfVO vo = new TicketPdfVO() TicketPdfVO vo = new TicketPdfVO()
.setNo(ticket.getNo()) .setNo(ticket.getNo())
@ -512,7 +510,7 @@ public class TicketController extends ControllerBase {
.setReason(ticket.getReason()) .setReason(ticket.getReason())
.setDeviceAddress(ticket.getDeviceAddress()) .setDeviceAddress(ticket.getDeviceAddress())
.setImages(images) .setImages(images)
.setFiles(files) // .setFiles(files)
.setMeasures(ticketSolutionService.getSolutionMeasures(ticket.getId()).getMeasures()); .setMeasures(ticketSolutionService.getSolutionMeasures(ticket.getId()).getMeasures());
Map<String, Object> variables = new HashMap<>(); Map<String, Object> variables = new HashMap<>();
variables.put("ticket", vo); variables.put("ticket", vo);
@ -545,12 +543,12 @@ public class TicketController extends ControllerBase {
} }
} }
private String urlEncode(String url){ // private String urlEncode(String url){
int index = url.lastIndexOf("/"); // int index = url.lastIndexOf("/");
String pre= url.substring(0,index+1); // String pre= url.substring(0,index+1);
String end = url.substring(index+1); // String end = url.substring(index+1);
return pre+URLEncoder.encode(end, StandardCharsets.UTF_8); // return pre+URLEncoder.encode(end, StandardCharsets.UTF_8);
} // }
/** /**
* 获取工单详情 * 获取工单详情
@ -603,8 +601,8 @@ public class TicketController extends ControllerBase {
.setSolveTime(ticket.getSolveTime()) .setSolveTime(ticket.getSolveTime())
.setDeviceTypeSub(device.getDeviceTypeSub()) .setDeviceTypeSub(device.getDeviceTypeSub())
.setPrimaryUserName(device.getAgentName()) .setPrimaryUserName(device.getAgentName())
.setImages(StrUtil.isNotBlank(ticket.getImages()) ? StrUtil.split(ticket.getImages(), ",") : Collections.emptyList()) .setImages(getFileVOs(ticket.getImages()))
.setAttachments(StrUtil.isNotBlank(ticket.getAttachments()) ? StrUtil.split(ticket.getAttachments(), ",") : Collections.emptyList()) .setAttachments(getFileVOs(ticket.getAttachments()))
.setCreateUserId(ticket.getUserId()) .setCreateUserId(ticket.getUserId())
.setCreateUserName(user.getName()) .setCreateUserName(user.getName())
.setCreateUserAvatar(user.getAvatar()) .setCreateUserAvatar(user.getAvatar())
@ -620,6 +618,16 @@ public class TicketController extends ControllerBase {
return ApiResult.success(vo); return ApiResult.success(vo);
} }
private List<FileUploadVO> getFileVOs(String ids){
if (StrUtil.isBlank(ids)){
return Collections.emptyList();
}
return fileUploadRecordService.listByIds(StrUtil.split(ids, ",").stream().map(Integer::parseInt).collect(Collectors.toList()))
.stream()
.map(fileUploadRecord -> new FileUploadVO(fileUploadRecord.getId(), fileUploadRecord.getFileName(), fileUploadRecord.getUrl()))
.collect(Collectors.toList());
}
private TicketEvaluateVO getTicketEvaluate(Integer ticketId) { private TicketEvaluateVO getTicketEvaluate(Integer ticketId) {
TicketEvaluate ticketEvaluate = ticketEvaluateService.lambdaQuery().eq(TicketEvaluate::getTicketId,ticketId).one(); TicketEvaluate ticketEvaluate = ticketEvaluateService.lambdaQuery().eq(TicketEvaluate::getTicketId,ticketId).one();
if (Objects.isNull(ticketEvaluate)) { if (Objects.isNull(ticketEvaluate)) {
@ -949,18 +957,17 @@ public class TicketController extends ControllerBase {
//第七行 //第七行
Row row7 = sheet.createRow(7); Row row7 = sheet.createRow(7);
row7.setHeightInPoints(height); row7.setHeightInPoints(height);
List<FileInfo> images = new ArrayList<>(); List<Integer> fileIds=CollectionUtil.addAll(StrUtil.split(ticket.getAttachments(),","), StrUtil.split(ticket.getImages(),","))
if (StrUtil.isNotBlank(ticket.getAttachments())) { .stream()
StrUtil.split(ticket.getAttachments(), ",").forEach(item -> { .map(Integer::parseInt)
if (item.endsWith(".jpg") || item.endsWith(".png") || item.endsWith(".jpeg")) { .collect(Collectors.toList());
images.add(new FileInfo(item.substring(item.lastIndexOf("/") + 1), urlEncode(item))); List<String> images = new ArrayList<>();
} if (CollectionUtil.isNotEmpty(fileIds)){
}); images=fileUploadRecordService.listByIds(fileIds)
} .stream()
if (StrUtil.isNotBlank(ticket.getImages())) { .map(FileUploadRecord::getUrl)
StrUtil.split(ticket.getImages(), ",").forEach(item -> { .filter(url->url.endsWith(".jpg") || url.endsWith(".png") || url.endsWith(".jpeg"))
images.add(new FileInfo(item.substring(item.lastIndexOf("/") + 1), item)); .collect(Collectors.toList());
});
} }
int rowIndex = 6; int rowIndex = 6;
int rows = images.size() % 2 == 0 ? images.size() / 2 : images.size() / 2 + 1; int rows = images.size() % 2 == 0 ? images.size() / 2 : images.size() / 2 + 1;
@ -976,9 +983,9 @@ public class TicketController extends ControllerBase {
for (int i = 0; i < images.size(); i++) { for (int i = 0; i < images.size(); i++) {
if (i % 2 == 0) { if (i % 2 == 0) {
rowIndex++; rowIndex++;
bindPic(images.get(i).getUrl(), workbook, sheet, rowIndex, 1, 6); bindPic(images.get(i), workbook, sheet, rowIndex, 1, 6);
} else { } else {
bindPic(images.get(i).getUrl(), workbook, sheet, rowIndex, 6, 12); bindPic(images.get(i), workbook, sheet, rowIndex, 6, 12);
} }
} }
if (images.size() % 2 != 0) { if (images.size() % 2 != 0) {

View File

@ -73,8 +73,8 @@
<tr> <tr>
<td class="desc1">图片</td> <td class="desc1">图片</td>
<td colspan="11"> <td colspan="11">
<div th:each="file:${ticket.images}"> <div th:each="url:${ticket.images}">
<img class="cimg" alt="" th:src="${file.url}"/> <img alt="" class="cimg" th:src="${url}"/>
</div> </div>
</td> </td>
</tr> </tr>

View File

@ -86,6 +86,9 @@ public class TiketController extends ControllerBase {
@Resource @Resource
private ITBasePartService partService; private ITBasePartService partService;
@Resource
private IFileUploadRecordService fileUploadRecordService;
/** /**
* 搜索设备 * 搜索设备
* @param request 搜索条件 * @param request 搜索条件
@ -209,8 +212,8 @@ public class TiketController extends ControllerBase {
.setUseTime(ticket.getUseTime()) .setUseTime(ticket.getUseTime())
.setDescription(ticket.getDescription()) .setDescription(ticket.getDescription())
.setState(ticket.getState()) .setState(ticket.getState())
.setImages(StrUtil.isNotBlank(ticket.getImages()) ? StrUtil.split(ticket.getImages(), ",") : Collections.emptyList()) .setImages(getFileVOs(ticket.getImages()))
.setAttachments(StrUtil.isNotBlank(ticket.getAttachments()) ? StrUtil.split(ticket.getAttachments(), ",") : Collections.emptyList()) .setAttachments(getFileVOs(ticket.getAttachments()))
.setCreateUserId(ticket.getUserId()) .setCreateUserId(ticket.getUserId())
.setCreateUserName(user.getName()) .setCreateUserName(user.getName())
.setCreateUserAvatar(user.getAvatar()) .setCreateUserAvatar(user.getAvatar())
@ -224,6 +227,16 @@ public class TiketController extends ControllerBase {
return ApiResult.success(vo); return ApiResult.success(vo);
} }
private List<FileUploadVO> getFileVOs(String ids){
if (StrUtil.isBlank(ids)){
return Collections.emptyList();
}
return fileUploadRecordService.listByIds(StrUtil.split(ids, ",").stream().map(Integer::parseInt).collect(Collectors.toList()))
.stream()
.map(fileUploadRecord -> new FileUploadVO(fileUploadRecord.getId(), fileUploadRecord.getFileName(), fileUploadRecord.getUrl()))
.collect(Collectors.toList());
}
private TicketEvaluateVO getTicketEvaluate(Integer ticketId) { private TicketEvaluateVO getTicketEvaluate(Integer ticketId) {
TicketEvaluate ticketEvaluate = ticketEvaluateService.lambdaQuery().eq(TicketEvaluate::getTicketId,ticketId).one(); TicketEvaluate ticketEvaluate = ticketEvaluateService.lambdaQuery().eq(TicketEvaluate::getTicketId,ticketId).one();
if (Objects.isNull(ticketEvaluate)) { if (Objects.isNull(ticketEvaluate)) {

View File

@ -87,10 +87,10 @@ public class TicketInfoVO {
private Byte urgency; private Byte urgency;
//图片 //图片
private List<String> images; private List<FileUploadVO> images;
//附件 //附件
private List<String> attachments; private List<FileUploadVO> attachments;
//评价 //评价
private TicketEvaluateVO evaluate; private TicketEvaluateVO evaluate;

View File

@ -1,7 +1,6 @@
package com.nflg.mobilebroken.common.pojo.vo; package com.nflg.mobilebroken.common.pojo.vo;
import com.nflg.mobilebroken.common.constant.TicketState; import com.nflg.mobilebroken.common.constant.TicketState;
import com.nflg.mobilebroken.common.pojo.dto.FileInfo;
import lombok.Data; import lombok.Data;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
@ -58,9 +57,9 @@ public class TicketPdfVO {
//原因分析 //原因分析
private String reason; private String reason;
//图片 //图片
private List<FileInfo> images; private List<String> images;
//文件 // //文件
private List<FileInfo> files; // private List<FileInfo> files;
public String getUrgencyDesc() { public String getUrgencyDesc() {
if (Objects.isNull(urgency)) { if (Objects.isNull(urgency)) {

View File

@ -76,8 +76,6 @@ public class TicketServiceImpl extends ServiceImpl<TicketMapper, Ticket> impleme
.setUseTime(request.getUseTime()) .setUseTime(request.getUseTime())
.setTitle(request.getTitle()) .setTitle(request.getTitle())
.setDescription(request.getDescription()) .setDescription(request.getDescription())
.setImages(StrUtil.join(",", request.getImages()))
.setAttachments(StrUtil.join(",", request.getAttachments()))
.setState(TicketState.PendingProcessing.getState()) .setState(TicketState.PendingProcessing.getState())
.setUserId(userId) .setUserId(userId)
.setCreateTime(LocalDateTime.now()); .setCreateTime(LocalDateTime.now());
@ -111,11 +109,13 @@ public class TicketServiceImpl extends ServiceImpl<TicketMapper, Ticket> impleme
} }
fileUploadRecordService.updateBatchById(attachmentsRecords); fileUploadRecordService.updateBatchById(attachmentsRecords);
} }
if(CollectionUtil.isNotEmpty(imagesRecords) || CollectionUtil.isNotEmpty(attachmentsRecords)) {
lambdaUpdate() lambdaUpdate()
.set(CollectionUtil.isNotEmpty(imagesRecords),Ticket::getImages, imagesRecords.stream().map(FileUploadRecord::getId).collect(Collectors.toList())) .set(CollectionUtil.isNotEmpty(imagesRecords), Ticket::getImages, StrUtil.join(",",imagesRecords.stream().map(FileUploadRecord::getId).collect(Collectors.toList())))
.set(CollectionUtil.isNotEmpty(attachmentsRecords),Ticket::getAttachments, attachmentsRecords.stream().map(FileUploadRecord::getId).collect(Collectors.toList())) .set(CollectionUtil.isNotEmpty(attachmentsRecords), Ticket::getAttachments, StrUtil.join(",",attachmentsRecords.stream().map(FileUploadRecord::getId).collect(Collectors.toList())))
.eq(Ticket::getId, ticket.getId()) .eq(Ticket::getId, ticket.getId())
.update(); .update();
}
return ticket; return ticket;
} }
@ -347,7 +347,7 @@ public class TicketServiceImpl extends ServiceImpl<TicketMapper, Ticket> impleme
@Override @Override
public List<AdminUserSimpleVO> getTicketHandle(Integer id) { public List<AdminUserSimpleVO> getTicketHandle(Integer id) {
Ticket ticket=lambdaQuery().select(Ticket::getHandle).eq(Ticket::getId,id).one(); Ticket ticket=lambdaQuery().select(Ticket::getHandle,Ticket::getId).eq(Ticket::getId,id).one();
List<Integer> handles=StrUtil.split(ticket.getHandle(),",").stream().map(Integer::parseInt).collect(Collectors.toList()); List<Integer> handles=StrUtil.split(ticket.getHandle(),",").stream().map(Integer::parseInt).collect(Collectors.toList());
if (CollectionUtil.isEmpty(handles)){ if (CollectionUtil.isEmpty(handles)){
return Collections.emptyList(); return Collections.emptyList();