Ver Fonte

自动执行计划事件任务功能

raojiang há 4 meses atrás
pai
commit
5c8a255a80
41 ficheiros alterados com 1605 adições e 211 exclusões
  1. 36 0
      api/load-transfer-bf-api/src/main/java/com/hdkj/fhzg/request/AutoTaskQueryPageRequest.java
  2. 35 0
      api/load-transfer-bf-api/src/main/java/com/hdkj/fhzg/request/AutoTaskQueryRequest.java
  3. 0 116
      api/load-transfer-bf-api/src/main/java/com/hdkj/fhzg/request/WorkOrderRequest.java
  4. 14 0
      api/load-transfer-bf-api/src/main/java/com/hdkj/fhzg/response/AutoTaskChartResponse.java
  5. 56 0
      api/load-transfer-bf-api/src/main/java/com/hdkj/fhzg/response/AutoTaskCityDetailResponse.java
  6. 58 0
      api/load-transfer-bf-api/src/main/java/com/hdkj/fhzg/response/AutoTaskCountryDetailResponse.java
  7. 20 0
      api/load-transfer-bf-api/src/main/java/com/hdkj/fhzg/response/AutoTaskFeederChangeResponse.java
  8. 29 0
      api/load-transfer-bf-api/src/main/java/com/hdkj/fhzg/response/AutoTaskFeederResponse.java
  9. 0 80
      api/load-transfer-bf-api/src/main/java/com/hdkj/fhzg/response/WorkOrderResponse.java
  10. 6 0
      api/load-transfer-mq-api/src/main/java/com/hdkj/lt/feign/IPlanCreateClient.java
  11. 30 0
      api/load-transfer-mq-api/src/main/java/com/hdkj/lt/modle/dto/plan/AcceptPlanPowerCutListRequest.java
  12. 2 0
      services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/LoadTransferBFApplication.java
  13. 158 0
      services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/controller/AutoTaskController.java
  14. 72 0
      services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/entity/FhzgAutoTaskCountryInfo.java
  15. 57 0
      services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/entity/FhzgAutoTaskFeederChange.java
  16. 57 0
      services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/entity/FhzgAutoTaskPlan.java
  17. 92 0
      services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/entity/FhzgAutoTaskPlanDetail.java
  18. 18 0
      services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/mapper/FhzgAutoTaskCountryInfoMapper.java
  19. 18 0
      services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/mapper/FhzgAutoTaskFeederChangeMapper.java
  20. 18 0
      services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/mapper/FhzgAutoTaskPlanDetailMapper.java
  21. 27 0
      services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/mapper/FhzgAutoTaskPlanMapper.java
  22. 37 0
      services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/service/AutoTaskService.java
  23. 13 0
      services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/service/FhzgAutoTaskCountryInfoService.java
  24. 13 0
      services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/service/FhzgAutoTaskFeederChangeService.java
  25. 13 0
      services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/service/FhzgAutoTaskPlanDetailService.java
  26. 22 0
      services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/service/FhzgAutoTaskPlanService.java
  27. 449 0
      services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/service/impl/AutoTaskServiceImpl.java
  28. 22 0
      services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/service/impl/FhzgAutoTaskCountryInfoServiceImpl.java
  29. 22 0
      services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/service/impl/FhzgAutoTaskFeederChangeServiceImpl.java
  30. 22 0
      services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/service/impl/FhzgAutoTaskPlanDetailServiceImpl.java
  31. 42 0
      services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/service/impl/FhzgAutoTaskPlanServiceImpl.java
  32. 5 12
      services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/service/impl/StruServiceImpl.java
  33. 23 0
      services/load-transfer-bf/src/main/resources/mapper/FhzgAutoTaskCountryInfoMapper.xml
  34. 22 0
      services/load-transfer-bf/src/main/resources/mapper/FhzgAutoTaskFeederChangeMapper.xml
  35. 27 0
      services/load-transfer-bf/src/main/resources/mapper/FhzgAutoTaskPlanDetailMapper.xml
  36. 29 0
      services/load-transfer-bf/src/main/resources/mapper/FhzgAutoTaskPlanMapper.xml
  37. 12 0
      services/load-transfer-mq/src/main/java/com/hdkj/lt/mq/feign/PlanCreateClient.java
  38. 2 0
      services/load-transfer-mq/src/main/java/com/hdkj/lt/mq/service/plan/AcceptPlanPowerCutService.java
  39. 22 1
      services/load-transfer-mq/src/main/java/com/hdkj/lt/mq/service/plan/impl/AcceptPlanPowerCutServiceImpl.java
  40. 1 1
      services/load-transfer-si/src/main/java/com/hdkj/lt/si/service/simulation/impl/SimulationServiceImpl.java
  41. 4 1
      services/load-transfer-si/src/main/resources/bootstrap.yml

+ 36 - 0
api/load-transfer-bf-api/src/main/java/com/hdkj/fhzg/request/AutoTaskQueryPageRequest.java

@@ -0,0 +1,36 @@
+package com.hdkj.fhzg.request;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.time.YearMonth;
+
+/**
+ * @author rj
+ * @date 2026/3/10 15:29
+ * @description
+ */
+@Data
+public class AutoTaskQueryPageRequest {
+    //地市编码
+    private String cityCode;
+    //区县编码
+    private String countryCode;
+    //线路名称
+    private String feederName;
+    //线路id
+    private String feederId;
+    //计划编号
+    private String planNo;
+    //计划开始日期
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime startTime;
+    //计划结束日期
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime endTime;
+    //当前页
+    private Long current;
+    //页大小
+    private Long size;
+}

+ 35 - 0
api/load-transfer-bf-api/src/main/java/com/hdkj/fhzg/request/AutoTaskQueryRequest.java

@@ -0,0 +1,35 @@
+package com.hdkj.fhzg.request;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+import java.time.LocalDate;
+import java.time.YearMonth;
+
+/**
+ * @author rj
+ * @date 2026/3/10 15:29
+ * @description
+ */
+@Data
+public class AutoTaskQueryRequest {
+    //地市编码
+    private String cityCode;
+    //区县编码
+    private String countryCode;
+    //图表类型 1-调用成功率 2-方案生成成功率 3-方案成图成功率(获取图表的接口使用)
+    private Integer chartType;
+    //线路变更类型 1-所有变更线路 2-有联络线路(线路变更接口使用)
+    private Integer feederType;
+
+    @JsonFormat(pattern = "yyyy-MM")
+    private YearMonth startDate;
+
+    @JsonFormat(pattern = "yyyy-MM")
+    private YearMonth endDate;
+
+}

+ 0 - 116
api/load-transfer-bf-api/src/main/java/com/hdkj/fhzg/request/WorkOrderRequest.java

@@ -1,116 +0,0 @@
-package com.hdkj.fhzg.request;
-
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * @Author: hyh
- * @Date: 2025/5/29
- * @Description:
- */
-@Data
-public class WorkOrderRequest implements Serializable {
-
-    /**
-     * 用户ID
-     */
-    @ApiModelProperty("用户ID(分页)")
-    private Long userId;
-    /**
-     * 当前页
-     */
-    @ApiModelProperty("当前页(分页)")
-    protected Long current;
-
-    /**
-     * 分页大小
-     */
-    @ApiModelProperty("分页大小(分页)")
-    protected Long size;
-
-    /**
-     * 待办类型
-     * 列表筛选
-     * 0-验收入库, 1-领料出库
-     */
-    @ApiModelProperty("业务;类型(分页、详情)")
-    private Integer businessType;
-    /**
-     * 工厂code
-     */
-    @ApiModelProperty("工厂code(分页)")
-    private String factoryCode;
-    /**
-     * 仓库id
-     */
-    @ApiModelProperty("仓库code(分页)")
-    private String warehouseCode;
-
-    /**
-     * 工厂id
-     */
-    @ApiModelProperty("工厂id(分页)")
-    private String factoryId;
-    /**
-     * 仓库id
-     */
-    @ApiModelProperty("仓库id(分页)")
-    private String warehouseId;
-    /**
-     * 仓库地点ID或者专业仓ID
-     */
-    @ApiModelProperty("仓库地点ID列表")
-    private List<Long> warehouseIdList;
-
-    @ApiModelProperty("单据状态")
-    private String status;
-    /**
-     * 单据编号
-     */
-    @ApiModelProperty("单据编号(分页)")
-    private String orderNo;
-    /**
-     * 项目名称
-     */
-    @ApiModelProperty("项目名称(分页)")
-    private String projectName;
-
-    /**
-     * 开始时间
-     */
-    @ApiModelProperty("开始时间(分页)")
-    private String startTime;
-
-    /**
-     * 结束时间
-     */
-    @ApiModelProperty("结束时间(分页)")
-    private String endTime;
-
-    @ApiModelProperty("业务id(详情)")
-    @JsonSerialize(using = ToStringSerializer.class)
-    private Long businessId;
-
-    @ApiModelProperty("来源,1、app,2、pc")
-    private Integer origin;
-
-
-    /**
-     * 工厂code
-     */
-    @ApiModelProperty("工厂code")
-    private List<String> factoryCodeList;
-    /**
-     * 仓库code
-     */
-    @ApiModelProperty("仓库code")
-    private List<String> warehouseCodeList;
-
-    @ApiModelProperty("物料来源")
-    private String materialResource;
-}

+ 14 - 0
api/load-transfer-bf-api/src/main/java/com/hdkj/fhzg/response/AutoTaskChartResponse.java

@@ -0,0 +1,14 @@
+package com.hdkj.fhzg.response;
+
+import lombok.Data;
+
+/**
+ * @author rj
+ * @date 2026/3/11 10:16
+ * @description
+ */
+@Data
+public class AutoTaskChartResponse {
+    private String key;
+    private String value;
+}

+ 56 - 0
api/load-transfer-bf-api/src/main/java/com/hdkj/fhzg/response/AutoTaskCityDetailResponse.java

