From 2e0e1c5cde0585669334ebc64ff50eae68770726 Mon Sep 17 00:00:00 2001
From: cloudroam <cloudroam>
Date: 星期四, 26 六月 2025 14:58:11 +0800
Subject: [PATCH] add:影视景点

---
 src/main/java/com/mzl/flower/dto/request/film/FilmLocationDTO.java              |   34 ++
 src/main/java/com/mzl/flower/entity/film/FilmLocation.java                      |   36 ++
 src/main/java/com/mzl/flower/service/film/impl/FilmLocationServiceImpl.java     |  173 ++++++++++++++
 src/main/java/com/mzl/flower/service/film/impl/FilmWorksServiceImpl.java        |   53 ++++
 src/main/java/com/mzl/flower/service/film/FilmLocationWorkService.java          |   10 
 src/main/java/com/mzl/flower/web/film/FilmWorksController.java                  |    7 
 src/main/java/com/mzl/flower/service/partner/PartnerService.java                |    7 
 src/main/java/com/mzl/flower/constant/Constants.java                            |   17 +
 src/main/resources/mapper/film/FilmLocationMapper.xml                           |   54 ++--
 src/main/java/com/mzl/flower/web/upload/FileUploadOssResource.java              |   10 
 src/main/java/com/mzl/flower/web/film/FilmLocationController.java               |   36 ++
 src/main/java/com/mzl/flower/service/film/impl/FilmLocationWorkServiceImpl.java |   20 +
 src/main/java/com/mzl/flower/dto/response/film/FilmLocationVO.java              |  149 +++++++++--
 src/main/java/com/mzl/flower/dto/request/film/FilmLocationQueryDTO.java         |   17 +
 src/main/java/com/mzl/flower/entity/film/FilmLocationWork.java                  |   37 +++
 src/main/java/com/mzl/flower/mapper/film/FilmLocationMapper.java                |   15 +
 src/main/java/com/mzl/flower/mapper/film/FilmLocationWorkMapper.java            |   18 +
 src/main/java/com/mzl/flower/service/film/FilmWorksService.java                 |    1 
 src/main/java/com/mzl/flower/service/film/FilmLocationService.java              |    9 
 19 files changed, 622 insertions(+), 81 deletions(-)

diff --git a/src/main/java/com/mzl/flower/constant/Constants.java b/src/main/java/com/mzl/flower/constant/Constants.java
index 0a0114e..ffd4f47 100644
--- a/src/main/java/com/mzl/flower/constant/Constants.java
+++ b/src/main/java/com/mzl/flower/constant/Constants.java
@@ -79,6 +79,8 @@
         approved("审核通过"),
 
         rejected("审核驳回"),
+        create_cancel("取消生成"),
+        create_afresh("重新生成"),
         ;
 
         COMMON_PUBLISH_STATUS(String desc) {
@@ -779,6 +781,21 @@
     }
 
 
+    public enum IS_VISITOR {
+        yes("是"), no("否");
+
+        IS_VISITOR(String desc) {
+            this.desc = desc;
+        }
+
+        private String desc;
+
+        public String getDesc() {
+            return desc;
+        }
+    }
+
+
 
 
 }
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 69fc585..b5240d9 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
@@ -7,15 +7,22 @@
 
 @Data
 public class FilmLocationDTO {
+
+    private Long id;
     /**
      * 关联的影视作品ID
      */
-    private Integer filmId;
+    private Long filmId;
 
     /**
      * 拍摄地点名称
      */
     private String locationName;
+
+    /**
+     * 拍摄地点图片
+     */
+    private String locationUrl;
 
     /**
      * 详细地址
@@ -55,7 +62,7 @@
     /**
      * 是否开放参观(0否,1是)
      */
-    private Boolean isOpenVisit;
+    private String isOpenVisit;
 
     /**
      * 参观提示(JSON格式存储)
@@ -103,4 +110,27 @@
      */
     private String visitorPhotos;
 
+    /**
+     *  省
+     */
+    private String province;
+
+    /**
+     *  市
+     */
+    private String city;
+
+    /**
+     *  区
+     */
+    private String region;
+
+    /**
+     * 景点热度
+     */
+    private Double locationWeight;
+
+
+    private Integer operationWeight;
+
 }
diff --git a/src/main/java/com/mzl/flower/dto/request/film/FilmLocationQueryDTO.java b/src/main/java/com/mzl/flower/dto/request/film/FilmLocationQueryDTO.java
index 6000f70..2638daa 100644
--- a/src/main/java/com/mzl/flower/dto/request/film/FilmLocationQueryDTO.java
+++ b/src/main/java/com/mzl/flower/dto/request/film/FilmLocationQueryDTO.java
@@ -5,6 +5,19 @@
 
 @Data
 public class FilmLocationQueryDTO {
-    @ApiModelProperty(value = "会员等级名称")
-    private String name;
+
+    @ApiModelProperty(value = "拍摄地点名称")
+    private String locationName;
+
+    @ApiModelProperty(value = "所在省")
+    private String province;
+
+    @ApiModelProperty(value = "所在市")
+    private String city;
+
+    @ApiModelProperty(value = "所在区")
+    private String region;
+
+    @ApiModelProperty("启用/禁用(USER_ENABLED_OR_DISABLED)")
+    private Integer isEnabled;
 }
