Browse Source

增加领养申请模块

glx_phase2
glx 19 hours ago
parent
commit
b8b6015f56
  1. 47
      src/main/java/com/youlai/boot/admin/controller/AdoptionApplicationManageController.java
  2. 1
      src/main/java/com/youlai/boot/codegen/freemarker/MyBatisPlusGenerator.java
  3. 3
      src/main/java/com/youlai/boot/common/enums/LogModuleEnum.java
  4. 51
      src/main/java/com/youlai/boot/mini/controller/AdoptionApplicationController.java
  5. 4
      src/main/java/com/youlai/boot/mini/controller/AdoptionDiaryController.java
  6. 10
      src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java
  7. 16
      src/main/java/com/youlai/boot/mini/mapper/MiniAdoptionApplicationMapper.java
  8. 4
      src/main/java/com/youlai/boot/mini/mapper/MiniStrayAnimalMapper.java
  9. 95
      src/main/java/com/youlai/boot/mini/model/entity/MiniAdoptionApplication.java
  10. 22
      src/main/java/com/youlai/boot/mini/model/form/AdoptionApplicationAuditForm.java
  11. 17
      src/main/java/com/youlai/boot/mini/model/form/AdoptionApplicationForm.java
  12. 20
      src/main/java/com/youlai/boot/mini/model/query/AdoptionApplicationQuery.java
  13. 24
      src/main/java/com/youlai/boot/mini/model/vo/AdoptedAnimalVO.java
  14. 50
      src/main/java/com/youlai/boot/mini/model/vo/AdoptionApplicationVO.java
  15. 22
      src/main/java/com/youlai/boot/mini/service/AdoptionApplicationService.java
  16. 3
      src/main/java/com/youlai/boot/mini/service/StrayAnimalService.java
  17. 160
      src/main/java/com/youlai/boot/mini/service/impl/AdoptionApplicationServiceImpl.java
  18. 6
      src/main/java/com/youlai/boot/mini/service/impl/AdoptionDiaryServiceImpl.java
  19. 25
      src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java
  20. 59
      src/main/resources/mapper/mini/MiniAdoptionApplicationMapper.xml
  21. 27
      src/main/resources/mapper/mini/MiniStrayAnimalMapper.xml

47
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<AdoptionApplicationVO> list(AdoptionApplicationQuery query) {
return PageResult.success(adoptionApplicationService.getAllApplications(query));
}
@Operation(summary = "获取领养申请详情")
@GetMapping("/detail/{applicationUuid}")
@Log(module = LogModuleEnum.ADOPTION_APPLICATION, value = ActionTypeEnum.LIST)
public Result<AdoptionApplicationVO> 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();
}
}

1
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")

3
src/main/java/com/youlai/boot/common/enums/LogModuleEnum.java

@ -37,7 +37,8 @@ public enum LogModuleEnum implements IBaseEnum<Integer> {
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;

51
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<AdoptionApplicationVO> getMyApplications(AdoptionApplicationQuery query) {
return PageResult.success(adoptionApplicationService.getMyApplications(query));
}
@Operation(summary = "获取领养申请详情")
@GetMapping("/detail/{applicationUuid}")
public Result<AdoptionApplicationVO> getApplicationDetail(@PathVariable String applicationUuid) {
return Result.success(adoptionApplicationService.getApplicationDetail(applicationUuid));
}
}

4
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) 接口查询更多信息;
}

10
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<AdoptedAnimalVO> 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)

16
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<MiniAdoptionApplication> {
IPage<AdoptionApplicationVO> getApplicationPage(Page<AdoptionApplicationVO> page, @Param("query") AdoptionApplicationQuery query);
AdoptionApplicationVO getApplicationDetail(@Param("applicationUuid") String applicationUuid);
}

4
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<MiniStrayAnimal> {
Long selectIdByUuid(@Param("strayAnimalUuId") String strayAnimalUuId);
IPage<AdoptedAnimalVO> getMyAdoptedPage(Page<AdoptedAnimalVO> page, @Param("userId") Long userId);
}

95
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;
}

22
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;
}

17
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;
}

20
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;
}

24
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;
}

50
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;
}

22
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<MiniAdoptionApplication> {
String submitApplication(String strayAnimalUuId, String reason, MultipartFile photo);
IPage<AdoptionApplicationVO> getMyApplications(AdoptionApplicationQuery query);
IPage<AdoptionApplicationVO> getAllApplications(AdoptionApplicationQuery query);
AdoptionApplicationVO getApplicationDetail(String applicationUuid);
void auditApplication(AdoptionApplicationAuditForm form);
}

3
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<MiniStrayAnimal> {
void resetCurrentUserBloom(Long userId);
void increaseNoteViewCount(String noteUuid);
IPage<AdoptedAnimalVO> getMyAdoptedPage(Integer pageNum, Integer pageSize);
}