@@ -0,0 +1,56 @@
+package com.hdkj.fhzg.response;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author rj
+ * @date 2026/3/10 15:47
+ * @description
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@HeadRowHeight(20)
+public class AutoTaskCityDetailResponse {
+    //区县名称
+    @ExcelProperty("区县名称")
+    @ColumnWidth(30)
+    private String countryName;
+    //线路总数
+    @ExcelProperty("线路总数")
+    @ColumnWidth(10)
+    private Integer feederTotal;
+    //有联络线路总数
+    @ExcelProperty("有联络线路总数")
+    @ColumnWidth(20)
+    private Integer contactFeederTotal;
+    //调用成功数
+    @ExcelProperty("调用成功数")
+    @ColumnWidth(15)
+    private Integer simulationSuccess;
+    //调用成功率
+    @ExcelProperty("调用成功率")
+    @ColumnWidth(15)
+    private Integer simulationSuccessRate;
+    //方案生成成功数
+    @ExcelProperty("方案生成(有联络线路)")
+    @ColumnWidth(30)
+    private Integer schemeSuccess;
+    //方案生成成功率
+    @ExcelProperty("方案生成成功率")
+    @ColumnWidth(20)
+    private Integer schemeSuccessRate;
+    //成图成功数
+    @ExcelProperty("方案成图")
+    @ColumnWidth(15)
+    private Integer svgSuccess;
+    //成图成功率
+    @ExcelProperty("方案成图成功率")
+    @ColumnWidth(20)
+    private Integer svgSuccessRate;
+}

+ 58 - 0
api/load-transfer-bf-api/src/main/java/com/hdkj/fhzg/response/AutoTaskCountryDetailResponse.java

@@ -0,0 +1,58 @@
+package com.hdkj.fhzg.response;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author rj
+ * @date 2026/3/10 15:47
+ * @description
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@HeadRowHeight(20)
+public class AutoTaskCountryDetailResponse {
+    //线路id
+    @ExcelProperty("线路id")
+    @ColumnWidth(30)
+    private String feederId;
+    //线路名称
+    @ExcelProperty("线路名称")
+    @ColumnWidth(20)
+    private String feederName;
+    //区县名称
+    @ExcelProperty("区县名称")
+    @ColumnWidth(15)
+    private String countryName;
+    //计划编号
+    @ExcelProperty("计划编号")
+    @ColumnWidth(20)
+    private String planNo;
+    //创建时间
+    @ExcelProperty("创建时间")
+    @ColumnWidth(20)
+    private LocalDateTime createTime;
+    //是否有联络
+    @ExcelProperty("是否有联络")
+    @ColumnWidth(20)
+    private Integer haveContact;
+    //调用是否成功
+    @ExcelProperty("调用是否成功")
+    @ColumnWidth(20)
+    private Integer simulationSuccess;
+    //方案生成是否成功
+    @ExcelProperty("方案生成是否成功")
+    @ColumnWidth(20)
+    private Integer schemeSuccess;
+    //成图是否成功
+    @ExcelProperty("成图是否成功")
+    @ColumnWidth(20)
+    private Integer svgSuccess;
+}

+ 20 - 0
api/load-transfer-bf-api/src/main/java/com/hdkj/fhzg/response/AutoTaskFeederChangeResponse.java

@@ -0,0 +1,20 @@
+package com.hdkj.fhzg.response;
+
+import lombok.Data;
+
+/**
+ * @author rj
+ * @date 2026/3/10 15:36
+ * @description
+ */
+@Data
+public class AutoTaskFeederChangeResponse {
+    //线路名称
+    private String feederName;
+    //线路id
+    private String feederId;
+    // 0-删除 1-新增
+    private Integer type;
+    //
+    private Integer haveContact;
+}

+ 29 - 0
api/load-transfer-bf-api/src/main/java/com/hdkj/fhzg/response/AutoTaskFeederResponse.java

@@ -0,0 +1,29 @@
+package com.hdkj.fhzg.response;
+
+import lombok.Data;
+
+/**
+ * @author rj
+ * @date 2026/3/10 15:31
+ * @description
+ */
+@Data
+public class AutoTaskFeederResponse {
+    //区县名称
+    private String countryName;
+    //区县编码
+    private String countryCode;
+    //线路总数
+    private Integer feederTotal;
+    //有联络线路总数
+    private Integer contactFeederTotal;
+    //线路总数新增
+    private Integer feederTotalAdd;
+    //线路总数删除
+    private Integer feederTotalDelete;
+    //有联络线路新增
+    private Integer contactFeederTotalAdd;
+    //有联络线路删除
+    private Integer contactFeederTotalDelete;
+
+}

+ 0 - 80
api/load-transfer-bf-api/src/main/java/com/hdkj/fhzg/response/WorkOrderResponse.java

@@ -1,80 +0,0 @@
-package com.hdkj.fhzg.response;
-
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-/**
- * @Author: hyh
- * @Date: 2025/6/2
- * @Description:
- */
-@Data
-public class WorkOrderResponse {
-    /**
-     * 业务id
-     */
-    @ApiModelProperty("业务id")
-    private Long businessId;
-    /**
-     * 业务类型
-     */
-    @ApiModelProperty("业务类型")
-    private Integer type;
-    /**
-     * 业务类型
-     */
-    @ApiModelProperty("业务类型")
-    private String businessType;
-    /**
-     * 工厂code
-     */
-    @ApiModelProperty("工厂code")
-    private String factoryCode;
-    /**
-     * 工厂名称
-     */
-    @ApiModelProperty("工厂名称")
-    private String factoryName;
-    /**
-     * 库存code
-     */
-    @ApiModelProperty("库存code")
-    private String warehouseCode;
-    /**
-     * 库存地点
-     */
-    @ApiModelProperty("库存地点")
-    private String warehouseName;
-
-    @ApiModelProperty("库存id")
-    private Long warehouseId;
-    /**
-     * 单据号
-     */
-    @ApiModelProperty("单据号")
-    private String orderNo;
-    /**
-     * 项目名称
-     */
-    @ApiModelProperty("项目名称")
-    private String projectName;
-    /**
-     * 创建时间
-     */
-    @ApiModelProperty("创建时间")
-    private String createTime;
-    /**
-     * 状态
-     */
-    @ApiModelProperty("状态、0、已提交 1、进行中 2、已完成")
-    private Integer status;
-    /**
-     * 预警数
-     */
-    @ApiModelProperty("预警数")
-    private Integer warningCount;
-
-    @ApiModelProperty("物料来源/去向")
-    private String materialResource;
-
-}

+ 6 - 0
api/load-transfer-mq-api/src/main/java/com/hdkj/lt/feign/IPlanCreateClient.java

@@ -2,9 +2,11 @@ package com.hdkj.lt.feign;
 
 import com.hdkj.hussar.ApiResponse;
 import com.hdkj.lt.base.constants.SystemGlobalConstant;
+import com.hdkj.lt.modle.dto.plan.AcceptPlanPowerCutListRequest;
 import com.hdkj.lt.modle.dto.plan.PlanCreateSwitchDTO;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 
 /**
  * @author rj
@@ -20,4 +22,8 @@ public interface IPlanCreateClient {
     @PostMapping("/feign/createPlanPowerCut")
     ApiResponse<Boolean> createPlanPowerCut(PlanCreateSwitchDTO planCreateSwitchDTO);
 
+    //默认出线开关计划停电
+    @PostMapping("/feign/acceptPlanPowerCutList")
+    ApiResponse<String> acceptPlanPowerCut(AcceptPlanPowerCutListRequest request);
+
 }

+ 30 - 0
api/load-transfer-mq-api/src/main/java/com/hdkj/lt/modle/dto/plan/AcceptPlanPowerCutListRequest.java

@@ -0,0 +1,30 @@
+package com.hdkj.lt.modle.dto.plan;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * @author rj
+ * @date 2026/3/18 15:21
+ * @description
+ */
+@Data
+public class AcceptPlanPowerCutListRequest {
+    @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "计划开始时间")
+    private LocalDateTime startTime;
+    //计划结束时间
+    @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @JSONField(format = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "计划结束时间")
+    private LocalDateTime endTime;
+    //计划停电的馈线列表
+    @ApiModelProperty(value = "计划停电的馈线列表")
+    private List<String> feederList;
+}

+ 2 - 0
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/LoadTransferBFApplication.java