diff --git a/src/main/java/com/mzl/flower/dto/response/film/FilmLocationVO.java b/src/main/java/com/mzl/flower/dto/response/film/FilmLocationVO.java
index 390eaf7..3834ad0 100644
--- a/src/main/java/com/mzl/flower/dto/response/film/FilmLocationVO.java
+++ b/src/main/java/com/mzl/flower/dto/response/film/FilmLocationVO.java
@@ -6,60 +6,141 @@
 import lombok.Data;
 
 import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 
 @Data
 public class FilmLocationVO extends AbstractTransDTO {
+
+
     private Long id;
+    /**
+     * 关联的影视作品ID
+     */
+    private Integer filmId;
 
-    @ApiModelProperty("会员等级名称")
-    private String name;
+    /**
+     * 拍摄地点名称
+     */
+    private String locationName;
 
-    @ApiModelProperty("成长点-区间-开始")
-    private int startPoint;
+    /**
+     * 拍摄地点图片
+     */
+    private String locationUrl;
 
-    @ApiModelProperty("成长点-区间-结束")
-    private int endPoint;
+    /**
+     * 详细地址
+     */
+    private String address;
 
-    @ApiModelProperty("会员折扣类型(百分比、固定金额)")
-    @DictTrans(target = "discountTypeStr", codeType = "DISCOUNT_TYPE")
-    private String discountType;
+    /**
+     * 纬度坐标(精确到小数点后6位)
+     */
+    private BigDecimal gpsLat;
 
-    private String discountTypeStr;
+    /**
+     * 经度坐标(精确到小数点后6位)
+     */
+    private BigDecimal gpsLng;
 
-    @ApiModelProperty("会员折扣百分比")
-    private BigDecimal discountRatio;
+    /**
+     * 拍摄开始日期
+     */
+    private LocalDate startDate;
 
-    @ApiModelProperty("会员折扣固定金额")
-    private BigDecimal discountAmount;
+    /**
+     * 拍摄结束日期
+     */
+    private LocalDate endDate;
 
-    @ApiModelProperty("消费金额(元)")
-    private int consumptionAmount;
+    /**
+     * 场景类型
+     */
+    private String sceneType;
 
-    @ApiModelProperty("已消费产生的成长值")
-    private int growthValue;
+    /**
+     * 经典画面描述
+     */
+    private String classicScene;
 
-    @ApiModelProperty("未消费产生的下降值")
-    private int downgradeValue;
+    /**
+     * 是否开放参观(0否,1是)
+     */
+    @DictTrans(target = "isOpenVisitStr", codeType = "IS_VISITOR")
+    private String isOpenVisit;
 
-    @ApiModelProperty("创建日期")
-    private LocalDateTime createTime;
+    private String isOpenVisitStr;
 
-    @ApiModelProperty("修改日期")
-    private LocalDateTime updateTime;
+    /**
+     * 参观提示(JSON格式存储)
+     */
+    private String visitInfo;
 
-    @ApiModelProperty("操作人")
-    private String createName;
+    /**
+     * 地标性建筑描述
+     */
+    private String landmarkDesc;
 
-    @ApiModelProperty("背景")
-    private String background;
+    /**
+     * 交通指引说明
+     */
+    private String transportGuide;
 
-    @ApiModelProperty("图片")
-    private String pictures;
+    /**
+     * 停车场信息
+     */
+    private String parkingInfo;
 
-    @ApiModelProperty(value = "会员成长值获取规则")
-    private String growthValueDesc;
+    /**
+     * 周边设施描述
+     */
+    private String surroundingFacilities;
 
-    @ApiModelProperty("更新人")
-    private String updateBy;
+    /**
+     * AR实景对比功能入口URL
+     */
+    private String arEntry;
+
+    /**
+     * 状态(0禁用,1启用)
+     */
+    private Boolean isEnabled;
+
+
+    /**
+     * 打卡记录量
+     */
+    private Integer checkinCount;
+
+    /**
+     * 游客实拍图(存储JSON数组)
+     */
+    private String visitorPhotos;
+
+    /**
+     *  省
+     */
+    private String province;
+
+    /**
+     *  市
+     */
+    private String city;
+
+    /**
+     *  区
+     */
+    private String region;
+
+    /**
+     * 景点热度
+     */
+    private Double locationWeight;
+
+    /**
+     * 运营权重
+     */
+    private Integer operationWeight;
+
 }
diff --git a/src/main/java/com/mzl/flower/entity/film/FilmLocation.java b/src/main/java/com/mzl/flower/entity/film/FilmLocation.java
index 8a4545b..1b7c8a6 100644
--- a/src/main/java/com/mzl/flower/entity/film/FilmLocation.java
+++ b/src/main/java/com/mzl/flower/entity/film/FilmLocation.java
@@ -6,6 +6,7 @@
 
 import com.mzl.flower.base.BaseAutoEntity;
 import com.mzl.flower.base.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
