From 46715d892da947c31f07796fdc79dbbef06677b3 Mon Sep 17 00:00:00 2001
From: cloudroam <cloudroam>
Date: 星期一, 14 七月 2025 09:53:19 +0800
Subject: [PATCH] add:定时任务配置,热门城市

---
 src/main/java/com/mzl/flower/web/film/FilmContentTaskConfigController.java         |   91 ++++
 src/main/java/com/mzl/flower/service/film/impl/FilmLocationServiceImpl.java        |   12 
 src/main/java/com/mzl/flower/service/film/impl/FilmWorksServiceImpl.java           |    7 
 src/main/java/com/mzl/flower/config/RestTemplateConfig.java                        |   21 +
 src/main/java/com/mzl/flower/entity/film/FilmHotCity.java                          |   24 +
 src/main/java/com/mzl/flower/service/film/impl/AiContentTaskConfigServiceImpl.java |  175 +++++++++
 src/main/java/com/mzl/flower/constant/Constants.java                               |   15 
 src/main/java/com/mzl/flower/service/film/FilmHotCityService.java                  |   33 +
 src/main/java/com/mzl/flower/schedule/TaskExecutor.java                            |   33 +
 src/main/java/com/mzl/flower/web/film/FilmLocationController.java                  |    7 
 src/main/java/com/mzl/flower/service/film/AiContentTaskConfigService.java          |   39 ++
 src/main/java/com/mzl/flower/mapper/film/FilmLocationWorkMapper.java               |    3 
 src/main/java/com/mzl/flower/dto/request/film/AiContentTaskConfigQueryDTO.java     |   30 +
 src/main/java/com/mzl/flower/web/film/AiContentTaskConfigController.java           |   81 ++++
 src/main/java/com/mzl/flower/entity/film/AiContentTaskConfig.java                  |   33 +
 src/main/resources/mapper/film/FilmHotCityMapper.xml                               |   27 +
 src/main/java/com/mzl/flower/service/system/WeChatService.java                     |   33 +
 src/main/java/com/mzl/flower/web/film/FilmHotCityController.java                   |   87 ++++
 src/main/java/com/mzl/flower/dto/request/film/FilmHotCityDTO.java                  |   21 +
 src/main/resources/application-test.yml                                            |    1 
 src/main/resources/mapper/film/AiContentTaskConfigMapper.xml                       |   20 +
 src/main/java/com/mzl/flower/config/ResourceServerConfig.java                      |    2 
 src/main/java/com/mzl/flower/dto/response/film/AiContentTaskConfigVO.java          |   43 ++
 src/main/java/com/mzl/flower/mapper/film/FilmHotCityMapper.java                    |   29 +
 src/main/java/com/mzl/flower/schedule/DynamicTaskManager.java                      |    8 
 src/main/java/com/mzl/flower/dto/response/film/FilmHotCityVO.java                  |   33 +
 src/main/java/com/mzl/flower/mapper/film/FilmLocationMapper.java                   |    4 
 src/main/java/com/mzl/flower/mapper/film/FilmWorksMapper.java                      |    3 
 src/main/java/com/mzl/flower/dto/request/film/FilmHotCityQueryDTO.java             |   20 +
 src/main/java/com/mzl/flower/service/film/impl/FilmHotCityServiceImpl.java         |  132 ++++++
 src/main/java/com/mzl/flower/dto/request/film/AiContentTaskConfigDTO.java          |   24 +
 src/main/java/com/mzl/flower/service/film/FilmLocationService.java                 |    2 
 32 files changed, 1,072 insertions(+), 21 deletions(-)

diff --git a/src/main/java/com/mzl/flower/config/ResourceServerConfig.java b/src/main/java/com/mzl/flower/config/ResourceServerConfig.java
index 19fb3bf..d3d2bb3 100644
--- a/src/main/java/com/mzl/flower/config/ResourceServerConfig.java
+++ b/src/main/java/com/mzl/flower/config/ResourceServerConfig.java
@@ -58,6 +58,8 @@
                 .antMatchers("/api/filmWorks/**").permitAll()
                 .antMatchers("/api/film/category/**").permitAll()
                 .antMatchers("/api/filmLocation/**").permitAll()
+                .antMatchers("/api/aiTaskConfig/**").permitAll()
+                .antMatchers("/api/home/homeConfig/**").permitAll()
                 .antMatchers("api/pub/customer/home/**").permitAll()
                 .antMatchers("/api/customer/point/goods/**").permitAll()
                 .antMatchers("/api/upload/oss/file").permitAll()
diff --git a/src/main/java/com/mzl/flower/config/RestTemplateConfig.java b/src/main/java/com/mzl/flower/config/RestTemplateConfig.java
new file mode 100644
index 0000000..fcb6bb8
--- /dev/null
+++ b/src/main/java/com/mzl/flower/config/RestTemplateConfig.java
@@ -0,0 +1,21 @@
+package com.mzl.flower.config;
+
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+public class RestTemplateConfig {
+
+    @Bean
+    public RestTemplate restTemplate() {
+        RestTemplate restTemplate = new RestTemplate();
+
+        // 可选:添加自定义配置
+        // restTemplate.setErrorHandler(new CustomErrorHandler());
+        // restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(StandardCharsets.UTF_8));
+
+        return restTemplate;
+    }
+}
diff --git a/src/main/java/com/mzl/flower/constant/Constants.java b/src/main/java/com/mzl/flower/constant/Constants.java
index ffd4f47..f700953 100644
--- a/src/main/java/com/mzl/flower/constant/Constants.java
+++ b/src/main/java/com/mzl/flower/constant/Constants.java
@@ -795,6 +795,21 @@
         }
     }
 
