From b8b6015f56cfc52f9f823df935f3ae7f06198548 Mon Sep 17 00:00:00 2001 From: glx <783262171@qq.com> Date: Fri, 29 May 2026 17:23:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=A2=86=E5=85=BB=E7=94=B3?= =?UTF-8?q?=E8=AF=B7=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AdoptionApplicationManageController.java | 47 +++++ .../freemarker/MyBatisPlusGenerator.java | 1 + .../boot/common/enums/LogModuleEnum.java | 3 +- .../AdoptionApplicationController.java | 51 ++++++ .../controller/AdoptionDiaryController.java | 4 + .../controller/StrayAnimalController.java | 10 ++ .../mapper/MiniAdoptionApplicationMapper.java | 16 ++ .../mini/mapper/MiniStrayAnimalMapper.java | 4 +- .../model/entity/MiniAdoptionApplication.java | 95 +++++++++++ .../form/AdoptionApplicationAuditForm.java | 22 +++ .../model/form/AdoptionApplicationForm.java | 17 ++ .../model/query/AdoptionApplicationQuery.java | 20 +++ .../boot/mini/model/vo/AdoptedAnimalVO.java | 24 +++ .../mini/model/vo/AdoptionApplicationVO.java | 50 ++++++ .../service/AdoptionApplicationService.java | 22 +++ .../boot/mini/service/StrayAnimalService.java | 3 + .../impl/AdoptionApplicationServiceImpl.java | 160 ++++++++++++++++++ .../impl/AdoptionDiaryServiceImpl.java | 6 + .../service/impl/StrayAnimalServiceImpl.java | 25 +++ .../mini/MiniAdoptionApplicationMapper.xml | 59 +++++++ .../mapper/mini/MiniStrayAnimalMapper.xml | 27 +++ 21 files changed, 664 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/youlai/boot/admin/controller/AdoptionApplicationManageController.java create mode 100644 src/main/java/com/youlai/boot/mini/controller/AdoptionApplicationController.java create mode 100644 src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionApplicationMapper.java create mode 100644 src/main/java/com/youlai/boot/mini/model/entity/MiniAdoptionApplication.java create mode 100644 src/main/java/com/youlai/boot/mini/model/form/AdoptionApplicationAuditForm.java create mode 100644 src/main/java/com/youlai/boot/mini/model/form/AdoptionApplicationForm.java create mode 100644 src/main/java/com/youlai/boot/mini/model/query/AdoptionApplicationQuery.java create mode 100644 src/main/java/com/youlai/boot/mini/model/vo/AdoptedAnimalVO.java create mode 100644 src/main/java/com/youlai/boot/mini/model/vo/AdoptionApplicationVO.java create mode 100644 src/main/java/com/youlai/boot/mini/service/AdoptionApplicationService.java create mode 100644 src/main/java/com/youlai/boot/mini/service/impl/AdoptionApplicationServiceImpl.java create mode 100644 src/main/resources/mapper/mini/MiniAdoptionApplicationMapper.xml diff --git a/src/main/java/com/youlai/boot/admin/controller/AdoptionApplicationManageController.java b/src/main/java/com/youlai/boot/admin/controller/AdoptionApplicationManageController.java new file mode 100644 index 0000000..38fc2cf --- /dev/null +++ b/src/main/java/com/youlai/boot/admin/controller/AdoptionApplicationManageController.java @@ -0,0 +1,47 @@ +package com.youlai.boot.admin.controller; + +import com.youlai.boot.common.annotation.Log; +import com.youlai.boot.common.enums.ActionTypeEnum; +import com.youlai.boot.common.enums.LogModuleEnum; +import com.youlai.boot.common.result.PageResult; +import com.youlai.boot.common.result.Result; +import com.youlai.boot.mini.model.form.AdoptionApplicationAuditForm; +import com.youlai.boot.mini.model.query.AdoptionApplicationQuery; +import com.youlai.boot.mini.model.vo.AdoptionApplicationVO; +import com.youlai.boot.mini.service.AdoptionApplicationService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +@Tag(name = "管理端领养申请相关接口") +@RestController +@RequestMapping("/api/v1/admin/adoptionApplication") +@RequiredArgsConstructor +public class AdoptionApplicationManageController { + + private final AdoptionApplicationService adoptionApplicationService; + + @Operation(summary = "分页查询领养申请列表") + @GetMapping("/list") + @Log(module = LogModuleEnum.ADOPTION_APPLICATION, value = ActionTypeEnum.LIST) + public PageResult list(AdoptionApplicationQuery query) { + return PageResult.success(adoptionApplicationService.getAllApplications(query)); + } + + @Operation(summary = "获取领养申请详情") + @GetMapping("/detail/{applicationUuid}") + @Log(module = LogModuleEnum.ADOPTION_APPLICATION, value = ActionTypeEnum.LIST) + public Result getApplicationDetail(@PathVariable String applicationUuid) { + return Result.success(adoptionApplicationService.getApplicationDetail(applicationUuid)); + } + + @Operation(summary = "审核领养申请") + @PostMapping("/audit") + @Log(module = LogModuleEnum.ADOPTION_APPLICATION, value = ActionTypeEnum.UPDATE) + public Result auditApplication(@Valid @RequestBody AdoptionApplicationAuditForm form) { + adoptionApplicationService.auditApplication(form); + return Result.success(); + } +} diff --git a/src/main/java/com/youlai/boot/codegen/freemarker/MyBatisPlusGenerator.java b/src/main/java/com/youlai/boot/codegen/freemarker/MyBatisPlusGenerator.java index f198d39..045c6fb 100644 --- a/src/main/java/com/youlai/boot/codegen/freemarker/MyBatisPlusGenerator.java +++ b/src/main/java/com/youlai/boot/codegen/freemarker/MyBatisPlusGenerator.java @@ -119,6 +119,7 @@ public class MyBatisPlusGenerator { ,new TableConfig("mini_user_post_view", IdType.AUTO, "mini") ,new TableConfig("mini_user_post_comment", IdType.AUTO, "mini") ,new TableConfig("mini_user_post_comment_like", IdType.AUTO, "mini") + ,new TableConfig("mini_adoption_application", IdType.AUTO, "mini") // ,new TableConfig("mini_stray_animal", IdType.AUTO, "mini") // ,new TableConfig("mini_stray_animal", IdType.INPUT, "minitest") diff --git a/src/main/java/com/youlai/boot/common/enums/LogModuleEnum.java b/src/main/java/com/youlai/boot/common/enums/LogModuleEnum.java index b8274a6..1ed2f3d 100644 --- a/src/main/java/com/youlai/boot/common/enums/LogModuleEnum.java +++ b/src/main/java/com/youlai/boot/common/enums/LogModuleEnum.java @@ -37,7 +37,8 @@ public enum LogModuleEnum implements IBaseEnum { ADOPTION_DIARY_COMMENT(111, "领养日记评论"), ADOPTION_DIARY_INFO(112, "领养日记信息"), USER_POST_INFO(113, "用户作品信息"), - USER_POST_COMMENT(114, "用户作品评论"); + USER_POST_COMMENT(114, "用户作品评论"), + ADOPTION_APPLICATION(115, "领养申请"); @EnumValue private final Integer value; diff --git a/src/main/java/com/youlai/boot/mini/controller/AdoptionApplicationController.java b/src/main/java/com/youlai/boot/mini/controller/AdoptionApplicationController.java new file mode 100644 index 0000000..15e317f --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/controller/AdoptionApplicationController.java @@ -0,0 +1,51 @@ +package com.youlai.boot.mini.controller; + +import com.youlai.boot.common.annotation.Log; +import com.youlai.boot.common.annotation.RepeatSubmit; +import com.youlai.boot.common.enums.ActionTypeEnum; +import com.youlai.boot.common.enums.LogModuleEnum; +import com.youlai.boot.common.result.PageResult; +import com.youlai.boot.common.result.Result; +import com.youlai.boot.mini.model.query.AdoptionApplicationQuery; +import com.youlai.boot.mini.model.vo.AdoptionApplicationVO; +import com.youlai.boot.mini.service.AdoptionApplicationService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +@Tag(name = "领养申请相关接口") +@RestController +@RequestMapping("/api/v1/mini/adoptionApplication") +@RequiredArgsConstructor +public class AdoptionApplicationController { + + private final AdoptionApplicationService adoptionApplicationService; + + @Operation(summary = "提交领养申请") + @PostMapping(value = "/submit", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @RepeatSubmit + @Log(module = LogModuleEnum.ADOPTION_APPLICATION, value = ActionTypeEnum.INSERT) + public Result submitApplication( + @RequestParam("strayAnimalUuId") String strayAnimalUuId, + @RequestParam(value = "reason", required = false) String reason, + @RequestPart("photo") MultipartFile photo + ) { + String applicationUuid = adoptionApplicationService.submitApplication(strayAnimalUuId, reason, photo); + return Result.success(applicationUuid); + } + + @Operation(summary = "获取我的领养申请列表") + @GetMapping("/myApplications") + public PageResult getMyApplications(AdoptionApplicationQuery query) { + return PageResult.success(adoptionApplicationService.getMyApplications(query)); + } + + @Operation(summary = "获取领养申请详情") + @GetMapping("/detail/{applicationUuid}") + public Result getApplicationDetail(@PathVariable String applicationUuid) { + return Result.success(adoptionApplicationService.getApplicationDetail(applicationUuid)); + } +} diff --git a/src/main/java/com/youlai/boot/mini/controller/AdoptionDiaryController.java b/src/main/java/com/youlai/boot/mini/controller/AdoptionDiaryController.java index a258ce7..de1b6a6 100644 --- a/src/main/java/com/youlai/boot/mini/controller/AdoptionDiaryController.java +++ b/src/main/java/com/youlai/boot/mini/controller/AdoptionDiaryController.java @@ -194,5 +194,9 @@ public class AdoptionDiaryController { return Result.success(); } + //TODO 领养申请 + + //TODO 查询已领养的动物列表 ;这边里的接口需要查询多少字段数据,是查询所有,还是简单几个字段,然后可以根据动物uuid 用已有的 @Operation(summary = "获取动物信息详情") + // @RequestMapping(value = "/getDetails/{animalUuid}", method = RequestMethod.GET) 接口查询更多信息; } 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 e6eb7fc..3d7a3b7 100644 --- a/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java +++ b/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java @@ -15,6 +15,7 @@ import com.youlai.boot.mini.model.form.NoteLikeForm; import com.youlai.boot.mini.model.form.StrayAnimalForm; import com.youlai.boot.mini.model.query.OwnStrayAnimalQuery; import com.youlai.boot.mini.model.query.WaterfallQuery; +import com.youlai.boot.mini.model.vo.AdoptedAnimalVO; import com.youlai.boot.mini.model.vo.WaterfallResult; import com.youlai.boot.mini.model.vo.SaveStrayAnimalVO; import com.youlai.boot.mini.model.vo.StrayAnimalDetailsVO; @@ -196,6 +197,15 @@ public class StrayAnimalController { return Result.success("重置成功"); } + @Operation(summary = "查询当前用户已领养的动物列表") + @GetMapping("/getMyAdoptedPage") + public PageResult getMyAdoptedPage( + @RequestParam(defaultValue = "1") Integer pageNum, + @RequestParam(defaultValue = "10") Integer pageSize + ) { + return PageResult.success(strayAnimalService.getMyAdoptedPage(pageNum, pageSize)); + } + @Operation(summary = "增加动物笔记浏览量") @PostMapping(value = "/note/increase-view") @Log(module = LogModuleEnum.STRAY_ANIMAL_INFO, value = ActionTypeEnum.UPDATE) diff --git a/src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionApplicationMapper.java b/src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionApplicationMapper.java new file mode 100644 index 0000000..5945548 --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionApplicationMapper.java @@ -0,0 +1,16 @@ +package com.youlai.boot.mini.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.youlai.boot.mini.model.entity.MiniAdoptionApplication; +import com.youlai.boot.mini.model.query.AdoptionApplicationQuery; +import com.youlai.boot.mini.model.vo.AdoptionApplicationVO; +import org.apache.ibatis.annotations.Param; + +public interface MiniAdoptionApplicationMapper extends BaseMapper { + + IPage getApplicationPage(Page page, @Param("query") AdoptionApplicationQuery query); + + AdoptionApplicationVO getApplicationDetail(@Param("applicationUuid") String applicationUuid); +} 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 4df2da3..76dc804 100644 --- a/src/main/java/com/youlai/boot/mini/mapper/MiniStrayAnimalMapper.java +++ b/src/main/java/com/youlai/boot/mini/mapper/MiniStrayAnimalMapper.java @@ -8,8 +8,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.youlai.boot.mini.model.query.OwnStrayAnimalQuery; import com.youlai.boot.mini.model.vo.StrayAnimalDetailsVO; import com.youlai.boot.mini.model.vo.StrayAnimalNearbyVO; +import com.youlai.boot.mini.model.vo.AdoptedAnimalVO; import com.youlai.boot.mini.model.vo.StrayAnimalShortVO; -import jakarta.validation.constraints.NotNull; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -36,4 +36,6 @@ public interface MiniStrayAnimalMapper extends BaseMapper { Long selectIdByUuid(@Param("strayAnimalUuId") String strayAnimalUuId); + IPage getMyAdoptedPage(Page page, @Param("userId") Long userId); + } diff --git a/src/main/java/com/youlai/boot/mini/model/entity/MiniAdoptionApplication.java b/src/main/java/com/youlai/boot/mini/model/entity/MiniAdoptionApplication.java new file mode 100644 index 0000000..3463e40 --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/entity/MiniAdoptionApplication.java @@ -0,0 +1,95 @@ +package com.youlai.boot.mini.model.entity; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +@Getter +@Setter +@ToString +@Accessors(chain = true) +@TableName("mini_adoption_application") +@Schema(description = "领养申请表") +public class MiniAdoptionApplication implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + @Schema(description = "主键ID") + private Long id; + + + @TableField("uuid") + @Schema(description = "UUID唯一标识,前后端数据交互使用") + private String uuid; + + @TableField("stray_animal_id") + @Schema(description = "关联的流浪动物ID") + private Long strayAnimalId; + + @TableField("mini_user_id") + @Schema(description = "申请人用户ID") + private Long miniUserId; + + @TableField("photo_url") + @Schema(description = "申请时拍摄的照片URL") + private String photoUrl; + + @TableField("reason") + @Schema(description = "申请理由/领养说明") + private String reason; + + @TableField("status") + @Schema(description = "审核状态:pending-待审核,approved-已通过,rejected-已拒绝") + private String status; + + @TableField("audit_user_id") + @Schema(description = "审核人ID(管理员)") + private Long auditUserId; + + @TableField("audit_remark") + @Schema(description = "审核备注") + private String auditRemark; + + @TableField("audit_time") + @Schema(description = "审核时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date auditTime; + + @TableField("create_time") + @Schema(description = "创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @TableField("create_timestamp") + @Schema(description = "创建时间毫秒级时间戳") + private Long createTimestamp; + + @TableField("create_by") + @Schema(description = "创建人ID") + private Long createBy; + + @TableField("update_time") + @Schema(description = "更新时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date updateTime; + + @TableField("update_timestamp") + @Schema(description = "更新时间毫秒级时间戳") + private Long updateTimestamp; + + @TableField("update_by") + @Schema(description = "修改人ID") + private Long updateBy; + + @TableField("is_deleted") + @Schema(description = "逻辑删除标识(0-未删除 1-已删除)") + private Boolean deleted; + + +} diff --git a/src/main/java/com/youlai/boot/mini/model/form/AdoptionApplicationAuditForm.java b/src/main/java/com/youlai/boot/mini/model/form/AdoptionApplicationAuditForm.java new file mode 100644 index 0000000..7c876df --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/form/AdoptionApplicationAuditForm.java @@ -0,0 +1,22 @@ +package com.youlai.boot.mini.model.form; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +@Schema(description = "领养申请审核表单") +public class AdoptionApplicationAuditForm { + + @NotNull(message = "申请UUID不能为空") + @Schema(description = "申请UUID", requiredMode = Schema.RequiredMode.REQUIRED) + private String applicationUuid; + + @NotBlank(message = "审核状态不能为空") + @Schema(description = "审核状态:approved-通过,rejected-拒绝", requiredMode = Schema.RequiredMode.REQUIRED) + private String status; + + @Schema(description = "审核备注") + private String remark; +} diff --git a/src/main/java/com/youlai/boot/mini/model/form/AdoptionApplicationForm.java b/src/main/java/com/youlai/boot/mini/model/form/AdoptionApplicationForm.java new file mode 100644 index 0000000..90a422e --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/form/AdoptionApplicationForm.java @@ -0,0 +1,17 @@ +package com.youlai.boot.mini.model.form; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +@Schema(description = "领养申请表单") +public class AdoptionApplicationForm { + + @NotNull(message = "关联的动物ID不能为空") + @Schema(description = "流浪动物UUID", requiredMode = Schema.RequiredMode.REQUIRED) + private String strayAnimalUuId; + + @Schema(description = "申请理由") + private String reason; +} diff --git a/src/main/java/com/youlai/boot/mini/model/query/AdoptionApplicationQuery.java b/src/main/java/com/youlai/boot/mini/model/query/AdoptionApplicationQuery.java new file mode 100644 index 0000000..cd58136 --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/query/AdoptionApplicationQuery.java @@ -0,0 +1,20 @@ +package com.youlai.boot.mini.model.query; + +import com.youlai.boot.common.base.BaseQuery; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class AdoptionApplicationQuery extends BaseQuery { + + @Schema(description = "审核状态:pending-待审核,approved-已通过,rejected-已拒绝") + private String status; + + @Schema(description = "动物类型") + private String animalType; + + @Schema(description = "申请人用户ID", hidden = true) + private Long miniUserId; +} diff --git a/src/main/java/com/youlai/boot/mini/model/vo/AdoptedAnimalVO.java b/src/main/java/com/youlai/boot/mini/model/vo/AdoptedAnimalVO.java new file mode 100644 index 0000000..d2f28a7 --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/vo/AdoptedAnimalVO.java @@ -0,0 +1,24 @@ +package com.youlai.boot.mini.model.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +@Schema(description = "已领养动物列表VO") +public class AdoptedAnimalVO { + + @Schema(description = "动物UUID") + private String animalUuid; + + @Schema(description = "动物类型:cat-猫,dog-狗,other-其他") + private String animalType; + + @Schema(description = "封面图片URL") + private String firstImageUrl; + + @Schema(description = "领养时间(毫秒级时间戳)") + private Long adoptedAt; + + @Schema(description = "状态") + private String status; +} diff --git a/src/main/java/com/youlai/boot/mini/model/vo/AdoptionApplicationVO.java b/src/main/java/com/youlai/boot/mini/model/vo/AdoptionApplicationVO.java new file mode 100644 index 0000000..61d6d04 --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/vo/AdoptionApplicationVO.java @@ -0,0 +1,50 @@ +package com.youlai.boot.mini.model.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.Date; + +@Data +@Schema(description = "领养申请VO") +public class AdoptionApplicationVO { + + @Schema(description = "申请UUID") + private String applicationUuid; + + @Schema(description = "动物UUID") + private String animalUuid; + + @Schema(description = "动物类型") + private String animalType; + + @Schema(description = "申请照片URL") + private String photoUrl; + + @Schema(description = "申请理由") + private String reason; + + @Schema(description = "审核状态") + private String status; + + @Schema(description = "审核备注") + private String auditRemark; + + @Schema(description = "审核时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date auditTime; + + @Schema(description = "申请人UUID") + private String applicantUuid; + + @Schema(description = "申请人昵称") + private String applicantName; + + @Schema(description = "申请人头像") + private String applicantAvatar; + + @Schema(description = "创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; +} diff --git a/src/main/java/com/youlai/boot/mini/service/AdoptionApplicationService.java b/src/main/java/com/youlai/boot/mini/service/AdoptionApplicationService.java new file mode 100644 index 0000000..5fe551d --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/service/AdoptionApplicationService.java @@ -0,0 +1,22 @@ +package com.youlai.boot.mini.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.youlai.boot.mini.model.entity.MiniAdoptionApplication; +import com.youlai.boot.mini.model.form.AdoptionApplicationAuditForm; +import com.youlai.boot.mini.model.query.AdoptionApplicationQuery; +import com.youlai.boot.mini.model.vo.AdoptionApplicationVO; +import org.springframework.web.multipart.MultipartFile; + +public interface AdoptionApplicationService extends IService { + + String submitApplication(String strayAnimalUuId, String reason, MultipartFile photo); + + IPage getMyApplications(AdoptionApplicationQuery query); + + IPage getAllApplications(AdoptionApplicationQuery query); + + AdoptionApplicationVO getApplicationDetail(String applicationUuid); + + void auditApplication(AdoptionApplicationAuditForm form); +} 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 1fa10b1..79d88dd 100644 --- a/src/main/java/com/youlai/boot/mini/service/StrayAnimalService.java +++ b/src/main/java/com/youlai/boot/mini/service/StrayAnimalService.java @@ -13,6 +13,7 @@ import com.youlai.boot.mini.model.form.NoteCollectForm; import com.youlai.boot.mini.model.form.StrayAnimalForm; import com.youlai.boot.mini.model.query.OwnStrayAnimalQuery; import com.youlai.boot.mini.model.query.WaterfallQuery; +import com.youlai.boot.mini.model.vo.AdoptedAnimalVO; import com.youlai.boot.mini.model.vo.WaterfallResult; import com.youlai.boot.mini.model.vo.SaveStrayAnimalVO; import com.youlai.boot.mini.model.vo.StrayAnimalDetailsVO; @@ -61,5 +62,7 @@ public interface StrayAnimalService extends IService { void resetCurrentUserBloom(Long userId); void increaseNoteViewCount(String noteUuid); + + IPage getMyAdoptedPage(Integer pageNum, Integer pageSize); } diff --git a/src/main/java/com/youlai/boot/mini/service/impl/AdoptionApplicationServiceImpl.java b/src/main/java/com/youlai/boot/mini/service/impl/AdoptionApplicationServiceImpl.java new file mode 100644 index 0000000..7339916 --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/service/impl/AdoptionApplicationServiceImpl.java @@ -0,0 +1,160 @@ +package com.youlai.boot.mini.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.youlai.boot.common.exception.MsgException; +import com.youlai.boot.common.util.RandomNumberUtils; +import com.youlai.boot.file.service.impl.AliyunFileService; +import com.youlai.boot.framework.security.util.SecurityUtils; +import com.youlai.boot.mini.mapper.MiniAdoptionApplicationMapper; +import com.youlai.boot.mini.mapper.MiniStrayAnimalMapper; +import com.youlai.boot.mini.model.entity.MiniAdoptionApplication; +import com.youlai.boot.mini.model.entity.MiniStrayAnimal; +import com.youlai.boot.mini.model.form.AdoptionApplicationAuditForm; +import com.youlai.boot.mini.model.query.AdoptionApplicationQuery; +import com.youlai.boot.mini.model.vo.AdoptionApplicationVO; +import com.youlai.boot.mini.service.AdoptionApplicationService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FilenameUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Date; +import java.util.UUID; + +@Slf4j +@Service +@RequiredArgsConstructor +public class AdoptionApplicationServiceImpl extends ServiceImpl implements AdoptionApplicationService { + + private static final String OSS_APPLICATION_DIR = "adoption_application/"; + + private final AliyunFileService aliyunFileService; + private final MiniStrayAnimalMapper miniStrayAnimalMapper; + + @Override + @Transactional(rollbackFor = Exception.class) + public String submitApplication(String strayAnimalUuId, String reason, MultipartFile photo) { + Long userId = SecurityUtils.getUserId(); + + Long animalId = miniStrayAnimalMapper.selectIdByUuid(strayAnimalUuId); + if (animalId == null) { + throw new MsgException("动物不存在"); + } + + MiniStrayAnimal animal = miniStrayAnimalMapper.selectById(animalId); + if (!"found".equals(animal.getStatus()) && !"reviewing".equals(animal.getStatus())) { + throw new MsgException("该动物当前不可领养"); + } + + // 防重复申请 + Long pendingCount = lambdaQuery() + .eq(MiniAdoptionApplication::getStrayAnimalId, animalId) + .eq(MiniAdoptionApplication::getMiniUserId, userId) + .eq(MiniAdoptionApplication::getStatus, "pending") + .eq(MiniAdoptionApplication::getDeleted, false) + .count(); + if (pendingCount > 0) { + throw new MsgException("您已提交过该动物的领养申请,请耐心等待审核"); + } + + long currentTimestamp = System.currentTimeMillis(); + + // 上传申请照片 + String photoUrl = null; + if (photo != null && !photo.isEmpty()) { + try { + String objectName = OSS_APPLICATION_DIR + + currentTimestamp + RandomNumberUtils.createRandomLowerLetterAndNumber(8) + + "." + FilenameUtils.getExtension(photo.getOriginalFilename()); + photoUrl = aliyunFileService.uploadFile(objectName, photo.getInputStream()); + } catch (Exception e) { + log.error("领养申请照片上传失败", e); + throw new MsgException("照片上传失败,请重试"); + } + } + + MiniAdoptionApplication application = new MiniAdoptionApplication(); + application.setUuid(UUID.randomUUID().toString()); + application.setStrayAnimalId(animalId); + application.setMiniUserId(userId); + application.setPhotoUrl(photoUrl); + application.setReason(reason); + application.setStatus("pending"); + application.setCreateTime(new Date(currentTimestamp)); + application.setCreateTimestamp(currentTimestamp); + application.setCreateBy(userId); + application.setDeleted(false); + save(application); + + return application.getUuid(); + } + + @Override + public IPage getMyApplications(AdoptionApplicationQuery query) { + Long userId = SecurityUtils.getUserId(); + query.setMiniUserId(userId); + Page page = new Page<>(query.getPageNum(), query.getPageSize()); + return baseMapper.getApplicationPage(page, query); + } + + @Override + public IPage getAllApplications(AdoptionApplicationQuery query) { + Page page = new Page<>(query.getPageNum(), query.getPageSize()); + return baseMapper.getApplicationPage(page, query); + } + + @Override + public AdoptionApplicationVO getApplicationDetail(String applicationUuid) { + AdoptionApplicationVO vo = baseMapper.getApplicationDetail(applicationUuid); + if (vo == null) { + throw new MsgException("申请不存在"); + } + return vo; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void auditApplication(AdoptionApplicationAuditForm form) { + MiniAdoptionApplication application = lambdaQuery() + .eq(MiniAdoptionApplication::getUuid, form.getApplicationUuid()) + .eq(MiniAdoptionApplication::getDeleted, false) + .one(); + if (application == null) { + throw new MsgException("申请不存在"); + } + if (!"pending".equals(application.getStatus())) { + throw new MsgException("该申请已审核,无法重复操作"); + } + + Long auditUserId = SecurityUtils.getUserId(); + Date now = new Date(); + + application.setStatus(form.getStatus()); + application.setAuditRemark(form.getRemark()); + application.setAuditUserId(auditUserId); + application.setAuditTime(now); + application.setUpdateBy(auditUserId); + application.setUpdateTime(now); + application.setUpdateTimestamp(System.currentTimeMillis()); + updateById(application); + + // 审核通过:更新动物领养状态 + if ("approved".equals(form.getStatus())) { + MiniStrayAnimal animal = miniStrayAnimalMapper.selectById(application.getStrayAnimalId()); + if (animal != null) { + animal.setAdoptedBy(application.getMiniUserId()); + animal.setStatus("adopted"); + animal.setAdoptedAt(System.currentTimeMillis()); + animal.setUpdateBy(auditUserId); + animal.setUpdateTime(now); + animal.setUpdateTimestamp(System.currentTimeMillis()); + miniStrayAnimalMapper.updateById(animal); + } + } + } +} diff --git a/src/main/java/com/youlai/boot/mini/service/impl/AdoptionDiaryServiceImpl.java b/src/main/java/com/youlai/boot/mini/service/impl/AdoptionDiaryServiceImpl.java index 3b026cc..694a841 100644 --- a/src/main/java/com/youlai/boot/mini/service/impl/AdoptionDiaryServiceImpl.java +++ b/src/main/java/com/youlai/boot/mini/service/impl/AdoptionDiaryServiceImpl.java @@ -183,6 +183,12 @@ public class AdoptionDiaryServiceImpl extends ServiceImpl getMyAdoptedPage(Integer pageNum, Integer pageSize) { + Long userId = SecurityUtils.getUserId(); + Page page = new Page<>(pageNum, pageSize); + IPage result = miniStrayAnimalMapper.getMyAdoptedPage(page, userId); + if (result.getTotal() > 0) { + result.getRecords().forEach(item -> { + if (StrUtil.isBlank(item.getFirstImageUrl())) { + switch (item.getAnimalType()) { + case "cat": + item.setFirstImageUrl(getDefaultCatCoverHost() + "/default_cat.png"); + break; + case "dog": + item.setFirstImageUrl(getDefaultCatCoverHost() + "/default_dog.png"); + break; + default: + item.setFirstImageUrl(getDefaultCatCoverHost() + "/default_other.png"); + break; + } + } + }); + } + return result; + } + @Override public void increaseNoteViewCount(String noteUuid) { try { diff --git a/src/main/resources/mapper/mini/MiniAdoptionApplicationMapper.xml b/src/main/resources/mapper/mini/MiniAdoptionApplicationMapper.xml new file mode 100644 index 0000000..55acf10 --- /dev/null +++ b/src/main/resources/mapper/mini/MiniAdoptionApplicationMapper.xml @@ -0,0 +1,59 @@ + + + + + + + + + + diff --git a/src/main/resources/mapper/mini/MiniStrayAnimalMapper.xml b/src/main/resources/mapper/mini/MiniStrayAnimalMapper.xml index d3ec534..a5390cb 100644 --- a/src/main/resources/mapper/mini/MiniStrayAnimalMapper.xml +++ b/src/main/resources/mapper/mini/MiniStrayAnimalMapper.xml @@ -362,4 +362,31 @@ AND is_deleted = 0 + +