From d678db8fe85e51b65403f3edae4bff18aa23ee15 Mon Sep 17 00:00:00 2001 From: cloudroam <cloudroam> Date: 星期二, 01 七月 2025 10:28:07 +0800 Subject: [PATCH] add:影视景点管理 --- src/main/java/com/mzl/flower/dto/request/film/FilmLocationDTO.java | 12 +++ src/main/java/com/mzl/flower/service/film/impl/FilmLocationServiceImpl.java | 59 ++++++++++++++++--- src/main/java/com/mzl/flower/mapper/film/FilmLocationMapper.java | 14 ++++ src/main/java/com/mzl/flower/mapper/film/FilmWorksMapper.java | 14 ++++ src/main/java/com/mzl/flower/dto/response/film/FilmLocationNameDTO.java | 9 +++ src/main/java/com/mzl/flower/mapper/film/FilmLocationWorkMapper.java | 20 ++++++ src/main/java/com/mzl/flower/web/film/FilmLocationController.java | 16 +++++ src/main/java/com/mzl/flower/service/film/FilmLocationService.java | 7 ++ 8 files changed, 140 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/mzl/flower/dto/request/film/FilmLocationDTO.java b/src/main/java/com/mzl/flower/dto/request/film/FilmLocationDTO.java index b5240d9..7f567d7 100644 --- a/src/main/java/com/mzl/flower/dto/request/film/FilmLocationDTO.java +++ b/src/main/java/com/mzl/flower/dto/request/film/FilmLocationDTO.java @@ -97,7 +97,7 @@ /** * 状态(0禁用,1启用) */ - private Integer status; + private Boolean isEnabled; /** @@ -133,4 +133,14 @@ private Integer operationWeight; + /** + * 创建者ID + */ + private String createBy; + + /** + * 最后修改者ID + */ + private String updateBy; + } diff --git a/src/main/java/com/mzl/flower/dto/response/film/FilmLocationNameDTO.java b/src/main/java/com/mzl/flower/dto/response/film/FilmLocationNameDTO.java new file mode 100644 index 0000000..e485ef9 --- /dev/null +++ b/src/main/java/com/mzl/flower/dto/response/film/FilmLocationNameDTO.java @@ -0,0 +1,9 @@ +package com.mzl.flower.dto.response.film; + +import lombok.Data; + +@Data +public class FilmLocationNameDTO { + private Long id; + private String name; +} diff --git a/src/main/java/com/mzl/flower/mapper/film/FilmLocationMapper.java b/src/main/java/com/mzl/flower/mapper/film/FilmLocationMapper.java index ecc7844..85c6cc1 100644 --- a/src/main/java/com/mzl/flower/mapper/film/FilmLocationMapper.java +++ b/src/main/java/com/mzl/flower/mapper/film/FilmLocationMapper.java @@ -2,13 +2,17 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.mzl.flower.dto.request.film.FilmLocationQueryDTO; +import com.mzl.flower.dto.response.film.FilmLocationNameDTO; import com.mzl.flower.dto.response.film.FilmLocationVO; import com.mzl.flower.entity.film.FilmLocation; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.MapKey; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; +import java.util.ArrayList; import java.util.List; +import java.util.Map; /** * <p> @@ -28,4 +32,14 @@ @Select("select * from film_location where location_name = #{locationName} and deleted = '0' limit 1") FilmLocation selectByLocationName(@Param("locationName") String locationName ); + + @Select("<script>" + + "SELECT id, location_name AS name FROM film_location " + + "WHERE id IN " + + "<foreach item='id' collection='list' open='(' separator=',' close=')'>" + + "#{id}" + + "</foreach>" + + "</script>") + @MapKey("id") + Map<Long, FilmLocationNameDTO> getLocationNamesByIds(@Param("list") List<Long> ids); } diff --git a/src/main/java/com/mzl/flower/mapper/film/FilmLocationWorkMapper.java b/src/main/java/com/mzl/flower/mapper/film/FilmLocationWorkMapper.java index 1b18e3b..6ca94f4 100644 --- a/src/main/java/com/mzl/flower/mapper/film/FilmLocationWorkMapper.java +++ b/src/main/java/com/mzl/flower/mapper/film/FilmLocationWorkMapper.java @@ -6,6 +6,7 @@ import org.apache.ibatis.annotations.Select; import java.util.List; +import java.util.Set; public interface FilmLocationWorkMapper extends BaseMapper<FilmLocationWork> { @@ -15,4 +16,23 @@ List<FilmLocationWork> getByLocaltionId(@Param("locationId") String locationId); List<FilmLocationWork> selectByLocationId(Long id); + + @Select("<script>" + + "SELECT DISTINCT location_id FROM film_location_work " + + "WHERE location_id IN " + + "<foreach item='id' collection='list' open='(' separator=',' close=')'>" + + "#{id}" + + "</foreach>" + + "</script>") + Set<Long> findLocationIdsWithWorks(@Param("list") List<Long> locationIds); + + + @Select("<script>" + + "SELECT DISTINCT film_id FROM film_location_work " + + "WHERE location_id IN " + + "<foreach item='id' collection='list' open='(' separator=',' close=')'>" + + "#{id}" + + "</foreach>" + + "</script>") + Set<Long> findFilmIdsWithWorks(@Param("list") List<Long> locationIds); } diff --git a/src/main/java/com/mzl/flower/mapper/film/FilmWorksMapper.java b/src/main/java/com/mzl/flower/mapper/film/FilmWorksMapper.java index c792a10..89f70b4 100644 --- a/src/main/java/com/mzl/flower/mapper/film/FilmWorksMapper.java +++ b/src/main/java/com/mzl/flower/mapper/film/FilmWorksMapper.java @@ -2,13 +2,16 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.mzl.flower.dto.request.film.FilmWorksQueryDTO; +import com.mzl.flower.dto.response.film.FilmLocationNameDTO; import com.mzl.flower.dto.response.film.FilmWorksVO; import com.mzl.flower.entity.film.FilmWorks; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.MapKey; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; import java.util.List; +import java.util.Map; /** * <p> @@ -33,4 +36,15 @@ @Select("select * from film_works where deleted = '0' and status = 'pending_create'") List<FilmWorksVO> pendingCreate(); + + + @Select("<script>" + + "select * from film_works where deleted = '0' " + + "and id IN " + + "<foreach item='id' collection='list' open='(' separator=',' close=')'>" + + "#{id}" + + "</foreach>" + + "</script>") + @MapKey("id") + List<FilmWorksVO> getFilmWorksByIds(@Param("list") List<Long> ids); } diff --git a/src/main/java/com/mzl/flower/service/film/FilmLocationService.java b/src/main/java/com/mzl/flower/service/film/FilmLocationService.java index a431bb5..0f6f95c 100644 --- a/src/main/java/com/mzl/flower/service/film/FilmLocationService.java +++ b/src/main/java/com/mzl/flower/service/film/FilmLocationService.java @@ -5,8 +5,11 @@ import com.mzl.flower.dto.request.film.FilmLocationDTO; import com.mzl.flower.dto.request.film.FilmLocationQueryDTO; import com.mzl.flower.dto.response.film.FilmLocationVO; +import com.mzl.flower.dto.response.film.FilmWorksVO; import com.mzl.flower.entity.film.FilmLocation; import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; /** * <p> @@ -33,4 +36,8 @@ void isEnable(Long id); void batchMerge(BatchDTO dto); + + void batchDelete(BatchDTO dto); + + List<FilmWorksVO> related(Long locationId); } diff --git a/src/main/java/com/mzl/flower/service/film/impl/FilmLocationServiceImpl.java b/src/main/java/com/mzl/flower/service/film/impl/FilmLocationServiceImpl.java index 9c27933..4528c16 100644 --- a/src/main/java/com/mzl/flower/service/film/impl/FilmLocationServiceImpl.java +++ b/src/main/java/com/mzl/flower/service/film/impl/FilmLocationServiceImpl.java @@ -7,13 +7,15 @@ import com.mzl.flower.dto.BatchDTO; import com.mzl.flower.dto.request.film.FilmLocationDTO; import com.mzl.flower.dto.request.film.FilmLocationQueryDTO; +import com.mzl.flower.dto.response.film.FilmLocationNameDTO; import com.mzl.flower.dto.response.film.FilmLocationVO; +import com.mzl.flower.dto.response.film.FilmWorksVO; import com.mzl.flower.entity.film.FilmLocation; import com.mzl.flower.entity.film.FilmLocationWork; -import com.mzl.flower.entity.film.FilmWorks; import com.mzl.flower.entity.system.Role; import com.mzl.flower.mapper.film.FilmLocationMapper; import com.mzl.flower.mapper.film.FilmLocationWorkMapper; +import com.mzl.flower.mapper.film.FilmWorksMapper; import com.mzl.flower.service.film.FilmLocationService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.mzl.flower.service.film.FilmLocationWorkService; @@ -26,11 +28,7 @@ import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.function.Function; +import java.util.*; import java.util.stream.Collectors; /** @@ -47,11 +45,10 @@ public class FilmLocationServiceImpl extends ServiceImpl<FilmLocationMapper, FilmLocation> implements FilmLocationService { private final FilmLocationMapper filmLocationMapper; - - private final RoleService roleService; - private final FilmLocationWorkMapper filmLocationWorkMapper; + + private final FilmWorksMapper filmWorksMapper; private final FilmLocationWorkService filmLocationWorkService; @Override @@ -84,7 +81,7 @@ if (!filmLocation1.getId().equals(filmLocation.getId())) { throw new ValidationException("景点名称重复"); } - BeanUtils.copyProperties(filmLocationDTO, filmLocation); + BeanUtils.copyProperties(filmLocationDTO, filmLocation,"filmId","startDate","endDate","visitorPhotos","isEnabled","transportGuide"); filmLocation.update(SecurityUtils.getUserId()); filmLocationMapper.updateById(filmLocation); } @@ -199,6 +196,47 @@ } + @Override + @Transactional + public void batchDelete(BatchDTO dto) { + if (CollectionUtils.isEmpty(dto.getIds())) { + throw new ValidationException("删除ID列表不能为空"); + } + + Set<Long> protectedIds = filmLocationWorkMapper.findLocationIdsWithWorks(dto.getIds()); + if (!protectedIds.isEmpty()) { + Map<Long, FilmLocationNameDTO> locationDTOs = filmLocationMapper.getLocationNamesByIds( + new ArrayList<>(protectedIds) + ); + + String errorMsg = protectedIds.stream() + .map(id -> { + FilmLocationNameDTO locationNameDTO = locationDTOs.get(id); + String name = (locationNameDTO != null && locationNameDTO.getName() != null) ? + locationNameDTO.getName() : "未知景点"; + return String.format("%s(ID:%d)", name, id); + }) + .collect(Collectors.joining("、")); + + throw new ValidationException("以下景点有对应的影视作品,无法删除: " + errorMsg); + } + + filmLocationMapper.deleteBatchIds(dto.getIds()); + + } + + @Override + public List<FilmWorksVO> related(Long locationId) { + List<Long> ids = new ArrayList<>(); + ids.add(locationId); + Set<Long> filmIds = filmLocationWorkMapper.findFilmIdsWithWorks(ids); + if (!filmIds.isEmpty()) { + List<FilmWorksVO> filmWorksVOS = filmWorksMapper.getFilmWorksByIds(new ArrayList<>(filmIds)); + return filmWorksVOS; + } else { + return null; + } + } private void updateLocationRelations(Long targetId, List<Long> mergeIds) { // 查询所有待更新的工作记录 @@ -219,4 +257,5 @@ filmLocationWorkService.updateBatchById(toUpdate); } } + } diff --git a/src/main/java/com/mzl/flower/web/film/FilmLocationController.java b/src/main/java/com/mzl/flower/web/film/FilmLocationController.java index 5c7623b..105bda5 100644 --- a/src/main/java/com/mzl/flower/web/film/FilmLocationController.java +++ b/src/main/java/com/mzl/flower/web/film/FilmLocationController.java @@ -9,6 +9,7 @@ import com.mzl.flower.dto.request.film.FilmLocationDTO; import com.mzl.flower.dto.request.film.FilmLocationQueryDTO; import com.mzl.flower.dto.response.film.FilmLocationVO; +import com.mzl.flower.dto.response.film.FilmWorksVO; import com.mzl.flower.service.film.FilmLocationService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -18,6 +19,7 @@ import org.springframework.web.bind.annotation.*; import javax.validation.constraints.NotNull; +import java.util.List; /** * 影视拍摄场地信息表前端控制器 @@ -87,4 +89,18 @@ filmLocationService.batchMerge(dto); return returnData(R.SUCCESS.getCode(), null); } + + @PostMapping("/filmLocation/delete/batch") + @ApiOperation(value = "批量删除", notes = "批量删除") + public ResponseEntity<ReturnDataDTO> batchDelete(@Validated @RequestBody BatchDTO dto) { + filmLocationService.batchDelete(dto); + return returnData(R.SUCCESS.getCode(),null); + } + + @GetMapping("/filmLocation/related") + @ApiOperation(value = "景点对应的影视作品", notes = "景点对应的影视作品") + public ResponseEntity<ReturnDataDTO<List<FilmWorksVO>>> related(@NotNull(message = "id不能为空") Long locationId) { + return returnData(R.SUCCESS.getCode(), filmLocationService.related(locationId)); + } + } -- Gitblit v1.9.3