@@ -7,6 +7,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cache.annotation.EnableCaching;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
 import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 /**
  * @Description:
@@ -19,6 +20,7 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
 @SpringBootApplication(scanBasePackages = {SystemGlobalConstant.BIZMS_BASE_PACKAGE})
 @MapperScan(basePackages = {SystemGlobalConstant.BIZMS_DAO_PACKAGE, SystemGlobalConstant.BIZMS_MAPPER_PACKAGE})
 @EnableCaching
+@EnableScheduling
 //@EnableSwagger2WebMvc
 public class LoadTransferBFApplication {
 

+ 158 - 0
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/controller/AutoTaskController.java

@@ -0,0 +1,158 @@
+package com.hdkj.lt.bf.controller;
+
+import com.hdkj.fhzg.entity.Page;
+import com.hdkj.fhzg.request.AutoTaskQueryPageRequest;
+import com.hdkj.fhzg.request.AutoTaskQueryRequest;
+import com.hdkj.fhzg.response.*;
+import com.hdkj.hussar.ApiResponse;
+import com.hdkj.lt.bf.service.AutoTaskService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * @author rj
+ * @date 2026/3/9 17:23
+ * @description
+ */
+@Slf4j
+@RestController
+@RequestMapping("/autoTask")
+@RequiredArgsConstructor
+public class AutoTaskController {
+
+    private final AutoTaskService autoTaskService;
+
+    /**
+     * 区县线路情况统计
+     *
+     * @return
+     */
+    @PostMapping("/getCountryStatistic")
+    public ApiResponse<List<AutoTaskFeederResponse>> getCountryStatistic(@RequestBody AutoTaskQueryRequest request) {
+        if (StringUtils.isEmpty(request.getCityCode())) {
+            return ApiResponse.fail("地市编码不能为空");
+        }
+        return ApiResponse.success(autoTaskService.getCountryStatistic(request));
+    }
+
+    /**
+     * 区县线路变更列表
+     *
+     * @return
+     */
+    @PostMapping("/getCountryFeederChangeList")
+    public ApiResponse<List<AutoTaskFeederChangeResponse>> getCountryFeederChangeList(@RequestBody AutoTaskQueryRequest request) {
+        if (StringUtils.isEmpty(request.getCountryCode())) {
+            return ApiResponse.fail("区县编码不能为空");
+        }
+        return ApiResponse.success(autoTaskService.getCountryFeederChangeList(request));
+    }
+
+
+    /**
+     * 根据地市获取区县方案成功率列表
+     *
+     * @return
+     */
+    @PostMapping("/getCityDetailList")
+    public ApiResponse<List<AutoTaskCityDetailResponse>> getCityDetailList(@RequestBody AutoTaskQueryRequest request) {
+        if (StringUtils.isEmpty(request.getCityCode())) {
+            return ApiResponse.fail("地市编码不能为空");
+        }
+        return ApiResponse.success(autoTaskService.getCityDetailList(request));
+    }
+
+    /**
+     * 根据区县获取各线路方案成功率列表
+     *
+     * @return
+     */
+    @PostMapping("/getCountryDetailList")
+    public ApiResponse<List<AutoTaskCountryDetailResponse>> getCountryDetailList(@RequestBody AutoTaskQueryRequest request) {
+        if (StringUtils.isEmpty(request.getCountryCode())) {
+            return ApiResponse.fail("区县编码不能为空");
+        }
+        return ApiResponse.success(autoTaskService.getCountryDetailList(request));
+    }
+
+    /**
+     * 根据地市获取区县方案成功率折线图数据
+     *
+     * @return
+     */
+    @PostMapping("/getCityDetailChart")
+    public ApiResponse<List<AutoTaskChartResponse>> getCityDetailChart(@RequestBody AutoTaskQueryRequest request) {
+        if (StringUtils.isEmpty(request.getCityCode())) {
+            return ApiResponse.fail("地市编码不能为空");
+        }
+        return ApiResponse.success(autoTaskService.getCityDetailChart(request));
+    }
+
+    /**
+     * 根据区县获取各线路方案成功率折线图数据
+     *
+     * @return
+     */
+    @PostMapping("/getCountryDetailChart")
+    public ApiResponse<List<AutoTaskChartResponse>> getCountryDetailChart(@RequestBody AutoTaskQueryRequest request) {
+        if (StringUtils.isEmpty(request.getCountryCode())) {
+            return ApiResponse.fail("区县编码不能为空");
+        }
+        return ApiResponse.success(autoTaskService.getCountryDetailChart(request));
+    }
+
+
+    /**
+     * 根据地市获取区县方案成功率列表 分页
+     *
+     * @return
+     */
+    @PostMapping("/getCityDetailPage")
+    public ApiResponse<Page<AutoTaskCityDetailResponse>> getCityDetailPage(@RequestBody AutoTaskQueryPageRequest request) {
+        if (StringUtils.isEmpty(request.getCityCode())) {
+            return ApiResponse.fail("地市编码不能为空");
+        }
+        return ApiResponse.success(autoTaskService.getCityDetailPage(request));
+    }
+
+    /**
+     * 根据区县获取各线路方案成功率列表
+     *
+     * @return
+     */
+    @PostMapping("/getCountryDetailPage")
+    public ApiResponse<Page<AutoTaskCountryDetailResponse>> getCountryDetailPage(@RequestBody AutoTaskQueryPageRequest request) {
+        if (StringUtils.isEmpty(request.getCountryCode())) {
+            return ApiResponse.fail("区县编码不能为空");
+        }
+        return ApiResponse.success(autoTaskService.getCountryDetailPage(request));
+    }
+
+    @PostMapping("/export")
+    public void export(@RequestBody AutoTaskQueryPageRequest request, HttpServletResponse response) {
+        autoTaskService.export(request, response);
+    }
+
+    /**
+     * 根据地市创建执行计划
+     * @param request
+     * @return
+     */
+    @PostMapping("/createTask")
+    public ApiResponse<String> createTask(@RequestBody AutoTaskQueryRequest request) {
+        if (StringUtils.isEmpty(request.getCityCode())) {
+            return ApiResponse.fail("地市编码不能为空");
+        }
+        return ApiResponse.success(autoTaskService.createTask(request.getCityCode()));
+    }
+
+
+}

+ 72 - 0
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/entity/FhzgAutoTaskCountryInfo.java