@@ -26,12 +27,17 @@
     /**
      * 关联的影视作品ID
      */
-    private Integer filmId;
+    private Long filmId;
 
     /**
      * 拍摄地点名称
      */
     private String locationName;
+
+    /**
+     * 拍摄地点图片
+     */
+    private String locationUrl;
 
     /**
      * 详细地址
@@ -71,7 +77,7 @@
     /**
      * 是否开放参观(0否,1是)
      */
-    private Boolean isOpenVisit;
+    private String isOpenVisit;
 
     /**
      * 参观提示(JSON格式存储)
@@ -106,7 +112,7 @@
     /**
      * 状态(0禁用,1启用)
      */
-    private Integer status;
+    private Boolean isEnabled;
 
     /**
      * 打卡记录量
@@ -118,5 +124,29 @@
      */
     private String visitorPhotos;
 
+    /**
+     *  省
+     */
+    private String province;
+
+    /**
+     *  市
+     */
+    private String city;
+
+    /**
+     *  区
+     */
+    private String region;
+
+    /**
+     * 景点热度
+     */
+    private Double locationWeight;
+
+    /**
+     * 运营权重
+     */
+    private Integer operationWeight;
 
 }
diff --git a/src/main/java/com/mzl/flower/entity/film/FilmLocationWork.java b/src/main/java/com/mzl/flower/entity/film/FilmLocationWork.java
new file mode 100644
index 0000000..a959478
--- /dev/null
+++ b/src/main/java/com/mzl/flower/entity/film/FilmLocationWork.java
@@ -0,0 +1,37 @@
+package com.mzl.flower.entity.film;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.mzl.flower.base.BaseAutoEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+/**
+ * 影视拍摄场地信息表
+ *
+ * @author generator@Fang
+ * @since 2025-05-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("film_location_work")
+public class FilmLocationWork extends BaseAutoEntity {
+
+
+    /**
+     * 关联的景点ID
+     */
+    private Long locationId;
+
+    /**
+     * 关联的影视作品ID
+     */
+    private Long filmId;
+
+
+
+}
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 9195636..ecc7844 100644
--- a/src/main/java/com/mzl/flower/mapper/film/FilmLocationMapper.java
+++ b/src/main/java/com/mzl/flower/mapper/film/FilmLocationMapper.java
@@ -1,7 +1,14 @@
 package com.mzl.flower.mapper.film;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.dto.request.film.FilmLocationQueryDTO;
+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.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +20,12 @@
  */
 public interface FilmLocationMapper extends BaseMapper<FilmLocation> {
 
+    List<FilmLocationVO> queryPage(@Param("dto") FilmLocationQueryDTO dto, Page page);
+
+
+    @Select("select * from film_location where  id  = #{id} ")
+    FilmLocationVO selectByIdInfo(Long id);
+
+    @Select("select * from film_location where  location_name  = #{locationName} and deleted = '0'  limit 1")
+    FilmLocation selectByLocationName(@Param("locationName") String locationName );
 }
diff --git a/src/main/java/com/mzl/flower/mapper/film/FilmLocationWorkMapper.java b/src/main/java/com/mzl/flower/mapper/film/FilmLocationWorkMapper.java
new file mode 100644
index 0000000..1b18e3b
--- /dev/null
+++ b/src/main/java/com/mzl/flower/mapper/film/FilmLocationWorkMapper.java
@@ -0,0 +1,18 @@
+package com.mzl.flower.mapper.film;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.mzl.flower.entity.film.FilmLocationWork;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+
+public interface FilmLocationWorkMapper extends BaseMapper<FilmLocationWork> {
+
+
+    @Select("select * from film_location_work  where  location_id = #{locationId}  and deleted = '0' ")
+    List<FilmLocationWork> getByLocaltionId(@Param("locationId") String locationId);
+
+    List<FilmLocationWork> selectByLocationId(Long id);
+}
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 a5cb2b2..a431bb5 100644
--- a/src/main/java/com/mzl/flower/service/film/FilmLocationService.java
+++ b/src/main/java/com/mzl/flower/service/film/FilmLocationService.java
@@ -1,6 +1,7 @@
 package com.mzl.flower.service.film;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+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.FilmLocationVO;
@@ -24,4 +25,12 @@
     void deleteFilmLocation(String id);
 
     Page<FilmLocationVO> queryPage(FilmLocationQueryDTO filmLocationQueryDTO, Page page);
+
+    FilmLocationVO detail(Long id);
+
+    void changeDownState(Long id);
+
+    void isEnable(Long id);
+
+    void batchMerge(BatchDTO dto);
 }
