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