@@ -0,0 +1,72 @@
+package com.hdkj.lt.bf.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+
+/**
+ * @TableName fhzg_auto_task_country_info
+ */
+@TableName(value = "fhzg_auto_task_country_info")
+@Data
+public class FhzgAutoTaskCountryInfo implements Serializable {
+    /**
+     *
+     */
+    @TableId
+    private Integer id;
+
+    /**
+     * 地市编码
+     */
+    private String cityCode;
+
+    /**
+     * 地市名称
+     */
+    private String cityName;
+
+    /**
+     * 区县编码
+     */
+    private String countryCode;
+
+    /**
+     * 区县名称
+     */
+    private String countryName;
+
+    /**
+     * 线路总数
+     */
+    private Integer feederTotal;
+
+    /**
+     * 有联络的线路总数
+     */
+    private Integer contactFeederTotal;
+
+    /**
+     * 调用成功率
+     */
+    private Integer simulationSuccessRate;
+
+    /**
+     * 方案生产成功率
+     */
+    private Integer schemeSuccessRate;
+
+    /**
+     * 成图成功率
+     */
+    private Integer svgSuccessRate;
+
+    private LocalDate updateTime;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 57 - 0
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/entity/FhzgAutoTaskFeederChange.java

@@ -0,0 +1,57 @@
+package com.hdkj.lt.bf.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @TableName fhzg_auto_task_feeder_change
+ */
+@TableName(value = "fhzg_auto_task_feeder_change")
+@Data
+public class FhzgAutoTaskFeederChange implements Serializable {
+    /**
+     *
+     */
+    @TableId
+    private Long id;
+
+    /**
+     *
+     */
+    private String cityCode;
+
+    /**
+     *
+     */
+    private String countryCode;
+
+    /**
+     *
+     */
+    private String feederId;
+
+    /**
+     *
+     */
+    private String feederName;
+
+    /**
+     *
+     */
+    private Integer isHavaContact;
+
+    /**
+     *
+     */
+    private Date createTime;
+
+    private Integer type;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 57 - 0
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/entity/FhzgAutoTaskPlan.java

@@ -0,0 +1,57 @@
+package com.hdkj.lt.bf.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 
+ * @TableName fhzg_auto_task_plan
+ */
+@TableName(value ="fhzg_auto_task_plan")
+@Data
+public class FhzgAutoTaskPlan implements Serializable {
+    /**
+     * 
+     */
+    @TableId
+    private Long id;
+
+    /**
+     * 地市编码
+     */
+    private String cityCode;
+
+    /**
+     * 区县编码
+     */
+    private String countryCode;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 计划开始时间
+     */
+    private LocalDateTime planCreateTime;
+
+    /**
+     * 计划结束时间
+     */
+    private LocalDateTime planEndTime;
+
+    /**
+     * 当前任务状态
+     */
+    private Integer status;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 92 - 0
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/entity/FhzgAutoTaskPlanDetail.java

@@ -0,0 +1,92 @@
+package com.hdkj.lt.bf.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+import lombok.Data;
+
+/**
+ * 
+ * @TableName fhzg_auto_task_plan_detail
+ */
+@TableName(value ="fhzg_auto_task_plan_detail")
+@Data
+public class FhzgAutoTaskPlanDetail implements Serializable {
+    /**
+     * 
+     */
+    @TableId
+    private Long id;
+
+    /**
+     * taskId
+     */
+    private Long taskId;
+
+    /**
+     * 线路id
+     */
+    private String feederId;
+
+    /**
+     * 线路名称
+     */
+    private String feederName;
+
+    /**
+     * 地市名称
+     */
+    private String cityName;
+
+    /**
+     * 区县名称
+     */
+    private String countryName;
+
+    /**
+     * 地市编码
+     */
+    private String cityCode;
+
+    /**
+     * 区县编码
+     */
+    private String countryCode;
+
+    /**
+     * 计划编号
+     */
+    private String planNo;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 是否有联络
+     */
+    private Integer isHaveContact;
+
+    /**
+     * 调用推演平台是否成功
+     */
+    private Integer isSimulationSuccess;
+
+    /**
+     * 是否有方案
+     */
+    private Integer isSchemeSuccess;
+
+    /**
+     * 是否成图成功
+     */
+    private Integer isSvgSuccess;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 18 - 0
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/mapper/FhzgAutoTaskCountryInfoMapper.java

@@ -0,0 +1,18 @@
+package com.hdkj.lt.bf.mapper;
+
+import com.hdkj.lt.bf.entity.FhzgAutoTaskCountryInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author Sunlit
+* @description 针对表【fhzg_auto_task_country_info】的数据库操作Mapper
+* @createDate 2026-03-11 11:09:24
+* @Entity com.hdkj.lt.bf.entity.FhzgAutoTaskCountryInfo
+*/
+public interface FhzgAutoTaskCountryInfoMapper extends BaseMapper<FhzgAutoTaskCountryInfo> {
+
+}
+
+
+
+

+ 18 - 0
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/mapper/FhzgAutoTaskFeederChangeMapper.java

@@ -0,0 +1,18 @@
+package com.hdkj.lt.bf.mapper;
+
+import com.hdkj.lt.bf.entity.FhzgAutoTaskFeederChange;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author Sunlit
+* @description 针对表【fhzg_auto_task_feeder_change】的数据库操作Mapper
+* @createDate 2026-03-12 10:08:52
+* @Entity com.hdkj.lt.bf.entity.FhzgAutoTaskFeederChange
+*/
+public interface FhzgAutoTaskFeederChangeMapper extends BaseMapper<FhzgAutoTaskFeederChange> {
+
+}
+
+
+
+

+ 18 - 0
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/mapper/FhzgAutoTaskPlanDetailMapper.java

@@ -0,0 +1,18 @@
+package com.hdkj.lt.bf.mapper;
+
+import com.hdkj.lt.bf.entity.FhzgAutoTaskPlanDetail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author Sunlit
+* @description 针对表【fhzg_auto_task_plan_detail】的数据库操作Mapper
+* @createDate 2026-03-11 11:09:24
+* @Entity com.hdkj.lt.bf.entity.FhzgAutoTaskPlanDetail
+*/
+public interface FhzgAutoTaskPlanDetailMapper extends BaseMapper<FhzgAutoTaskPlanDetail> {
+
+}
+
+
+
+

+ 27 - 0
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/mapper/FhzgAutoTaskPlanMapper.java

@@ -0,0 +1,27 @@
+package com.hdkj.lt.bf.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.hdkj.lt.bf.entity.FhzgAutoTaskPlan;
+import com.hdkj.lt.core.bizms.modle.po.DwdShbDsFeederBase;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author Sunlit
+ * @description 针对表【fhzg_auto_task_plan】的数据库操作Mapper
+ * @createDate 2026-03-11 11:09:24
+ * @Entity com.hdkj.lt.bf.entity.FhzgAutoTaskPlan
+ */
+public interface FhzgAutoTaskPlanMapper extends BaseMapper<FhzgAutoTaskPlan> {
+
+    List<String> getContactFeederList(@Param("cityCode") String cityCode);
+
+    List<String> getHaveStartKgFeederList(@Param("cityCode") String cityCode);
+
+    List<DwdShbDsFeederBase> getFeederInfoByCityCode(@Param("cityCode") String cityCode);
+}
+
+
+
+

+ 37 - 0
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/service/AutoTaskService.java

@@ -0,0 +1,37 @@
+package com.hdkj.lt.bf.service;
+
+import com.hdkj.fhzg.entity.Page;
+import com.hdkj.fhzg.request.AutoTaskQueryPageRequest;
+import com.hdkj.fhzg.request.AutoTaskQueryRequest;
+import com.hdkj.fhzg.response.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+/**
+ * @author rj
+ * @date 2026/3/10 16:03
+ * @description
+ */
+public interface AutoTaskService {
+
+    List<AutoTaskFeederResponse> getCountryStatistic(AutoTaskQueryRequest request);
+
+    List<AutoTaskFeederChangeResponse> getCountryFeederChangeList(AutoTaskQueryRequest request);
+
+    List<AutoTaskCityDetailResponse> getCityDetailList(AutoTaskQueryRequest request);
+
+    List<AutoTaskCountryDetailResponse> getCountryDetailList(AutoTaskQueryRequest request);
+
+    List<AutoTaskChartResponse> getCityDetailChart(AutoTaskQueryRequest request);
+
+    List<AutoTaskChartResponse> getCountryDetailChart(AutoTaskQueryRequest request);
+
+    Page<AutoTaskCityDetailResponse> getCityDetailPage(AutoTaskQueryPageRequest request);
+
+    Page<AutoTaskCountryDetailResponse> getCountryDetailPage(AutoTaskQueryPageRequest request);
+
+    void export(AutoTaskQueryPageRequest request, HttpServletResponse response);
+
+    String createTask(String cityCode);
+}

+ 13 - 0
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/service/FhzgAutoTaskCountryInfoService.java

@@ -0,0 +1,13 @@
+package com.hdkj.lt.bf.service;
+
+import com.hdkj.lt.bf.entity.FhzgAutoTaskCountryInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author Sunlit
+* @description 针对表【fhzg_auto_task_country_info】的数据库操作Service
+* @createDate 2026-03-11 11:09:24
+*/
+public interface FhzgAutoTaskCountryInfoService extends IService<FhzgAutoTaskCountryInfo> {
+
+}

+ 13 - 0
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/service/FhzgAutoTaskFeederChangeService.java

@@ -0,0 +1,13 @@
+package com.hdkj.lt.bf.service;
+
+import com.hdkj.lt.bf.entity.FhzgAutoTaskFeederChange;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author Sunlit
+* @description 针对表【fhzg_auto_task_feeder_change】的数据库操作Service
+* @createDate 2026-03-12 10:08:52
+*/
+public interface FhzgAutoTaskFeederChangeService extends IService<FhzgAutoTaskFeederChange> {
+
+}

+ 13 - 0
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/service/FhzgAutoTaskPlanDetailService.java

@@ -0,0 +1,13 @@
+package com.hdkj.lt.bf.service;
+
+import com.hdkj.lt.bf.entity.FhzgAutoTaskPlanDetail;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author Sunlit
+* @description 针对表【fhzg_auto_task_plan_detail】的数据库操作Service
+* @createDate 2026-03-11 11:09:24
+*/
+public interface FhzgAutoTaskPlanDetailService extends IService<FhzgAutoTaskPlanDetail> {
+
+}

+ 22 - 0
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/service/FhzgAutoTaskPlanService.java

@@ -0,0 +1,22 @@
+package com.hdkj.lt.bf.service;
+
+import com.hdkj.lt.bf.entity.FhzgAutoTaskPlan;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.hdkj.lt.bf.entity.FhzgAutoTaskPlanDetail;
+import com.hdkj.lt.core.bizms.modle.po.DwdShbDsFeederBase;
+
+import java.util.List;
+
+/**
+* @author Sunlit
+* @description 针对表【fhzg_auto_task_plan】的数据库操作Service
+* @createDate 2026-03-11 11:09:24
+*/
+public interface FhzgAutoTaskPlanService extends IService<FhzgAutoTaskPlan> {
+
+    List<String> getContactFeederList(String cityCode);
+
+    List<String> getHaveStartKgFeederList(String cityCode);
+
+    List<DwdShbDsFeederBase> getFeederInfoByCityCode(String cityCode);
+}

+ 449 - 0
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/service/impl/AutoTaskServiceImpl.java

@@ -0,0 +1,449 @@
+package com.hdkj.lt.bf.service.impl;
+
+import cn.hutool.core.util.IdUtil;
+import com.alibaba.excel.EasyExcel;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.esotericsoftware.minlog.Log;
+import com.hdkj.fhzg.request.AutoTaskQueryPageRequest;
+import com.hdkj.fhzg.request.AutoTaskQueryRequest;
+import com.hdkj.fhzg.response.*;
+import com.hdkj.hussar.ApiResponse;
+import com.hdkj.lt.base.exception.BusinessException;
+import com.hdkj.lt.bf.entity.FhzgAutoTaskCountryInfo;
+import com.hdkj.lt.bf.entity.FhzgAutoTaskFeederChange;
+import com.hdkj.lt.bf.entity.FhzgAutoTaskPlan;
+import com.hdkj.lt.bf.entity.FhzgAutoTaskPlanDetail;
+import com.hdkj.lt.bf.service.*;
+import com.hdkj.lt.core.bizms.modle.po.DwdShbDsFeederBase;
+import com.hdkj.lt.feign.IPlanCreateClient;
+import com.hdkj.lt.modle.dto.plan.AcceptPlanPowerCutListRequest;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.HttpHeaders;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletResponse;
+import java.net.URLEncoder;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.temporal.TemporalAdjusters;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author rj
+ * @date 2026/3/10 16:04
+ * @description
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class AutoTaskServiceImpl implements AutoTaskService {
+
+    private final FhzgAutoTaskPlanService autoTaskPlanService;
+
+    private final FhzgAutoTaskCountryInfoService autoTaskCountryInfoService;
+
+    private final FhzgAutoTaskPlanDetailService autoTaskPlanDetailService;
+
+    private final FhzgAutoTaskFeederChangeService autoTaskFeederChangeService;
+
+    private final IPlanCreateClient planCreateClient;
+
+    @Override
+    public List<AutoTaskFeederResponse> getCountryStatistic(AutoTaskQueryRequest request) {
+        LambdaQueryWrapper<FhzgAutoTaskCountryInfo> queryWrapper = new LambdaQueryWrapper<>();
+
+        queryWrapper.eq(StringUtils.isNotBlank(request.getCityCode()), FhzgAutoTaskCountryInfo::getCityCode, request.getCityCode());
+        queryWrapper.eq(StringUtils.isNotBlank(request.getCountryCode()), FhzgAutoTaskCountryInfo::getCountryCode, request.getCountryCode());
+        LocalDate startTime = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
+        LocalDate endTime = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
+        queryWrapper.between(FhzgAutoTaskCountryInfo::getUpdateTime, startTime, endTime);
+        List<FhzgAutoTaskCountryInfo> list = autoTaskCountryInfoService.list(queryWrapper);
+        List<AutoTaskFeederResponse> responseList = new ArrayList<>();
+        for (FhzgAutoTaskCountryInfo fhzgAutoTaskCountryInfo : list) {
+            AutoTaskFeederResponse response = new AutoTaskFeederResponse();
+            response.setCountryName(fhzgAutoTaskCountryInfo.getCountryName());
+            response.setCountryCode(fhzgAutoTaskCountryInfo.getCountryCode());
+            response.setFeederTotal(fhzgAutoTaskCountryInfo.getFeederTotal());
+            response.setContactFeederTotal(fhzgAutoTaskCountryInfo.getContactFeederTotal());
+            AutoTaskQueryRequest request1 = new AutoTaskQueryRequest();
+            request1.setCountryCode(fhzgAutoTaskCountryInfo.getCountryCode());
+            List<AutoTaskFeederChangeResponse> countryFeederChangeList = this.getCountryFeederChangeList(request1);
+            response.setFeederTotalAdd((int) countryFeederChangeList.stream().filter(i -> i.getType() == 1).count());
+            response.setFeederTotalDelete((int) countryFeederChangeList.stream().filter(i -> i.getType() == 0).count());
+            response.setContactFeederTotalAdd((int) countryFeederChangeList.stream().filter(i -> i.getHaveContact() == 1 && i.getType() == 1).count());
+            response.setContactFeederTotalDelete((int) countryFeederChangeList.stream().filter(i -> i.getHaveContact() == 1 && i.getType() == 0).count());
+            responseList.add(response);
+        }
+        return responseList;
+    }
+
+    @Override
+    public List<AutoTaskFeederChangeResponse> getCountryFeederChangeList(AutoTaskQueryRequest request) {
+        LambdaQueryWrapper<FhzgAutoTaskFeederChange> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotBlank(request.getCityCode()), FhzgAutoTaskFeederChange::getCityCode, request.getCityCode());
+        queryWrapper.eq(StringUtils.isNotBlank(request.getCountryCode()), FhzgAutoTaskFeederChange::getCountryCode, request.getCountryCode());
+        queryWrapper.eq(request.getFeederType() != null && request.getFeederType() == 2, FhzgAutoTaskFeederChange::getType, 1);
+        LocalDate startTime = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
+        LocalDate endTime = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
+        queryWrapper.between(FhzgAutoTaskFeederChange::getCreateTime, startTime, endTime);
+        List<FhzgAutoTaskFeederChange> list = autoTaskFeederChangeService.list(queryWrapper);
+        List<AutoTaskFeederChangeResponse> result = new ArrayList<>();
+        for (FhzgAutoTaskFeederChange fhzgAutoTaskFeederChange : list) {
+            AutoTaskFeederChangeResponse response = new AutoTaskFeederChangeResponse();
+            response.setFeederId(fhzgAutoTaskFeederChange.getFeederId());
+            response.setFeederName(fhzgAutoTaskFeederChange.getFeederName());
+            response.setType(fhzgAutoTaskFeederChange.getType());
+            response.setHaveContact(fhzgAutoTaskFeederChange.getIsHavaContact());
+            result.add(response);
+        }
+        return result;
+    }
+
+    @Override
+    public List<AutoTaskCityDetailResponse> getCityDetailList(AutoTaskQueryRequest request) {
+        LambdaQueryWrapper<FhzgAutoTaskCountryInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotBlank(request.getCityCode()), FhzgAutoTaskCountryInfo::getCityCode, request.getCityCode());
+        queryWrapper.eq(StringUtils.isNotBlank(request.getCountryCode()), FhzgAutoTaskCountryInfo::getCountryCode, request.getCountryCode());
+        queryWrapper.orderByAsc(FhzgAutoTaskCountryInfo::getSimulationSuccessRate);
+        LocalDate startTime = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
+        LocalDate endTime = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
+        queryWrapper.between(FhzgAutoTaskCountryInfo::getUpdateTime, startTime, endTime);
+        List<FhzgAutoTaskCountryInfo> list = autoTaskCountryInfoService.list(queryWrapper);
+        List<AutoTaskCityDetailResponse> responseList = new ArrayList<>();
+        for (FhzgAutoTaskCountryInfo fhzgAutoTaskCountryInfo : list) {
+            AutoTaskCityDetailResponse response = new AutoTaskCityDetailResponse();
+            response.setCountryName(fhzgAutoTaskCountryInfo.getCountryName());
+            response.setFeederTotal(fhzgAutoTaskCountryInfo.getFeederTotal());
+            response.setContactFeederTotal(fhzgAutoTaskCountryInfo.getContactFeederTotal());
+            response.setSimulationSuccess(fhzgAutoTaskCountryInfo.getSimulationSuccessRate());
+            response.setSimulationSuccessRate(fhzgAutoTaskCountryInfo.getSimulationSuccessRate());
+            response.setSchemeSuccess(fhzgAutoTaskCountryInfo.getSimulationSuccessRate());
+            response.setSchemeSuccessRate(fhzgAutoTaskCountryInfo.getSimulationSuccessRate());
+            response.setSvgSuccess(fhzgAutoTaskCountryInfo.getSimulationSuccessRate());
+            response.setSvgSuccessRate(fhzgAutoTaskCountryInfo.getSimulationSuccessRate());
+            responseList.add(response);
+        }
+        return responseList;
+    }
+
+    @Override
+    public List<AutoTaskCountryDetailResponse> getCountryDetailList(AutoTaskQueryRequest request) {
+        LambdaQueryWrapper<FhzgAutoTaskPlanDetail> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotBlank(request.getCountryCode()), FhzgAutoTaskPlanDetail::getCountryCode, request.getCountryCode());
+        LocalDate startTime = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
+        LocalDate endTime = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
+        queryWrapper.between(FhzgAutoTaskPlanDetail::getCreateTime, startTime, endTime);
+        queryWrapper.orderByAsc(FhzgAutoTaskPlanDetail::getIsHaveContact);
+        queryWrapper.orderByAsc(FhzgAutoTaskPlanDetail::getIsSimulationSuccess);
+        queryWrapper.orderByAsc(FhzgAutoTaskPlanDetail::getIsSchemeSuccess);
+        queryWrapper.orderByAsc(FhzgAutoTaskPlanDetail::getIsSvgSuccess);
+        List<FhzgAutoTaskPlanDetail> list = autoTaskPlanDetailService.list(queryWrapper);
+        List<AutoTaskCountryDetailResponse> result = new ArrayList<>();
+        for (FhzgAutoTaskPlanDetail fhzgAutoTaskPlanDetail : list) {
+            AutoTaskCountryDetailResponse response = new AutoTaskCountryDetailResponse();
+            response.setFeederId(fhzgAutoTaskPlanDetail.getFeederId());
+            response.setFeederName(fhzgAutoTaskPlanDetail.getFeederName());
+            response.setCountryName(fhzgAutoTaskPlanDetail.getCountryName());
+            response.setPlanNo(fhzgAutoTaskPlanDetail.getPlanNo());
+            response.setCreateTime(fhzgAutoTaskPlanDetail.getCreateTime());
+            response.setHaveContact(fhzgAutoTaskPlanDetail.getIsHaveContact());
+            response.setSimulationSuccess(fhzgAutoTaskPlanDetail.getIsSimulationSuccess());
+            response.setSchemeSuccess(fhzgAutoTaskPlanDetail.getIsSchemeSuccess());
+            response.setSvgSuccess(fhzgAutoTaskPlanDetail.getIsSvgSuccess());
+            result.add(response);
+        }
+        return result;
+    }
+
+    @Override
+    public List<AutoTaskChartResponse> getCountryDetailChart(AutoTaskQueryRequest request) {
+        LambdaQueryWrapper<FhzgAutoTaskCountryInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotBlank(request.getCountryCode()), FhzgAutoTaskCountryInfo::getCountryCode, request.getCountryCode());
+        if (request.getStartDate() == null || request.getEndDate() == null) {
+            //如果没传时间就默认返回最近6个月的数据
+            LocalDate startTime = LocalDate.now().minusMonths(6).withDayOfMonth(1);
+            LocalDate endTime = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
+            queryWrapper.between(FhzgAutoTaskCountryInfo::getUpdateTime, startTime, endTime);
+        } else {
+            LocalDate startTime = request.getStartDate().atDay(1);
+            LocalDate endTime = request.getEndDate().atEndOfMonth();
+            queryWrapper.between(FhzgAutoTaskCountryInfo::getUpdateTime, startTime, endTime);
+        }
+
+        queryWrapper.orderByAsc(FhzgAutoTaskCountryInfo::getUpdateTime);
+        List<FhzgAutoTaskCountryInfo> list = autoTaskCountryInfoService.list(queryWrapper);
+        List<AutoTaskChartResponse> responseList = new ArrayList<>();
+        for (FhzgAutoTaskCountryInfo fhzgAutoTaskCountryInfo : list) {
+            AutoTaskChartResponse response = new AutoTaskChartResponse();
+            response.setKey(fhzgAutoTaskCountryInfo.getUpdateTime().getYear() + "年" +
+                    fhzgAutoTaskCountryInfo.getUpdateTime().getMonth().getValue() + "月");
+            if (request.getChartType() == 1) {
+                response.setValue(String.valueOf(fhzgAutoTaskCountryInfo.getSimulationSuccessRate()));
+            } else if (request.getChartType() == 2) {
+                response.setValue(String.valueOf(fhzgAutoTaskCountryInfo.getSchemeSuccessRate()));
+            } else if (request.getChartType() == 3) {
+                response.setValue(String.valueOf(fhzgAutoTaskCountryInfo.getSvgSuccessRate()));
+            }
+            responseList.add(response);
+        }
+        return responseList;
+    }
+
+
+    @Override
+    public List<AutoTaskChartResponse> getCityDetailChart(AutoTaskQueryRequest request) {
+        LambdaQueryWrapper<FhzgAutoTaskCountryInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotBlank(request.getCityCode()), FhzgAutoTaskCountryInfo::getCityCode, request.getCityCode());
+        queryWrapper.eq(StringUtils.isNotBlank(request.getCountryCode()), FhzgAutoTaskCountryInfo::getCountryCode, request.getCountryCode());
+        LocalDate startTime = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
+        LocalDate endTime = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
+        queryWrapper.between(FhzgAutoTaskCountryInfo::getUpdateTime, startTime, endTime);
+        List<FhzgAutoTaskCountryInfo> list = autoTaskCountryInfoService.list(queryWrapper);
+        List<AutoTaskChartResponse> responseList = new ArrayList<>();
+        for (FhzgAutoTaskCountryInfo fhzgAutoTaskCountryInfo : list) {
+            AutoTaskChartResponse response = new AutoTaskChartResponse();
+            response.setKey(fhzgAutoTaskCountryInfo.getCountryName());
+            if (request.getChartType() == 1) {
+                response.setValue(String.valueOf(fhzgAutoTaskCountryInfo.getSimulationSuccessRate()));
+            } else if (request.getChartType() == 2) {
+                response.setValue(String.valueOf(fhzgAutoTaskCountryInfo.getSchemeSuccessRate()));
+            } else if (request.getChartType() == 3) {
+                response.setValue(String.valueOf(fhzgAutoTaskCountryInfo.getSvgSuccessRate()));
+            }
+            responseList.add(response);
+        }
+        return responseList;
+    }
+
+    @Override
+    public com.hdkj.fhzg.entity.Page<AutoTaskCityDetailResponse> getCityDetailPage(AutoTaskQueryPageRequest request) {
+        LambdaQueryWrapper<FhzgAutoTaskCountryInfo> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotBlank(request.getCityCode()), FhzgAutoTaskCountryInfo::getCityCode, request.getCityCode());
+        LocalDate startTime = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
+        LocalDate endTime = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
+        queryWrapper.between(FhzgAutoTaskCountryInfo::getUpdateTime, startTime, endTime);
+        queryWrapper.orderByAsc(FhzgAutoTaskCountryInfo::getSimulationSuccessRate);
+        Page<FhzgAutoTaskCountryInfo> page = new Page<>();
+        page.setCurrent(request.getCurrent());
+        page.setSize(request.getSize());
+        Page<FhzgAutoTaskCountryInfo> pageResult = autoTaskCountryInfoService.page(page, queryWrapper);
+        List<AutoTaskCityDetailResponse> responseList = new ArrayList<>();
+        for (FhzgAutoTaskCountryInfo fhzgAutoTaskCountryInfo : pageResult.getRecords()) {
+            AutoTaskCityDetailResponse response = new AutoTaskCityDetailResponse();
+            response.setCountryName(fhzgAutoTaskCountryInfo.getCountryName());
+            response.setFeederTotal(fhzgAutoTaskCountryInfo.getFeederTotal());
+            response.setContactFeederTotal(fhzgAutoTaskCountryInfo.getContactFeederTotal());
+            response.setSimulationSuccess(fhzgAutoTaskCountryInfo.getSimulationSuccessRate());
+            response.setSimulationSuccessRate(fhzgAutoTaskCountryInfo.getSimulationSuccessRate());
+            response.setSchemeSuccess(fhzgAutoTaskCountryInfo.getSimulationSuccessRate());
+            response.setSchemeSuccessRate(fhzgAutoTaskCountryInfo.getSimulationSuccessRate());
+            response.setSvgSuccess(fhzgAutoTaskCountryInfo.getSimulationSuccessRate());
+            response.setSvgSuccessRate(fhzgAutoTaskCountryInfo.getSimulationSuccessRate());
+            responseList.add(response);
+        }
+        com.hdkj.fhzg.entity.Page<AutoTaskCityDetailResponse> result = new com.hdkj.fhzg.entity.Page<>();
+        result.setCurrent(page.getCurrent());
+        result.setSize(page.getSize());
+        result.setRecords(responseList);
+        result.setTotal(pageResult.getTotal());
+        return result;
+    }
+
+    @Override
+    public com.hdkj.fhzg.entity.Page<AutoTaskCountryDetailResponse> getCountryDetailPage(AutoTaskQueryPageRequest request) {
+        LambdaQueryWrapper<FhzgAutoTaskPlanDetail> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotBlank(request.getCountryCode()), FhzgAutoTaskPlanDetail::getCountryCode, request.getCountryCode());
+        queryWrapper.eq(StringUtils.isNotBlank(request.getFeederId()), FhzgAutoTaskPlanDetail::getFeederId, request.getFeederId());
+        queryWrapper.eq(StringUtils.isNotBlank(request.getPlanNo()), FhzgAutoTaskPlanDetail::getPlanNo, request.getPlanNo());
+        queryWrapper.like(StringUtils.isNotBlank(request.getFeederName()), FhzgAutoTaskPlanDetail::getFeederName, request.getFeederName());
+        queryWrapper.between(FhzgAutoTaskPlanDetail::getCreateTime, request.getStartTime(), request.getEndTime());
+        queryWrapper.orderByAsc(FhzgAutoTaskPlanDetail::getIsHaveContact);
+        queryWrapper.orderByAsc(FhzgAutoTaskPlanDetail::getIsSimulationSuccess);
+        queryWrapper.orderByAsc(FhzgAutoTaskPlanDetail::getIsSchemeSuccess);
+        queryWrapper.orderByAsc(FhzgAutoTaskPlanDetail::getIsSvgSuccess);
+        Page<FhzgAutoTaskPlanDetail> page = new Page<>();
+        page.setCurrent(request.getCurrent());
+        page.setSize(request.getSize());
+        Page<FhzgAutoTaskPlanDetail> pageResult = autoTaskPlanDetailService.page(page, queryWrapper);
+        List<AutoTaskCountryDetailResponse> responseList = new ArrayList<>();
+        for (FhzgAutoTaskPlanDetail fhzgAutoTaskPlanDetail : pageResult.getRecords()) {
+            AutoTaskCountryDetailResponse response = new AutoTaskCountryDetailResponse();
+            response.setFeederId(fhzgAutoTaskPlanDetail.getFeederId());
+            response.setFeederName(fhzgAutoTaskPlanDetail.getFeederName());
+            response.setCountryName(fhzgAutoTaskPlanDetail.getCountryName());
+            response.setPlanNo(fhzgAutoTaskPlanDetail.getPlanNo());
+            response.setCreateTime(fhzgAutoTaskPlanDetail.getCreateTime());
+            response.setHaveContact(fhzgAutoTaskPlanDetail.getIsHaveContact());
+            response.setSimulationSuccess(fhzgAutoTaskPlanDetail.getIsSimulationSuccess());
+            response.setSchemeSuccess(fhzgAutoTaskPlanDetail.getIsSchemeSuccess());
+            response.setSvgSuccess(fhzgAutoTaskPlanDetail.getIsSvgSuccess());
+            responseList.add(response);
+        }
+        com.hdkj.fhzg.entity.Page<AutoTaskCountryDetailResponse> result = new com.hdkj.fhzg.entity.Page<>();
+        result.setCurrent(page.getCurrent());
+        result.setSize(page.getSize());
+        result.setRecords(responseList);
+        result.setTotal(pageResult.getTotal());
+        return result;
+    }
+
+    @Override
+    public void export(AutoTaskQueryPageRequest request, HttpServletResponse response) {
+        if (!StringUtils.isEmpty(request.getCityCode())) {
+            //导出地市统计数据
+            LambdaQueryWrapper<FhzgAutoTaskCountryInfo> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(StringUtils.isNotBlank(request.getCityCode()), FhzgAutoTaskCountryInfo::getCityCode, request.getCityCode());
+            LocalDate startTime = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
+            LocalDate endTime = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
+            queryWrapper.between(FhzgAutoTaskCountryInfo::getUpdateTime, startTime, endTime);
+            queryWrapper.orderByAsc(FhzgAutoTaskCountryInfo::getSimulationSuccessRate);
+            List<FhzgAutoTaskCountryInfo> countryInfoList = autoTaskCountryInfoService.list(queryWrapper);
+            List<AutoTaskCityDetailResponse> responseList = new ArrayList<>();
+            for (FhzgAutoTaskCountryInfo fhzgAutoTaskCountryInfo : countryInfoList) {
+                AutoTaskCityDetailResponse cityDetailResponse = new AutoTaskCityDetailResponse();
+                cityDetailResponse.setCountryName(fhzgAutoTaskCountryInfo.getCountryName());
+                cityDetailResponse.setFeederTotal(fhzgAutoTaskCountryInfo.getFeederTotal());
+                cityDetailResponse.setContactFeederTotal(fhzgAutoTaskCountryInfo.getContactFeederTotal());
+                cityDetailResponse.setSimulationSuccess(fhzgAutoTaskCountryInfo.getSimulationSuccessRate());
+                cityDetailResponse.setSimulationSuccessRate(fhzgAutoTaskCountryInfo.getSimulationSuccessRate());
+                cityDetailResponse.setSchemeSuccess(fhzgAutoTaskCountryInfo.getSimulationSuccessRate());
+                cityDetailResponse.setSchemeSuccessRate(fhzgAutoTaskCountryInfo.getSimulationSuccessRate());
+                cityDetailResponse.setSvgSuccess(fhzgAutoTaskCountryInfo.getSimulationSuccessRate());
+                cityDetailResponse.setSvgSuccessRate(fhzgAutoTaskCountryInfo.getSimulationSuccessRate());
+                responseList.add(cityDetailResponse);
+            }
+            String cityName = "";
+            if (!countryInfoList.isEmpty()) {
+                cityName = countryInfoList.get(0).getCityName();
+            }
+            try {
+                response.setContentType("application/vnd.ms-excel");
+                response.setCharacterEncoding("UTF-8");
+                String fileName = cityName + "导出.xlsx";
+                response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + URLEncoder.encode(fileName, "utf-8"));
+                EasyExcel.write(response.getOutputStream(), AutoTaskCityDetailResponse.class)
+                        .sheet()
+                        .doWrite(responseList);
+            } catch (Exception e) {
+                Log.error("导出地市统计数据失败", e);
+                throw new BusinessException("导出失败");
+            }
+
+        } else if (!StringUtils.isEmpty(request.getCountryCode())) {
+            //导出区县数据
+            LambdaQueryWrapper<FhzgAutoTaskPlanDetail> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(StringUtils.isNotBlank(request.getCountryCode()), FhzgAutoTaskPlanDetail::getCountryCode, request.getCountryCode());
+            queryWrapper.eq(StringUtils.isNotBlank(request.getFeederId()), FhzgAutoTaskPlanDetail::getFeederId, request.getFeederId());
+            queryWrapper.eq(StringUtils.isNotBlank(request.getPlanNo()), FhzgAutoTaskPlanDetail::getPlanNo, request.getPlanNo());
+            queryWrapper.like(StringUtils.isNotBlank(request.getFeederName()), FhzgAutoTaskPlanDetail::getFeederName, request.getFeederName());
+            queryWrapper.between(FhzgAutoTaskPlanDetail::getCreateTime, request.getStartTime(), request.getEndTime());
+            queryWrapper.orderByAsc(FhzgAutoTaskPlanDetail::getIsHaveContact);
+            queryWrapper.orderByAsc(FhzgAutoTaskPlanDetail::getIsSimulationSuccess);
+            queryWrapper.orderByAsc(FhzgAutoTaskPlanDetail::getIsSchemeSuccess);
+            queryWrapper.orderByAsc(FhzgAutoTaskPlanDetail::getIsSvgSuccess);
+            List<FhzgAutoTaskPlanDetail> detailList = autoTaskPlanDetailService.list(queryWrapper);
+            List<AutoTaskCountryDetailResponse> responseList = new ArrayList<>();
+            for (FhzgAutoTaskPlanDetail fhzgAutoTaskPlanDetail : detailList) {
+                AutoTaskCountryDetailResponse detailResponse = new AutoTaskCountryDetailResponse();
+                detailResponse.setFeederId(fhzgAutoTaskPlanDetail.getFeederId());
+                detailResponse.setFeederName(fhzgAutoTaskPlanDetail.getFeederName());
+                detailResponse.setCountryName(fhzgAutoTaskPlanDetail.getCountryName());
+                detailResponse.setPlanNo(fhzgAutoTaskPlanDetail.getPlanNo());
+                detailResponse.setCreateTime(fhzgAutoTaskPlanDetail.getCreateTime());
+                detailResponse.setHaveContact(fhzgAutoTaskPlanDetail.getIsHaveContact());
+                detailResponse.setSimulationSuccess(fhzgAutoTaskPlanDetail.getIsSimulationSuccess());
+                detailResponse.setSchemeSuccess(fhzgAutoTaskPlanDetail.getIsSchemeSuccess());
+                detailResponse.setSvgSuccess(fhzgAutoTaskPlanDetail.getIsSvgSuccess());
+                responseList.add(detailResponse);
+            }
+            String countryName = "";
+            if (!responseList.isEmpty()) {
+                countryName = responseList.get(0).getCountryName();
+            }
+            try {
+                response.setContentType("application/vnd.ms-excel");
+                response.setCharacterEncoding("UTF-8");
+                String fileName = countryName + "导出.xlsx";
+                response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + URLEncoder.encode(fileName, "utf-8"));
+                EasyExcel.write(response.getOutputStream(), AutoTaskCountryDetailResponse.class)
+                        .sheet()
+                        .doWrite(responseList);
+            } catch (Exception e) {
+                Log.error("导出地市统计数据失败", e);
+                throw new BusinessException("导出失败");
+            }
+        } else {
+            throw new BusinessException("地市编码为空");
+        }
+    }
+
+    public String createTask(String cityCode) {
+        //1.查询是否有对应的计划
+        LocalDate startTime = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
+        LocalDate endTime = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
+        LambdaQueryWrapper<FhzgAutoTaskPlan> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(FhzgAutoTaskPlan::getCityCode, cityCode);
+        queryWrapper.between(FhzgAutoTaskPlan::getCreateTime, startTime, endTime);
+        List<FhzgAutoTaskPlan> list = autoTaskPlanService.list(queryWrapper);
+        if (list.isEmpty()) {
+            long snowflakeNextId = IdUtil.getSnowflakeNextId();
+            FhzgAutoTaskPlan fhzgAutoTaskPlan = new FhzgAutoTaskPlan();
+            fhzgAutoTaskPlan.setId(snowflakeNextId);
+            fhzgAutoTaskPlan.setCityCode(cityCode);
+            LocalDateTime now = LocalDateTime.now();
+            fhzgAutoTaskPlan.setCreateTime(now);
+            autoTaskPlanService.save(fhzgAutoTaskPlan);
+            //查询对应地市的线路
+            List<String> contactFeederList = autoTaskPlanService.getContactFeederList(cityCode);
+            List<String> haveStartKgFeederList = autoTaskPlanService.getHaveStartKgFeederList(cityCode);
+            List<DwdShbDsFeederBase> feederBaseList = autoTaskPlanService.getFeederInfoByCityCode(cityCode);
+            Map<String, DwdShbDsFeederBase> feederSwitchBaseMap = feederBaseList.stream().collect(Collectors.toMap(DwdShbDsFeederBase::getPsrId, i -> i));
+
+            Set<String> haveStartKgAndContactFeederSet = new HashSet<>(haveStartKgFeederList);
+            haveStartKgAndContactFeederSet.addAll(contactFeederList);
+            List<FhzgAutoTaskPlanDetail> detailList = new ArrayList<>();
+            haveStartKgAndContactFeederSet.forEach(i -> {
+                DwdShbDsFeederBase dwdShbDsFeederBase = feederSwitchBaseMap.get(i);
+                FhzgAutoTaskPlanDetail fhzgAutoTaskPlanDetail = new FhzgAutoTaskPlanDetail();
+                fhzgAutoTaskPlanDetail.setTaskId(snowflakeNextId);
+                fhzgAutoTaskPlanDetail.setFeederId(i);
+                fhzgAutoTaskPlanDetail.setFeederName(dwdShbDsFeederBase.getName());
+                fhzgAutoTaskPlanDetail.setCityCode(dwdShbDsFeederBase.getCity());
+                fhzgAutoTaskPlanDetail.setCityName(dwdShbDsFeederBase.getCityName());
+                fhzgAutoTaskPlanDetail.setCountryCode(dwdShbDsFeederBase.getMaintOrg());
+                fhzgAutoTaskPlanDetail.setCountryName(dwdShbDsFeederBase.getMaintOrgName());
+                fhzgAutoTaskPlanDetail.setIsHaveContact(1);
+                fhzgAutoTaskPlanDetail.setCreateTime(now);
+                detailList.add(fhzgAutoTaskPlanDetail);
+            });
+            autoTaskPlanDetailService.saveBatch(detailList);
+            return "创建成功";
+        } else {
+            return "已经创建";
+        }
+    }
+
+    @Scheduled(cron = "0 0/5 * * * *")
+    public void runTask() {
+        LambdaQueryWrapper<FhzgAutoTaskPlanDetail> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.isNull(FhzgAutoTaskPlanDetail::getPlanNo);
+        List<FhzgAutoTaskPlanDetail> list = autoTaskPlanDetailService.list(queryWrapper);
+        if (!list.isEmpty()) {
+            FhzgAutoTaskPlanDetail fhzgAutoTaskPlanDetail = list.get(0);
+            AcceptPlanPowerCutListRequest request = new AcceptPlanPowerCutListRequest();
+            request.setStartTime(fhzgAutoTaskPlanDetail.getCreateTime());
+            request.setEndTime(fhzgAutoTaskPlanDetail.getCreateTime().plusHours(2));
+            request.setFeederList(Collections.singletonList(fhzgAutoTaskPlanDetail.getFeederId()));
+            ApiResponse<String> stringApiResponse = planCreateClient.acceptPlanPowerCut(request);
+            fhzgAutoTaskPlanDetail.setPlanNo(stringApiResponse.getMsg());
+            autoTaskPlanDetailService.updateById(fhzgAutoTaskPlanDetail);
+        }
+    }
+
+}

