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