diff --git a/src/main/java/com/mzl/flower/service/film/FilmLocationWorkService.java b/src/main/java/com/mzl/flower/service/film/FilmLocationWorkService.java
new file mode 100644
index 0000000..2a3a9ab
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/film/FilmLocationWorkService.java
@@ -0,0 +1,10 @@
+package com.mzl.flower.service.film;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.mzl.flower.entity.film.FilmLocationWork;
+
+
+public interface FilmLocationWorkService extends IService<FilmLocationWork> {
+
+
+}
diff --git a/src/main/java/com/mzl/flower/service/film/FilmWorksService.java b/src/main/java/com/mzl/flower/service/film/FilmWorksService.java
index 99ab182..5a159b1 100644
--- a/src/main/java/com/mzl/flower/service/film/FilmWorksService.java
+++ b/src/main/java/com/mzl/flower/service/film/FilmWorksService.java
@@ -32,6 +32,7 @@
     List<FilmWorksVO> pendingCreate();
 
     void changeStatus(Long id);
+    void changeCreateStatus(Long id);
 
     void changeTopState(Long id);
 
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 66d6ada..9c27933 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
@@ -1,17 +1,37 @@
 package com.mzl.flower.service.film.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.config.exception.ValidationException;
+import com.mzl.flower.config.security.SecurityUtils;
+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.FilmLocationVO;
 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.service.film.FilmLocationService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.mzl.flower.service.film.FilmLocationWorkService;