+    public enum GENERATOR_CONTENT {
+        film_name("影视作品"), film_content("影视内容");
+
+        GENERATOR_CONTENT(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/AiContentTaskConfigDTO.java b/src/main/java/com/mzl/flower/dto/request/film/AiContentTaskConfigDTO.java
new file mode 100644
index 0000000..1881b42
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/film/AiContentTaskConfigDTO.java
@@ -0,0 +1,24 @@
+package com.mzl.flower.dto.request.film;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class AiContentTaskConfigDTO {
+
+    private Long id;
+    private String taskName;
+    private String aiParams;
+    private String cron;
+    private Boolean isEnabled;
+    private Date lastRunTime;
+
+
+    private String type;
+    private String promptArticle;
+    private String promptRoute;
+    private String promptTravel;
+    private String promptLocaltion;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/film/AiContentTaskConfigQueryDTO.java b/src/main/java/com/mzl/flower/dto/request/film/AiContentTaskConfigQueryDTO.java
new file mode 100644
index 0000000..f0f819a
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/film/AiContentTaskConfigQueryDTO.java
@@ -0,0 +1,30 @@
+package com.mzl.flower.dto.request.film;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class AiContentTaskConfigQueryDTO {
+
+
+    private Integer id;
+    private String taskName;
+    private String aiParams;
+    private String cron;
+    /**
+     * 状态(0禁用,1启用)
+     */
+    private Boolean isEnabled;
+    private Date lastRunTime;
+
+
+    private String type;
+
+    private String promptArticle;
+    private String promptRoute;
+    private String promptTravel;
+    private String promptLocaltion;
+
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/film/FilmHotCityDTO.java b/src/main/java/com/mzl/flower/dto/request/film/FilmHotCityDTO.java
new file mode 100644
index 0000000..cc784e4
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/film/FilmHotCityDTO.java
@@ -0,0 +1,21 @@
+package com.mzl.flower.dto.request.film;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+@Data
+public class FilmHotCityDTO {
+
+    private Long id;
+    private String name;
+    private String cityUrl;
+    private String country;
+    private String continent;
+    private Boolean isEnabled;
+    private String createBy;
+    private String updateBy;
+    private Integer cityWeight;
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/request/film/FilmHotCityQueryDTO.java b/src/main/java/com/mzl/flower/dto/request/film/FilmHotCityQueryDTO.java
new file mode 100644
index 0000000..fdf2bf9
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/request/film/FilmHotCityQueryDTO.java
@@ -0,0 +1,20 @@
+package com.mzl.flower.dto.request.film;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class FilmHotCityQueryDTO {
+
+    @ApiModelProperty(value = "城市名称")
+    private String name;
+
+    @ApiModelProperty(value = "所在国家")
+    private String country;
+
+    @ApiModelProperty(value = "所在洲")
+    private String continent;
+
+    @ApiModelProperty("启用/禁用(USER_ENABLED_OR_DISABLED)")
+    private Integer isEnabled;
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/film/AiContentTaskConfigVO.java b/src/main/java/com/mzl/flower/dto/response/film/AiContentTaskConfigVO.java
new file mode 100644
index 0000000..e848a96
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/film/AiContentTaskConfigVO.java
@@ -0,0 +1,43 @@
+package com.mzl.flower.dto.response.film;
+
+import com.mzl.flower.base.AbstractTransDTO;
+import com.mzl.flower.base.annotation.DictTrans;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+
+
+@Data
+public class AiContentTaskConfigVO extends AbstractTransDTO {
+    private Long id;
+
+    private String taskName;
+    private String aiParams;
+    private String cron;
+    /**
+     * 状态(0禁用,1启用)
+     */
+    private Boolean isEnabled;
+    private Date lastRunTime;
+
+    /**
+     * 创建者ID
+     */
+    private String createBy;
+
+    /**
+     * 最后修改者ID
+     */
+    private String updateBy;
+
+
+    private String type;
+
+    private String promptArticle;
+    private String promptRoute;
+    private String promptTravel;
+    private String promptLocaltion;
+
+
+}
diff --git a/src/main/java/com/mzl/flower/dto/response/film/FilmHotCityVO.java b/src/main/java/com/mzl/flower/dto/response/film/FilmHotCityVO.java
new file mode 100644
index 0000000..009a8e8
--- /dev/null
+++ b/src/main/java/com/mzl/flower/dto/response/film/FilmHotCityVO.java
@@ -0,0 +1,33 @@
+package com.mzl.flower.dto.response.film;
+
+import com.mzl.flower.base.AbstractTransDTO;
+import com.mzl.flower.base.annotation.DictTrans;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+@Data
+public class FilmHotCityVO extends AbstractTransDTO {
+
+    private Long id;
+
+    @ApiModelProperty("城市名称")
+    private String name;
+
+    @ApiModelProperty("城市URL")
+    private String cityUrl;
+
+    @ApiModelProperty("国家")
+    private String country;
+
+    @ApiModelProperty("洲")
+    private String continent;
+
+    @ApiModelProperty("是否锁定")
+    private Boolean isEnabled;
+
+    @ApiModelProperty("热度")
+    private Integer cityWeight;
+}
diff --git a/src/main/java/com/mzl/flower/entity/film/AiContentTaskConfig.java b/src/main/java/com/mzl/flower/entity/film/AiContentTaskConfig.java
new file mode 100644
index 0000000..e39a0b8
--- /dev/null
+++ b/src/main/java/com/mzl/flower/entity/film/AiContentTaskConfig.java
@@ -0,0 +1,33 @@
+package com.mzl.flower.entity.film;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.mzl.flower.base.BaseAutoEntity;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 模型任务配置表
+ *
+ * @author generator@Fang
+ * @since 2025-07-01
+ */
+@Data
+@TableName("ai_content_task_config")
+public class AiContentTaskConfig extends BaseAutoEntity {
+    private String taskName;
+    private String aiParams;
+    private String cron;
+    /**
+     * 状态(0禁用,1启用)
+     */
+    private Boolean isEnabled;
+    private Date lastRunTime;
+    private String type;
+
+    private String promptArticle;
+    private String promptRoute;
+    private String promptTravel;
+    private String promptLocaltion;
+
+}
diff --git a/src/main/java/com/mzl/flower/entity/film/FilmHotCity.java b/src/main/java/com/mzl/flower/entity/film/FilmHotCity.java
new file mode 100644
index 0000000..ee28d54
--- /dev/null
+++ b/src/main/java/com/mzl/flower/entity/film/FilmHotCity.java
@@ -0,0 +1,24 @@
+package com.mzl.flower.entity.film;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.mzl.flower.base.BaseAutoEntity;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * FilmHotCity热门城市表
+ *
+ * @author generator@Fang
+ * @since 2025-07-01
+ */
+@Data
+@TableName("film_hot_city")
+public class FilmHotCity extends BaseAutoEntity {
+    private String name;
+    private String cityUrl;
+    private String country;
+    private String continent;
+    private Boolean isEnabled;
+    private Integer cityWeight;
+}
diff --git a/src/main/java/com/mzl/flower/mapper/film/FilmHotCityMapper.java b/src/main/java/com/mzl/flower/mapper/film/FilmHotCityMapper.java
new file mode 100644
index 0000000..3116bd7
--- /dev/null
+++ b/src/main/java/com/mzl/flower/mapper/film/FilmHotCityMapper.java
@@ -0,0 +1,29 @@
+package com.mzl.flower.mapper.film;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.dto.request.film.FilmHotCityQueryDTO;
+import com.mzl.flower.dto.response.film.FilmHotCityVO;
+import com.mzl.flower.entity.film.FilmHotCity;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+/**
+ * <p>
+ * FilmHotCity热门城市 Mapper 接口
+ * </p>
+ *
+ * @author generator@Fang
+ */
+public interface FilmHotCityMapper extends BaseMapper<FilmHotCity> {
+
+    List<FilmHotCityVO> queryPage(@Param("dto") FilmHotCityQueryDTO dto, Page page);
+
+    @Select("select * from film_hot_city where  name  = #{name} and deleted = '0' limit 1 ")
+    FilmHotCity selectByName(@Param("name") String name);
+
+    @Select("select * from film_hot_city where  id  = #{id} ")
+    FilmHotCityVO selectByIdInfo(Long id);
+}
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 85c6cc1..1aa3157 100644
--- a/src/main/java/com/mzl/flower/mapper/film/FilmLocationMapper.java
+++ b/src/main/java/com/mzl/flower/mapper/film/FilmLocationMapper.java
@@ -42,4 +42,8 @@
             "</script>")
     @MapKey("id")
     Map<Long, FilmLocationNameDTO> getLocationNamesByIds(@Param("list") List<Long> ids);
+
+
+    @Select("select * from film_location where  is_enabled = '1' and deleted = '0' order by location_weight desc  limit 3")
+    List<FilmLocationVO> getFilmLocationListTop3();
 }
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 6ca94f4..8607791 100644
--- a/src/main/java/com/mzl/flower/mapper/film/FilmLocationWorkMapper.java
+++ b/src/main/java/com/mzl/flower/mapper/film/FilmLocationWorkMapper.java
@@ -1,6 +1,7 @@
 package com.mzl.flower.mapper.film;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.mzl.flower.dto.response.film.FilmLocationVO;
 import com.mzl.flower.entity.film.FilmLocationWork;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
@@ -35,4 +36,6 @@
             "</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 89f70b4..3aeff4b 100644
--- a/src/main/java/com/mzl/flower/mapper/film/FilmWorksMapper.java
+++ b/src/main/java/com/mzl/flower/mapper/film/FilmWorksMapper.java
@@ -47,4 +47,7 @@
             "</script>")
     @MapKey("id")
     List<FilmWorksVO> getFilmWorksByIds(@Param("list") List<Long> ids);
+
+    @Select("select * from  film_works where deleted = '0' and name_cn = #{nameCn} and type = #{type} and release_year = #{releaseYear} limit 1")
+    FilmWorks getFilmWorksByName(@Param("nameCn") String nameCn, @Param("type")String type, @Param("releaseYear") String releaseYear);
 }
diff --git a/src/main/java/com/mzl/flower/schedule/DynamicTaskManager.java b/src/main/java/com/mzl/flower/schedule/DynamicTaskManager.java
index 3db0e8a..1195cf6 100644
--- a/src/main/java/com/mzl/flower/schedule/DynamicTaskManager.java
+++ b/src/main/java/com/mzl/flower/schedule/DynamicTaskManager.java
@@ -1,6 +1,7 @@
 package com.mzl.flower.schedule;
 
 import com.mzl.flower.entity.film.AiContentTaskConfig;
+import com.mzl.flower.mapper.film.AiContentTaskConfigMapper;
 import com.mzl.flower.service.film.AiContentTaskConfigService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
@@ -8,6 +9,7 @@
 import org.springframework.stereotype.Component;
 
 import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ScheduledFuture;
@@ -19,8 +21,8 @@
 
     @Autowired
     private ThreadPoolTaskScheduler taskScheduler;
-    @Autowired
-    private AiContentTaskConfigService configService;
+    @Resource
+    private AiContentTaskConfigMapper aiContentTaskConfigMapper;
     @Autowired
     private TaskExecutor taskExecutor;
 
@@ -30,7 +32,7 @@
     }
 
     public synchronized void refreshTasks() {
-        List<AiContentTaskConfig> latestConfigs = configService.getEnabledConfigs();
+        List<AiContentTaskConfig> latestConfigs = aiContentTaskConfigMapper.getAiContentTaskConfigAll();
         Set<Long> latestIds = latestConfigs.stream()
                 .map(AiContentTaskConfig::getId)
                 .collect(Collectors.toSet());
diff --git a/src/main/java/com/mzl/flower/schedule/TaskExecutor.java b/src/main/java/com/mzl/flower/schedule/TaskExecutor.java
index 04e82d6..e16fbda 100644
--- a/src/main/java/com/mzl/flower/schedule/TaskExecutor.java
+++ b/src/main/java/com/mzl/flower/schedule/TaskExecutor.java
@@ -1,11 +1,13 @@
 package com.mzl.flower.schedule;
 
+import com.mzl.flower.constant.Constants;
 import com.mzl.flower.entity.film.AiContentTaskConfig;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
+import org.springframework.util.StringUtils;
 import org.springframework.web.client.RestTemplate;
 
 import java.util.Date;
@@ -28,9 +30,16 @@
         System.out.println("定时任务执行 - 时间: " + new Date());
 
         try {
-//            String aiResult = callPythonAiService(paramsJson);
-//            System.out.println("AI 服务返回结果: " + aiResult);
             System.out.println("开始执行调用AI服务: ");
+            if(Constants.GENERATOR_CONTENT.film_content.name().equals(config.getType())){
+                System.out.println("开始执行调用内容生成服务: ");
+                String aiResult = callPythonContentService(paramsJson);
+                System.out.println("AI 服务返回结果: " + aiResult);
+            }else{
+                System.out.println("开始执行调用作品名称生成服务: ");
+                String aiResult = callPythonFilmNameService(paramsJson);
+                System.out.println("AI 服务返回结果: " + aiResult);
+            }
             // 这里处理结果入库逻辑...
         } catch (Exception e) {
             System.err.println("调用 AI 服务失败: " + e.getMessage());
@@ -38,8 +47,24 @@
         }
     }
 
-    public String callPythonAiService(String paramsJson) {
-        String url = "http://127.0.0.1:5000/crawl-douban";
+    public String callPythonFilmNameService(String paramsJson) {
+        System.out.println("开始执行调用python crawl: ");
+        String url = "http://14.103.144.28:5000/crawl-douban";
+
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+
+        HttpEntity<String> request = new HttpEntity<>(paramsJson, headers);
+
+        ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);
+
+        return response.getBody();
+    }
+
+    public String callPythonContentService(String paramsJson) {
+        System.out.println("开始执行调用python generate: ");
+//        String url = "http://192.168.1.213:5000/generate-film-content";
+        String url = "http://14.103.144.28:5000/generate-film-content";
 
         HttpHeaders headers = new HttpHeaders();
         headers.setContentType(MediaType.APPLICATION_JSON);
diff --git a/src/main/java/com/mzl/flower/service/film/AiContentTaskConfigService.java b/src/main/java/com/mzl/flower/service/film/AiContentTaskConfigService.java
new file mode 100644
index 0000000..fa392bf
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/film/AiContentTaskConfigService.java
@@ -0,0 +1,39 @@
+package com.mzl.flower.service.film;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.mzl.flower.dto.BatchDTO;
+import com.mzl.flower.dto.request.film.AiContentTaskConfigDTO;
+import com.mzl.flower.dto.request.film.AiContentTaskConfigQueryDTO;
+import com.mzl.flower.dto.response.film.AiContentTaskConfigVO;
+import com.mzl.flower.entity.film.AiContentTaskConfig;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 模型任务配置表 服务类
+ * </p>
+ *
+ * @author generator@Fang
+ * @since 2025-05-19
+ */
+public interface AiContentTaskConfigService extends IService<AiContentTaskConfig> {
+    List<AiContentTaskConfigVO> getAiContentTaskConfigAll();
+    List<AiContentTaskConfigVO> getEnabledAiContentTaskConfig();
+
+    Page<AiContentTaskConfigVO> queryPage(AiContentTaskConfigQueryDTO aiContentTaskConfigQueryDTO, Page page);
+
+    void deleteAiContentTaskConfig(String id);
+
+    void saveAiContentTaskConfig(AiContentTaskConfigDTO aiContentTaskConfigDTO);
+
+    void updateAiContentTaskConfig(AiContentTaskConfigDTO aiContentTaskConfigDTO);
+
+    AiContentTaskConfigVO detail(Long id);
+
+    //获取配置信息
+    List<AiContentTaskConfig> getEnabledConfigs();
+
+    void batchDelete(BatchDTO dto);
+}
diff --git a/src/main/java/com/mzl/flower/service/film/FilmHotCityService.java b/src/main/java/com/mzl/flower/service/film/FilmHotCityService.java
new file mode 100644
index 0000000..114fc29
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/film/FilmHotCityService.java
@@ -0,0 +1,33 @@
+package com.mzl.flower.service.film;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.mzl.flower.dto.BatchDTO;
+import com.mzl.flower.dto.request.film.FilmHotCityDTO;
+import com.mzl.flower.dto.request.film.FilmHotCityQueryDTO;
+import com.mzl.flower.dto.response.film.FilmHotCityVO;
+import com.mzl.flower.dto.response.film.FilmWorksVO;
+import com.mzl.flower.entity.film.FilmHotCity;
+
+import java.util.List;
+
+/**
+ * <p>
+ * FilmHotCity热门城市表 服务类
+ * </p>
+ *
+ * @author generator@Fang
+ */
+public interface FilmHotCityService extends IService<FilmHotCity> {
+
+
+    void saveFilmHotCity(FilmHotCityDTO filmHotCityDTO);
+
+    void updateFilmHotCity(FilmHotCityDTO filmHotCityDTO);
+    void deleteFilmHotCity(String id);
+    Page<FilmHotCityVO> queryPage(FilmHotCityQueryDTO filmHotCityQueryDTO, Page page);
+    FilmHotCityVO detail(Long id);
+    void isEnable(Long id);
+    void batchDelete(BatchDTO dto);
+
+}
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 0f6f95c..5fdab4d 100644
--- a/src/main/java/com/mzl/flower/service/film/FilmLocationService.java
+++ b/src/main/java/com/mzl/flower/service/film/FilmLocationService.java
@@ -40,4 +40,6 @@
     void batchDelete(BatchDTO dto);
 
     List<FilmWorksVO> related(Long locationId);
+
+    List<FilmLocationVO> getFilmLocationListTop3();
 }
diff --git a/src/main/java/com/mzl/flower/service/film/impl/AiContentTaskConfigServiceImpl.java b/src/main/java/com/mzl/flower/service/film/impl/AiContentTaskConfigServiceImpl.java
new file mode 100644
index 0000000..7deda13
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/film/impl/AiContentTaskConfigServiceImpl.java
@@ -0,0 +1,175 @@
+package com.mzl.flower.service.film.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+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.AiContentTaskConfigDTO;
+import com.mzl.flower.dto.request.film.AiContentTaskConfigQueryDTO;
+import com.mzl.flower.dto.response.film.AiContentTaskConfigVO;
+import com.mzl.flower.entity.film.AiContentTaskConfig;
+import com.mzl.flower.entity.system.Role;
+import com.mzl.flower.mapper.customer.CustomerMapper;
+import com.mzl.flower.mapper.film.AiContentTaskConfigMapper;
+import com.mzl.flower.schedule.DynamicTaskManager;
+import com.mzl.flower.service.film.AiContentTaskConfigService;
+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.transaction.support.TransactionSynchronization;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * <p>
+ * 影视作品信息表 服务实现类
+ * </p>
+ *
+ * @author generator@Fang
+ * @since 2025-05-19
+ */
+@Service
+@Transactional
+@RequiredArgsConstructor
+public class AiContentTaskConfigServiceImpl extends ServiceImpl<AiContentTaskConfigMapper, AiContentTaskConfig> implements AiContentTaskConfigService {
+
+    private final AiContentTaskConfigMapper aiContentTaskConfigMapper;
+    private final CustomerMapper customerMapper;
+    private final RoleService roleService;
+
+    private final DynamicTaskManager dynamicTaskManager;
+
+    @Override
+    public List<AiContentTaskConfigVO> getAiContentTaskConfigAll() {
+        return aiContentTaskConfigMapper.getAiContentTaskConfigAllInfo();
+    }
+
+    @Override
+    public List<AiContentTaskConfigVO> getEnabledAiContentTaskConfig() {
+        return aiContentTaskConfigMapper.getEnabledAiContentTaskConfig();
+    }
+
+    @Override
+    public Page<AiContentTaskConfigVO> queryPage(AiContentTaskConfigQueryDTO dto, Page page) {
+        List<AiContentTaskConfigVO> list = aiContentTaskConfigMapper.queryPage(dto, page);
+        // 测试前端展示用代码,部署发布不适用
+        page.setRecords(list);
+
+        return page;
+    }
+
+    @Override
+    @Transactional
+    public void deleteAiContentTaskConfig(String id) {
+        AiContentTaskConfig filmWork = aiContentTaskConfigMapper.selectById(id);
+        if (filmWork == null) {
+            throw new ValidationException("找不到id为" + id + "的影视作品");
+        }
+        aiContentTaskConfigMapper.deleteById(id);
+        dynamicTaskManager.refreshTasks(); // 每次删除后刷新定时任务
+
+        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
+            @Override
+            public void afterCommit() {
+                dynamicTaskManager.refreshTasks();
+            }
+        });
+    }
+
+
+    @Override
+    @Transactional
+    public void saveAiContentTaskConfig(AiContentTaskConfigDTO aiContentTaskConfigDTO) {
+        //获取当前人员角色,判断是不是编辑角色
+        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("非编辑角色不能新增");
+//        }
+        //  转换
+        AiContentTaskConfig aiContentTaskConfig = new AiContentTaskConfig();
+        BeanUtils.copyProperties(aiContentTaskConfigDTO, aiContentTaskConfig);
+        aiContentTaskConfig.create();
+        aiContentTaskConfigMapper.insert(aiContentTaskConfig);
+
+        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
+            @Override
+            public void afterCommit() {
+                dynamicTaskManager.refreshTasks();
+            }
+        });
+    }
+
+    @Override
+    @Transactional
+    public void updateAiContentTaskConfig(AiContentTaskConfigDTO aiContentTaskConfigDTO) {
+        AiContentTaskConfig aiContentTaskConfig = new AiContentTaskConfig();
+
+        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("非编辑角色不能修改");
+//        }
+        aiContentTaskConfig = aiContentTaskConfigMapper.selectById(aiContentTaskConfigDTO.getId());
+        BeanUtils.copyProperties(aiContentTaskConfigDTO, aiContentTaskConfig,"type");
+        aiContentTaskConfig.update(SecurityUtils.getUserId());
+
+        aiContentTaskConfigMapper.updateById(aiContentTaskConfig);
+        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
+            @Override
+            public void afterCommit() {
+                dynamicTaskManager.refreshTasks();
+            }
+        });
+    }
+
+
+    @Override
+    public AiContentTaskConfigVO detail(Long id) {
+        // userId 可以是空,因为用户可以登录
+
+        String userId = SecurityUtils.getUserId();
+        AiContentTaskConfigVO aiContentTaskConfigVO = aiContentTaskConfigMapper.selectInfoById(id, userId);
+        if (aiContentTaskConfigVO == null) {
+            return null;
+        }
+//        CustomerDTO currentCustomer = customerMapper.getCurrentCustomer(aiContentTaskConfigVO.getCreateBy());
+//        if (!ObjectUtils.isEmpty(currentCustomer)) {
+//            aiContentTaskConfigVO.setNickname(currentCustomer.getNickName());
+//            aiContentTaskConfigVO.setAvatar(currentCustomer.getCover());
+//        }
+
+        return aiContentTaskConfigVO;
+    }
+
+    @Override
+    public List<AiContentTaskConfig> getEnabledConfigs() {
+        return aiContentTaskConfigMapper.getAiContentTaskConfigAll();
+    }
+
+    @Override
+    @Transactional
+    public void batchDelete(BatchDTO dto) {
+        aiContentTaskConfigMapper.deleteBatchIds(dto.getIds());
+
+        TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
+            @Override
+            public void afterCommit() {
+                dynamicTaskManager.refreshTasks();
+            }
+        });
+    }
+
+
+}
diff --git a/src/main/java/com/mzl/flower/service/film/impl/FilmHotCityServiceImpl.java b/src/main/java/com/mzl/flower/service/film/impl/FilmHotCityServiceImpl.java
new file mode 100644
index 0000000..da0f4ec
--- /dev/null
+++ b/src/main/java/com/mzl/flower/service/film/impl/FilmHotCityServiceImpl.java
@@ -0,0 +1,132 @@
+package com.mzl.flower.service.film.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+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.FilmHotCityDTO;
+import com.mzl.flower.dto.request.film.FilmHotCityQueryDTO;
+import com.mzl.flower.dto.response.film.FilmHotCityVO;
+import com.mzl.flower.entity.film.FilmHotCity;
+import com.mzl.flower.mapper.film.FilmHotCityMapper;
+import com.mzl.flower.mapper.film.FilmWorksMapper;
+import com.mzl.flower.service.film.FilmHotCityService;
+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.*;
+
+/**
+ * <p>
+ * FilmHotCity热门城市表 服务实现类
+ * </p>
+ *
+ * @author generator@Fang
+ * @since 2025-05-20
+ */
+@Service
+@Transactional
+@RequiredArgsConstructor
+public class FilmHotCityServiceImpl extends ServiceImpl<FilmHotCityMapper, FilmHotCity> implements FilmHotCityService {
+
+    private final FilmHotCityMapper filmHotCityMapper;
+    private final RoleService roleService;
+    private final FilmWorksMapper filmWorksMapper;
+
+    @Override
+    public void saveFilmHotCity(FilmHotCityDTO filmHotCityDTO) {
+        //  转换
+        //增加保存时判断是否有城市名称
+        if (StringUtils.isEmpty(filmHotCityDTO.getName())) {
+            throw new ValidationException("城市名称不能为空");
+        }
+        FilmHotCity filmHotCity1 = filmHotCityMapper.selectByName(filmHotCityDTO.getName());
+        if (!ObjectUtils.isEmpty(filmHotCity1)) {
+            throw new ValidationException("城市名称重复");
+        }
+        FilmHotCity filmHotCity = new FilmHotCity();
+        BeanUtils.copyProperties(filmHotCityDTO, filmHotCity);
+        filmHotCity.setIsEnabled(false);
+        filmHotCity.create();
+        filmHotCityMapper.insert(filmHotCity);
+    }
+
+    @Override
+    public void updateFilmHotCity(FilmHotCityDTO filmHotCityDTO) {
+        if (StringUtils.isEmpty(filmHotCityDTO.getName())) {
+            throw new ValidationException("城市名称不能为空");
+        }
+
+        //增加修改时保存得城市名称是否有重复,排除当前这条
+        FilmHotCity filmHotCity1 = filmHotCityMapper.selectByName(filmHotCityDTO.getName());
+
+        FilmHotCity filmHotCity = filmHotCityMapper.selectById(filmHotCityDTO.getId());
+        if (!filmHotCity1.getId().equals(filmHotCity.getId())) {
+            throw new ValidationException("城市名称重复");
+        }
+        BeanUtils.copyProperties(filmHotCityDTO, filmHotCity, "isEnabled");
+        filmHotCity.update(SecurityUtils.getUserId());
+        filmHotCityMapper.updateById(filmHotCity);
+    }
+
+    @Override
+    public void deleteFilmHotCity(String id) {
+        FilmHotCity filmHotCity = filmHotCityMapper.selectById(id);
+        if (filmHotCity == null) {
+            throw new ValidationException("找不到id为" + id + "的城市");
+        }
+        filmHotCityMapper.deleteById(id);
+    }
+
+    @Override
+    public Page<FilmHotCityVO> queryPage(FilmHotCityQueryDTO dto, Page page) {
+
+        List<FilmHotCityVO> list = filmHotCityMapper.queryPage(dto, page);
+        page.setRecords(list);
+        return page;
+    }
+
+    @Override
+    public FilmHotCityVO detail(Long id) {
+        FilmHotCityVO filmHotCityVO = filmHotCityMapper.selectByIdInfo(id);
+        if (filmHotCityVO == null) {
+            return null;
+        }
+        return filmHotCityVO;
+    }
+
+
+    @Override
+    public void isEnable(Long id) {
+        FilmHotCity filmHotCity = filmHotCityMapper.selectById(id);
+        if (filmHotCity == null) {
+            throw new ValidationException("找不到id为" + id + "的城市");
+        }
+        if (filmHotCity.getIsEnabled()) {
+            filmHotCity.setIsEnabled(false);
+        } else {
+            filmHotCity.setIsEnabled(true);
+        }
+        filmHotCity.update(SecurityUtils.getUserId());
+        filmHotCityMapper.updateById(filmHotCity);
+    }
+
+
+    @Override
+    @Transactional
+    public void batchDelete(BatchDTO dto) {
+        if (CollectionUtils.isEmpty(dto.getIds())) {
+            throw new ValidationException("删除ID列表不能为空");
+        }
+        filmHotCityMapper.deleteBatchIds(dto.getIds());
+    }
+
+
+}
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 4528c16..507a3d3 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
@@ -66,6 +66,13 @@
         BeanUtils.copyProperties(filmLocationDTO, filmLocation);
         filmLocation.create();
         filmLocationMapper.insert(filmLocation);