160
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<MiniAdoptionApplicationMapper, MiniAdoptionApplication> 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<AdoptionApplicationVO> getMyApplications(AdoptionApplicationQuery query) {
Long userId = SecurityUtils.getUserId();
query.setMiniUserId(userId);
Page<AdoptionApplicationVO> page = new Page<>(query.getPageNum(), query.getPageSize());
return baseMapper.getApplicationPage(page, query);
}
@Override
public IPage<AdoptionApplicationVO> getAllApplications(AdoptionApplicationQuery query) {
Page<AdoptionApplicationVO> 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);
}
}
}
}

6
src/main/java/com/youlai/boot/mini/service/impl/AdoptionDiaryServiceImpl.java

@ -183,6 +183,12 @@ public class AdoptionDiaryServiceImpl extends ServiceImpl<MiniAdoptionDiaryMappe
long currentTimestamp = System.currentTimeMillis();
Long userId = SecurityUtils.getUserId();
// 校验该动物是否由当前用户领养
MiniStrayAnimal animal = miniStrayAnimalMapper.selectById(animalId);
if (animal == null || !userId.equals(animal.getAdoptedBy())) {
throw new MsgException("您不是该动物的领养人,无法发布领养日记");
}
// 1. 保存领养日记基本信息
MiniAdoptionDiary diary = new MiniAdoptionDiary();
diary.setUuid(UUID.randomUUID().toString());

25
src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java

@ -1018,6 +1018,31 @@ public class StrayAnimalServiceImpl extends ServiceImpl<MiniStrayAnimalMapper, M
}
}
@Override
public IPage<AdoptedAnimalVO> getMyAdoptedPage(Integer pageNum, Integer pageSize) {
Long userId = SecurityUtils.getUserId();
Page<AdoptedAnimalVO> page = new Page<>(pageNum, pageSize);
IPage<AdoptedAnimalVO> 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 {

59
src/main/resources/mapper/mini/MiniAdoptionApplicationMapper.xml

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.youlai.boot.mini.mapper.MiniAdoptionApplicationMapper">
<select id="getApplicationPage" resultType="com.youlai.boot.mini.model.vo.AdoptionApplicationVO" databaseId="mysql">
SELECT
app.uuid AS applicationUuid,
sa.uuid AS animalUuid,
sa.animal_type AS animalType,
app.photo_url AS photoUrl,
app.reason,
app.status,
app.audit_remark AS auditRemark,
app.audit_time AS auditTime,
app.create_time AS createTime,
u.uuid AS applicantUuid,
u.nickname AS applicantName,
u.avatar AS applicantAvatar
FROM mini_adoption_application app
INNER JOIN sys_user u ON app.mini_user_id = u.id AND u.is_deleted = 0
LEFT JOIN mini_stray_animal sa ON app.stray_animal_id = sa.id
WHERE app.is_deleted = 0
<if test="query.status != null and query.status != ''">
AND app.status = #{query.status}
</if>
<if test="query.animalType != null and query.animalType != ''">
AND sa.animal_type = #{query.animalType}
</if>
<if test="query.miniUserId != null">
AND app.mini_user_id = #{query.miniUserId}
</if>
ORDER BY app.create_time DESC
</select>
<select id="getApplicationDetail" resultType="com.youlai.boot.mini.model.vo.AdoptionApplicationVO">
SELECT
app.uuid AS applicationUuid,
sa.uuid AS animalUuid,
sa.animal_type AS animalType,
app.photo_url AS photoUrl,
app.reason,
app.status,
app.audit_remark AS auditRemark,
app.audit_time AS auditTime,
app.create_time AS createTime,
u.uuid AS applicantUuid,
u.nickname AS applicantName,
u.avatar AS applicantAvatar
FROM mini_adoption_application app
INNER JOIN sys_user u ON app.mini_user_id = u.id AND u.is_deleted = 0
LEFT JOIN mini_stray_animal sa ON app.stray_animal_id = sa.id
WHERE app.uuid = #{applicationUuid}
AND app.is_deleted = 0
</select>
</mapper>

27
src/main/resources/mapper/mini/MiniStrayAnimalMapper.xml

@ -362,4 +362,31 @@
AND is_deleted = 0
</select>
<select id="getMyAdoptedPage" resultType="com.youlai.boot.mini.model.vo.AdoptedAnimalVO" databaseId="mysql">
WITH first_image AS (
SELECT
m.note_id,
m.source_url,
ROW_NUMBER() OVER (
PARTITION BY m.note_id
ORDER BY m.id ASC
) AS rn
FROM mini_stray_animal_note_media m
WHERE m.media_type = 'image'
AND m.is_deleted = 0
)
SELECT
sa.uuid AS animalUuid,
sa.animal_type AS animalType,
sa.adopted_at AS adoptedAt,
sa.status,
fi.source_url AS firstImageUrl
FROM mini_stray_animal sa
LEFT JOIN mini_stray_animal_note n ON n.stray_animal_id = sa.id AND n.is_deleted = 0
LEFT JOIN first_image fi ON fi.note_id = n.id AND fi.rn = 1
WHERE sa.adopted_by = #{userId}
AND sa.is_deleted = 0
ORDER BY sa.adopted_at DESC
</select>
</mapper>

Loading…
Cancel
Save