From 870190c7093078bad5af10b18fe087d31c4aac8e Mon Sep 17 00:00:00 2001 From: MaDaLei Date: Fri, 17 Apr 2026 08:09:03 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=AD=97=E6=AE=B5=EF=BC=8C=E6=8F=90=E5=8D=87?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E9=99=90=E5=88=B6=E8=87=B3120MB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 0 -> 8196 bytes .../controller/AppointmentController.java | 10 ++++- .../petstore/controller/FileController.java | 6 ++- .../petstore/controller/ReportController.java | 9 +++++ .../petstore/controller/StoreController.java | 12 ++++++ .../petstore/controller/UserController.java | 5 ++- .../java/com/petstore/entity/Appointment.java | 3 ++ src/main/java/com/petstore/entity/Pet.java | 3 ++ src/main/java/com/petstore/entity/Report.java | 5 ++- src/main/java/com/petstore/entity/Store.java | 3 ++ src/main/java/com/petstore/entity/User.java | 3 ++ .../petstore/mapper/AppointmentMapper.java | 18 +++++---- .../java/com/petstore/mapper/PetMapper.java | 6 ++- .../com/petstore/mapper/ReportMapper.java | 20 ++++----- .../java/com/petstore/mapper/StoreMapper.java | 7 +++- .../java/com/petstore/mapper/UserMapper.java | 8 ++-- .../petstore/service/AppointmentService.java | 34 +++++++++++----- .../java/com/petstore/service/PetService.java | 11 +++-- .../com/petstore/service/ReportService.java | 38 ++++++++++++------ .../com/petstore/service/StoreService.java | 21 ++++++++-- .../com/petstore/service/UserService.java | 36 +++++++++++------ src/main/resources/application.yml | 3 +- 22 files changed, 188 insertions(+), 73 deletions(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..9c55bc6f5bf5cdecb475d19d8d38e3ea8f4e4607 GIT binary patch literal 8196 zcmeHMU2GIp6u#fI&>1?=0g5fS6BY_V$O3J_wB^Ta{}d1?ur2+eu*~j^bYMDDc6M8! zG&Uwa2!ioR zlKcn|6l&8sAn=KYG8xKoAp=*MQ=A?Ux*|McK)91W&do_CLpd&_aAy$i4B^TMPbdgh zC%<@L&X5!`s-p}<8JL^_PMsyzROEUMuI5OluWB zMY%QWxw~=}*LP<D%SaIyu*$Xm^hld?}(G*;nfbDrbu@_d_5)7z7`j^(*- zlB%cA_j38xV6wEP6?|)tMRVE1RvXRe_t>-~cdVQcB9!xUsunN1Z*_gcreyop9lNhq zXmjVyuT<4ON~fE*AF-`m*NAQA2YL-ZYq_TF9_k*peLLe=ovtxx%|${{u2xhpTy$?t z*QYY=DP-)U1v`IStC8hkjrbB>?Kf$2J3N!GVrmy1XjL>k+T2<{lLO9TTz6Ek!w_eq|93x{nnyH9&8k0rB5W}MCg%x^A?~=98WV%JRJ8Tp7>9z_A$Th`VQ1MRw}x>np6~x1)W%HtX(EbY4SgX z^=s@p`+@z!ZW7k#U_Pp`0=0zj2e1V@3F92$T{wU=3}j$p5H5yrl+b<>V|Wzfcnqfr z?Pu{6p2l-{9xvb}yoT2a@#pX+;r$Zc!MpeXAL24T4w3&g;r=K5JORr)?!+>Fos8w- zRL*rg_Yi4{47k&2diF}hwyXL1zkTZO|I;(LXxC8&q73|{44||v)z(6$Q$5@y(#7dI zNEa{MZd}N~g(_~s$AjZI$y delete(@RequestParam Long id) { + boolean ok = appointmentService.softDelete(id); + if (!ok) { + return Map.of("code", 404, "message", "预约不存在"); + } + return Map.of("code", 200, "message", "删除成功"); + } } diff --git a/src/main/java/com/petstore/controller/FileController.java b/src/main/java/com/petstore/controller/FileController.java index 83e74f3..81feb33 100644 --- a/src/main/java/com/petstore/controller/FileController.java +++ b/src/main/java/com/petstore/controller/FileController.java @@ -71,9 +71,11 @@ public class FileController { } String contentType = file.getContentType(); - if (contentType == null || !contentType.startsWith("image/")) { + boolean isImage = contentType != null && contentType.startsWith("image/"); + boolean isVideo = contentType != null && contentType.startsWith("video/"); + if (!isImage && !isVideo) { result.put("code", 400); - result.put("message", "只能上传图片"); + result.put("message", "只能上传图片或视频"); return result; } diff --git a/src/main/java/com/petstore/controller/ReportController.java b/src/main/java/com/petstore/controller/ReportController.java index a9096a3..c289a8e 100644 --- a/src/main/java/com/petstore/controller/ReportController.java +++ b/src/main/java/com/petstore/controller/ReportController.java @@ -198,4 +198,13 @@ public class ReportController { } return result; } + + @DeleteMapping("/delete") + public Map delete(@RequestParam Long id) { + boolean ok = reportService.softDelete(id); + if (!ok) { + return Map.of("code", 404, "message", "报告不存在"); + } + return Map.of("code", 200, "message", "删除成功"); + } } diff --git a/src/main/java/com/petstore/controller/StoreController.java b/src/main/java/com/petstore/controller/StoreController.java index f19224b..739e315 100644 --- a/src/main/java/com/petstore/controller/StoreController.java +++ b/src/main/java/com/petstore/controller/StoreController.java @@ -64,6 +64,9 @@ public class StoreController { @PutMapping("/update") public Map update(@RequestBody Store store) { Store updated = storeService.update(store); + if (updated == null) { + return Map.of("code", 404, "message", "店铺不存在"); + } Map result = new HashMap<>(); result.put("code", 200); result.put("message", "更新成功"); @@ -71,6 +74,15 @@ public class StoreController { return result; } + @DeleteMapping("/delete") + public Map delete(@RequestParam Long id) { + boolean ok = storeService.softDelete(id); + if (!ok) { + return Map.of("code", 404, "message", "店铺不存在"); + } + return Map.of("code", 200, "message", "删除成功"); + } + @GetMapping("/invite-code") public Map getByInviteCode(@RequestParam String code) { Store store = storeService.findByInviteCode(code); diff --git a/src/main/java/com/petstore/controller/UserController.java b/src/main/java/com/petstore/controller/UserController.java index 99c46ae..8938e7d 100644 --- a/src/main/java/com/petstore/controller/UserController.java +++ b/src/main/java/com/petstore/controller/UserController.java @@ -99,7 +99,10 @@ public class UserController { /** 老板:删除员工 */ @DeleteMapping("/staff") public Map deleteStaff(@RequestParam Long staffId) { - userService.deleteStaff(staffId); + boolean ok = userService.deleteStaff(staffId); + if (!ok) { + return Map.of("code", 404, "message", "员工不存在"); + } return Map.of("code", 200, "message", "删除成功"); } diff --git a/src/main/java/com/petstore/entity/Appointment.java b/src/main/java/com/petstore/entity/Appointment.java index 8d10e44..8bfe500 100644 --- a/src/main/java/com/petstore/entity/Appointment.java +++ b/src/main/java/com/petstore/entity/Appointment.java @@ -47,4 +47,7 @@ public class Appointment { @Column(name = "update_time") private LocalDateTime updateTime; + + @Column(nullable = false, columnDefinition = "TINYINT(1) DEFAULT 0") + private Boolean deleted = false; } diff --git a/src/main/java/com/petstore/entity/Pet.java b/src/main/java/com/petstore/entity/Pet.java index c8e67a0..9662d23 100644 --- a/src/main/java/com/petstore/entity/Pet.java +++ b/src/main/java/com/petstore/entity/Pet.java @@ -40,4 +40,7 @@ public class Pet { @Column(name = "update_time") private LocalDateTime updateTime; + + @Column(nullable = false, columnDefinition = "TINYINT(1) DEFAULT 0") + private Boolean deleted = false; } diff --git a/src/main/java/com/petstore/entity/Report.java b/src/main/java/com/petstore/entity/Report.java index 5204dbe..de78a8a 100644 --- a/src/main/java/com/petstore/entity/Report.java +++ b/src/main/java/com/petstore/entity/Report.java @@ -2,7 +2,6 @@ package com.petstore.entity; import jakarta.persistence.*; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import java.time.LocalDateTime; import java.util.ArrayList; @@ -30,7 +29,6 @@ public class Report { private String remark; @Transient - @JsonIgnore private List images = new ArrayList<>(); @Column(name = "user_id") @@ -52,4 +50,7 @@ public class Report { @Column(name = "update_time") private LocalDateTime updateTime; + + @Column(nullable = false, columnDefinition = "TINYINT(1) DEFAULT 0") + private Boolean deleted = false; } diff --git a/src/main/java/com/petstore/entity/Store.java b/src/main/java/com/petstore/entity/Store.java index 64656be..26e57cb 100644 --- a/src/main/java/com/petstore/entity/Store.java +++ b/src/main/java/com/petstore/entity/Store.java @@ -39,4 +39,7 @@ public class Store { @Column(name = "update_time") private LocalDateTime updateTime; + + @Column(nullable = false, columnDefinition = "TINYINT(1) DEFAULT 0") + private Boolean deleted = false; } diff --git a/src/main/java/com/petstore/entity/User.java b/src/main/java/com/petstore/entity/User.java index 6d795c0..174e994 100644 --- a/src/main/java/com/petstore/entity/User.java +++ b/src/main/java/com/petstore/entity/User.java @@ -35,4 +35,7 @@ public class User { @Column(name = "update_time") private LocalDateTime updateTime; + + @Column(nullable = false, columnDefinition = "TINYINT(1) DEFAULT 0") + private Boolean deleted = false; } diff --git a/src/main/java/com/petstore/mapper/AppointmentMapper.java b/src/main/java/com/petstore/mapper/AppointmentMapper.java index 5dba41f..c0633c9 100644 --- a/src/main/java/com/petstore/mapper/AppointmentMapper.java +++ b/src/main/java/com/petstore/mapper/AppointmentMapper.java @@ -6,15 +6,17 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; +import java.util.Optional; public interface AppointmentMapper extends JpaRepository { - List findByUserId(Long userId); - List findByUserIdAndStatus(Long userId, String status); - List findByStoreId(Long storeId); - List findByStoreIdAndStatus(Long storeId, String status); + List findByUserIdAndDeletedFalse(Long userId); + List findByUserIdAndStatusAndDeletedFalse(Long userId, String status); + List findByStoreIdAndDeletedFalse(Long storeId); + List findByStoreIdAndStatusAndDeletedFalse(Long storeId, String status); - Page findByUserId(Long userId, Pageable pageable); - Page findByUserIdAndStatus(Long userId, String status, Pageable pageable); - Page findByStoreId(Long storeId, Pageable pageable); - Page findByStoreIdAndStatus(Long storeId, String status, Pageable pageable); + Page findByUserIdAndDeletedFalse(Long userId, Pageable pageable); + Page findByUserIdAndStatusAndDeletedFalse(Long userId, String status, Pageable pageable); + Page findByStoreIdAndDeletedFalse(Long storeId, Pageable pageable); + Page findByStoreIdAndStatusAndDeletedFalse(Long storeId, String status, Pageable pageable); + Optional findByIdAndDeletedFalse(Long id); } diff --git a/src/main/java/com/petstore/mapper/PetMapper.java b/src/main/java/com/petstore/mapper/PetMapper.java index 1835122..486db2a 100644 --- a/src/main/java/com/petstore/mapper/PetMapper.java +++ b/src/main/java/com/petstore/mapper/PetMapper.java @@ -6,12 +6,14 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import java.util.List; +import java.util.Optional; public interface PetMapper extends JpaRepository { - List findByOwnerUserIdOrderByUpdateTimeDesc(Long ownerUserId); + List findByOwnerUserIdAndDeletedFalseOrderByUpdateTimeDesc(Long ownerUserId); /** 本店预约中关联过的宠物(预约.pet_id 指向该宠物) */ - @Query("SELECT DISTINCT p FROM Pet p, Appointment a WHERE a.petId = p.id AND a.storeId = :storeId ORDER BY p.updateTime DESC") + @Query("SELECT DISTINCT p FROM Pet p, Appointment a WHERE a.petId = p.id AND a.storeId = :storeId AND p.deleted = false AND a.deleted = false ORDER BY p.updateTime DESC") List findDistinctPetsServedAtStore(@Param("storeId") Long storeId); + Optional findByIdAndDeletedFalse(Long id); } diff --git a/src/main/java/com/petstore/mapper/ReportMapper.java b/src/main/java/com/petstore/mapper/ReportMapper.java index b34f92c..764b582 100644 --- a/src/main/java/com/petstore/mapper/ReportMapper.java +++ b/src/main/java/com/petstore/mapper/ReportMapper.java @@ -9,22 +9,24 @@ import java.util.List; import java.util.Optional; public interface ReportMapper extends JpaRepository { - Optional findFirstByAppointmentIdOrderByCreateTimeDesc(Long appointmentId); + Optional findFirstByAppointmentIdAndDeletedFalseOrderByCreateTimeDesc(Long appointmentId); - Optional findFirstByReportToken(String reportToken); + Optional findFirstByReportTokenAndDeletedFalse(String reportToken); - List findByStoreIdOrderByCreateTimeDesc(Long storeId); + List findByStoreIdAndDeletedFalseOrderByCreateTimeDesc(Long storeId); - List findByUserIdOrderByCreateTimeDesc(Long userId); + List findByUserIdAndDeletedFalseOrderByCreateTimeDesc(Long userId); - List findByStoreIdAndUserIdOrderByCreateTimeDesc(Long storeId, Long userId); + List findByStoreIdAndUserIdAndDeletedFalseOrderByCreateTimeDesc(Long storeId, Long userId); - List findAllByOrderByCreateTimeDesc(); + List findAllByDeletedFalseOrderByCreateTimeDesc(); - Page findByStoreId(Long storeId, Pageable pageable); + Page findByStoreIdAndDeletedFalse(Long storeId, Pageable pageable); - Page findByUserId(Long userId, Pageable pageable); + Page findByUserIdAndDeletedFalse(Long userId, Pageable pageable); - Page findByStoreIdAndUserId(Long storeId, Long userId, Pageable pageable); + Page findByStoreIdAndUserIdAndDeletedFalse(Long storeId, Long userId, Pageable pageable); + Page findByDeletedFalse(Pageable pageable); + Optional findByIdAndDeletedFalse(Long id); } diff --git a/src/main/java/com/petstore/mapper/StoreMapper.java b/src/main/java/com/petstore/mapper/StoreMapper.java index 94bfa8e..800842b 100644 --- a/src/main/java/com/petstore/mapper/StoreMapper.java +++ b/src/main/java/com/petstore/mapper/StoreMapper.java @@ -3,6 +3,11 @@ package com.petstore.mapper; import com.petstore.entity.Store; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; +import java.util.Optional; + public interface StoreMapper extends JpaRepository { - Store findByInviteCode(String inviteCode); + Store findByInviteCodeAndDeletedFalse(String inviteCode); + Optional findByIdAndDeletedFalse(Long id); + List findAllByDeletedFalse(); } diff --git a/src/main/java/com/petstore/mapper/UserMapper.java b/src/main/java/com/petstore/mapper/UserMapper.java index 506e267..f9ce49a 100644 --- a/src/main/java/com/petstore/mapper/UserMapper.java +++ b/src/main/java/com/petstore/mapper/UserMapper.java @@ -4,9 +4,11 @@ import com.petstore.entity.User; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; +import java.util.Optional; public interface UserMapper extends JpaRepository { - User findByUsername(String username); - User findByPhone(String phone); - List findByStoreId(Long storeId); + User findByUsernameAndDeletedFalse(String username); + User findByPhoneAndDeletedFalse(String phone); + List findByStoreIdAndDeletedFalse(Long storeId); + Optional findByIdAndDeletedFalse(Long id); } diff --git a/src/main/java/com/petstore/service/AppointmentService.java b/src/main/java/com/petstore/service/AppointmentService.java index a9d58a8..2e9f454 100644 --- a/src/main/java/com/petstore/service/AppointmentService.java +++ b/src/main/java/com/petstore/service/AppointmentService.java @@ -19,22 +19,22 @@ public class AppointmentService { // 员工查看自己的预约 public List getByUserId(Long userId) { - return appointmentMapper.findByUserId(userId); + return appointmentMapper.findByUserIdAndDeletedFalse(userId); } // 老板查看本店所有预约 public List getByStoreId(Long storeId) { - return appointmentMapper.findByStoreId(storeId); + return appointmentMapper.findByStoreIdAndDeletedFalse(storeId); } // 员工按状态查 public List getByUserIdAndStatus(Long userId, String status) { - return appointmentMapper.findByUserIdAndStatus(userId, status); + return appointmentMapper.findByUserIdAndStatusAndDeletedFalse(userId, status); } // 老板按状态查 public List getByStoreIdAndStatus(Long storeId, String status) { - return appointmentMapper.findByStoreIdAndStatus(storeId, status); + return appointmentMapper.findByStoreIdAndStatusAndDeletedFalse(storeId, status); } public Page pageByScope(Long userId, Long storeId, String status, int pageNo, int pageSize) { @@ -46,29 +46,30 @@ public class AppointmentService { boolean hasStatus = status != null && !status.isBlank(); if (storeId != null) { return hasStatus - ? appointmentMapper.findByStoreIdAndStatus(storeId, status, pageable) - : appointmentMapper.findByStoreId(storeId, pageable); + ? appointmentMapper.findByStoreIdAndStatusAndDeletedFalse(storeId, status, pageable) + : appointmentMapper.findByStoreIdAndDeletedFalse(storeId, pageable); } if (userId != null) { return hasStatus - ? appointmentMapper.findByUserIdAndStatus(userId, status, pageable) - : appointmentMapper.findByUserId(userId, pageable); + ? appointmentMapper.findByUserIdAndStatusAndDeletedFalse(userId, status, pageable) + : appointmentMapper.findByUserIdAndDeletedFalse(userId, pageable); } return Page.empty(pageable); } public Appointment getById(Long id) { - return appointmentMapper.findById(id).orElse(null); + return appointmentMapper.findByIdAndDeletedFalse(id).orElse(null); } public Appointment create(Appointment appointment) { appointment.setCreateTime(LocalDateTime.now()); appointment.setUpdateTime(LocalDateTime.now()); + appointment.setDeleted(false); return appointmentMapper.save(appointment); } public Appointment updateStatus(Long id, String status) { - Appointment appointment = appointmentMapper.findById(id).orElse(null); + Appointment appointment = appointmentMapper.findByIdAndDeletedFalse(id).orElse(null); if (appointment != null) { appointment.setStatus(status); appointment.setUpdateTime(LocalDateTime.now()); @@ -79,7 +80,7 @@ public class AppointmentService { /** 开始服务:状态变为进行中,同时指定技师为当前用户 */ public Appointment startService(Long appointmentId, Long staffUserId) { - Appointment appointment = appointmentMapper.findById(appointmentId).orElse(null); + Appointment appointment = appointmentMapper.findByIdAndDeletedFalse(appointmentId).orElse(null); if (appointment != null) { appointment.setStatus("doing"); appointment.setAssignedUserId(staffUserId); @@ -88,4 +89,15 @@ public class AppointmentService { } return null; } + + public boolean softDelete(Long id) { + Appointment appointment = appointmentMapper.findByIdAndDeletedFalse(id).orElse(null); + if (appointment == null) { + return false; + } + appointment.setDeleted(true); + appointment.setUpdateTime(LocalDateTime.now()); + appointmentMapper.save(appointment); + return true; + } } diff --git a/src/main/java/com/petstore/service/PetService.java b/src/main/java/com/petstore/service/PetService.java index 3a80bd9..fd3b407 100644 --- a/src/main/java/com/petstore/service/PetService.java +++ b/src/main/java/com/petstore/service/PetService.java @@ -20,7 +20,7 @@ public class PetService { if (ownerUserId == null) { return List.of(); } - return petMapper.findByOwnerUserIdOrderByUpdateTimeDesc(ownerUserId); + return petMapper.findByOwnerUserIdAndDeletedFalseOrderByUpdateTimeDesc(ownerUserId); } /** 商家/员工:本店预约中关联过的宠物(预约带 pet_id) */ @@ -43,6 +43,7 @@ public class PetService { } pet.setCreateTime(LocalDateTime.now()); pet.setUpdateTime(LocalDateTime.now()); + pet.setDeleted(false); Pet saved = petMapper.save(pet); return Map.of("code", 200, "message", "保存成功", "data", saved); } @@ -51,7 +52,7 @@ public class PetService { if (input.getId() == null) { return Map.of("code", 400, "message", "缺少宠物ID"); } - Optional opt = petMapper.findById(input.getId()); + Optional opt = petMapper.findByIdAndDeletedFalse(input.getId()); if (opt.isEmpty()) { return Map.of("code", 404, "message", "宠物不存在"); } @@ -84,7 +85,7 @@ public class PetService { } public Map delete(Long petId, Long operatorUserId, String role) { - Optional opt = petMapper.findById(petId); + Optional opt = petMapper.findByIdAndDeletedFalse(petId); if (opt.isEmpty()) { return Map.of("code", 404, "message", "宠物不存在"); } @@ -92,7 +93,9 @@ public class PetService { if (!"customer".equals(role) || !pet.getOwnerUserId().equals(operatorUserId)) { return Map.of("code", 403, "message", "无权删除"); } - petMapper.deleteById(petId); + pet.setDeleted(true); + pet.setUpdateTime(LocalDateTime.now()); + petMapper.save(pet); return Map.of("code", 200, "message", "已删除"); } } diff --git a/src/main/java/com/petstore/service/ReportService.java b/src/main/java/com/petstore/service/ReportService.java index 9e06461..7bff2bb 100644 --- a/src/main/java/com/petstore/service/ReportService.java +++ b/src/main/java/com/petstore/service/ReportService.java @@ -27,7 +27,7 @@ public class ReportService { // 填充冗余字段,并自动完成预约 if (report.getAppointmentId() != null) { - Appointment appt = appointmentMapper.findById(report.getAppointmentId()).orElse(null); + Appointment appt = appointmentMapper.findByIdAndDeletedFalse(report.getAppointmentId()).orElse(null); if (appt != null) { report.setPetName(appt.getPetName()); report.setServiceType(appt.getServiceType()); @@ -35,7 +35,7 @@ public class ReportService { report.setStoreId(appt.getStoreId()); // 技师取预约分配的技师(开始服务时指定的) if (appt.getAssignedUserId() != null) { - User staff = userMapper.findById(appt.getAssignedUserId()).orElse(null); + User staff = userMapper.findByIdAndDeletedFalse(appt.getAssignedUserId()).orElse(null); if (staff != null) { report.setUserId(staff.getId()); report.setStaffName(staff.getName()); @@ -49,7 +49,7 @@ public class ReportService { } // 如果预约没分配技师,则用当前操作人 if (report.getUserId() != null && report.getStaffName() == null) { - User staff = userMapper.findById(report.getUserId()).orElse(null); + User staff = userMapper.findByIdAndDeletedFalse(report.getUserId()).orElse(null); if (staff != null) { report.setStaffName(staff.getName()); if (report.getStoreId() == null) { @@ -60,6 +60,7 @@ public class ReportService { report.setCreateTime(LocalDateTime.now()); report.setUpdateTime(LocalDateTime.now()); + report.setDeleted(false); // 先保存 Report 以获取生成的 ID Report saved = reportMapper.save(report); @@ -100,26 +101,26 @@ public class ReportService { if (appointmentId == null) { return null; } - return enrichImages(reportMapper.findFirstByAppointmentIdOrderByCreateTimeDesc(appointmentId).orElse(null)); + return enrichImages(reportMapper.findFirstByAppointmentIdAndDeletedFalseOrderByCreateTimeDesc(appointmentId).orElse(null)); } public Report getByToken(String token) { if (token == null || token.isBlank()) { return null; } - return enrichImages(reportMapper.findFirstByReportToken(token).orElse(null)); + return enrichImages(reportMapper.findFirstByReportTokenAndDeletedFalse(token).orElse(null)); } public List list(Long storeId, Long userId) { List reports; if (storeId != null && userId != null) { - reports = reportMapper.findByStoreIdAndUserIdOrderByCreateTimeDesc(storeId, userId); + reports = reportMapper.findByStoreIdAndUserIdAndDeletedFalseOrderByCreateTimeDesc(storeId, userId); } else if (storeId != null) { - reports = reportMapper.findByStoreIdOrderByCreateTimeDesc(storeId); + reports = reportMapper.findByStoreIdAndDeletedFalseOrderByCreateTimeDesc(storeId); } else if (userId != null) { - reports = reportMapper.findByUserIdOrderByCreateTimeDesc(userId); + reports = reportMapper.findByUserIdAndDeletedFalseOrderByCreateTimeDesc(userId); } else { - reports = reportMapper.findAllByOrderByCreateTimeDesc(); + reports = reportMapper.findAllByDeletedFalseOrderByCreateTimeDesc(); } return enrichImages(reports); } @@ -132,16 +133,27 @@ public class ReportService { ); Page paged; if (storeId != null && userId != null) { - paged = reportMapper.findByStoreIdAndUserId(storeId, userId, pageable); + paged = reportMapper.findByStoreIdAndUserIdAndDeletedFalse(storeId, userId, pageable); } else if (storeId != null) { - paged = reportMapper.findByStoreId(storeId, pageable); + paged = reportMapper.findByStoreIdAndDeletedFalse(storeId, pageable); } else if (userId != null) { - paged = reportMapper.findByUserId(userId, pageable); + paged = reportMapper.findByUserIdAndDeletedFalse(userId, pageable); } else { - paged = reportMapper.findAll(pageable); + paged = reportMapper.findByDeletedFalse(pageable); } // 填充图片 enrichImages(paged.getContent()); return paged; } + + public boolean softDelete(Long id) { + Report report = reportMapper.findByIdAndDeletedFalse(id).orElse(null); + if (report == null) { + return false; + } + report.setDeleted(true); + report.setUpdateTime(LocalDateTime.now()); + reportMapper.save(report); + return true; + } } diff --git a/src/main/java/com/petstore/service/StoreService.java b/src/main/java/com/petstore/service/StoreService.java index c7938ed..a5a9620 100644 --- a/src/main/java/com/petstore/service/StoreService.java +++ b/src/main/java/com/petstore/service/StoreService.java @@ -18,27 +18,42 @@ public class StoreService { store.setInviteCode(generateInviteCode()); store.setCreateTime(LocalDateTime.now()); store.setUpdateTime(LocalDateTime.now()); + store.setDeleted(false); return storeMapper.save(store); } public Store findById(Long id) { - return storeMapper.findById(id).orElse(null); + return storeMapper.findByIdAndDeletedFalse(id).orElse(null); } public Store findByInviteCode(String code) { - return storeMapper.findByInviteCode(code); + return storeMapper.findByInviteCodeAndDeletedFalse(code); } /** C 端预约:列出全部门店供选择 */ public List listAll() { - return storeMapper.findAll(); + return storeMapper.findAllByDeletedFalse(); } public Store update(Store store) { store.setUpdateTime(LocalDateTime.now()); + if (store.getDeleted() == null) { + store.setDeleted(false); + } return storeMapper.save(store); } + public boolean softDelete(Long id) { + Store store = storeMapper.findByIdAndDeletedFalse(id).orElse(null); + if (store == null) { + return false; + } + store.setDeleted(true); + store.setUpdateTime(LocalDateTime.now()); + storeMapper.save(store); + return true; + } + private String generateInviteCode() { return UUID.randomUUID().toString().replace("-", "").substring(0, 8).toUpperCase(); } diff --git a/src/main/java/com/petstore/service/UserService.java b/src/main/java/com/petstore/service/UserService.java index de5f07b..97a1516 100644 --- a/src/main/java/com/petstore/service/UserService.java +++ b/src/main/java/com/petstore/service/UserService.java @@ -17,7 +17,7 @@ public class UserService { private final StoreMapper storeMapper; public Map registerBoss(String storeName, String bossName, String phone, String password) { - if (userMapper.findByPhone(phone) != null) { + if (userMapper.findByPhoneAndDeletedFalse(phone) != null) { return Map.of("code", 400, "message", "手机号已注册"); } @@ -28,6 +28,7 @@ public class UserService { store.setInviteCode(UUID.randomUUID().toString().replace("-", "").substring(0, 8).toUpperCase()); store.setCreateTime(LocalDateTime.now()); store.setUpdateTime(LocalDateTime.now()); + store.setDeleted(false); store = storeMapper.save(store); User boss = new User(); @@ -39,6 +40,7 @@ public class UserService { boss.setRole("boss"); boss.setCreateTime(LocalDateTime.now()); boss.setUpdateTime(LocalDateTime.now()); + boss.setDeleted(false); boss = userMapper.save(boss); store.setOwnerId(boss.getId()); @@ -65,7 +67,7 @@ public class UserService { if (phone == null || !phone.matches("^1\\d{10}$")) { return Map.of("code", 400, "message", "手机号格式不正确"); } - User user = userMapper.findByPhone(phone); + User user = userMapper.findByPhoneAndDeletedFalse(phone); if (user == null) { user = new User(); user.setUsername(phone); @@ -75,11 +77,12 @@ public class UserService { user.setRole("customer"); user.setCreateTime(LocalDateTime.now()); user.setUpdateTime(LocalDateTime.now()); + user.setDeleted(false); user = userMapper.save(user); } Store store = null; if (user.getStoreId() != null) { - store = storeMapper.findById(user.getStoreId()).orElse(null); + store = storeMapper.findByIdAndDeletedFalse(user.getStoreId()).orElse(null); } Map data = new HashMap<>(); data.put("user", user); @@ -88,10 +91,10 @@ public class UserService { } public Map registerStaff(String phone, String password, String name, String inviteCode) { - if (userMapper.findByPhone(phone) != null) { + if (userMapper.findByPhoneAndDeletedFalse(phone) != null) { return Map.of("code", 400, "message", "手机号已注册"); } - Store store = storeMapper.findByInviteCode(inviteCode); + Store store = storeMapper.findByInviteCodeAndDeletedFalse(inviteCode); if (store == null) { return Map.of("code", 400, "message", "邀请码无效"); } @@ -104,6 +107,7 @@ public class UserService { staff.setRole("staff"); staff.setCreateTime(LocalDateTime.now()); staff.setUpdateTime(LocalDateTime.now()); + staff.setDeleted(false); staff = userMapper.save(staff); Map data = new HashMap<>(); data.put("user", staff); @@ -115,7 +119,7 @@ public class UserService { if (storeId == null) { return Map.of("code", 400, "message", "店铺ID不能为空"); } - if (userMapper.findByPhone(phone) != null) { + if (userMapper.findByPhoneAndDeletedFalse(phone) != null) { return Map.of("code", 400, "message", "手机号已存在"); } String pwd = String.format("%06d", (int)(Math.random() * 999999)); @@ -128,25 +132,33 @@ public class UserService { staff.setRole("staff"); staff.setCreateTime(LocalDateTime.now()); staff.setUpdateTime(LocalDateTime.now()); + staff.setDeleted(false); staff = userMapper.save(staff); return Map.of("code", 200, "message", "创建成功,初始密码:" + pwd, "data", staff); } public List getStaffList(Long storeId) { - return userMapper.findByStoreId(storeId); + return userMapper.findByStoreIdAndDeletedFalse(storeId); } - public void deleteStaff(Long staffId) { - userMapper.deleteById(staffId); + public boolean deleteStaff(Long staffId) { + User user = userMapper.findByIdAndDeletedFalse(staffId).orElse(null); + if (user == null) { + return false; + } + user.setDeleted(true); + user.setUpdateTime(LocalDateTime.now()); + userMapper.save(user); + return true; } public User findById(Long id) { - return userMapper.findById(id).orElse(null); + return userMapper.findByIdAndDeletedFalse(id).orElse(null); } public Map updateUser(Map params) { Long userId = Long.valueOf(params.get("id").toString()); - User user = userMapper.findById(userId).orElse(null); + User user = userMapper.findByIdAndDeletedFalse(userId).orElse(null); if (user == null) { return Map.of("code", 404, "message", "用户不存在"); } @@ -161,7 +173,7 @@ public class UserService { return Map.of("code", 400, "message", "验证码错误"); } // 检查手机号是否被占用 - User existing = userMapper.findByPhone(newPhone); + User existing = userMapper.findByPhoneAndDeletedFalse(newPhone); if (existing != null && !existing.getId().equals(userId)) { return Map.of("code", 400, "message", "手机号已被占用"); } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index b8eee32..352ade6 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -21,7 +21,8 @@ spring: format_sql: true servlet: multipart: - max-file-size: 10MB + max-file-size: 120MB + max-request-size: 120MB server: port: 8080