+ 22 - 0
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/service/impl/FhzgAutoTaskCountryInfoServiceImpl.java

@@ -0,0 +1,22 @@
+package com.hdkj.lt.bf.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.hdkj.lt.bf.entity.FhzgAutoTaskCountryInfo;
+import com.hdkj.lt.bf.service.FhzgAutoTaskCountryInfoService;
+import com.hdkj.lt.bf.mapper.FhzgAutoTaskCountryInfoMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author Sunlit
+* @description 针对表【fhzg_auto_task_country_info】的数据库操作Service实现
+* @createDate 2026-03-11 11:09:24
+*/
+@Service
+public class FhzgAutoTaskCountryInfoServiceImpl extends ServiceImpl<FhzgAutoTaskCountryInfoMapper, FhzgAutoTaskCountryInfo>
+    implements FhzgAutoTaskCountryInfoService{
+
+}
+
+
+
+

+ 22 - 0
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/service/impl/FhzgAutoTaskFeederChangeServiceImpl.java

@@ -0,0 +1,22 @@
+package com.hdkj.lt.bf.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.hdkj.lt.bf.entity.FhzgAutoTaskFeederChange;
+import com.hdkj.lt.bf.service.FhzgAutoTaskFeederChangeService;
+import com.hdkj.lt.bf.mapper.FhzgAutoTaskFeederChangeMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author Sunlit
+* @description 针对表【fhzg_auto_task_feeder_change】的数据库操作Service实现
+* @createDate 2026-03-12 10:08:52
+*/
+@Service
+public class FhzgAutoTaskFeederChangeServiceImpl extends ServiceImpl<FhzgAutoTaskFeederChangeMapper, FhzgAutoTaskFeederChange>
+    implements FhzgAutoTaskFeederChangeService{
+
+}
+
+
+
+