+        //此处传入参数是否有影视作品ID,如果不等于空,则需要保存关联关系
+        if (!StringUtils.isEmpty(filmLocationDTO.getFilmId())) {
+            FilmLocationWork filmLocationWork = new FilmLocationWork();
+            filmLocationWork.setFilmId(filmLocationDTO.getFilmId());
+            filmLocationWork.setLocationId(filmLocation.getId());
+            filmLocationWorkMapper.insert(filmLocationWork);
+        }
     }
 
     @Override
@@ -238,6 +245,11 @@
         }
     }
 
+    @Override
+    public List<FilmLocationVO> getFilmLocationListTop3() {
+        return filmLocationMapper.getFilmLocationListTop3();
+    }
+
     private void updateLocationRelations(Long targetId, List<Long> mergeIds) {
         // 查询所有待更新的工作记录
         LambdaQueryWrapper<FilmLocationWork> query = new LambdaQueryWrapper<>();
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 e6e0575..f777319 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
@@ -62,11 +62,16 @@
         if (!roleIds.contains("8f9ef89f6b2d4d8e9ea1fc8d2f25ce69")) {
             throw new ValidationException("非编辑角色不能新增");
         }
+        // 判断系统是否存在重复的名称+类型+年份,如果有就不保存
+        FilmWorks filmWorksByName = filmWorksMapper.getFilmWorksByName(filmWorksDTO.getNameCn(), filmWorksDTO.getType(), filmWorksDTO.getReleaseYear());
+        if (!ObjectUtils.isEmpty(filmWorksByName)) {
+            throw new ValidationException("系统已存在名称为【" + filmWorksDTO.getNameCn() + "】,类型为【" + filmWorksDTO.getType() + "】,年份为【" + filmWorksDTO.getReleaseYear() + "】的影视作品");
+        }
         //  转换
         FilmWorks filmWorks = new FilmWorks();
         BeanUtils.copyProperties(filmWorksDTO, filmWorks);
         filmWorks.create();
-        filmWorks.setStatus(Constants.COMMON_PUBLISH_STATUS.pending_review.name());
+        filmWorks.setStatus(Constants.COMMON_PUBLISH_STATUS.pending_create.name());
         filmWorksMapper.insert(filmWorks);
     }
 
