From 5628effa692b0f7a1357e7965aceb6901b050822 Mon Sep 17 00:00:00 2001 From: "review512jwy@163.com" <“review512jwy@163.com”> Date: Fri, 17 Apr 2026 15:32:18 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../youlai/boot/mini/converter/MiniStrayAnimalConverter.java | 3 --- .../youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/youlai/boot/mini/converter/MiniStrayAnimalConverter.java b/src/main/java/com/youlai/boot/mini/converter/MiniStrayAnimalConverter.java index bcf6b4d..670e00e 100644 --- a/src/main/java/com/youlai/boot/mini/converter/MiniStrayAnimalConverter.java +++ b/src/main/java/com/youlai/boot/mini/converter/MiniStrayAnimalConverter.java @@ -2,9 +2,6 @@ package com.youlai.boot.mini.converter; import com.youlai.boot.mini.model.entity.MiniStrayAnimal; import com.youlai.boot.mini.model.form.StrayAnimalForm; -import com.youlai.boot.system.model.entity.Dept; -import com.youlai.boot.system.model.form.DeptForm; -import com.youlai.boot.system.model.vo.DeptVO; import org.mapstruct.Mapper; /** diff --git a/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java b/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java index 457563c..a73ccd0 100644 --- a/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java +++ b/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java @@ -59,7 +59,7 @@ public class StrayAnimalServiceImpl extends ServiceImpl images, List videos) { // 1. 参数校验 - validateInput(formData, images, videos); + validateInput(images, videos); // 2. 保存流浪动物基本信息 MiniStrayAnimal miniStrayAnimal = saveAnimalInfo(formData); @@ -211,7 +211,7 @@ public class StrayAnimalServiceImpl extends ServiceImpl images, List videos) { + private void validateInput(List images, List videos) { // 验证必填图片 Assert.notEmpty(images, "需要上传图片"); // 验证图片数量 From 220d00cf807601a055c037bfec0ee6c65a185d35 Mon Sep 17 00:00:00 2001 From: "review512jwy@163.com" <“review512jwy@163.com”> Date: Fri, 17 Apr 2026 20:09:10 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E7=BC=96=E8=BE=91=E5=8A=A8=E7=89=A9?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=EF=BC=88=E4=B8=8D=E5=8C=85=E5=90=AB=E5=9B=BE?= =?UTF-8?q?=E7=89=87/=E8=A7=86=E9=A2=91=E5=AA=92=E4=BD=93=E8=B5=84?= =?UTF-8?q?=E6=BA=90=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../youlai/boot/file/service/FileService.java | 3 - .../file/service/impl/LocalFileService.java | 4 - .../file/service/impl/MinioFileService.java | 5 -- .../controller/StrayAnimalController.java | 15 ++++ .../mini/mapper/MiniStrayAnimalMapper.java | 2 + .../boot/mini/service/StrayAnimalService.java | 1 + .../service/impl/StrayAnimalServiceImpl.java | 75 +++++++++++++++---- .../mapper/mini/MiniStrayAnimalMapper.xml | 36 +++++++++ 8 files changed, 114 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/youlai/boot/file/service/FileService.java b/src/main/java/com/youlai/boot/file/service/FileService.java index b8cbaba..bd4238d 100644 --- a/src/main/java/com/youlai/boot/file/service/FileService.java +++ b/src/main/java/com/youlai/boot/file/service/FileService.java @@ -29,7 +29,4 @@ public interface FileService { boolean deleteFile(String filePath); - String uploadFile(String objectName, InputStream inputStream); - - } diff --git a/src/main/java/com/youlai/boot/file/service/impl/LocalFileService.java b/src/main/java/com/youlai/boot/file/service/impl/LocalFileService.java index e9a293f..4a9e927 100644 --- a/src/main/java/com/youlai/boot/file/service/impl/LocalFileService.java +++ b/src/main/java/com/youlai/boot/file/service/impl/LocalFileService.java @@ -90,8 +90,4 @@ public class LocalFileService implements FileService { return FileUtil.del(storagePath + filePath); } - @Override - public String uploadFile(String objectName, InputStream inputStream) { - return ""; - } } diff --git a/src/main/java/com/youlai/boot/file/service/impl/MinioFileService.java b/src/main/java/com/youlai/boot/file/service/impl/MinioFileService.java index 5516795..03e5a32 100644 --- a/src/main/java/com/youlai/boot/file/service/impl/MinioFileService.java +++ b/src/main/java/com/youlai/boot/file/service/impl/MinioFileService.java @@ -165,11 +165,6 @@ public class MinioFileService implements FileService { } } - @Override - public String uploadFile(String objectName, InputStream inputStream) { - return ""; - } - /** * PUBLIC桶策略 diff --git a/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java b/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java index 804e758..3ff6dcc 100644 --- a/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java +++ b/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java @@ -10,11 +10,14 @@ import com.youlai.boot.mini.model.form.StrayAnimalForm; import com.youlai.boot.mini.service.StrayAnimalService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.enums.ParameterIn; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -44,4 +47,16 @@ public class StrayAnimalController { return Result.success(uuid); } + + @Operation(summary = "编辑动物信息(不包含图片/视频媒体资源)") + @PutMapping(value = "/{uuid}") + @Log(module = LogModuleEnum.STRAY_ANIMAL_INFO, value = ActionTypeEnum.UPDATE) + public Result updateStrayAnimal( + @PathVariable String uuid, + @Validated @RequestBody StrayAnimalForm formData + ) { + strayAnimalService.updateStrayAnimal(uuid, formData); + return Result.success(); + } + } diff --git a/src/main/java/com/youlai/boot/mini/mapper/MiniStrayAnimalMapper.java b/src/main/java/com/youlai/boot/mini/mapper/MiniStrayAnimalMapper.java index 0ff5576..72946ec 100644 --- a/src/main/java/com/youlai/boot/mini/mapper/MiniStrayAnimalMapper.java +++ b/src/main/java/com/youlai/boot/mini/mapper/MiniStrayAnimalMapper.java @@ -13,4 +13,6 @@ public interface MiniStrayAnimalMapper extends BaseMapper { boolean insertStrayAnimal(MiniStrayAnimal entity); + void updateStrayAnimal(MiniStrayAnimal miniStrayAnimal); + } diff --git a/src/main/java/com/youlai/boot/mini/service/StrayAnimalService.java b/src/main/java/com/youlai/boot/mini/service/StrayAnimalService.java index 7516fbc..718ce36 100644 --- a/src/main/java/com/youlai/boot/mini/service/StrayAnimalService.java +++ b/src/main/java/com/youlai/boot/mini/service/StrayAnimalService.java @@ -12,4 +12,5 @@ public interface StrayAnimalService extends IService { String saveStrayAnimal(@Valid StrayAnimalForm formData, List images, List videos); + void updateStrayAnimal(String uuid, StrayAnimalForm formData); } diff --git a/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java b/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java index a73ccd0..e9bdc89 100644 --- a/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java +++ b/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java @@ -3,6 +3,8 @@ package com.youlai.boot.mini.service.impl; import ch.hsr.geohash.GeoHash; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.youlai.boot.common.constant.CommonConstants; import com.youlai.boot.common.util.CoordinateTransformUtils; @@ -10,6 +12,7 @@ import com.youlai.boot.common.util.FileUtils; import com.youlai.boot.common.util.JavaVCUtils; import com.youlai.boot.common.util.RandomNumberUtils; import com.youlai.boot.file.service.FileService; +import com.youlai.boot.file.service.impl.AliyunFileService; import com.youlai.boot.framework.security.util.SecurityUtils; import com.youlai.boot.mini.converter.MiniStrayAnimalConverter; import com.youlai.boot.mini.mapper.MiniStrayAnimalMapper; @@ -46,7 +49,7 @@ import java.util.UUID; @Slf4j public class StrayAnimalServiceImpl extends ServiceImpl implements StrayAnimalService { - private final FileService fileService; + private final AliyunFileService aliyunFileService; private final MiniStrayAnimalNoteMapper miniStrayAnimalNoteMapper; private final MiniStrayAnimalNoteMediaMapper miniStrayAnimalNoteMediaMapper; @@ -84,7 +87,7 @@ public class StrayAnimalServiceImpl extends ServiceImpl() + .eq(MiniStrayAnimal::getUuid, uuid) + .eq(MiniStrayAnimal::getDeleted, 0) + ); + Assert.notNull(animal, "动物不存在"); + + long currentTimestamp = System.currentTimeMillis(); + + // 1. 更新流浪动物基本信息 + updateAnimalInfo(animal.getId(), formData, currentTimestamp); + // 3. 更新笔记信息` + updateNoteInfo(animal.getId(), formData, currentTimestamp); + + } + + private void updateNoteInfo(Long animalId, StrayAnimalForm formData, long currentTimestamp) { + //处理笔记 + MiniStrayAnimalNote miniStrayAnimalNote = miniStrayAnimalNoteMapper.selectOne(new LambdaQueryWrapper() + .eq(MiniStrayAnimalNote::getStrayAnimalId, animalId)); + if (null != miniStrayAnimalNote){ + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(MiniStrayAnimalNote::getId, miniStrayAnimalNote.getId()) + .set(MiniStrayAnimalNote::getTitle, formData.getTitle()) + .set(MiniStrayAnimalNote::getContent, formData.getContent()) + .set(MiniStrayAnimalNote::getVisibility, formData.getVisibility()) + .set(MiniStrayAnimalNote::getUpdateTimestamp, currentTimestamp) + .set(MiniStrayAnimalNote::getUpdateBy, SecurityUtils.getUserId()) + .set(MiniStrayAnimalNote::getUpdateTime, new Date(currentTimestamp)); + + miniStrayAnimalNoteMapper.update(null, updateWrapper); + + } + } + + private void updateAnimalInfo(Long animalId, StrayAnimalForm formData, long currentTimestamp) { + MiniStrayAnimal miniStrayAnimal = miniStrayAnimalConverter.toEntity(formData); + + miniStrayAnimal.setId(animalId); + miniStrayAnimal.setUpdateTimestamp(currentTimestamp); + miniStrayAnimal.setUpdateTime(new Date(currentTimestamp)); + miniStrayAnimal.setUpdateBy(SecurityUtils.getUserId()); + handleLngLat(miniStrayAnimal, formData.getLng(), formData.getLat()); + + miniStrayAnimalMapper.updateStrayAnimal(miniStrayAnimal); + } + } diff --git a/src/main/resources/mapper/mini/MiniStrayAnimalMapper.xml b/src/main/resources/mapper/mini/MiniStrayAnimalMapper.xml index 1b699c0..aaeab58 100644 --- a/src/main/resources/mapper/mini/MiniStrayAnimalMapper.xml +++ b/src/main/resources/mapper/mini/MiniStrayAnimalMapper.xml @@ -80,4 +80,40 @@ + + + UPDATE mini_stray_animal + + uuid = #{uuid}, + mini_user_id = #{miniUserId}, + animal_type = #{animalType}, + color = #{color}, + size = #{size}, + status = #{status}, + adopted_by = #{adoptedBy}, + adopted_at = #{adoptedAt}, + audit_status = #{auditStatus}, + province = #{province}, + city = #{city}, + district = #{district}, + address = #{address}, + + + gd_location_point = + ST_GeomFromWKB(#{gdLocationPoint, typeHandler=com.youlai.boot.common.handler.PointTypeHandler}, 4326), + + + + wgs84_location_point = + ST_GeomFromWKB(#{wgs84LocationPoint, typeHandler=com.youlai.boot.common.handler.PointTypeHandler}, 4326), + + + wgs84_geohash = #{wgs84Geohash}, + update_time = #{updateTime}, + update_timestamp = #{updateTimestamp}, + update_by = #{updateBy}, + + WHERE id = #{id} + + From 938eec2648cafd2cbaae59b4b0c04f27e21eba74 Mon Sep 17 00:00:00 2001 From: "review512jwy@163.com" <“review512jwy@163.com”> Date: Fri, 17 Apr 2026 21:46:53 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E7=AC=94=E8=AE=B0=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../file/service/impl/AliyunFileService.java | 18 +++ .../controller/StrayAnimalController.java | 33 +++- .../MiniStrayAnimalNoteMediaMapper.java | 3 + .../dto/DeleteStrayAnimalNoteMediaDTO.java | 36 +++++ .../entity/MiniStrayAnimalNoteMedia.java | 2 +- .../boot/mini/service/StrayAnimalService.java | 7 +- .../service/impl/StrayAnimalServiceImpl.java | 153 +++++++++++++++--- .../mini/MiniStrayAnimalNoteMediaMapper.xml | 8 + 8 files changed, 231 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/youlai/boot/mini/model/dto/DeleteStrayAnimalNoteMediaDTO.java diff --git a/src/main/java/com/youlai/boot/file/service/impl/AliyunFileService.java b/src/main/java/com/youlai/boot/file/service/impl/AliyunFileService.java index 2688f0d..baba791 100644 --- a/src/main/java/com/youlai/boot/file/service/impl/AliyunFileService.java +++ b/src/main/java/com/youlai/boot/file/service/impl/AliyunFileService.java @@ -6,6 +6,8 @@ import cn.hutool.core.lang.Assert; import cn.hutool.core.util.IdUtil; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; +import com.aliyun.oss.model.DeleteObjectsRequest; +import com.aliyun.oss.model.DeleteObjectsResult; import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.PutObjectRequest; import com.youlai.boot.file.service.FileService; @@ -14,6 +16,7 @@ import jakarta.annotation.PostConstruct; import lombok.Data; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @@ -21,6 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.InputStream; import java.time.LocalDateTime; +import java.util.List; /** * Aliyun 对象存储服务类 @@ -33,6 +37,7 @@ import java.time.LocalDateTime; @ConfigurationProperties(prefix = "oss.aliyun") @RequiredArgsConstructor @Data +@Slf4j public class AliyunFileService implements FileService { /** * 服务Endpoint @@ -109,4 +114,17 @@ public class AliyunFileService implements FileService { aliyunOssClient.deleteObject(bucketName, fileName); return true; } + + public void deleteMultiFile(List objectNames) { + + DeleteObjectsRequest deleteRequest = new DeleteObjectsRequest(bucketName).withKeys(objectNames); + DeleteObjectsResult deleteResult = aliyunOssClient.deleteObjects(deleteRequest); + + List deletedObjects = deleteResult.getDeletedObjects(); + + deletedObjects.forEach(key -> log.info(" - {}", key)); + + log.info("aliyun oss files delete successfully......."); + + } } diff --git a/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java b/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java index 3ff6dcc..78feb1f 100644 --- a/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java +++ b/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java @@ -6,6 +6,7 @@ import com.youlai.boot.common.enums.ActionTypeEnum; import com.youlai.boot.common.enums.LogModuleEnum; import com.youlai.boot.common.model.Option; import com.youlai.boot.common.result.Result; +import com.youlai.boot.mini.model.dto.DeleteStrayAnimalNoteMediaDTO; import com.youlai.boot.mini.model.form.StrayAnimalForm; import com.youlai.boot.mini.service.StrayAnimalService; import io.swagger.v3.oas.annotations.Operation; @@ -35,7 +36,7 @@ public class StrayAnimalController { private final StrayAnimalService strayAnimalService; @Operation(summary = "添加动物信息") - @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @PostMapping(value = "save", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @RepeatSubmit @Log(module = LogModuleEnum.STRAY_ANIMAL_INFO, value = ActionTypeEnum.INSERT) public Result saveStrayAnimal( @@ -49,13 +50,37 @@ public class StrayAnimalController { @Operation(summary = "编辑动物信息(不包含图片/视频媒体资源)") - @PutMapping(value = "/{uuid}") + @PostMapping(value = "/update/{animalUuid}") @Log(module = LogModuleEnum.STRAY_ANIMAL_INFO, value = ActionTypeEnum.UPDATE) public Result updateStrayAnimal( - @PathVariable String uuid, + @PathVariable String animalUuid, @Validated @RequestBody StrayAnimalForm formData ) { - strayAnimalService.updateStrayAnimal(uuid, formData); + strayAnimalService.updateStrayAnimal(animalUuid, formData); + return Result.success(); + } + + @Operation(summary = "编辑动物信息时,删除流浪动物信息媒体资源") + @PostMapping(value = "/update/deleteMediaSource") + @Log(module = LogModuleEnum.STRAY_ANIMAL_INFO, value = ActionTypeEnum.UPDATE) + public Result deleteMediaSource( + @RequestBody @Validated DeleteStrayAnimalNoteMediaDTO deleteStrayAnimalNoteMediaDTO + ){ + strayAnimalService.deleteMediaSource(deleteStrayAnimalNoteMediaDTO); + return Result.success(); + } + + + @Operation(summary = "编辑动物信息时,添加流浪动物信息媒体资源", description = "比如补充图片、补充视频") + @PostMapping(value = "update/saveMediaSource/{noteMediaUuid}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @RepeatSubmit + @Log(module = LogModuleEnum.STRAY_ANIMAL_INFO, value = ActionTypeEnum.UPDATE) + public Result saveMediaSource( + @PathVariable String noteMediaUuid, + @RequestPart(name = "images", required = false) List images, + @RequestPart(name = "videos", required = false) List videos + ) { + strayAnimalService.saveMediaSource(noteMediaUuid, images, videos); return Result.success(); } diff --git a/src/main/java/com/youlai/boot/mini/mapper/MiniStrayAnimalNoteMediaMapper.java b/src/main/java/com/youlai/boot/mini/mapper/MiniStrayAnimalNoteMediaMapper.java index 4f60da1..c326c67 100644 --- a/src/main/java/com/youlai/boot/mini/mapper/MiniStrayAnimalNoteMediaMapper.java +++ b/src/main/java/com/youlai/boot/mini/mapper/MiniStrayAnimalNoteMediaMapper.java @@ -3,6 +3,8 @@ package com.youlai.boot.mini.mapper; import com.youlai.boot.mini.model.entity.MiniStrayAnimalNoteMedia; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.Map; + /** * 流浪信息资源表 Mapper 接口 * @@ -11,4 +13,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface MiniStrayAnimalNoteMediaMapper extends BaseMapper { + int getMediaCountByNoteIdAndType(Map param); } diff --git a/src/main/java/com/youlai/boot/mini/model/dto/DeleteStrayAnimalNoteMediaDTO.java b/src/main/java/com/youlai/boot/mini/model/dto/DeleteStrayAnimalNoteMediaDTO.java new file mode 100644 index 0000000..3010dbb --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/dto/DeleteStrayAnimalNoteMediaDTO.java @@ -0,0 +1,36 @@ +package com.youlai.boot.mini.model.dto; + +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.util.List; + +@Data +public class DeleteStrayAnimalNoteMediaDTO { + + @NotEmpty(message = "媒体资源uuid不能为空") + @ArraySchema( + arraySchema = @Schema( + description = "流浪动物信息媒体资源uuid列表", + example = "[\"uuid1\",\"uuid2\"]", + requiredMode = Schema.RequiredMode.REQUIRED + ), + schema = @Schema( + description = "媒体资源uuid", + example = "uuid1" + ) + ) + private List<@NotBlank(message = "uuid不能为空") String> noteMediaUuidList; + + @NotBlank(message = "笔记uuid不能为空") + @Schema( + description = "流浪动物信息笔记uuid", + example = "2d7890db8a6e47016ccef2d679d5a2c8", + requiredMode = Schema.RequiredMode.REQUIRED + ) + private String noteUuid; +} diff --git a/src/main/java/com/youlai/boot/mini/model/entity/MiniStrayAnimalNoteMedia.java b/src/main/java/com/youlai/boot/mini/model/entity/MiniStrayAnimalNoteMedia.java index 9cd53ed..5760a35 100644 --- a/src/main/java/com/youlai/boot/mini/model/entity/MiniStrayAnimalNoteMedia.java +++ b/src/main/java/com/youlai/boot/mini/model/entity/MiniStrayAnimalNoteMedia.java @@ -62,7 +62,7 @@ public class MiniStrayAnimalNoteMedia implements Serializable { @TableField("sort_order") @Schema(description = "排序顺序") - private Integer sortOrder; + private Long sortOrder; @TableField("create_time") @Schema(description = "创建时间") diff --git a/src/main/java/com/youlai/boot/mini/service/StrayAnimalService.java b/src/main/java/com/youlai/boot/mini/service/StrayAnimalService.java index 718ce36..9c9f5c5 100644 --- a/src/main/java/com/youlai/boot/mini/service/StrayAnimalService.java +++ b/src/main/java/com/youlai/boot/mini/service/StrayAnimalService.java @@ -1,6 +1,7 @@ package com.youlai.boot.mini.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.youlai.boot.mini.model.dto.DeleteStrayAnimalNoteMediaDTO; import com.youlai.boot.mini.model.entity.MiniStrayAnimal; import com.youlai.boot.mini.model.form.StrayAnimalForm; import jakarta.validation.Valid; @@ -12,5 +13,9 @@ public interface StrayAnimalService extends IService { String saveStrayAnimal(@Valid StrayAnimalForm formData, List images, List videos); - void updateStrayAnimal(String uuid, StrayAnimalForm formData); + void updateStrayAnimal(String animalUuid, StrayAnimalForm formData); + + void deleteMediaSource(DeleteStrayAnimalNoteMediaDTO deleteStrayAnimalNoteMediaDTO); + + void saveMediaSource(String noteMediaUuid, List images, List videos); } diff --git a/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java b/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java index e9bdc89..42195fe 100644 --- a/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java +++ b/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.youlai.boot.common.constant.CommonConstants; +import com.youlai.boot.common.exception.BusinessException; import com.youlai.boot.common.util.CoordinateTransformUtils; import com.youlai.boot.common.util.FileUtils; import com.youlai.boot.common.util.JavaVCUtils; @@ -18,6 +19,7 @@ import com.youlai.boot.mini.converter.MiniStrayAnimalConverter; import com.youlai.boot.mini.mapper.MiniStrayAnimalMapper; import com.youlai.boot.mini.mapper.MiniStrayAnimalNoteMapper; import com.youlai.boot.mini.mapper.MiniStrayAnimalNoteMediaMapper; +import com.youlai.boot.mini.model.dto.DeleteStrayAnimalNoteMediaDTO; import com.youlai.boot.mini.model.enums.AnimalNoteMediaTypeEnum; import com.youlai.boot.mini.model.entity.MiniStrayAnimal; import com.youlai.boot.mini.model.entity.MiniStrayAnimalNote; @@ -26,6 +28,7 @@ import com.youlai.boot.mini.model.form.StrayAnimalForm; import com.youlai.boot.mini.service.StrayAnimalService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.io.FilenameUtils; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.GeometryFactory; @@ -37,9 +40,8 @@ import org.springframework.web.multipart.MultipartFile; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; -import java.util.Date; -import java.util.List; -import java.util.UUID; +import java.text.MessageFormat; +import java.util.*; /** * 流浪动物业务实现类 @@ -71,20 +73,22 @@ public class StrayAnimalServiceImpl extends ServiceImpl images, List videos) { - int sortOrder = 0; + private void saveMediaFiles(MiniStrayAnimalNote note, List images, List videos, long currentTimestamp) { + long sortOrder = currentTimestamp; // 处理图片 if (images != null) { for (MultipartFile image : images) { try { String objectName = "animal_note/" + note.getId() + "/" - + note.getCreateTimestamp() + RandomNumberUtils.createRandomLowerLetterAndNumber(8) + + currentTimestamp + RandomNumberUtils.createRandomLowerLetterAndNumber(8) + "." + FilenameUtils.getExtension(image.getOriginalFilename()); String url = aliyunFileService.uploadFile(objectName, image.getInputStream()); @@ -98,8 +102,8 @@ public class StrayAnimalServiceImpl extends ServiceImpl images, List videos) { // 验证必填图片 - Assert.notEmpty(images, "需要上传图片"); + if (images == null || images.isEmpty()) { + throw new BusinessException("需要上传图片"); + } // 验证图片数量 - Assert.isTrue( - images.size() <= CommonConstants.STRAY_ANIMAL_IMAGE_NUM_LIMIT, - "最多只能上传" + CommonConstants.STRAY_ANIMAL_IMAGE_NUM_LIMIT + "张图片"); + if (images.size() > CommonConstants.STRAY_ANIMAL_IMAGE_NUM_LIMIT) { + throw new BusinessException( + "最多只能上传" + CommonConstants.STRAY_ANIMAL_IMAGE_NUM_LIMIT + "张图片" + ); + } + // 验证视频数量 - Assert.isTrue( - CollUtil.isEmpty(videos) || videos.size() <= CommonConstants.STRAY_ANIMAL_VIDEO_NUM_LIMIT, - "最多只能上传" + CommonConstants.STRAY_ANIMAL_VIDEO_NUM_LIMIT + "个视频"); + if (!CollUtil.isEmpty(videos) && videos.size() > CommonConstants.STRAY_ANIMAL_VIDEO_NUM_LIMIT) { + throw new BusinessException( + "最多只能上传" + CommonConstants.STRAY_ANIMAL_VIDEO_NUM_LIMIT + "个视频" + ); + } } @Override - public void updateStrayAnimal(String uuid, StrayAnimalForm formData) { + public void updateStrayAnimal(String animalUuid, StrayAnimalForm formData) { // 校验动物是否存在 MiniStrayAnimal animal = miniStrayAnimalMapper.selectOne( new LambdaQueryWrapper() - .eq(MiniStrayAnimal::getUuid, uuid) + .eq(MiniStrayAnimal::getUuid, animalUuid) .eq(MiniStrayAnimal::getDeleted, 0) ); - Assert.notNull(animal, "动物不存在"); + if (animal == null) { + throw new BusinessException("动物不存在"); + } + + if (1 == animal.getAuditStatus()) { + throw new BusinessException("审核中无法更改"); + } long currentTimestamp = System.currentTimeMillis(); @@ -235,6 +252,7 @@ public class StrayAnimalServiceImpl extends ServiceImpl noteMediaUuidList = deleteStrayAnimalNoteMediaDTO.getNoteMediaUuidList(); + + MiniStrayAnimalNote note = miniStrayAnimalNoteMapper.selectOne(new LambdaQueryWrapper() + .eq(MiniStrayAnimalNote::getUuid, deleteStrayAnimalNoteMediaDTO.getNoteUuid())); + if (note == null) { + throw new BusinessException("笔记不存在"); + } + + LambdaQueryWrapper queryWrapper = + new LambdaQueryWrapper() + .in(MiniStrayAnimalNoteMedia::getUuid, noteMediaUuidList) + .eq(MiniStrayAnimalNoteMedia::getNoteId, note.getId()) + .eq(MiniStrayAnimalNoteMedia::getDeleted, 0); + + List mediaList = + miniStrayAnimalNoteMediaMapper.selectList(queryWrapper); + + if (CollectionUtils.isNotEmpty(mediaList)) { + + // 删除源文件 + List storageKeyList = mediaList.stream() + .map(MiniStrayAnimalNoteMedia::getStorageKey) + .toList(); + aliyunFileService.deleteMultiFile(storageKeyList); + + long currentTimestamp = System.currentTimeMillis(); + + // 逻辑删除 + miniStrayAnimalNoteMediaMapper.update( + null, + new LambdaUpdateWrapper() + .in(MiniStrayAnimalNoteMedia::getUuid, noteMediaUuidList) + .eq(MiniStrayAnimalNoteMedia::getNoteId, note.getId()) + .set(MiniStrayAnimalNoteMedia::getDeleted, 1) + .set(MiniStrayAnimalNoteMedia::getUpdateTimestamp, currentTimestamp) + .set(MiniStrayAnimalNoteMedia::getUpdateTime, new Date(currentTimestamp)) + .set(MiniStrayAnimalNoteMedia::getUpdateBy, SecurityUtils.getUserId()) + ); + } + } + + @Override + public void saveMediaSource(String noteMediaUuid, List images, List videos) { + if ((images == null || images.isEmpty()) && (videos == null || videos.isEmpty())) { + throw new BusinessException("需要上传媒体资源"); + } + MiniStrayAnimalNote note = miniStrayAnimalNoteMapper.selectOne( + new LambdaQueryWrapper() + .eq(MiniStrayAnimalNote::getUuid, noteMediaUuid) + .eq(MiniStrayAnimalNote::getDeleted, 0) + ); + if (note == null) { + throw new BusinessException("笔记不存在"); + } + + Long animalId = note.getStrayAnimalId(); + MiniStrayAnimal miniStrayAnimal = miniStrayAnimalMapper.selectById(animalId); + if (miniStrayAnimal == null) { + throw new BusinessException("动物信息不存在"); + } + if (1 == miniStrayAnimal.getAuditStatus()){ + throw new BusinessException("审核中"); + } + + //校验数量有没有超出 + Map param = new HashMap<>(); + param.put("noteId", note.getId()); + + if (CollectionUtils.isNotEmpty(images)){ + param.put("mediaType", AnimalNoteMediaTypeEnum.IMAGE.name().toLowerCase()); + int imagesExist = miniStrayAnimalNoteMediaMapper.getMediaCountByNoteIdAndType(param); + if (imagesExist+images.size() > CommonConstants.STRAY_ANIMAL_IMAGE_NUM_LIMIT) { + throw new BusinessException("图片总数不能超过" + CommonConstants.STRAY_ANIMAL_IMAGE_NUM_LIMIT + "张"); + } + } + if (CollectionUtils.isNotEmpty(videos)){ + param.put("mediaType", AnimalNoteMediaTypeEnum.VIDEO.name().toLowerCase()); + int videosExist = miniStrayAnimalNoteMediaMapper.getMediaCountByNoteIdAndType(param); + if(videosExist+videos.size() > CommonConstants.STRAY_ANIMAL_VIDEO_NUM_LIMIT){ + throw new BusinessException("视频总数不能超过" + CommonConstants.STRAY_ANIMAL_VIDEO_NUM_LIMIT + "个"); + } + } + + saveMediaFiles(note, images, videos, System.currentTimeMillis()); + + } + } diff --git a/src/main/resources/mapper/mini/MiniStrayAnimalNoteMediaMapper.xml b/src/main/resources/mapper/mini/MiniStrayAnimalNoteMediaMapper.xml index 4ff3cf4..e7dbb62 100644 --- a/src/main/resources/mapper/mini/MiniStrayAnimalNoteMediaMapper.xml +++ b/src/main/resources/mapper/mini/MiniStrayAnimalNoteMediaMapper.xml @@ -5,5 +5,13 @@ + From f226559dbb6a9802b8ba1c9783b4b1e6f8c4d00c Mon Sep 17 00:00:00 2001 From: "review512jwy@163.com" <“review512jwy@163.com”> Date: Sat, 18 Apr 2026 10:16:35 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../youlai/boot/mini/controller/StrayAnimalController.java | 6 +++--- .../com/youlai/boot/mini/service/StrayAnimalService.java | 2 +- .../boot/mini/service/impl/StrayAnimalServiceImpl.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java b/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java index 78feb1f..00391f4 100644 --- a/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java +++ b/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java @@ -72,15 +72,15 @@ public class StrayAnimalController { @Operation(summary = "编辑动物信息时,添加流浪动物信息媒体资源", description = "比如补充图片、补充视频") - @PostMapping(value = "update/saveMediaSource/{noteMediaUuid}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @PostMapping(value = "update/saveMediaSource/{noteUuid}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @RepeatSubmit @Log(module = LogModuleEnum.STRAY_ANIMAL_INFO, value = ActionTypeEnum.UPDATE) public Result saveMediaSource( - @PathVariable String noteMediaUuid, + @PathVariable String noteUuid, @RequestPart(name = "images", required = false) List images, @RequestPart(name = "videos", required = false) List videos ) { - strayAnimalService.saveMediaSource(noteMediaUuid, images, videos); + strayAnimalService.saveMediaSource(noteUuid, images, videos); return Result.success(); } diff --git a/src/main/java/com/youlai/boot/mini/service/StrayAnimalService.java b/src/main/java/com/youlai/boot/mini/service/StrayAnimalService.java index 9c9f5c5..5c2d2ec 100644 --- a/src/main/java/com/youlai/boot/mini/service/StrayAnimalService.java +++ b/src/main/java/com/youlai/boot/mini/service/StrayAnimalService.java @@ -17,5 +17,5 @@ public interface StrayAnimalService extends IService { void deleteMediaSource(DeleteStrayAnimalNoteMediaDTO deleteStrayAnimalNoteMediaDTO); - void saveMediaSource(String noteMediaUuid, List images, List videos); + void saveMediaSource(String noteUuid, List images, List videos); } diff --git a/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java b/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java index 42195fe..ec7432d 100644 --- a/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java +++ b/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java @@ -331,13 +331,13 @@ public class StrayAnimalServiceImpl extends ServiceImpl images, List videos) { + public void saveMediaSource(String noteUuid, List images, List videos) { if ((images == null || images.isEmpty()) && (videos == null || videos.isEmpty())) { throw new BusinessException("需要上传媒体资源"); } MiniStrayAnimalNote note = miniStrayAnimalNoteMapper.selectOne( new LambdaQueryWrapper() - .eq(MiniStrayAnimalNote::getUuid, noteMediaUuid) + .eq(MiniStrayAnimalNote::getUuid, noteUuid) .eq(MiniStrayAnimalNote::getDeleted, 0) ); if (note == null) { From 56621ed02e78ccf95789e1a7f5f20d05cbdd94f9 Mon Sep 17 00:00:00 2001 From: "review512jwy@163.com" <“review512jwy@163.com”> Date: Sat, 18 Apr 2026 10:37:36 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E5=8F=8D=E9=A6=88=E7=BB=99=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=8F=90=E7=A4=BA=EF=BC=8C=E5=BC=82=E5=B8=B8=E5=B0=81?= =?UTF-8?q?=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../boot/common/exception/MsgException.java | 45 +++++++++++++++++++ .../youlai/boot/common/result/ResultCode.java | 7 +-- .../web/advice/GlobalExceptionHandler.java | 8 ++++ .../service/impl/StrayAnimalServiceImpl.java | 26 +++++------ 4 files changed, 70 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/youlai/boot/common/exception/MsgException.java diff --git a/src/main/java/com/youlai/boot/common/exception/MsgException.java b/src/main/java/com/youlai/boot/common/exception/MsgException.java new file mode 100644 index 0000000..f8e719c --- /dev/null +++ b/src/main/java/com/youlai/boot/common/exception/MsgException.java @@ -0,0 +1,45 @@ +package com.youlai.boot.common.exception; + +import com.youlai.boot.common.result.IResultCode; +import lombok.Getter; +import org.slf4j.helpers.MessageFormatter; + +/** + * 自定义业务异常 + * + * @author Ray + * @since 2022/7/31 + */ +@Getter +public class MsgException extends RuntimeException { + + public IResultCode resultCode; + + public MsgException(IResultCode errorCode) { + super(errorCode.getMsg()); + this.resultCode = errorCode; + } + + + public MsgException(IResultCode errorCode, String message) { + super(message); + this.resultCode = errorCode; + } + + + public MsgException(String message, Throwable cause) { + super(message, cause); + } + + public MsgException(Throwable cause) { + super(cause); + } + + public MsgException(String message, Object... args) { + super(formatMessage(message, args)); + } + + private static String formatMessage(String message, Object... args) { + return MessageFormatter.arrayFormat(message, args).getMessage(); + } +} diff --git a/src/main/java/com/youlai/boot/common/result/ResultCode.java b/src/main/java/com/youlai/boot/common/result/ResultCode.java index a0833d1..189e7bc 100644 --- a/src/main/java/com/youlai/boot/common/result/ResultCode.java +++ b/src/main/java/com/youlai/boot/common/result/ResultCode.java @@ -53,10 +53,11 @@ import java.io.Serializable; public enum ResultCode implements IResultCode, Serializable { SUCCESS("00000", "成功"), - + /** 一级宏观错误码:用户端错误(由客户端输入/认证/权限/请求方式等引起,需客户端配合修正) */ USER_ERROR("A0001", "用户端错误"), - + MSG_ERROR("A0002", "需反馈给用户端的提示"), + /** 二级宏观错误码:用户端具体错误(按号段细分,便于定位是注册/登录/令牌/参数/防重等问题) */ @@ -98,7 +99,7 @@ public enum ResultCode implements IResultCode, Serializable { /** A07xx:文件处理异常 */ UPLOAD_FILE_EXCEPTION("A0700", "上传文件异常"), DELETE_FILE_EXCEPTION("A0710", "删除文件异常"), - + /** 一级宏观错误码:系统端错误(服务端内部异常/超时/不可用等,需后端排查修复) */ SYSTEM_ERROR("B0001", "系统执行出错"), diff --git a/src/main/java/com/youlai/boot/framework/web/advice/GlobalExceptionHandler.java b/src/main/java/com/youlai/boot/framework/web/advice/GlobalExceptionHandler.java index fb0e25d..131578f 100644 --- a/src/main/java/com/youlai/boot/framework/web/advice/GlobalExceptionHandler.java +++ b/src/main/java/com/youlai/boot/framework/web/advice/GlobalExceptionHandler.java @@ -1,6 +1,7 @@ package com.youlai.boot.framework.web.advice; import cn.hutool.core.util.StrUtil; +import com.youlai.boot.common.exception.MsgException; import tools.jackson.core.JacksonException; import com.youlai.boot.common.exception.BusinessException; import com.youlai.boot.common.result.Result; @@ -239,6 +240,13 @@ public class GlobalExceptionHandler { return Result.failed(e.getMessage()); } + @ExceptionHandler(MsgException.class) + @ResponseStatus(HttpStatus.OK) + public Result handleMsgException(MsgException e) { + log.error("msg exception", e); + return Result.failed(ResultCode.MSG_ERROR, e.getMessage()); + } + /** * 处理所有未捕获的异常 *

diff --git a/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java b/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java index ec7432d..1682c8b 100644 --- a/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java +++ b/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java @@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.youlai.boot.common.constant.CommonConstants; -import com.youlai.boot.common.exception.BusinessException; +import com.youlai.boot.common.exception.MsgException; import com.youlai.boot.common.util.CoordinateTransformUtils; import com.youlai.boot.common.util.FileUtils; import com.youlai.boot.common.util.JavaVCUtils; @@ -212,18 +212,18 @@ public class StrayAnimalServiceImpl extends ServiceImpl images, List videos) { // 验证必填图片 if (images == null || images.isEmpty()) { - throw new BusinessException("需要上传图片"); + throw new MsgException("需要上传图片"); } // 验证图片数量 if (images.size() > CommonConstants.STRAY_ANIMAL_IMAGE_NUM_LIMIT) { - throw new BusinessException( + throw new MsgException( "最多只能上传" + CommonConstants.STRAY_ANIMAL_IMAGE_NUM_LIMIT + "张图片" ); } // 验证视频数量 if (!CollUtil.isEmpty(videos) && videos.size() > CommonConstants.STRAY_ANIMAL_VIDEO_NUM_LIMIT) { - throw new BusinessException( + throw new MsgException( "最多只能上传" + CommonConstants.STRAY_ANIMAL_VIDEO_NUM_LIMIT + "个视频" ); } @@ -239,11 +239,11 @@ public class StrayAnimalServiceImpl extends ServiceImpl() .eq(MiniStrayAnimalNote::getUuid, deleteStrayAnimalNoteMediaDTO.getNoteUuid())); if (note == null) { - throw new BusinessException("笔记不存在"); + throw new MsgException("笔记不存在"); } LambdaQueryWrapper queryWrapper = @@ -333,7 +333,7 @@ public class StrayAnimalServiceImpl extends ServiceImpl images, List videos) { if ((images == null || images.isEmpty()) && (videos == null || videos.isEmpty())) { - throw new BusinessException("需要上传媒体资源"); + throw new MsgException("需要上传媒体资源"); } MiniStrayAnimalNote note = miniStrayAnimalNoteMapper.selectOne( new LambdaQueryWrapper() @@ -341,16 +341,16 @@ public class StrayAnimalServiceImpl extends ServiceImpl CommonConstants.STRAY_ANIMAL_IMAGE_NUM_LIMIT) { - throw new BusinessException("图片总数不能超过" + CommonConstants.STRAY_ANIMAL_IMAGE_NUM_LIMIT + "张"); + throw new MsgException("图片总数不能超过" + CommonConstants.STRAY_ANIMAL_IMAGE_NUM_LIMIT + "张"); } } if (CollectionUtils.isNotEmpty(videos)){ param.put("mediaType", AnimalNoteMediaTypeEnum.VIDEO.name().toLowerCase()); int videosExist = miniStrayAnimalNoteMediaMapper.getMediaCountByNoteIdAndType(param); if(videosExist+videos.size() > CommonConstants.STRAY_ANIMAL_VIDEO_NUM_LIMIT){ - throw new BusinessException("视频总数不能超过" + CommonConstants.STRAY_ANIMAL_VIDEO_NUM_LIMIT + "个"); + throw new MsgException("视频总数不能超过" + CommonConstants.STRAY_ANIMAL_VIDEO_NUM_LIMIT + "个"); } } From 42be6b58b94375c8867cff70cc1939dd8384086f Mon Sep 17 00:00:00 2001 From: "review512jwy@163.com" <“review512jwy@163.com”> Date: Sat, 18 Apr 2026 10:38:25 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E5=8F=8D=E9=A6=88=E7=BB=99=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=8F=90=E7=A4=BA=EF=BC=8C=E5=BC=82=E5=B8=B8=E5=B0=81?= =?UTF-8?q?=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/youlai/boot/common/exception/MsgException.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/com/youlai/boot/common/exception/MsgException.java b/src/main/java/com/youlai/boot/common/exception/MsgException.java index f8e719c..b0bcaf2 100644 --- a/src/main/java/com/youlai/boot/common/exception/MsgException.java +++ b/src/main/java/com/youlai/boot/common/exception/MsgException.java @@ -5,10 +5,7 @@ import lombok.Getter; import org.slf4j.helpers.MessageFormatter; /** - * 自定义业务异常 - * - * @author Ray - * @since 2022/7/31 + * 需反馈给用户端的提示 */ @Getter public class MsgException extends RuntimeException { From f841e0089e7c4f1a164aba30db083eb70167d296 Mon Sep 17 00:00:00 2001 From: "review512jwy@163.com" <“review512jwy@163.com”> Date: Sat, 18 Apr 2026 10:42:30 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/youlai/boot/mini/controller/StrayAnimalController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java b/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java index 00391f4..4855704 100644 --- a/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java +++ b/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java @@ -51,6 +51,7 @@ public class StrayAnimalController { @Operation(summary = "编辑动物信息(不包含图片/视频媒体资源)") @PostMapping(value = "/update/{animalUuid}") + @RepeatSubmit @Log(module = LogModuleEnum.STRAY_ANIMAL_INFO, value = ActionTypeEnum.UPDATE) public Result updateStrayAnimal( @PathVariable String animalUuid, From a9b5fd9744bf7c57fd6dd1bde15c28c2b72b317d Mon Sep 17 00:00:00 2001 From: "review512jwy@163.com" <“review512jwy@163.com”> Date: Sat, 18 Apr 2026 11:18:33 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E7=BC=96=E8=BE=91=E5=8A=A8=E7=89=A9?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=8F=AF=E8=A7=81=E8=8C=83=E5=9B=B4=E3=80=81?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=8A=A8=E7=89=A9=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/StrayAnimalController.java | 28 ++++++- .../mini/model/dto/DeleteStrayAnimalDTO.java | 29 +++++++ .../mini/model/dto/EditVisibilityDTO.java | 18 +++++ .../boot/mini/service/StrayAnimalService.java | 8 ++ .../service/impl/StrayAnimalServiceImpl.java | 78 +++++++++++++++---- 5 files changed, 144 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/youlai/boot/mini/model/dto/DeleteStrayAnimalDTO.java create mode 100644 src/main/java/com/youlai/boot/mini/model/dto/EditVisibilityDTO.java diff --git a/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java b/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java index 4855704..0897d1d 100644 --- a/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java +++ b/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java @@ -6,7 +6,9 @@ import com.youlai.boot.common.enums.ActionTypeEnum; import com.youlai.boot.common.enums.LogModuleEnum; import com.youlai.boot.common.model.Option; import com.youlai.boot.common.result.Result; +import com.youlai.boot.mini.model.dto.DeleteStrayAnimalDTO; import com.youlai.boot.mini.model.dto.DeleteStrayAnimalNoteMediaDTO; +import com.youlai.boot.mini.model.dto.EditVisibilityDTO; import com.youlai.boot.mini.model.form.StrayAnimalForm; import com.youlai.boot.mini.service.StrayAnimalService; import io.swagger.v3.oas.annotations.Operation; @@ -73,7 +75,7 @@ public class StrayAnimalController { @Operation(summary = "编辑动物信息时,添加流浪动物信息媒体资源", description = "比如补充图片、补充视频") - @PostMapping(value = "update/saveMediaSource/{noteUuid}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @PostMapping(value = "/update/saveMediaSource/{noteUuid}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @RepeatSubmit @Log(module = LogModuleEnum.STRAY_ANIMAL_INFO, value = ActionTypeEnum.UPDATE) public Result saveMediaSource( @@ -85,4 +87,28 @@ public class StrayAnimalController { return Result.success(); } + + @Operation(summary = "编辑动物信息可见范围") + @PostMapping(value = "/update/visibility/{animalUuid}") + @RepeatSubmit + @Log(module = LogModuleEnum.STRAY_ANIMAL_INFO, value = ActionTypeEnum.UPDATE) + public Result updateVisibility( + @PathVariable String animalUuid, + @RequestBody @Validated EditVisibilityDTO editVisibilityDTO + ) { + strayAnimalService.updateVisibility(animalUuid, editVisibilityDTO); + return Result.success(); + } + + @Operation(summary = "删除动物信息") + @PostMapping(value = "/delete") + @RepeatSubmit + @Log(module = LogModuleEnum.STRAY_ANIMAL_INFO, value = ActionTypeEnum.DELETE) + public Result delete( + @RequestBody @Validated DeleteStrayAnimalDTO deleteStrayAnimalDTO + ) { + strayAnimalService.delete(deleteStrayAnimalDTO); + return Result.success(); + } + } diff --git a/src/main/java/com/youlai/boot/mini/model/dto/DeleteStrayAnimalDTO.java b/src/main/java/com/youlai/boot/mini/model/dto/DeleteStrayAnimalDTO.java new file mode 100644 index 0000000..61e54a9 --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/dto/DeleteStrayAnimalDTO.java @@ -0,0 +1,29 @@ +package com.youlai.boot.mini.model.dto; + +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; +import org.bytedeco.opencv.presets.opencv_core; + +import java.util.List; + +@Data +public class DeleteStrayAnimalDTO { + + @NotEmpty(message = "uuid不能为空") + @ArraySchema( + arraySchema = @Schema( + description = "流浪动物信息uuid列表", + example = "[\"uuid1\",\"uuid2\"]", + requiredMode = Schema.RequiredMode.REQUIRED + ), + schema = @Schema( + description = "动物信息uuid", + example = "uuid1" + ) + ) + private List<@NotBlank(message = "uuid不能为空") String> animalUuidList; + +} diff --git a/src/main/java/com/youlai/boot/mini/model/dto/EditVisibilityDTO.java b/src/main/java/com/youlai/boot/mini/model/dto/EditVisibilityDTO.java new file mode 100644 index 0000000..0076b80 --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/dto/EditVisibilityDTO.java @@ -0,0 +1,18 @@ +package com.youlai.boot.mini.model.dto; + +import com.youlai.boot.common.annotation.EnumValid; +import com.youlai.boot.mini.model.enums.VisibilityEnum; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class EditVisibilityDTO { + + @NotBlank(message = "可见性范围不能为空") + @EnumValid(enumClass = VisibilityEnum.class, message = "可见性范围不合法") + @Schema(description = "可见性范围:public-公开,private-仅自己,friends-仅好友", example = "public") + private String visibility="public"; + +} diff --git a/src/main/java/com/youlai/boot/mini/service/StrayAnimalService.java b/src/main/java/com/youlai/boot/mini/service/StrayAnimalService.java index 5c2d2ec..834f336 100644 --- a/src/main/java/com/youlai/boot/mini/service/StrayAnimalService.java +++ b/src/main/java/com/youlai/boot/mini/service/StrayAnimalService.java @@ -1,7 +1,10 @@ package com.youlai.boot.mini.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.youlai.boot.common.result.Result; +import com.youlai.boot.mini.model.dto.DeleteStrayAnimalDTO; import com.youlai.boot.mini.model.dto.DeleteStrayAnimalNoteMediaDTO; +import com.youlai.boot.mini.model.dto.EditVisibilityDTO; import com.youlai.boot.mini.model.entity.MiniStrayAnimal; import com.youlai.boot.mini.model.form.StrayAnimalForm; import jakarta.validation.Valid; @@ -18,4 +21,9 @@ public interface StrayAnimalService extends IService { void deleteMediaSource(DeleteStrayAnimalNoteMediaDTO deleteStrayAnimalNoteMediaDTO); void saveMediaSource(String noteUuid, List images, List videos); + + void updateVisibility(String animalUuid, EditVisibilityDTO editVisibilityDTO); + + void delete(DeleteStrayAnimalDTO deleteStrayAnimalDTO); } + diff --git a/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java b/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java index 1682c8b..6fc83b1 100644 --- a/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java +++ b/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java @@ -12,14 +12,15 @@ import com.youlai.boot.common.util.CoordinateTransformUtils; import com.youlai.boot.common.util.FileUtils; import com.youlai.boot.common.util.JavaVCUtils; import com.youlai.boot.common.util.RandomNumberUtils; -import com.youlai.boot.file.service.FileService; import com.youlai.boot.file.service.impl.AliyunFileService; import com.youlai.boot.framework.security.util.SecurityUtils; import com.youlai.boot.mini.converter.MiniStrayAnimalConverter; import com.youlai.boot.mini.mapper.MiniStrayAnimalMapper; import com.youlai.boot.mini.mapper.MiniStrayAnimalNoteMapper; import com.youlai.boot.mini.mapper.MiniStrayAnimalNoteMediaMapper; +import com.youlai.boot.mini.model.dto.DeleteStrayAnimalDTO; import com.youlai.boot.mini.model.dto.DeleteStrayAnimalNoteMediaDTO; +import com.youlai.boot.mini.model.dto.EditVisibilityDTO; import com.youlai.boot.mini.model.enums.AnimalNoteMediaTypeEnum; import com.youlai.boot.mini.model.entity.MiniStrayAnimal; import com.youlai.boot.mini.model.entity.MiniStrayAnimalNote; @@ -40,7 +41,6 @@ import org.springframework.web.multipart.MultipartFile; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; -import java.text.MessageFormat; import java.util.*; /** @@ -233,27 +233,39 @@ public class StrayAnimalServiceImpl extends ServiceImpl() .eq(MiniStrayAnimal::getUuid, animalUuid) .eq(MiniStrayAnimal::getDeleted, 0) ); + if (animal == null) { throw new MsgException("动物不存在"); } + return animal; + } + + private void checkNotAuditing(MiniStrayAnimal animal) { if (1 == animal.getAuditStatus()) { throw new MsgException("审核中无法更改"); } - - long currentTimestamp = System.currentTimeMillis(); - - // 1. 更新流浪动物基本信息 - updateAnimalInfo(animal.getId(), formData, currentTimestamp); - // 3. 更新笔记信息` - updateNoteInfo(animal.getId(), formData, currentTimestamp); - // 4. 提交审核 - } private void updateNoteInfo(Long animalId, StrayAnimalForm formData, long currentTimestamp) { @@ -330,20 +342,28 @@ public class StrayAnimalServiceImpl extends ServiceImpl images, List videos) { - if ((images == null || images.isEmpty()) && (videos == null || videos.isEmpty())) { - throw new MsgException("需要上传媒体资源"); - } + private MiniStrayAnimalNote getValidNote(String noteUuid) { MiniStrayAnimalNote note = miniStrayAnimalNoteMapper.selectOne( new LambdaQueryWrapper() .eq(MiniStrayAnimalNote::getUuid, noteUuid) .eq(MiniStrayAnimalNote::getDeleted, 0) ); + if (note == null) { throw new MsgException("笔记不存在"); } + return note; + } + + @Override + public void saveMediaSource(String noteUuid, List images, List videos) { + if ((images == null || images.isEmpty()) && (videos == null || videos.isEmpty())) { + throw new MsgException("需要上传媒体资源"); + } + // 获取笔记 + MiniStrayAnimalNote note = getValidNote(noteUuid); + Long animalId = note.getStrayAnimalId(); MiniStrayAnimal miniStrayAnimal = miniStrayAnimalMapper.selectById(animalId); if (miniStrayAnimal == null) { @@ -376,4 +396,30 @@ public class StrayAnimalServiceImpl extends ServiceImpl() + .eq(MiniStrayAnimalNote::getStrayAnimalId, animal.getId()) + .eq(MiniStrayAnimalNote::getDeleted, 0)); + if (null != miniStrayAnimalNote) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(MiniStrayAnimalNote::getId, miniStrayAnimalNote.getId()) + .set(MiniStrayAnimalNote::getVisibility, editVisibilityDTO.getVisibility()); + + miniStrayAnimalNoteMapper.update(null, updateWrapper); + } + } + + @Override + public void delete(DeleteStrayAnimalDTO deleteStrayAnimalDTO) { + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.in(MiniStrayAnimal::getUuid, deleteStrayAnimalDTO.getAnimalUuidList()) + .set(MiniStrayAnimal::getDeleted, 1); + + miniStrayAnimalMapper.update(null, updateWrapper); + } + }