+import com.mzl.flower.service.system.RoleService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+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.stream.Collectors;
 
 /**
  * <p>
@@ -27,9 +47,24 @@
 public class FilmLocationServiceImpl extends ServiceImpl<FilmLocationMapper, FilmLocation> implements FilmLocationService {
 
     private final FilmLocationMapper filmLocationMapper;
+
+
+    private final RoleService roleService;
+
+    private final FilmLocationWorkMapper filmLocationWorkMapper;
+    private final FilmLocationWorkService filmLocationWorkService;
+
     @Override
     public void saveFilmLocation(FilmLocationDTO filmLocationDTO) {
         //  转换
+        //增加保存时判断是否有景点名称
+        if (StringUtils.isEmpty(filmLocationDTO.getLocationName())) {
+            throw new ValidationException("景点名称不能为空");
+        }
+        FilmLocation filmLocation1 = filmLocationMapper.selectByLocationName(filmLocationDTO.getLocationName());
+        if (!ObjectUtils.isEmpty(filmLocation1)) {
+            throw new ValidationException("景点名称重复");
+        }
         FilmLocation filmLocation = new FilmLocation();
         BeanUtils.copyProperties(filmLocationDTO, filmLocation);
         filmLocation.create();
@@ -38,16 +73,150 @@
 
     @Override
     public void updateFilmLocation(FilmLocationDTO filmLocationDTO) {
+        if (StringUtils.isEmpty(filmLocationDTO.getLocationName())) {
+            throw new ValidationException("景点名称不能为空");
+        }
 
+        //增加修改时保存得景点名称是否有重复,排除当前这条
+        FilmLocation filmLocation1 = filmLocationMapper.selectByLocationName(filmLocationDTO.getLocationName());
+
+        FilmLocation filmLocation = filmLocationMapper.selectById(filmLocationDTO.getId());
+        if (!filmLocation1.getId().equals(filmLocation.getId())) {
+            throw new ValidationException("景点名称重复");
+        }
+        BeanUtils.copyProperties(filmLocationDTO, filmLocation);
+        filmLocation.update(SecurityUtils.getUserId());
+        filmLocationMapper.updateById(filmLocation);
     }
 
     @Override
     public void deleteFilmLocation(String id) {
+        FilmLocation filmLocation = filmLocationMapper.selectById(id);
+        if (filmLocation == null) {
+            throw new ValidationException("找不到id为" + id + "的景点");
+        }
+        //判断景点id是否有对应得影视作品,如果有则不能删除。如果没有则可以删除
+        //可能需要增加判断,如果是取消生成应该也可以删除,重新生成需要重新生成新的位置信息(取消生成的话,其实也没有对应的景点信息,这点其实暂时不用考虑)
+        List<FilmLocationWork> filmLocationWorks = filmLocationWorkMapper.getByLocaltionId(id);
+        if(!CollectionUtils.isEmpty(filmLocationWorks)){
+            throw new ValidationException("景点有对应得影视作品,无法删除");
+        }
+        filmLocationMapper.deleteById(id);
+    }
+
+    @Override
+    public Page<FilmLocationVO> queryPage(FilmLocationQueryDTO dto, Page page) {
+
+        List<FilmLocationVO> list = filmLocationMapper.queryPage(dto, page);
+        page.setRecords(list);
+        return page;
+    }
+
+    @Override
+    public FilmLocationVO detail(Long id) {
+        FilmLocationVO filmLocationVO = filmLocationMapper.selectByIdInfo(id);
+        if (filmLocationVO == null) {
+            return null;
+        }
+        return filmLocationVO;
+    }
+
+    @Override
+    public void changeDownState(Long id) {
+
+        //获取当前人员角色,判断是不是审核角色
+        List<String> roleIds = new ArrayList<>();
+        List<Role> roleList = roleService.getUserRoleList(SecurityUtils.getUserId());
+        for (Role role : roleList) {
+            roleIds.add(role.getId());
+        }
+
+        if (!roleIds.contains("77462b362bad4c88a7a5c64cbdd25d91")) {
+            throw new ValidationException("非运营角色不能清除权重");
+        }
+
+        FilmLocation filmLocation = filmLocationMapper.selectById(id);
+        if (filmLocation == null) {
+            throw new ValidationException("找不到id为" + id + "的景点");
+        }
+
+        filmLocation.setLocationWeight((double) 0);
+
+        filmLocationMapper.updateById(filmLocation);
 
     }
 
     @Override
-    public Page<FilmLocationVO> queryPage(FilmLocationQueryDTO filmLocationQueryDTO, Page page) {
-        return null;
+    public void isEnable(Long id) {
+        FilmLocation filmLocation = filmLocationMapper.selectById(id);
+        if (filmLocation == null) {
+            throw new ValidationException("找不到id为" + id + "的景点");
+        }
+        if (filmLocation.getIsEnabled()) {
+            filmLocation.setIsEnabled(false);
+        } else {
+            filmLocation.setIsEnabled(true);
+        }
+        filmLocation.update(SecurityUtils.getUserId());
+        filmLocationMapper.updateById(filmLocation);
+    }
+
+    @Override
+    @Transactional
+    public void batchMerge(BatchDTO dto) {
+        //获取当前人员角色,判断是不是审核角色
+//        List<String> roleIds = new ArrayList<>();
+//        List<Role> roleList = roleService.getUserRoleList(SecurityUtils.getUserId());
+//        for (Role role : roleList) {
+//            roleIds.add(role.getId());
+//        }
+        // 权限校验:仅允许运营角色操作
+        List<String> roleIds = roleService.getUserRoleList(SecurityUtils.getUserId()).stream().map(Role::getId).collect(Collectors.toList());
+        if (!roleIds.contains("77462b362bad4c88a7a5c64cbdd25d91")) {
+            throw new ValidationException("非运营角色不能合并");
+        }
+        if (dto.getIds() == null || dto.getIds().size() < 2) {
+            throw new ValidationException("至少选中两条数据");
+        }
+
+        List<Long> idList = dto.getIds();
+        List<FilmLocation> sortedList = idList.stream().map(id -> filmLocationMapper.selectById(id)).filter(Objects::nonNull).collect(Collectors.toList());
+
+        // 检查有效记录数
+        if (sortedList.size() < 2) {
+            throw new ValidationException("有效数据不足两条");
+        }
+        // 获取目标记录(第一条)和待合并记录
+        FilmLocation target = sortedList.get(0);
+        List<FilmLocation> toMergeList = sortedList.subList(1, sortedList.size());
+        List<Long> mergeIds = toMergeList.stream().map(FilmLocation::getId).collect(Collectors.toList());
+
+        // 更新关联表的外键引用
+        updateLocationRelations(target.getId(), mergeIds);
+
+        // 删除待合并记录
+        filmLocationMapper.deleteBatchIds(mergeIds);
+
+    }
+
+
+    private void updateLocationRelations(Long targetId, List<Long> mergeIds) {
+        // 查询所有待更新的工作记录
+        LambdaQueryWrapper<FilmLocationWork> query = new LambdaQueryWrapper<>();
+        query.in(FilmLocationWork::getLocationId, mergeIds);
+        List<FilmLocationWork> records = filmLocationWorkService.list(query);
+
+        // 准备更新
+        List<FilmLocationWork> toUpdate = records.stream().map(work -> {
+            FilmLocationWork update = new FilmLocationWork();
+            update.setId(work.getId());
+            update.setLocationId(targetId);
+            return update;
+        }).collect(Collectors.toList());
+
+        // 批量更新(MP的批量更新方法)
+        if (!toUpdate.isEmpty()) {
+            filmLocationWorkService.updateBatchById(toUpdate);
+        }
     }
 }
diff --git a/src/main/java/com/mzl/flower/service/film/impl/FilmLocationWorkServiceImpl.java b/src/main/java/com/mzl/flower/service/film/impl/FilmLocationWorkServiceImpl.java
new file mode 100644
index 0000000..01ad1e2
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/film/impl/FilmLocationWorkServiceImpl.java
@@ -0,0 +1,20 @@
+package com.mzl.flower.service.film.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.mzl.flower.entity.film.FilmLocationWork;
+import com.mzl.flower.mapper.film.FilmLocationMapper;
+import com.mzl.flower.mapper.film.FilmLocationWorkMapper;
+import com.mzl.flower.service.film.FilmLocationWorkService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+
+@Service
+@Transactional
+@RequiredArgsConstructor
+public class FilmLocationWorkServiceImpl extends ServiceImpl<FilmLocationWorkMapper, FilmLocationWork> implements FilmLocationWorkService {
+
+    private final FilmLocationMapper filmLocationMapper;
+
+}
diff --git a/src/main/java/com/mzl/flower/service/film/impl/FilmWorksServiceImpl.java b/src/main/java/com/mzl/flower/service/film/impl/FilmWorksServiceImpl.java
index 397ee89..e6e0575 100644
--- a/src/main/java/com/mzl/flower/service/film/impl/FilmWorksServiceImpl.java
+++ b/src/main/java/com/mzl/flower/service/film/impl/FilmWorksServiceImpl.java
@@ -27,6 +27,9 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.ObjectUtils;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.List;
@@ -135,6 +138,18 @@
             dto.setUserId(null);
         }
         List<FilmWorksVO> list =  filmWorksMapper.queryPage(dto,page);
+        // 测试前端展示用代码,部署发布不适用
+//        list.forEach(l->{
+//            if (l.getCoverUrl().contains("doubanio")) {
+//                String encodedUrl = null;
+//                try {
+//                    encodedUrl = URLEncoder.encode(l.getCoverUrl(), String.valueOf(StandardCharsets.UTF_8));
+//                } catch (UnsupportedEncodingException e) {
+//                    throw new RuntimeException(e);
+//                }
+//                l.setCoverUrl("https://images.weserv.nl/?url=" + encodedUrl);
+//            }
+//        });
         page.setRecords(list);
 
 
@@ -176,6 +191,37 @@
             filmWorksMapper.updateById(filmWork);
         }else{
             throw new ValidationException("非审核通过或者发布状态,不能操作");
+        }
+    }
+
+
+    @Override
+    public void changeCreateStatus(Long id) {
+        //获取当前人员角色,判断是不是审核角色
+        List<String> roleIds = new ArrayList<>();
+        List<Role> roleList = roleService.getUserRoleList(SecurityUtils.getUserId());
+        for (Role role : roleList) {
+            roleIds.add(role.getId());
+        }
+        if (!roleIds.contains("8f9ef89f6b2d4d8e9ea1fc8d2f25ce69")) {
+            throw new ValidationException("非编辑角色不能操作");
+        }
+        FilmWorks filmWork = filmWorksMapper.selectById(id);
+        if (filmWork == null) {
+            throw new ValidationException("找不到id为" + id + "的作品");
+        }
+        if (Constants.COMMON_PUBLISH_STATUS.pending_create.name().equals(filmWork.getStatus()) || Constants.COMMON_PUBLISH_STATUS.create_cancel.name().equals(filmWork.getStatus()) || Constants.COMMON_PUBLISH_STATUS.create_failed.name().equals(filmWork.getStatus())) {
+            if (Constants.COMMON_PUBLISH_STATUS.create_cancel.name().equals(filmWork.getStatus())) {
+                filmWork.setStatus(Constants.COMMON_PUBLISH_STATUS.pending_create.name());
+            } else if (Constants.COMMON_PUBLISH_STATUS.create_failed.name().equals(filmWork.getStatus())) {
+                filmWork.setStatus(Constants.COMMON_PUBLISH_STATUS.pending_create.name());
+            } else {
+                filmWork.setStatus(Constants.COMMON_PUBLISH_STATUS.create_cancel.name());
+                filmWork.setPublishDate(LocalDate.now());
+            }
+            filmWorksMapper.updateById(filmWork);
+        }else{
+            throw new ValidationException("当前状态,不能操作");
         }
     }
 
@@ -266,8 +312,11 @@
             return null;
         }
         CustomerDTO currentCustomer = customerMapper.getCurrentCustomer(filmWorksVO.getCreateBy());
-        filmWorksVO.setNickname(currentCustomer.getNickName());
-        filmWorksVO.setAvatar(currentCustomer.getCover());
+        if(!ObjectUtils.isEmpty(currentCustomer)){
+            filmWorksVO.setNickname(currentCustomer.getNickName());
+            filmWorksVO.setAvatar(currentCustomer.getCover());
+        }
+
         return filmWorksVO;
     }
 
diff --git a/src/main/java/com/mzl/flower/service/partner/PartnerService.java b/src/main/java/com/mzl/flower/service/partner/PartnerService.java
index 3be43a8..d7c1fb5 100644
--- a/src/main/java/com/mzl/flower/service/partner/PartnerService.java
+++ b/src/main/java/com/mzl/flower/service/partner/PartnerService.java
@@ -15,6 +15,7 @@
 import com.mzl.flower.mapper.system.UserMapper;
 import com.mzl.flower.service.BaseService;
 import com.mzl.flower.service.UploadService;
+import com.mzl.flower.service.oss.TosOssService;
 import com.mzl.flower.service.system.UserService;
 import com.mzl.flower.utils.DateUtils;
 import lombok.extern.slf4j.Slf4j;
@@ -58,6 +59,9 @@
     @Autowired
     private UserService userService;
 
+
+    @Autowired
+    private TosOssService tosOssService;
 
     public PartnerService(PartnerMapper partnerMapper, UserMapper userMapper, WxMaService maService, UploadService uploadService) {
         this.partnerMapper = partnerMapper;
@@ -219,7 +223,8 @@
             File file = maService.getQrcodeService()
                     .createWxaCodeUnlimit("partnerUserId="+partner.getId(),"pages/login/supplier-login","/opt/wx-code");
             InputStream in = new FileInputStream(file);
-            String url = uploadService.upload(in, file.getName());
+//            String url = uploadService.upload(in, file.getName());
+            String url = tosOssService.uploadFile( in,file.getName());
 
             partner.setWechatUrl("https://" + url);
             partner.update(SecurityUtils.getUserId());
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 df54f22..5c7623b 100644
--- a/src/main/java/com/mzl/flower/web/film/FilmLocationController.java
+++ b/src/main/java/com/mzl/flower/web/film/FilmLocationController.java
@@ -5,6 +5,7 @@
 import com.mzl.flower.base.BaseController;
 import com.mzl.flower.base.R;
 import com.mzl.flower.base.ReturnDataDTO;
+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.FilmLocationVO;
@@ -13,6 +14,7 @@
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.constraints.NotNull;
@@ -33,30 +35,56 @@
     private final FilmLocationService filmLocationService;
 
     @GetMapping("/filmLocation/list")
-    @ApiOperation(value = "影视作品列表", httpMethod = "GET")
+    @ApiOperation(value = "影视拍摄场地列表", httpMethod = "GET")
     public ResponseEntity<ReturnDataDTO<Page<FilmLocationVO>>> getFilmLocationList(Page page, FilmLocationQueryDTO dto) {
         return returnData(R.SUCCESS.getCode(), filmLocationService.queryPage(dto, page));
     }
 
     @GetMapping(value = "/filmLocation/delete")
-    @ApiOperation(value = "删除影视作品 ", httpMethod = "GET", notes = "ID")
+    @ApiOperation(value = "删除影视拍摄场地 ", httpMethod = "GET", notes = "ID")
     public ResponseEntity delete(@NotNull(message = "id不能为空") Long id) {
         filmLocationService.deleteFilmLocation(String.valueOf(id));
         return returnData(R.SUCCESS.getCode(), null);
     }
 
     @PostMapping(value = "/filmLocation/new")
-    @ApiOperation(value = "保存影视作品", httpMethod = "POST")
+    @ApiOperation(value = "保存影视拍摄场地", httpMethod = "POST")
     public ResponseEntity insert(@RequestBody FilmLocationDTO filmLocationDTO) {
         filmLocationService.saveFilmLocation(filmLocationDTO);
         return returnData(R.SUCCESS.getCode(), null);
     }
 
     @PostMapping(value = "/filmLocation/edit")
-    @ApiOperation(value = "更新影视作品", httpMethod = "POST")
+    @ApiOperation(value = "更新影视拍摄场地", httpMethod = "POST")
     public ResponseEntity update(@RequestBody FilmLocationDTO filmLocationDTO) {
         filmLocationService.updateFilmLocation(filmLocationDTO);
         return returnData(R.SUCCESS.getCode(), null);
     }
 
+    @GetMapping("/filmLocation/list/view")
+    @ApiOperation(value = "详情", notes = "详情")
+    public ResponseEntity<ReturnDataDTO<FilmLocationVO>> detail(@NotNull(message = "id不能为空") Long id) {
+        return returnData(R.SUCCESS.getCode(),filmLocationService.detail(id));
+    }
+
+    @GetMapping("/filmLocation/setDown")
+    @ApiOperation(value = "清除权重", notes = "清除权重")
+    public ResponseEntity<ReturnDataDTO> setDown(@NotNull(message = "id不能为空") Long id) {
+        filmLocationService.changeDownState(id);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @GetMapping("/filmLocation/isEnable")
+    @ApiOperation(value = "启用/禁用", notes = "启用/禁用景点")
+    public ResponseEntity<ReturnDataDTO<String>> isEnable(@NotNull(message = "id不能为空") Long id) {
+        filmLocationService.isEnable(id);
+        return returnData(R.SUCCESS.getCode(),null);
+    }
+
+    @PostMapping("/filmLocation/merge/batch")
+    @ApiOperation(value = "批量发布", notes = "批量发布")
+    public ResponseEntity<ReturnDataDTO> batchMerge(@Validated @RequestBody BatchDTO dto) {
+        filmLocationService.batchMerge(dto);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
 }
diff --git a/src/main/java/com/mzl/flower/web/film/FilmWorksController.java b/src/main/java/com/mzl/flower/web/film/FilmWorksController.java
index c0faba5..39235b4 100644
--- a/src/main/java/com/mzl/flower/web/film/FilmWorksController.java
+++ b/src/main/java/com/mzl/flower/web/film/FilmWorksController.java
@@ -81,6 +81,13 @@
         return returnData(R.SUCCESS.getCode(), null);
     }
 
+    @GetMapping("/filmWorks/changeCreateStatus")
+    @ApiOperation(value = "修改创建状态", notes = "修改创建状态")
+    public ResponseEntity<ReturnDataDTO> changeCreateStatus(@NotNull(message = "id不能为空") Long id) {
+        filmWorksService.changeCreateStatus(id);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
     @GetMapping("/filmWorks/setTop")
     @ApiOperation(value = "文章置顶", notes = "文章置顶")
     public ResponseEntity<ReturnDataDTO> setTop(@NotNull(message = "id不能为空") Long id) {
diff --git a/src/main/java/com/mzl/flower/web/upload/FileUploadOssResource.java b/src/main/java/com/mzl/flower/web/upload/FileUploadOssResource.java
index ac0d1d9..5bf7e38 100644
--- a/src/main/java/com/mzl/flower/web/upload/FileUploadOssResource.java
+++ b/src/main/java/com/mzl/flower/web/upload/FileUploadOssResource.java
@@ -9,6 +9,7 @@
 import com.mzl.flower.config.exception.ValidationException;
 import com.mzl.flower.dto.response.upload.UploadResultDTO;
 import com.mzl.flower.service.UploadService;
+import com.mzl.flower.service.oss.TosOssService;
 import com.mzl.flower.utils.FileUtil;
 import com.mzl.flower.utils.UUIDGenerator;
 import io.swagger.annotations.Api;
@@ -38,6 +39,9 @@
 
     @Autowired
     private UploadService uploadService;
+
+    @Autowired
+    private TosOssService tosOssService;
 
     private static List<String> fileType = Arrays.asList("zip", "jpg", "png", "gif", "jpeg", "pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx", "mp4", "wmv", "rmvb", "mpg", "mpeg", "3gp", "mov", "m4v", "avi", "flv");
 
@@ -86,8 +90,10 @@
             String url = FileUtil.saveFile(path, bytes, fileName, uploadProperties.getFileGroup());
             uploadResult.setUrl(uploadProperties.getFileServerPath() + url);*/
 