diff --git a/src/main/java/com/mzl/flower/service/system/WeChatService.java b/src/main/java/com/mzl/flower/service/system/WeChatService.java
index 51c39d0..ee2fa99 100644
--- a/src/main/java/com/mzl/flower/service/system/WeChatService.java
+++ b/src/main/java/com/mzl/flower/service/system/WeChatService.java
@@ -166,22 +166,29 @@
             throw new ValidationException("微信code为空");
         }
 
-        String accessToken="";
-        try {
-            accessToken=maService.getAccessToken();
-        } catch (WxErrorException e) {
-            throw new RuntimeException(e);
-        }
+//        String accessToken="";
+//        try {
+//            accessToken=maService.getAccessToken();
+//        } catch (WxErrorException e) {
+//            throw new RuntimeException(e);
+//        }
+//
+//        if(StringUtils.isEmpty(accessToken)){
+//            accessToken=getAccessToken(
+//                    wxMiniappProperties.getCustomer().getAppid(),
+//                    wxMiniappProperties.getCustomer().getSecret());
+//            if(StringUtils.isEmpty(accessToken)){
+//                throw new ValidationException("获取微信AccessToken失败");
+//            }
+//        }
+        // 直接使用手动获取token的方式(跳过WxMaService的token)
+        String accessToken = getAccessToken(
+                wxMiniappProperties.getCustomer().getAppid(),
+                wxMiniappProperties.getCustomer().getSecret());
 
         if(StringUtils.isEmpty(accessToken)){
-            accessToken=getAccessToken(
-                    wxMiniappProperties.getCustomer().getAppid(),
-                    wxMiniappProperties.getCustomer().getSecret());
-            if(StringUtils.isEmpty(accessToken)){
-                throw new ValidationException("获取微信AccessToken失败");
-            }
+            throw new ValidationException("获取微信AccessToken失败");
         }