+ 22 - 0
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/service/impl/FhzgAutoTaskPlanDetailServiceImpl.java

@@ -0,0 +1,22 @@
+package com.hdkj.lt.bf.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.hdkj.lt.bf.entity.FhzgAutoTaskPlanDetail;
+import com.hdkj.lt.bf.service.FhzgAutoTaskPlanDetailService;
+import com.hdkj.lt.bf.mapper.FhzgAutoTaskPlanDetailMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author Sunlit
+* @description 针对表【fhzg_auto_task_plan_detail】的数据库操作Service实现
+* @createDate 2026-03-11 11:09:24
+*/
+@Service
+public class FhzgAutoTaskPlanDetailServiceImpl extends ServiceImpl<FhzgAutoTaskPlanDetailMapper, FhzgAutoTaskPlanDetail>
+    implements FhzgAutoTaskPlanDetailService{
+
+}
+
+
+
+

+ 42 - 0
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/service/impl/FhzgAutoTaskPlanServiceImpl.java

@@ -0,0 +1,42 @@
+package com.hdkj.lt.bf.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.hdkj.lt.bf.entity.FhzgAutoTaskPlan;
+import com.hdkj.lt.bf.entity.FhzgAutoTaskPlanDetail;
+import com.hdkj.lt.bf.service.FhzgAutoTaskPlanService;
+import com.hdkj.lt.bf.mapper.FhzgAutoTaskPlanMapper;
+import com.hdkj.lt.core.bizms.modle.po.DwdShbDsFeederBase;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+* @author Sunlit
+* @description 针对表【fhzg_auto_task_plan】的数据库操作Service实现
+* @createDate 2026-03-11 11:09:24
+*/
+@Service
+public class FhzgAutoTaskPlanServiceImpl extends ServiceImpl<FhzgAutoTaskPlanMapper, FhzgAutoTaskPlan>
+    implements FhzgAutoTaskPlanService{
+
+    @Override
+    public List<String> getContactFeederList(String cityCode) {
+        return this.baseMapper.getContactFeederList(cityCode);
+    }
+
+    @Override
+    public List<String> getHaveStartKgFeederList(String cityCode) {
+        return this.baseMapper.getHaveStartKgFeederList(cityCode);
+    }
+
+    @Override
+    public List<DwdShbDsFeederBase> getFeederInfoByCityCode(String cityCode) {
+        return this.baseMapper.getFeederInfoByCityCode(cityCode);
+    }
+}
+
+
+
+