-            String url = uploadService.upload(file.getInputStream(), fileName);
-            uploadResult.setUrl("https://" + url);
+//            String url = uploadService.upload(file.getInputStream(), fileName);
+            String url = tosOssService.uploadFile( file.getInputStream(),fileName);
+//            uploadResult.setUrl("https://" + url);
+            uploadResult.setUrl(url);
 
             uploadResult.setType(extName);
             uploadResult.setSize(file.getSize());
diff --git a/src/main/resources/mapper/film/FilmLocationMapper.xml b/src/main/resources/mapper/film/FilmLocationMapper.xml
index b4e3033..011a66a 100644
--- a/src/main/resources/mapper/film/FilmLocationMapper.xml
+++ b/src/main/resources/mapper/film/FilmLocationMapper.xml
@@ -2,33 +2,29 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.mzl.flower.mapper.film.FilmLocationMapper">
 
-    <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.mzl.flower.entity.film.FilmLocation">
-        <id column="id" property="id" />
-        <result column="create_time" property="createTime" />
-        <result column="update_time" property="updateTime" />
-        <result column="film_id" property="filmId" />
-        <result column="location_name" property="locationName" />
-        <result column="address" property="address" />
-        <result column="gps_lat" property="gpsLat" />
-        <result column="gps_lng" property="gpsLng" />
-        <result column="start_date" property="startDate" />
-        <result column="end_date" property="endDate" />
-        <result column="scene_type" property="sceneType" />
-        <result column="classic_scene" property="classicScene" />
-        <result column="is_open_visit" property="isOpenVisit" />
-        <result column="visit_info" property="visitInfo" />
-        <result column="landmark_desc" property="landmarkDesc" />
-        <result column="transport_guide" property="transportGuide" />
-        <result column="parking_info" property="parkingInfo" />
-        <result column="surrounding_facilities" property="surroundingFacilities" />
-        <result column="ar_entry" property="arEntry" />
-        <result column="status" property="status" />
-        <result column="deleted" property="deleted" />
-        <result column="create_by" property="createBy" />
-        <result column="update_by" property="updateBy" />
-        <result column="checkin_count" property="checkinCount" />
-        <result column="visitor_photos" property="visitorPhotos" />
-    </resultMap>
-
+    <select id="queryPage" resultType="com.mzl.flower.dto.response.film.FilmLocationVO">
+        SELECT
+        t.*
+        FROM
+        film_location t
+        WHERE
+        t.deleted = 0
+        <if test="dto.locationName != null and dto.locationName != ''">
+            AND t.location_name LIKE concat('%', #{dto.locationName},'%')
+        </if>
+        <if test="dto.province != null and dto.province != ''">
+            AND t.province LIKE concat('%', #{dto.province},'%')
+        </if>
+        <if test="dto.city != null and dto.city != ''">
+            AND t.city LIKE concat('%', #{dto.city},'%')
+        </if>
+        <if test="dto.region != null and dto.region != ''">
+            AND t.region LIKE concat('%', #{dto.region},'%')
+        </if>
+        <if test="dto.isEnabled!=null">
+            AND t.is_enabled = #{dto.isEnabled}
+        </if>
+        ORDER BY
+        t.location_weight DESC
+    </select>
 </mapper>

--
Gitblit v1.9.3