-
 
         String url = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token="+ accessToken;
         try{
diff --git a/src/main/java/com/mzl/flower/web/film/AiContentTaskConfigController.java b/src/main/java/com/mzl/flower/web/film/AiContentTaskConfigController.java
new file mode 100644
index 0000000..8158160
--- /dev/null
+++ b/src/main/java/com/mzl/flower/web/film/AiContentTaskConfigController.java
@@ -0,0 +1,81 @@
+package com.mzl.flower.web.film;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.base.BaseController;
+import com.mzl.flower.base.R;
+import com.mzl.flower.base.ReturnDataDTO;
+import com.mzl.flower.constant.Constants;
+import com.mzl.flower.dto.request.film.AiContentTaskConfigDTO;
+import com.mzl.flower.dto.request.film.AiContentTaskConfigQueryDTO;
+import com.mzl.flower.dto.response.film.AiContentTaskConfigVO;
+import com.mzl.flower.schedule.TaskExecutor;
+import com.mzl.flower.service.film.AiContentTaskConfigService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+ * @author fanghaowei
+ * @version version2.0
+ * @className FilmWorksController
+ * @date 2024/8/26
+ * @description 模型任务配置
+ */
+@Api(value = "模型任务配置", tags = "模型任务配置")
+@RestController
+@RequestMapping("/api")
+@RequiredArgsConstructor
+public class AiContentTaskConfigController extends BaseController {
+
+    private final AiContentTaskConfigService aiContentTaskConfigService;
+    private final TaskExecutor taskExecutor;
+
+    @GetMapping("/aiTaskConfig/all")
+    @ApiOperation(value = "模型任务配置列表", httpMethod = "GET")
+    public ResponseEntity<ReturnDataDTO<List<AiContentTaskConfigVO>>> getFilmWorksAll() {
+        return returnData(R.SUCCESS.getCode(), aiContentTaskConfigService.getEnabledAiContentTaskConfig());
+    }
+
+    @GetMapping("/aiTaskConfig/list")
+    @ApiOperation(value = "模型任务配置列表", httpMethod = "GET")
+    public ResponseEntity<ReturnDataDTO<Page<AiContentTaskConfigVO>>> getFilmWorksList(Page page, AiContentTaskConfigQueryDTO dto) {
+        dto.setType(Constants.GENERATOR_CONTENT.film_content.name());
+        return returnData(R.SUCCESS.getCode(), aiContentTaskConfigService.queryPage(dto, page));
+    }
+
+
+    @GetMapping(value = "/aiTaskConfig/delete")
+    @ApiOperation(value = "删除模型任务配置 ", httpMethod = "GET", notes = "ID")
+    public ResponseEntity delete(@NotNull(message = "id不能为空") Long id) {
+        aiContentTaskConfigService.deleteAiContentTaskConfig(String.valueOf(id));
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @PostMapping(value = "/aiTaskConfig/new")
+    @ApiOperation(value = "保存模型任务配置", httpMethod = "POST")
+    public ResponseEntity insert(@RequestBody AiContentTaskConfigDTO aiContentTaskConfigDTO) {
+        aiContentTaskConfigDTO.setType(Constants.GENERATOR_CONTENT.film_content.name());
+        aiContentTaskConfigService.saveAiContentTaskConfig(aiContentTaskConfigDTO);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @PostMapping(value = "/aiTaskConfig/edit")
+    @ApiOperation(value = "更新模型任务配置", httpMethod = "POST")
+    public ResponseEntity update(@RequestBody AiContentTaskConfigDTO aiContentTaskConfigDTO) {
+        aiContentTaskConfigService.updateAiContentTaskConfig(aiContentTaskConfigDTO);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @GetMapping("/aiTaskConfig/list/view")
+    @ApiOperation(value = "详情", notes = "详情")
+    public ResponseEntity<ReturnDataDTO<AiContentTaskConfigVO>> detail(@NotNull(message = "id不能为空") Long id) {
+        return returnData(R.SUCCESS.getCode(),aiContentTaskConfigService.detail(id));
+    }
+
+}
+
diff --git a/src/main/java/com/mzl/flower/web/film/FilmContentTaskConfigController.java b/src/main/java/com/mzl/flower/web/film/FilmContentTaskConfigController.java
new file mode 100644
index 0000000..f374c03
--- /dev/null
+++ b/src/main/java/com/mzl/flower/web/film/FilmContentTaskConfigController.java
@@ -0,0 +1,91 @@
+package com.mzl.flower.web.film;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.mzl.flower.base.BaseController;
+import com.mzl.flower.base.R;
+import com.mzl.flower.base.ReturnDataDTO;
+import com.mzl.flower.constant.Constants;
+import com.mzl.flower.dto.BatchDTO;
+import com.mzl.flower.dto.request.film.AiContentTaskConfigDTO;
+import com.mzl.flower.dto.request.film.AiContentTaskConfigQueryDTO;
+import com.mzl.flower.dto.response.film.AiContentTaskConfigVO;
+import com.mzl.flower.schedule.TaskExecutor;
+import com.mzl.flower.service.film.AiContentTaskConfigService;
+import io.swagger.annotations.Api;
+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;
+import java.util.List;
+
+/**
+ * @author fanghaowei
+ * @version version2.0
+ * @className FilmWorksController
+ * @date 2024/8/26
+ * @description 影视作品任务配置
+ */
+@Api(value = "影视作品任务配置", tags = "影视作品任务配置")
+@RestController
+@RequestMapping("/api")
+@RequiredArgsConstructor
+public class FilmContentTaskConfigController extends BaseController {
+
+    private final AiContentTaskConfigService aiContentTaskConfigService;
+    private final TaskExecutor taskExecutor;
+
+    @GetMapping("/filmTaskConfig/all")
+    @ApiOperation(value = "影视作品任务配置列表", httpMethod = "GET")
+    public ResponseEntity<ReturnDataDTO<List<AiContentTaskConfigVO>>> getFilmWorksAll() {
+        return returnData(R.SUCCESS.getCode(), aiContentTaskConfigService.getAiContentTaskConfigAll());
+    }
+
+    @GetMapping("/filmTaskConfig/list")
+    @ApiOperation(value = "影视作品任务配置列表", httpMethod = "GET")
+    public ResponseEntity<ReturnDataDTO<Page<AiContentTaskConfigVO>>> getFilmWorksList(Page page, AiContentTaskConfigQueryDTO dto) {
+        dto.setType(Constants.GENERATOR_CONTENT.film_name.name());
+        return returnData(R.SUCCESS.getCode(), aiContentTaskConfigService.queryPage(dto, page));
+    }
+
+
+    @GetMapping(value = "/filmTaskConfig/delete")
+    @ApiOperation(value = "删除影视作品任务配置 ", httpMethod = "GET", notes = "ID")
+    public ResponseEntity delete(@NotNull(message = "id不能为空") Long id) {
+        aiContentTaskConfigService.deleteAiContentTaskConfig(String.valueOf(id));
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @PostMapping(value = "/filmTaskConfig/new")
+    @ApiOperation(value = "保存影视作品任务配置", httpMethod = "POST")
+    public ResponseEntity insert(@RequestBody AiContentTaskConfigDTO aiContentTaskConfigDTO) {
+        aiContentTaskConfigDTO.setType(Constants.GENERATOR_CONTENT.film_name.name());
+        aiContentTaskConfigService.saveAiContentTaskConfig(aiContentTaskConfigDTO);
+//        taskExecutor.callPythonAiService(aiContentTaskConfigDTO.getAiParams());
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @PostMapping(value = "/filmTaskConfig/edit")
+    @ApiOperation(value = "更新影视作品任务配置", httpMethod = "POST")
+    public ResponseEntity update(@RequestBody AiContentTaskConfigDTO aiContentTaskConfigDTO) {
+        aiContentTaskConfigService.updateAiContentTaskConfig(aiContentTaskConfigDTO);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @GetMapping("/filmTaskConfig/list/view")
+    @ApiOperation(value = "详情", notes = "详情")
+    public ResponseEntity<ReturnDataDTO<AiContentTaskConfigVO>> detail(@NotNull(message = "id不能为空") Long id) {
+        return returnData(R.SUCCESS.getCode(),aiContentTaskConfigService.detail(id));
+    }
+
+    @PostMapping("/filmTaskConfig/delete/batch")
+    @ApiOperation(value = "批量删除", notes = "批量删除")
+    public ResponseEntity<ReturnDataDTO> batchDelete(@Validated @RequestBody BatchDTO dto) {
+        aiContentTaskConfigService.batchDelete(dto);
+        return returnData(R.SUCCESS.getCode(),null);
+    }
+
+}
+
diff --git a/src/main/java/com/mzl/flower/web/film/FilmHotCityController.java b/src/main/java/com/mzl/flower/web/film/FilmHotCityController.java
new file mode 100644
index 0000000..dfc4c01
--- /dev/null
+++ b/src/main/java/com/mzl/flower/web/film/FilmHotCityController.java
@@ -0,0 +1,87 @@
+package com.mzl.flower.web.film;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+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.FilmHotCityDTO;
+import com.mzl.flower.dto.request.film.FilmHotCityQueryDTO;
+import com.mzl.flower.dto.response.film.FilmHotCityVO;
+import com.mzl.flower.service.film.FilmHotCityService;
+import io.swagger.annotations.Api;
+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;
+
+/**
+ * FilmHotCity热门城市表前端控制器
+ *
+ * @author generator@Fang
+ */
+@Api(value = "热门城市信息管理", tags = "热门城市信息管理")
+@RestController
+@RequestMapping("/api")
+@RequiredArgsConstructor
+public class FilmHotCityController extends BaseController {
+
+
+    private final FilmHotCityService filmHotCityService;
+
+    @GetMapping("/filmHotCity/list")
+    @ApiOperation(value = "热门城市列表", httpMethod = "GET")
+    public ResponseEntity<ReturnDataDTO<Page<FilmHotCityVO>>> getFilmHotCityList(Page page, FilmHotCityQueryDTO dto) {
+        return returnData(R.SUCCESS.getCode(), filmHotCityService.queryPage(dto, page));
+    }
+
+
+    @GetMapping(value = "/filmHotCity/delete")
+    @ApiOperation(value = "删除热门城市 ", httpMethod = "GET", notes = "ID")
+    public ResponseEntity delete(@NotNull(message = "id不能为空") Long id) {
+        filmHotCityService.deleteFilmHotCity(String.valueOf(id));
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @PostMapping(value = "/filmHotCity/new")
+    @ApiOperation(value = "保存热门城市", httpMethod = "POST")
+    public ResponseEntity insert(@RequestBody FilmHotCityDTO filmHotCityDTO) {
+        filmHotCityService.saveFilmHotCity(filmHotCityDTO);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @PostMapping(value = "/filmHotCity/edit")
+    @ApiOperation(value = "更新热门城市", httpMethod = "POST")
+    public ResponseEntity update(@RequestBody FilmHotCityDTO filmHotCityDTO) {
+        filmHotCityService.updateFilmHotCity(filmHotCityDTO);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+    @GetMapping("/filmHotCity/list/view")
+    @ApiOperation(value = "详情", notes = "详情")
+    public ResponseEntity<ReturnDataDTO<FilmHotCityVO>> detail(@NotNull(message = "id不能为空") Long id) {
+        return returnData(R.SUCCESS.getCode(), filmHotCityService.detail(id));
+    }
+
+
+    @GetMapping("/filmHotCity/isEnable")
+    @ApiOperation(value = "启用/禁用", notes = "启用/禁用景点")
+    public ResponseEntity<ReturnDataDTO<String>> isEnable(@NotNull(message = "id不能为空") Long id) {
+        filmHotCityService.isEnable(id);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+
+    @PostMapping("/filmHotCity/delete/batch")
+    @ApiOperation(value = "批量删除", notes = "批量删除")
+    public ResponseEntity<ReturnDataDTO> batchDelete(@Validated @RequestBody BatchDTO dto) {
+        filmHotCityService.batchDelete(dto);
+        return returnData(R.SUCCESS.getCode(), null);
+    }
+
+
+}
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 105bda5..6e98f4f 100644
--- a/src/main/java/com/mzl/flower/web/film/FilmLocationController.java
+++ b/src/main/java/com/mzl/flower/web/film/FilmLocationController.java
@@ -42,6 +42,13 @@
         return returnData(R.SUCCESS.getCode(), filmLocationService.queryPage(dto, page));
     }
 
+    @GetMapping("/filmLocation/getTop3")
+    @ApiOperation(value = "影视拍摄场地前三", httpMethod = "GET")
+    public ResponseEntity<ReturnDataDTO<List<FilmLocationVO>>> getFilmLocationListTop3() {
+        return returnData(R.SUCCESS.getCode(), filmLocationService.getFilmLocationListTop3());
+    }
+
+
     @GetMapping(value = "/filmLocation/delete")
     @ApiOperation(value = "删除影视拍摄场地 ", httpMethod = "GET", notes = "ID")
     public ResponseEntity delete(@NotNull(message = "id不能为空") Long id) {
diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml
index c70b3e0..0ff770b 100644
--- a/src/main/resources/application-test.yml
+++ b/src/main/resources/application-test.yml
@@ -39,6 +39,7 @@
   redis:
     database: 0
     host: 192.168.1.235
+#    host: 127.0.0.1
     password: 123456
     port: 6379
 
diff --git a/src/main/resources/mapper/film/AiContentTaskConfigMapper.xml b/src/main/resources/mapper/film/AiContentTaskConfigMapper.xml
new file mode 100644
index 0000000..0ada459
--- /dev/null
+++ b/src/main/resources/mapper/film/AiContentTaskConfigMapper.xml
@@ -0,0 +1,20 @@
+<?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.mzl.flower.mapper.film.AiContentTaskConfigMapper">
+
+    <select id="queryPage" resultType="com.mzl.flower.dto.response.film.AiContentTaskConfigVO">
+        select t.* from ai_content_task_config t
+        where t.deleted= 0
+        <if test="dto.taskName != null and dto.taskName != ''">
+            and t.task_name like concat('%', #{dto.taskName}, '%')
+        </if>
+        <if test="dto.type != null and dto.type != ''">
+            and t.type = #{dto.type}
+        </if>
+        <if test="dto.isEnabled!=null">
+            AND t.is_enabled = #{dto.isEnabled}
+        </if>
+
+    </select>
+
+</mapper>
diff --git a/src/main/resources/mapper/film/FilmHotCityMapper.xml b/src/main/resources/mapper/film/FilmHotCityMapper.xml
new file mode 100644
index 0000000..4b6b695
--- /dev/null
+++ b/src/main/resources/mapper/film/FilmHotCityMapper.xml
@@ -0,0 +1,27 @@
+<?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.mzl.flower.mapper.film.FilmHotCityMapper">
+
+    <select id="queryPage" resultType="com.mzl.flower.dto.response.film.FilmHotCityVO">
+        SELECT
+        t.*
+        FROM
+        film_hot_city t
+        WHERE
+        t.deleted = 0
+        <if test="dto.name != null and dto.name != ''">
+            AND t.name LIKE concat('%', #{dto.name},'%')
+        </if>
+        <if test="dto.country != null and dto.country != ''">
+            AND t.country LIKE concat('%', #{dto.country},'%')
+        </if>
+        <if test="dto.continent != null and dto.continent != ''">
+            AND t.continent LIKE concat('%', #{dto.continent},'%')
+        </if>
+        <if test="dto.isEnabled!=null">
+            AND t.is_enabled = #{dto.isEnabled}
+        </if>
+        ORDER BY
+        t.city_weight DESC
+    </select>
+</mapper>

--
Gitblit v1.9.3