+ 5 - 12
services/load-transfer-bf/src/main/java/com/hdkj/lt/bf/service/impl/StruServiceImpl.java

@@ -575,7 +575,7 @@ public class StruServiceImpl implements StruService {
                     // 1.用户如果是省公司,返回->市-区县,
                     List<StruTreeVO> childrenList = struTreeVO.getChildren();
                     if (CollUtil.isNotEmpty(childrenList)) {
-                        result.addAll(childrenList);
+                        result.add(struTreeVO);
                     } else {
                         log.info("省份下城市信息为空:{}", struId); //返回空数据
                     }
@@ -619,17 +619,10 @@ public class StruServiceImpl implements StruService {
             return;
         }
         for (StruTreeVO parent : list) {
-            if (!Objects.equals(parent.getStruType(), CITY)) {
-                continue;
-            }
-            List<StruTreeVO> children = parent.getChildren();
-            if (children == null || children.isEmpty()) {
-                continue;
-            }
-            for (StruTreeVO child : children) {
-                if (child.getChildren() != null) {
-                    child.getChildren().clear();
-                }
+            if (COUNTY.equals(parent.getStruType()) && parent.getChildren() != null) {
+                parent.getChildren().clear();
+            } else {
+                removeSecondChildNode(parent.getChildren());
             }
         }
     }

+ 23 - 0
services/load-transfer-bf/src/main/resources/mapper/FhzgAutoTaskCountryInfoMapper.xml

@@ -0,0 +1,23 @@
+<?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.hdkj.lt.bf.mapper.FhzgAutoTaskCountryInfoMapper">
+
+    <resultMap id="BaseResultMap" type="com.hdkj.lt.bf.entity.FhzgAutoTaskCountryInfo">
+            <id property="id" column="id" jdbcType="INTEGER"/>
+            <result property="cityCode" column="city_code" jdbcType="VARCHAR"/>
+            <result property="countryCode" column="country_code" jdbcType="VARCHAR"/>
+            <result property="feederTotal" column="feeder_total" jdbcType="INTEGER"/>
+            <result property="contactFeederTotal" column="contact_feeder_total" jdbcType="INTEGER"/>
+            <result property="simulationSuccessRate" column="simulation_success_rate" jdbcType="INTEGER"/>
+            <result property="schemeSuccessRate" column="scheme_success_rate" jdbcType="INTEGER"/>
+            <result property="svgSuccessRate" column="svg_success_rate" jdbcType="INTEGER"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,city_code,country_code,
+        feeder_total,contact_feeder_total,simulation_success_rate,
+        scheme_success_rate,svg_success_rate
+    </sql>
+</mapper>

+ 22 - 0
services/load-transfer-bf/src/main/resources/mapper/FhzgAutoTaskFeederChangeMapper.xml

@@ -0,0 +1,22 @@
+<?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.hdkj.lt.bf.mapper.FhzgAutoTaskFeederChangeMapper">
+
+    <resultMap id="BaseResultMap" type="com.hdkj.lt.bf.entity.FhzgAutoTaskFeederChange">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="cityCode" column="city_code" jdbcType="VARCHAR"/>
+            <result property="countryCode" column="country_code" jdbcType="VARCHAR"/>
+            <result property="feederId" column="feeder_id" jdbcType="VARCHAR"/>
+            <result property="feederName" column="feeder_name" jdbcType="VARCHAR"/>
+            <result property="isHavaContact" column="is_hava_contact" jdbcType="INTEGER"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,city_code,country_code,
+        feeder_id,feeder_name,is_hava_contact,
+        create_time
+    </sql>
+</mapper>

+ 27 - 0
services/load-transfer-bf/src/main/resources/mapper/FhzgAutoTaskPlanDetailMapper.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.hdkj.lt.bf.mapper.FhzgAutoTaskPlanDetailMapper">
+
+    <resultMap id="BaseResultMap" type="com.hdkj.lt.bf.entity.FhzgAutoTaskPlanDetail">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="taskId" column="task_id" jdbcType="BIGINT"/>
+            <result property="feederId" column="feeder_id" jdbcType="VARCHAR"/>
+            <result property="feederName" column="feeder_name" jdbcType="VARCHAR"/>
+            <result property="cityName" column="city_name" jdbcType="VARCHAR"/>
+            <result property="planNo" column="plan_no" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="isHaveContact" column="is_have_contact" jdbcType="INTEGER"/>
+            <result property="isSimulationSuccess" column="is_simulation_success" jdbcType="INTEGER"/>
+            <result property="isSchemeSuccess" column="is_scheme_success" jdbcType="INTEGER"/>
+            <result property="isSvgSuccess" column="is_svg_success" jdbcType="INTEGER"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,task_id,feeder_id,
+        feeder_name,city_name,plan_no,
+        create_time,is_have_contact,is_simulation_success,
+        is_scheme_success,is_svg_success
+    </sql>
+</mapper>

+ 29 - 0
services/load-transfer-bf/src/main/resources/mapper/FhzgAutoTaskPlanMapper.xml

@@ -0,0 +1,29 @@
+<?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.hdkj.lt.bf.mapper.FhzgAutoTaskPlanMapper">
+
+    <resultMap id="BaseResultMap" type="com.hdkj.lt.bf.entity.FhzgAutoTaskPlan">
+            <id property="id" column="id" jdbcType="BIGINT"/>
+            <result property="cityCode" column="city_code" jdbcType="VARCHAR"/>
+            <result property="countryCode" column="country_code" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="planCreateTime" column="plan_create_time" jdbcType="TIMESTAMP"/>
+            <result property="planEndTime" column="plan_end_time" jdbcType="TIMESTAMP"/>
+            <result property="status" column="status" jdbcType="INTEGER"/>
+    </resultMap>
+
+    <select id="getHaveStartKgFeederList" resultType="java.lang.String">
+        select distinct feeder from t_feeder_topo where city_code = #{cityCode} and is_start_kg = 1;
+    </select>
+    <select id="getContactFeederList" resultType="java.lang.String">
+        select distinct feeder from t_feeder_topo where city_code = #{cityCode} and normal_open = 'true';
+    </select>
+
+    <select id="getFeederInfoByCityCode" resultType="com.hdkj.lt.core.bizms.modle.po.DwdShbDsFeederBase">
+        select * from dwd_shb_ds_feeder_base where city = #{cityCode} and psr_state = '20';
+    </select>
+
+
+</mapper>

+ 12 - 0
services/load-transfer-mq/src/main/java/com/hdkj/lt/mq/feign/PlanCreateClient.java

@@ -1,7 +1,9 @@
 package com.hdkj.lt.mq.feign;
 
 import com.hdkj.lt.feign.IPlanCreateClient;
+import com.hdkj.lt.modle.dto.plan.AcceptPlanPowerCutListRequest;
 import com.hdkj.lt.modle.dto.plan.PlanCreateSwitchDTO;
+import com.hdkj.lt.mq.entity.dto.AcceptPlanPowerCutListDTO;
 import com.hdkj.lt.mq.service.plan.AcceptPlanPowerCutService;
 import com.hdkj.lt.mq.service.plan.impl.FhzgReasoningPlatformServiceImpl;
 import com.hdkj.hussar.ApiResponse;
@@ -36,4 +38,14 @@ public class PlanCreateClient implements IPlanCreateClient {
         boolean result = acceptPlanPowerCutService.createPlanPowerCut(planCreateSwitchDTO);
         return ApiResponse.success(result);
     }
+
+    @Override
+    public ApiResponse<String> acceptPlanPowerCut(@RequestBody AcceptPlanPowerCutListRequest request) {
+        AcceptPlanPowerCutListDTO dto = AcceptPlanPowerCutListDTO.builder()
+                .startTime(request.getStartTime())
+                .endTime(request.getEndTime())
+                .feederList(request.getFeederList()).build();
+        String planNo = acceptPlanPowerCutService.autoTaskCreatePlan(dto);
+        return ApiResponse.success(planNo);
+    }
 }

