fix: return during media and stabilize report image ordering

This commit is contained in:
malei 2026-04-16 23:44:34 +08:00
parent fa9cdecfb1
commit 9008b5bece
4 changed files with 46 additions and 8 deletions

View File

@ -30,6 +30,23 @@ public class ReportController {
return baseUrl + path; return baseUrl + path;
} }
private String resolveMediaType(ReportImage img) {
String mt = img.getMediaType();
if (mt != null && !mt.isBlank()) {
return mt;
}
String url = img.getPhotoUrl();
if (url == null) {
return "photo";
}
String lower = url.toLowerCase(Locale.ROOT);
if (lower.endsWith(".mp4") || lower.endsWith(".mov") || lower.endsWith(".m4v")
|| lower.endsWith(".webm") || lower.endsWith(".avi")) {
return "video";
}
return "photo";
}
@PostMapping("/create") @PostMapping("/create")
public Map<String, Object> create(@RequestBody Report report) { public Map<String, Object> create(@RequestBody Report report) {
System.out.println(">>> Report create received: appointmentId=" + report.getAppointmentId() + ", userId=" + report.getUserId() + ", images count=" + (report.getImages() == null ? 0 : report.getImages().size())); System.out.println(">>> Report create received: appointmentId=" + report.getAppointmentId() + ", userId=" + report.getUserId() + ", images count=" + (report.getImages() == null ? 0 : report.getImages().size()));
@ -80,17 +97,24 @@ public class ReportController {
List<ReportImage> imgs = r.getImages(); List<ReportImage> imgs = r.getImages();
List<String> beforePhotos = new ArrayList<>(); List<String> beforePhotos = new ArrayList<>();
List<String> afterPhotos = new ArrayList<>(); List<String> afterPhotos = new ArrayList<>();
List<Map<String, Object>> duringMedia = new ArrayList<>();
if (imgs != null) { if (imgs != null) {
for (ReportImage img : imgs) { for (ReportImage img : imgs) {
if ("before".equals(img.getPhotoType())) { if ("before".equals(img.getPhotoType())) {
beforePhotos.add(fullUrl(img.getPhotoUrl())); beforePhotos.add(fullUrl(img.getPhotoUrl()));
} else if ("after".equals(img.getPhotoType())) { } else if ("after".equals(img.getPhotoType())) {
afterPhotos.add(fullUrl(img.getPhotoUrl())); afterPhotos.add(fullUrl(img.getPhotoUrl()));
} else if ("during".equals(img.getPhotoType())) {
Map<String, Object> m = new HashMap<>();
m.put("url", fullUrl(img.getPhotoUrl()));
m.put("mediaType", resolveMediaType(img));
duringMedia.add(m);
} }
} }
} }
item.put("beforePhotos", beforePhotos); item.put("beforePhotos", beforePhotos);
item.put("afterPhotos", afterPhotos); item.put("afterPhotos", afterPhotos);
item.put("duringMedia", duringMedia);
return item; return item;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
if (usePaging && paged != null) { if (usePaging && paged != null) {
@ -131,17 +155,24 @@ public class ReportController {
List<ReportImage> imgs = report.getImages(); List<ReportImage> imgs = report.getImages();
List<String> beforePhotos = new ArrayList<>(); List<String> beforePhotos = new ArrayList<>();
List<String> afterPhotos = new ArrayList<>(); List<String> afterPhotos = new ArrayList<>();
List<Map<String, Object>> duringMedia = new ArrayList<>();
if (imgs != null) { if (imgs != null) {
for (ReportImage img : imgs) { for (ReportImage img : imgs) {
if ("before".equals(img.getPhotoType())) { if ("before".equals(img.getPhotoType())) {
beforePhotos.add(img.getPhotoUrl()); beforePhotos.add(fullUrl(img.getPhotoUrl()));
} else if ("after".equals(img.getPhotoType())) { } else if ("after".equals(img.getPhotoType())) {
afterPhotos.add(img.getPhotoUrl()); afterPhotos.add(fullUrl(img.getPhotoUrl()));
} else if ("during".equals(img.getPhotoType())) {
Map<String, Object> m = new HashMap<>();
m.put("url", fullUrl(img.getPhotoUrl()));
m.put("mediaType", resolveMediaType(img));
duringMedia.add(m);
} }
} }
} }
data.put("beforePhotos", beforePhotos); data.put("beforePhotos", beforePhotos);
data.put("afterPhotos", afterPhotos); data.put("afterPhotos", afterPhotos);
data.put("duringMedia", duringMedia);
data.put("remark", report.getRemark()); data.put("remark", report.getRemark());
data.put("userId", report.getUserId()); data.put("userId", report.getUserId());
data.put("storeId", report.getStoreId()); data.put("storeId", report.getStoreId());

View File

@ -24,9 +24,13 @@ public class ReportImage {
@Column(name = "photo_url", length = 500) @Column(name = "photo_url", length = 500)
private String photoUrl; private String photoUrl;
/** 图片类型before=服务前after=服务后 */ /** 媒体分组before=服务前after=服务后during=服务过程中 */
@Column(name = "photo_type", length = 20) @Column(name = "photo_type", length = 20)
private String photoType; private String photoType;
/** 媒体类型photo=图片video=视频 */
@Column(name = "media_type", length = 20)
private String mediaType;
/** 排序序号,同类型内按顺序展示 */ /** 排序序号,同类型内按顺序展示 */
@Column(name = "sort_order") @Column(name = "sort_order")
@ -43,5 +47,8 @@ public class ReportImage {
if (sortOrder == null) { if (sortOrder == null) {
sortOrder = 0; sortOrder = 0;
} }
if (mediaType == null || mediaType.isBlank()) {
mediaType = "photo";
}
} }
} }

View File

@ -6,11 +6,11 @@ import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List; import java.util.List;
public interface ReportImageMapper extends JpaRepository<ReportImage, Long> { public interface ReportImageMapper extends JpaRepository<ReportImage, Long> {
List<ReportImage> findByReportIdOrderBySortOrderAsc(Long reportId); List<ReportImage> findByReportIdOrderBySortOrderAscIdAsc(Long reportId);
List<ReportImage> findByReportIdAndPhotoTypeOrderBySortOrderAsc(Long reportId, String photoType); List<ReportImage> findByReportIdAndPhotoTypeOrderBySortOrderAscIdAsc(Long reportId, String photoType);
void deleteByReportId(Long reportId); void deleteByReportId(Long reportId);
List<ReportImage> findByReportIdIn(List<Long> reportIds); List<ReportImage> findByReportIdInOrderByReportIdAscSortOrderAscIdAsc(List<Long> reportIds);
} }

View File

@ -78,7 +78,7 @@ public class ReportService {
/** 查询单条报告并填充图片 */ /** 查询单条报告并填充图片 */
private Report enrichImages(Report r) { private Report enrichImages(Report r) {
if (r == null) return null; if (r == null) return null;
List<ReportImage> imgs = reportImageMapper.findByReportIdOrderBySortOrderAsc(r.getId()); List<ReportImage> imgs = reportImageMapper.findByReportIdOrderBySortOrderAscIdAsc(r.getId());
r.setImages(imgs); r.setImages(imgs);
return r; return r;
} }
@ -87,7 +87,7 @@ public class ReportService {
private List<Report> enrichImages(List<Report> reports) { private List<Report> enrichImages(List<Report> reports) {
if (reports == null || reports.isEmpty()) return reports; if (reports == null || reports.isEmpty()) return reports;
List<Long> ids = reports.stream().map(Report::getId).toList(); List<Long> ids = reports.stream().map(Report::getId).toList();
List<ReportImage> allImages = reportImageMapper.findByReportIdIn(ids); List<ReportImage> allImages = reportImageMapper.findByReportIdInOrderByReportIdAscSortOrderAscIdAsc(ids);
java.util.Map<Long, List<ReportImage>> map = allImages.stream() java.util.Map<Long, List<ReportImage>> map = allImages.stream()
.collect(java.util.stream.Collectors.groupingBy(ReportImage::getReportId)); .collect(java.util.stream.Collectors.groupingBy(ReportImage::getReportId));
for (Report r : reports) { for (Report r : reports) {