+ 2 - 0
services/load-transfer-mq/src/main/java/com/hdkj/lt/mq/service/plan/AcceptPlanPowerCutService.java

@@ -14,6 +14,8 @@ public interface AcceptPlanPowerCutService {
 
     boolean acceptPlanPowerCutList(AcceptPlanPowerCutListDTO dto);
 
+    String autoTaskCreatePlan(AcceptPlanPowerCutListDTO dto);
+
     boolean reTryPlanPowerCutList(AcceptPlanPowerCutListDTO dto);
 
     boolean createPlanPowerCut(PlanCreateSwitchDTO planCreateSwitchDTO);

+ 22 - 1
services/load-transfer-mq/src/main/java/com/hdkj/lt/mq/service/plan/impl/AcceptPlanPowerCutServiceImpl.java

@@ -2,7 +2,6 @@ package com.hdkj.lt.mq.service.plan.impl;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.lang.Snowflake;
-import cn.hutool.core.lang.generator.SnowflakeGenerator;
 import cn.hutool.core.util.IdUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -295,6 +294,28 @@ public class AcceptPlanPowerCutServiceImpl implements AcceptPlanPowerCutService
         return true;
     }
 
+    public String autoTaskCreatePlan(AcceptPlanPowerCutListDTO dto) {
+        log.info(dto.toString());
+        Long planId = IdUtil.getSnowflakeNextId();
+        String planNo = String.valueOf(planId);
+        FeederInfo feederInfo = new FeederInfo();
+        FeederTopo feederTopo = feederTopoMapper.getFeederInfoById(dto.getFeederList().get(0));
+        feederInfo.setFeederPsrId(dto.getFeederList().get(0));
+        feederInfo.setFeederName(feederTopo.getFeederName());
+        AcceptPlanPowerCutDTO planPowerCutDTO = AcceptPlanPowerCutDTO.builder()
+                .feederList(new ArrayList<>(Collections.singletonList(feederInfo)))
+                .planNo("JHTD" + planNo)
+                .planId(planId)
+                .planDesc("线路id:" + dto.getFeederList().get(0) + "整线停电")
+                .validFlag("valid")
+                .sourceSystem("02")
+                .startTime(dto.getStartTime())
+                .endTime(dto.getEndTime())
+                .build();
+        acceptPlanPowerCut(planPowerCutDTO);
+        return planNo;
+    }
+
     /**
      * 重试时间范围内所有没有成功生成方案的计划
      *

+ 1 - 1
services/load-transfer-si/src/main/java/com/hdkj/lt/si/service/simulation/impl/SimulationServiceImpl.java

@@ -54,7 +54,7 @@ public class SimulationServiceImpl implements ISimulationService {
     private final FhzgOperationAbnormalityTransferAreaResultMapper operationAbnormalityTransferAreaResultMapper;
     private final String BASE_URL = "http://25.91.83.252:28081";
 
-    @Value("simulation.xToken")
+    @Value("${simulation.xToken}")
     private String xToken;
 
     @Autowired

+ 4 - 1
services/load-transfer-si/src/main/resources/bootstrap.yml

@@ -1,3 +1,6 @@
 spring:
   profiles:
-    active: @environment@
+    active: @environment@
+
+simulation:
+  xToken: 1sadasd123-dadasd