From e69dec94fe9763d04425756370760698850f926f Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期五, 22 三月 2024 19:38:39 +0800
Subject: [PATCH] 部门端基础数据保存、基础数据导入模板下载、基础数据导入接口

---
 ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataFieldVO.java                         |    8 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldVO.java                                  |    3 
 ruoyi-common/src/main/java/com/ruoyi/common/enums/DisabledEnum.java                          |   15 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TbFieldCategoryService.java              |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java         |  180 +++++++
 ruoyi-system/src/main/java/com/ruoyi/system/handler/DeptVerifyHandler.java                   |    8 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbDeptController.java                 |   53 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldReportingVO.java                         |   67 ++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataConfigServiceImpl.java   |   50 +
 ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java    |   84 +++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbFieldServiceImpl.java             |   36 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbFieldController.java                |   89 ++
 ruoyi-common/src/main/java/com/ruoyi/common/NumberDisplaceChineseUtil.java                   |   54 ++
 ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicData.java                          |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/importExcel/FieldExcel.java                      |   32 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbDeptServiceImpl.java              |   38 +
 ruoyi-system/src/main/java/com/ruoyi/system/dto/BasicDataFieldDTO.java                       |   20 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataCategoryServiceImpl.java |   11 
 ruoyi-admin-dept/src/main/java/com/ruoyi/RuoYiAdminDeptApplication.java                      |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataReportingVO.java                     |   41 +
 ruoyi-admin-dept/pom.xml                                                                     |   18 
 ruoyi-system/src/main/java/com/ruoyi/system/dto/BasicDataDTO.java                            |   33 +
 ruoyi-system/src/main/java/com/ruoyi/system/domain/TbDept.java                               |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbFieldCategoryServiceImpl.java     |   43 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataService.java                  |   13 
 ruoyi-system/pom.xml                                                                         |   14 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TbDeptService.java                       |    3 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbBasicDataCategoryController.java    |   70 ++
 ruoyi-system/src/main/java/com/ruoyi/system/importExcel/DeptExcel.java                       |   63 ++
 ruoyi-admin-dept/src/main/resources/mybatis/mybatis-config.xml                               |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TbFieldService.java                      |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataCategoryService.java          |    3 
 ruoyi-common/pom.xml                                                                         |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/listener/BasicDataListener.java                  |  121 ++++
 ruoyi-system/src/main/java/com/ruoyi/system/importExcel/BasicDataExcel.java                  |   39 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbBasicDataConfigController.java      |   77 ++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbFieldCategoryController.java        |   92 ++-
 ruoyi-admin-dept/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java                  |   22 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicDataField.java                     |    5 
 ruoyi-common/src/main/java/com/ruoyi/common/enums/ReportingStatusEnum.java                   |   26 +
 40 files changed, 1,274 insertions(+), 188 deletions(-)

diff --git a/ruoyi-admin-dept/pom.xml b/ruoyi-admin-dept/pom.xml
index db0d5b1..c5e201b 100644
--- a/ruoyi-admin-dept/pom.xml
+++ b/ruoyi-admin-dept/pom.xml
@@ -100,7 +100,6 @@
         <dependency>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>
-            <version>4.6.10</version>
         </dependency>
 
         <!-- zxing生成二维码 -->
@@ -139,22 +138,6 @@
             <version>1.2.78</version>
         </dependency>
 
-        <!-- easypoi -->
-        <dependency>
-            <groupId>cn.afterturn</groupId>
-            <artifactId>easypoi-base</artifactId>
-            <version>3.0.3</version>
-        </dependency>
-        <dependency>
-            <groupId>cn.afterturn</groupId>
-            <artifactId>easypoi-web</artifactId>
-            <version>3.0.3</version>
-        </dependency>
-        <dependency>
-            <groupId>cn.afterturn</groupId>
-            <artifactId>easypoi-annotation</artifactId>
-            <version>3.0.3</version>
-        </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot</artifactId>
@@ -165,7 +148,6 @@
             <version>2.0.10</version>
             <scope>compile</scope>
         </dependency>
-
     </dependencies>
 
     <build>
diff --git a/ruoyi-admin-dept/src/main/java/com/ruoyi/RuoYiAdminDeptApplication.java b/ruoyi-admin-dept/src/main/java/com/ruoyi/RuoYiAdminDeptApplication.java
index bbbbdf1..040ff61 100644
--- a/ruoyi-admin-dept/src/main/java/com/ruoyi/RuoYiAdminDeptApplication.java
+++ b/ruoyi-admin-dept/src/main/java/com/ruoyi/RuoYiAdminDeptApplication.java
@@ -12,7 +12,6 @@
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.web.client.RestTemplate;
 
-import java.net.InetAddress;
 import java.net.UnknownHostException;
 
 /**
@@ -33,7 +32,8 @@
                         "Swagger文档: \t\thttp://{}:{}/doc.html\n" +
                         "----------------------------------------------------------",
                 env.getProperty("spring.application.name", "后台"),
-                InetAddress.getLocalHost().getHostAddress(),
+                //InetAddress.getLocalHost().getHostAddress(),
+                "localhost",
                 env.getProperty("server.port", "8081"));
     }
 
diff --git a/ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java b/ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java
new file mode 100644
index 0000000..05e86bc
--- /dev/null
+++ b/ruoyi-admin-dept/src/main/java/com/ruoyi/web/controller/api/CurrentQuarterController.java
@@ -0,0 +1,84 @@
+package com.ruoyi.web.controller.api;
+
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.system.dto.BasicDataDTO;
+import com.ruoyi.system.service.TbBasicDataService;
+import com.ruoyi.system.vo.BasicDataReportingVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * @author mitao
+ * @date 2024/3/19
+ */
+@Slf4j
+@RestController
+@RequestMapping("/current-quarter")
+@RequiredArgsConstructor
+@Api(tags = "当前季度数据相关接口")
+public class CurrentQuarterController {
+
+    private final TbBasicDataService tbBasicDataService;
+
+    @ApiOperation("获取基础数据填报相关信息")
+    public R<BasicDataReportingVO> getBasicFields(@RequestParam("deptAreaCode") String deptAreaCode) {
+        //TODO 如果能够获取到当前登录用户,则不需要传区划代码
+        try {
+            return tbBasicDataService.getBasicFields(deptAreaCode);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("获取基础数据填报相关信息异常", e);
+            return R.fail();
+        }
+    }
+
+    @PostMapping("/save-basic-data")
+    @ApiOperation("保存当前季度数据")
+    public R<Void> saveBasicData(@RequestBody BasicDataDTO dto) {
+        try {
+            tbBasicDataService.saveBasicData(dto);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("保存当前季度数据异常", e);
+            return R.fail();
+        }
+        return R.ok();
+    }
+    /**
+     * 导入模板下载
+     */
+    @GetMapping("/download")
+    @ApiOperation("模板下载")
+    public void downloadImportTemplate() {
+        try {
+            tbBasicDataService.downloadImportTemplate();
+        } catch (Exception e) {
+            log.error("模板下载异常",e);
+            throw new ServiceException("模板下载失败,请联系管理员!");
+        }
+    }
+
+    @PostMapping("import")
+    @ApiOperation("基础数据导入")
+    public R<Void> importBasicData(@RequestPart("file") MultipartFile file) {
+        try {
+            tbBasicDataService.importBasicData(file);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("基础数据导入异常",e);
+            throw new ServiceException("基础数据导入失败,请联系管理员!");
+        }
+        return R.ok();
+    }
+}
diff --git a/ruoyi-admin-dept/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java b/ruoyi-admin-dept/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java
index 4a00ca4..4f399fb 100644
--- a/ruoyi-admin-dept/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java
+++ b/ruoyi-admin-dept/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java
@@ -1,26 +1,22 @@
 package com.ruoyi.web.core.config;
 
-import java.util.ArrayList;
-import java.util.List;
+import com.ruoyi.common.config.RuoYiConfig;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.models.auth.In;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import com.ruoyi.common.config.RuoYiConfig;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.models.auth.In;
 import springfox.documentation.builders.ApiInfoBuilder;
 import springfox.documentation.builders.PathSelectors;
 import springfox.documentation.builders.RequestHandlerSelectors;
-import springfox.documentation.service.ApiInfo;
-import springfox.documentation.service.ApiKey;
-import springfox.documentation.service.AuthorizationScope;
-import springfox.documentation.service.Contact;
-import springfox.documentation.service.SecurityReference;
-import springfox.documentation.service.SecurityScheme;
+import springfox.documentation.service.*;
 import springfox.documentation.spi.DocumentationType;
 import springfox.documentation.spi.service.contexts.SecurityContext;
 import springfox.documentation.spring.web.plugins.Docket;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Swagger2的接口配置
@@ -113,9 +109,9 @@
         // 用ApiInfoBuilder进行定制
         return new ApiInfoBuilder()
                 // 设置标题
-                .title("标题:好莱坞小程序_接口文档")
+                .title("财政运行分析评估系统部门端接口文档")
                 // 描述
-                .description("好莱坞小程序接口文档")
+                .description("财政运行分析评估系统部门端接口文档")
                 // 作者信息
                 .contact(new Contact(ruoyiConfig.getName(), null, null))
                 // 版本
diff --git a/ruoyi-admin-dept/src/main/resources/mybatis/mybatis-config.xml b/ruoyi-admin-dept/src/main/resources/mybatis/mybatis-config.xml
index 68a75af..1e19c83 100644
--- a/ruoyi-admin-dept/src/main/resources/mybatis/mybatis-config.xml
+++ b/ruoyi-admin-dept/src/main/resources/mybatis/mybatis-config.xml
@@ -15,6 +15,8 @@
         <setting name="logImpl"                  value="SLF4J"  />
         <!-- 使用驼峰命名法转换字段 -->
 <!--		 <setting name="mapUnderscoreToCamelCase" value="true"/>-->
+        <!--开启枚举类自动转换-->
+        <setting name="defaultEnumTypeHandler" value="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>
 	</settings>
 	
 </configuration>
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbBasicDataCategoryController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbBasicDataCategoryController.java
index 75d5212..8fca721 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbBasicDataCategoryController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbBasicDataCategoryController.java
@@ -3,6 +3,7 @@
 
 import com.ruoyi.common.basic.PageDTO;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.BeanUtils;
 import com.ruoyi.system.domain.TbBasicDataCategory;
 import com.ruoyi.system.dto.BasicDataCategoryDTO;
@@ -17,8 +18,6 @@
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
-
-import java.util.Objects;
 
 /**
  * <p>
@@ -45,7 +44,15 @@
     @PostMapping("/add")
     @ApiOperation("添加")
     public R<Void> add(@RequestBody @Validated BasicDataCategoryDTO dto) {
-        tbBasicDataCategoryService.add(dto);
+        try {
+            tbBasicDataCategoryService.add(dto);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("添加异常", e);
+            return R.fail();
+        }
         return R.ok();
     }
 
@@ -57,7 +64,15 @@
     @PostMapping("/edit")
     @ApiOperation("编辑")
     public R<Void> add(@RequestBody @Validated BasicDataCategoryUpdateDTO dto) {
-        tbBasicDataCategoryService.update(dto);
+        try {
+            tbBasicDataCategoryService.update(dto);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("编辑异常", e);
+            return R.fail();
+        }
         return R.ok();
     }
 
@@ -69,7 +84,15 @@
     @DeleteMapping("/delete")
     @ApiOperation("删除")
     public R<Void> delete(@RequestParam(value = "id") Integer id){
-        tbBasicDataCategoryService.removeById(id);
+        try {
+            tbBasicDataCategoryService.removeById(id);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("删除异常", e);
+            return R.fail();
+        }
         return R.ok();
     }
 
@@ -81,9 +104,17 @@
     @GetMapping("/get-details")
     @ApiOperation("根据id获取详情")
     public R<BasicDataCategoryVO> getDetails(@RequestParam(value = "id") Integer id){
-        TbBasicDataCategory basicDataCategory = tbBasicDataCategoryService.getById(id);
-        BasicDataCategoryVO vo = BeanUtils.copyBean(basicDataCategory, BasicDataCategoryVO.class);
-        return R.ok(vo);
+        try {
+            TbBasicDataCategory basicDataCategory = tbBasicDataCategoryService.getById(id);
+            BasicDataCategoryVO vo = BeanUtils.copyBean(basicDataCategory, BasicDataCategoryVO.class);
+            return R.ok(vo);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("根据id获取详情异常", e);
+            return R.fail();
+        }
     }
 
     /**
@@ -94,11 +125,15 @@
     @PostMapping("/show-hide")
     @ApiOperation("隐藏显示操作")
     public R<Void> showHide(@RequestBody ShowHideDTO dto) {
-        TbBasicDataCategory basicDataCategory = tbBasicDataCategoryService.getById(dto.getId());
-        if (Objects.isNull(basicDataCategory)) {
-            throw new RuntimeException("非法参数");
+        try {
+            tbBasicDataCategoryService.showHide(dto);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("隐藏显示操作异常", e);
+            return R.fail();
         }
-        tbBasicDataCategoryService.lambdaUpdate().set( TbBasicDataCategory::getStatus, dto.getStatus()).eq(TbBasicDataCategory::getId, dto.getId()).update();
         return R.ok();
     }
 
@@ -110,8 +145,15 @@
     @PostMapping("/page")
     @ApiOperation("分页条件查询")
     public R<PageDTO<BasicDataCategoryVO>> page(@RequestBody BasicDataCategoryQuery query) {
-        return R.ok(tbBasicDataCategoryService.queryPage(query));
+        try {
+            return R.ok(tbBasicDataCategoryService.queryPage(query));
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("分页条件查询异常", e);
+            return R.fail();
+        }
     }
-
 }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbBasicDataConfigController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbBasicDataConfigController.java
index 3e0d496..8d79f06 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbBasicDataConfigController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbBasicDataConfigController.java
@@ -4,6 +4,7 @@
 import com.ruoyi.common.basic.PageDTO;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.enums.ShowStatusEnum;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.BeanUtils;
 import com.ruoyi.system.domain.TbBasicDataCategory;
 import com.ruoyi.system.dto.BasicDataConfigDTO;
@@ -35,7 +36,7 @@
 @Slf4j
 @RestController
 @RequiredArgsConstructor
-@Api(tags = {"基础数据分类相关接口"})
+@Api(tags = {"基础数据配置相关接口"})
 @RequestMapping("/basic-data-config")
 public class TbBasicDataConfigController {
 
@@ -49,8 +50,16 @@
     @GetMapping("/categories")
     @ApiOperation(value = "获取分类列表")
     public R<List<BasicDataCategoryVO>> queryBasicDataCategories() {
-        List<TbBasicDataCategory> list = tbBasicDataCategoryService.lambdaQuery().eq(TbBasicDataCategory::getStatus, ShowStatusEnum.SHOW).list();
-        return R.ok(BeanUtils.copyList(list, BasicDataCategoryVO.class));
+        try {
+            List<TbBasicDataCategory> list = tbBasicDataCategoryService.lambdaQuery().eq(TbBasicDataCategory::getStatus, ShowStatusEnum.SHOW).list();
+            return R.ok(BeanUtils.copyList(list, BasicDataCategoryVO.class));
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("获取分类列表异常", e);
+            return R.fail();
+        }
     }
 
     /**
@@ -61,7 +70,15 @@
     @PostMapping("/add")
     @ApiOperation("添加")
     public R<Void> add(@RequestBody @Validated BasicDataConfigDTO dto) {
-        tbBasicDataConfigService.add(dto);
+        try {
+            tbBasicDataConfigService.add(dto);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("添加异常", e);
+            return R.fail();
+        }
         return R.ok();
     }
 
@@ -73,7 +90,15 @@
     @PostMapping("/edit")
     @ApiOperation("编辑")
     public R<Void> edit(@RequestBody @Validated BasicDataConfigUpdateDTO dto) {
-        tbBasicDataConfigService.edit(dto);
+        try {
+            tbBasicDataConfigService.edit(dto);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("编辑异常", e);
+            return R.fail();
+        }
         return R.ok();
     }
 
@@ -85,7 +110,16 @@
     @GetMapping("/get-details")
     @ApiOperation("获取详情")
     public R<BasicDataConfigDetailVO> getDetails(Integer id) {
-        return R.ok(tbBasicDataConfigService.getDetails(id));
+        try {
+            BasicDataConfigDetailVO details = tbBasicDataConfigService.getDetails(id);
+            return R.ok(details);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("获取详情异常", e);
+            return R.fail();
+        }
     }
 
     /**
@@ -96,7 +130,15 @@
     @DeleteMapping("/delete")
     @ApiOperation("删除")
     public R<Void> delete(Integer id) {
-        tbBasicDataConfigService.delete(id);
+        try {
+            tbBasicDataConfigService.delete(id);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("删除异常", e);
+            return R.fail();
+        }
         return R.ok();
     }
 
@@ -108,7 +150,15 @@
     @PostMapping("show-hide")
     @ApiOperation("隐藏显示操作")
     public R<Void> showHide(@RequestBody ShowHideDTO dto) {
-       tbBasicDataConfigService.showHide(dto);
+        try {
+            tbBasicDataConfigService.showHide(dto);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("隐藏显示操作异常", e);
+            return R.fail();
+        }
         return R.ok();
     }
 
@@ -120,7 +170,16 @@
     @PostMapping("/page")
     @ApiOperation("分页条件查询")
     public R<PageDTO<BasicDataConfigVO>> page(@RequestBody BasicDataConfigQuery query) {
-        return R.ok(tbBasicDataConfigService.queryPage(query));
+        try {
+            PageDTO<BasicDataConfigVO> basicDataConfigVOPageDTO = tbBasicDataConfigService.queryPage(query);
+            return R.ok(basicDataConfigVOPageDTO);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("分页条件查询异常", e);
+            return R.fail();
+        }
     }
 }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbDeptController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbDeptController.java
index ef97d4f..deade72 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbDeptController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbDeptController.java
@@ -3,7 +3,7 @@
 
 import com.ruoyi.common.basic.PageDTO;
 import com.ruoyi.common.core.domain.R;
-import com.ruoyi.common.exception.GlobalException;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.BeanUtils;
 import com.ruoyi.common.utils.ExcelUtil;
 import com.ruoyi.system.domain.TbDept;
@@ -21,7 +21,6 @@
 
 import javax.servlet.http.HttpServletResponse;
 import java.util.ArrayList;
-import java.util.Objects;
 
 /**
  * <p>
@@ -52,7 +51,7 @@
             ExcelUtil.exportExcel(list, "部门导入模板", "部门导入模板", TbDept.class, "部门导入模板", response);
         } catch (Exception e) {
             log.error("模板下载异常",e);
-            throw new GlobalException("模板下载失败,请联系管理员!");
+            throw new ServiceException("模板下载失败,请联系管理员!");
         }
     }
 
@@ -63,10 +62,13 @@
      */
     @PostMapping("/import")
     @ApiOperation("导入")
-    public R<Object> importExcel(@RequestPart("file")MultipartFile file) {
+    public R<Void> importExcel(@RequestPart("file")MultipartFile file) {
         try {
             tbDeptService.importExcel(file);
         } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
             log.error("导入失败", e);
             throw new RuntimeException(e.getMessage());
         }
@@ -81,7 +83,15 @@
     @PostMapping("/page")
     @ApiOperation("分页条件查询")
     public R<PageDTO<DeptVO>> page(@RequestBody DeptQuery query) {
-        return R.ok(tbDeptService.queryPage(query));
+        try {
+            return R.ok(tbDeptService.queryPage(query));
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("分页条件查询异常", e);
+            return R.fail();
+        }
     }
 
     /**
@@ -92,8 +102,16 @@
     @GetMapping("/get-details")
     @ApiOperation("根据id查询部门详情")
     public R<DeptVO> getDetails(@RequestParam Integer id) {
-        TbDept dept = tbDeptService.getById(id);
-        return R.ok(BeanUtils.copyBean(dept,DeptVO.class));
+        try {
+            TbDept dept = tbDeptService.getById(id);
+            return R.ok(BeanUtils.copyBean(dept,DeptVO.class));
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("根据id查询部门详情异常", e);
+            return R.fail();
+        }
     }
 
     /**
@@ -104,8 +122,16 @@
     @PostMapping("/edit")
     @ApiOperation("编辑")
     public R<Object> edit(@RequestBody DeptUpdateDTO dto){
-        TbDept tbDept = BeanUtils.copyBean(dto, TbDept.class);
-        tbDeptService.updateById(tbDept);
+        try {
+            TbDept tbDept = BeanUtils.copyBean(dto, TbDept.class);
+            tbDeptService.updateById(tbDept);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("编辑异常", e);
+            return R.fail();
+        }
         return R.ok();
     }
 
@@ -117,14 +143,7 @@
     @PostMapping("/focus")
     @ApiOperation("重点关注")
     public R<Object> focus(@RequestBody DeptFocusDTO dto){
-        TbDept dept = tbDeptService.getById(dto.getId());
-        if (Objects.isNull(dept)) {
-            throw new RuntimeException("非法参数");
-        }
-        tbDeptService.lambdaUpdate()
-                .eq(TbDept::getId, dto.getId())
-                .set(TbDept::getFocussed, dto.getFocussed())
-                .update();
+       tbDeptService.focus(dto);
         return R.ok();
     }
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbFieldCategoryController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbFieldCategoryController.java
index d4c16ad..4675827 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbFieldCategoryController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbFieldCategoryController.java
@@ -3,8 +3,7 @@
 
 import com.ruoyi.common.basic.PageDTO;
 import com.ruoyi.common.core.domain.R;
-import com.ruoyi.common.utils.BeanUtils;
-import com.ruoyi.system.domain.TbFieldCategory;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.system.dto.FieldCategoryDTO;
 import com.ruoyi.system.dto.ShowHideDTO;
 import com.ruoyi.system.dto.update.FieldCategoryUpdateDTO;
@@ -18,9 +17,6 @@
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-import java.util.Objects;
 
 /**
  * <p>
@@ -47,7 +43,15 @@
     @PostMapping("/add")
     @ApiOperation("添加")
     public R<Object> add(@RequestBody @Validated FieldCategoryDTO dto) {
-        tbFieldCategoryService.add(dto);
+        try {
+            tbFieldCategoryService.add(dto);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("添加异常", e);
+            return R.fail();
+        }
         return R.ok();
     }
 
@@ -59,24 +63,16 @@
     @GetMapping("/get-details")
     @ApiOperation("根据id获取字段分类详情")
     public R<FieldCategoryDetailVO> getById(@RequestParam(value = "id") Integer id) {
-        TbFieldCategory oneCategory = tbFieldCategoryService.getById(id);
-        if (Objects.isNull(oneCategory)) {
-            return R.ok(new FieldCategoryDetailVO());
+        try {
+            FieldCategoryDetailVO vo = tbFieldCategoryService.getDetailsById(id);
+            return R.ok(vo);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("根据id获取字段分类详情异常", e);
+            return R.fail();
         }
-        FieldCategoryDetailVO vo = BeanUtils.copyBean(oneCategory, FieldCategoryDetailVO.class);
-        //根据一级分类id,查询二级分类
-        List<TbFieldCategory> twoCategoryList = tbFieldCategoryService.lambdaQuery().eq(TbFieldCategory::getParentId, oneCategory.getId()).list();
-        twoCategoryList.forEach(item->{
-            FieldCategoryDetailVO twoCategoryVO = BeanUtils.copyBean(item, FieldCategoryDetailVO.class);
-            vo.getChildren().add(twoCategoryVO);
-            //根据二级分类id,查询三级分类
-            List<TbFieldCategory> threeCategoryList = tbFieldCategoryService.lambdaQuery().eq(TbFieldCategory::getParentId, item.getId()).list();
-            threeCategoryList.forEach(threeCategory->{
-                FieldCategoryDetailVO threeCategoryVO = BeanUtils.copyBean(threeCategory, FieldCategoryDetailVO.class);
-                twoCategoryVO.getChildren().add(threeCategoryVO);
-            });
-        });
-        return R.ok(vo);
     }
 
     /**
@@ -87,7 +83,15 @@
     @PostMapping("/page")
     @ApiOperation("分页条件查询")
     public R<PageDTO<FieldCategoryVO>> page(@RequestBody FieldCategoryQuery query) {
-        return R.ok(tbFieldCategoryService.queryPage(query));
+        try {
+            return R.ok(tbFieldCategoryService.queryPage(query));
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("分页条件查询异常", e);
+            return R.fail();
+        }
     }
 
     /**
@@ -98,7 +102,15 @@
     @PostMapping("/show-hide")
     @ApiOperation("隐藏显示操作")
     public R<Void> showHide(@RequestBody ShowHideDTO dto) {
-        tbFieldCategoryService.showHide(dto);
+        try {
+            tbFieldCategoryService.showHide(dto);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("隐藏显示操作异常", e);
+            return R.fail();
+        }
         return R.ok();
     }
 
@@ -110,7 +122,15 @@
     @DeleteMapping("/delete-children")
     @ApiOperation("编辑页面删除子字段分类")
     public R<Object> deleteChildren(@RequestParam(value = "id") Integer id){
-        tbFieldCategoryService.deleteChildren(id);
+        try {
+            tbFieldCategoryService.deleteChildren(id);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("编辑页面删除子字段分类异常", e);
+            return R.fail();
+        }
         return R.ok();
     }
 
@@ -122,7 +142,15 @@
     @DeleteMapping("/delete")
     @ApiOperation("列表页面删除分类")
     public R<Void> delete(@RequestParam(value = "id") Integer id){
-        tbFieldCategoryService.delete(id);
+        try {
+            tbFieldCategoryService.delete(id);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("列表页面删除分类异常", e);
+            return R.fail();
+        }
         return R.ok();
     }
 
@@ -134,7 +162,15 @@
     @PutMapping("/edit")
     @ApiOperation("编辑")
     public R<Object> edit(@RequestBody FieldCategoryUpdateDTO dto) {
-        tbFieldCategoryService.edit(dto);
+        try {
+            tbFieldCategoryService.edit(dto);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("编辑异常", e);
+            return R.fail();
+        }
         return R.ok();
     }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbFieldController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbFieldController.java
index 405cbc6..6b0485b 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbFieldController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbFieldController.java
@@ -3,6 +3,7 @@
 
 import com.ruoyi.common.basic.PageDTO;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.BeanUtils;
 import com.ruoyi.system.domain.TbField;
 import com.ruoyi.system.dto.FieldDTO;
@@ -21,7 +22,6 @@
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
-import java.util.Objects;
 
 /**
  * <p>
@@ -49,7 +49,15 @@
     @GetMapping("/categories")
     @ApiOperation(value = "获取分类列表",notes = "一级分类id传0,二级分类传一级分类id,三级分类同理")
     public R<List<FieldCategoryVO>> queryFieldCategories(@RequestParam Integer id) {
-        return R.ok(tbFieldCategoryService.queryFieldCategories(id));
+        try {
+            return R.ok(tbFieldCategoryService.queryFieldCategories(id));
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("获取分类列表异常", e);
+            return R.fail();
+        }
     }
 
     /**
@@ -60,14 +68,30 @@
     @PostMapping("/add")
     @ApiOperation("添加字段")
     public R<Void> add(@RequestBody @Validated FieldDTO dto){
-        tbFieldService.add(dto);
+        try {
+            tbFieldService.add(dto);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("添加字段异常", e);
+            return R.fail();
+        }
         return R.ok();
     }
 
     @GetMapping("/influenced-data")
     @ApiOperation("隐藏字段,获取同步隐藏的基础数据")
-    public R<List<String>> influencedData(@RequestParam Integer id) {
-        return R.ok(tbFieldService.influencedData(id));
+    public R<String> influencedData(@RequestParam Integer id) {
+        try {
+            return R.ok(tbFieldService.influencedData(id));
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("获取同步隐藏的基础数据异常", e);
+            return R.fail();
+        }
     }
     /**
      * 隐藏显示操作
@@ -77,7 +101,15 @@
     @PostMapping("/show-hide")
     @ApiOperation("隐藏显示操作")
     public R<Void> showHide(@RequestBody ShowHideDTO dto) {
-        tbFieldService.showHide(dto);
+        try {
+            tbFieldService.showHide(dto);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("隐藏显示操作异常", e);
+            return R.fail();
+        }
         return R.ok();
     }
 
@@ -89,12 +121,15 @@
     @PostMapping("/edit")
     @ApiOperation("编辑字段")
     public R<Void> add(@RequestBody @Validated FieldUpdateDTO dto){
-        TbField field = tbFieldService.getById(dto.getId());
-        if (Objects.isNull(field)) {
-            throw new RuntimeException("参数异常");
+        try {
+            tbFieldService.update(dto);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("编辑字段异常", e);
+            return R.fail();
         }
-        TbField tbField = BeanUtils.copyBean(dto, TbField.class);
-        tbFieldService.updateById(tbField);
         return R.ok();
     }
 
@@ -106,7 +141,15 @@
     @PostMapping("/page")
     @ApiOperation("分页条件查询")
     public R<PageDTO<FieldVO>> page(@RequestBody FieldQuery query) {
-        return R.ok(tbFieldService.queryPage(query));
+        try {
+            return R.ok(tbFieldService.queryPage(query));
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("分页条件查询异常", e);
+            return R.fail();
+        }
     }
 
     /**
@@ -117,8 +160,16 @@
     @GetMapping("/get-details")
     @ApiOperation("获取详情")
     public R<FieldVO> getDetails(@RequestParam Integer id){
-        TbField field = tbFieldService.getById(id);
-        return R.ok(BeanUtils.copyBean(field, FieldVO.class));
+        try {
+            TbField field = tbFieldService.getById(id);
+            return R.ok(BeanUtils.copyBean(field, FieldVO.class));
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("获取详情", e);
+            return R.fail();
+        }
     }
 
     /**
@@ -129,7 +180,15 @@
     @DeleteMapping("/delete")
     @ApiOperation("删除")
     public R<Void> delete(@RequestParam Integer id){
-        tbFieldService.removeById(id);
+        try {
+            tbFieldService.removeById(id);
+        } catch (Exception e) {
+            if (e instanceof ServiceException) {
+                return R.fail(e.getMessage());
+            }
+            log.error("获取详情", e);
+            return R.fail();
+        }
         return R.ok();
     }
 }
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index 573c853..c2037f7 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -186,6 +186,11 @@
             <artifactId>commons-jexl3</artifactId>
             <version>3.3</version>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>3.3.4</version>
+        </dependency>
     </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/NumberDisplaceChineseUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/NumberDisplaceChineseUtil.java
new file mode 100644
index 0000000..318b6e7
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/NumberDisplaceChineseUtil.java
@@ -0,0 +1,54 @@
+package com.ruoyi.common;
+
+public class NumberDisplaceChineseUtil {
+ 
+    final static String[] unitArray= {"","十","百","千","万","十","百","千","亿","十","百","千","万"};
+    final static String[] numArray = {"零","一","二","三","四","五","六","七","八","九"};
+ 
+    public static String numberToChinese(Integer number) throws Exception{
+        if (number == null) {
+            return "";
+        }
+        if (number == 0) {
+            return "零";
+        }
+        char[] charArray= String.valueOf(number).toCharArray();
+        int arrayLength = charArray.length;
+        StringBuilder stringBuilder = new StringBuilder();
+ 
+        for(int i = 0; i<arrayLength; i++){
+            int num = Integer.valueOf(charArray[i] + "");
+            boolean isZero = num == 0;
+            String unit = unitArray[(arrayLength - 1) - i];
+            if (isZero) {
+                continue;
+            }else {
+                if(i==0){
+                    stringBuilder.append(numArray[num]);
+                    stringBuilder.append(unit);
+                }else{
+                    if(charArray[i-1]=='0'){
+                        stringBuilder.append("零");
+                        stringBuilder.append(numArray[num]);
+                        stringBuilder.append(unit);
+                    }else{
+                        stringBuilder.append(numArray[num]);
+                        stringBuilder.append(unit);
+                    }
+                }
+            }
+        }
+        String numString = stringBuilder.toString();
+        if(numString.length() > 1){
+            if(numString.toCharArray()[0]== '一' && numString.toCharArray()[1] == '十'){
+                return numString.substring(1);
+            }
+        }
+        return numString;
+    }
+ 
+    public static void main(String[] args) throws Exception {
+        String s = numberToChinese(1234567890);
+        System.out.println(s);
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DisabledEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DisabledEnum.java
index b904c30..9df4d44 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/DisabledEnum.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/DisabledEnum.java
@@ -44,4 +44,19 @@
         }
         return null;
     }
+
+    /**
+     * 通过desc获取美剧
+     * @param desc
+     * @return
+     */
+    public static DisabledEnum getByDesc(String desc) {
+        DisabledEnum[] resultTypes = DisabledEnum.values();
+        for (DisabledEnum resultType : resultTypes) {
+            if (desc.equals(resultType.getDesc())) {
+                return resultType;
+            }
+        }
+        return null;
+    }
 }
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/ReportingStatusEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/ReportingStatusEnum.java
new file mode 100644
index 0000000..4b3d73f
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/ReportingStatusEnum.java
@@ -0,0 +1,26 @@
+package com.ruoyi.common.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.fasterxml.jackson.annotation.JsonValue;
+import lombok.Getter;
+import lombok.AllArgsConstructor;
+@Getter
+@AllArgsConstructor
+public enum ReportingStatusEnum {
+	UNFILLED(1, "未填报"),
+	MISSING_DATA(2, "数据缺失"),
+	FILLED(3, "已填报");
+	@EnumValue
+	private final Integer code;
+	@JsonValue
+	private final String desc;
+
+	public static ReportingStatusEnum getEnumByCode(Integer code) {
+		for (ReportingStatusEnum e : ReportingStatusEnum.values()) {
+			if (e.code.equals(code)) {
+				return e;
+			}
+		}
+		return null;
+	}
+} 
\ No newline at end of file
diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml
index 5711da5..09a6043 100644
--- a/ruoyi-system/pom.xml
+++ b/ruoyi-system/pom.xml
@@ -29,16 +29,11 @@
 <!--            </exclusions>-->
         </dependency>
 
+        <!--easy-poi-->
         <dependency>
             <groupId>cn.afterturn</groupId>
             <artifactId>easypoi-spring-boot-starter</artifactId>
-            <version>4.0.0</version>
-            <exclusions>
-                <exclusion>
-                    <artifactId>guava</artifactId>
-                    <groupId>com.google.guava</groupId>
-                </exclusion>
-            </exclusions>
+            <version>4.4.0</version>
         </dependency>
 
         <!--mybatis-plus-->
@@ -76,6 +71,11 @@
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>3.3.4</version>
+        </dependency>
     </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicData.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicData.java
index 1cee284..612dcc6 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicData.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicData.java
@@ -1,6 +1,7 @@
 package com.ruoyi.system.domain;
 
 import com.baomidou.mybatisplus.annotation.*;
+import com.ruoyi.common.enums.ReportingStatusEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -33,7 +34,7 @@
     @TableField("quarter")
     private String quarter;
 
-    @ApiModelProperty(value = "所属部门id")
+    @ApiModelProperty(value = "区划代码")
     @TableField("dept_area_code")
     private String deptAreaCode;
 
@@ -51,7 +52,7 @@
 
     @ApiModelProperty(value = "填报状态(1=未填报 2=数据缺失 3=已填报)")
     @TableField("status")
-    private Integer status;
+    private ReportingStatusEnum status;
 
     @ApiModelProperty(value = "删除标志(0代表存在 1代表删除)")
     @TableField("del_flag")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicDataField.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicDataField.java
index 633a7e8..10e6c39 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicDataField.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicDataField.java
@@ -41,11 +41,6 @@
     @TableField("field_value")
     private String fieldValue;
 
-    @ApiModelProperty(value = "删除标志(0代表存在 1代表删除)")
-    @TableField("del_flag")
-    @TableLogic
-    private String delFlag;
-
     @ApiModelProperty(value = "创建人")
     @TableField("create_by")
     private String createBy;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbDept.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbDept.java
index 07aa6a0..9bab699 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbDept.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbDept.java
@@ -2,7 +2,7 @@
 
 import cn.afterturn.easypoi.excel.annotation.Excel;
 import com.baomidou.mybatisplus.annotation.*;
-import com.ruoyi.common.enums.ShowStatusEnum;
+import com.ruoyi.common.enums.DisabledEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -53,8 +53,8 @@
 
     @ApiModelProperty(value = "县级标志(不包含直辖市的区 0:否 1:是)")
     @TableField("county_flag")
-    @Excel(name = "县级标志 是/否",replace = {"是_1","否_2"})
-    private ShowStatusEnum countyFlag;
+    @Excel(name = "县级标志 是/否",replace = {"是_1","否_0"})
+    private DisabledEnum countyFlag;
 
     @ApiModelProperty(value = "负责人")
     @TableField("person_in_charge")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/BasicDataDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/BasicDataDTO.java
new file mode 100644
index 0000000..842e0f9
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/BasicDataDTO.java
@@ -0,0 +1,33 @@
+package com.ruoyi.system.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author mitao
+ * @date 2024/3/21
+ */
+@Data
+@ApiModel(value = "当前季度基础数据数据传输对象")
+public class BasicDataDTO {
+
+    //TODO 登录功能好了之后删掉
+    @ApiModelProperty(value = "区划代码")
+    private String deptAreaCode;
+
+    @ApiModelProperty(value = "转移支付规模")
+    private String transferPaymentScale;
+
+    @ApiModelProperty(value = "当期GDP")
+    private String currentGdp;
+
+    @ApiModelProperty(value = "动态字段")
+    private List<BasicDataFieldDTO> fields = new ArrayList<>();
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/BasicDataFieldDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/BasicDataFieldDTO.java
new file mode 100644
index 0000000..b74a7e6
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/BasicDataFieldDTO.java
@@ -0,0 +1,20 @@
+package com.ruoyi.system.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author mitao
+ * @date 2024/3/21
+ */
+@Data
+@ApiModel(value = "当前季度基础数据字段数据传输对象")
+public class BasicDataFieldDTO {
+
+    @ApiModelProperty(value = "字段id")
+    private Integer fieldId;
+
+    @ApiModelProperty(value = "字段值")
+    private String fieldValue;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/handler/DeptVerifyHandler.java b/ruoyi-system/src/main/java/com/ruoyi/system/handler/DeptVerifyHandler.java
index b622daa..61952e7 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/handler/DeptVerifyHandler.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/handler/DeptVerifyHandler.java
@@ -3,8 +3,7 @@
 import cn.afterturn.easypoi.excel.entity.result.ExcelVerifyHandlerResult;
 import cn.afterturn.easypoi.handler.inter.IExcelVerifyHandler;
 import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.system.domain.TbDept;
-import lombok.RequiredArgsConstructor;
+import com.ruoyi.system.importExcel.DeptExcel;
 import org.springframework.stereotype.Component;
 
 /**
@@ -12,10 +11,9 @@
  * @date 2024/3/13
  */
 @Component
-@RequiredArgsConstructor
-public class DeptVerifyHandler implements IExcelVerifyHandler<TbDept> {
+public class DeptVerifyHandler implements IExcelVerifyHandler<DeptExcel> {
     @Override
-    public ExcelVerifyHandlerResult verifyHandler(TbDept obj) {
+    public ExcelVerifyHandlerResult verifyHandler(DeptExcel obj) {
         ExcelVerifyHandlerResult result = new ExcelVerifyHandlerResult(true);
         if (StringUtils.isEmpty(obj.getAreaName()) || StringUtils.isEmpty(obj.getAreaCode()) ||
                 StringUtils.isEmpty(obj.getAreaLevel()) || StringUtils.isNull(obj.getCountyFlag()) ||
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/importExcel/BasicDataExcel.java b/ruoyi-system/src/main/java/com/ruoyi/system/importExcel/BasicDataExcel.java
new file mode 100644
index 0000000..1ba30d4
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/importExcel/BasicDataExcel.java
@@ -0,0 +1,39 @@
+package com.ruoyi.system.importExcel;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import com.ruoyi.system.vo.FieldVO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author mitao
+ * @date 2024/3/21
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="基础数据导入Excel对象")
+public class BasicDataExcel implements Serializable {
+
+    private static final long serialVersionUID = 8626000917362659046L;
+
+    @ApiModelProperty(value = "季度")
+    @Excel(name = "填报季度")
+    private String quarter;
+
+    @ApiModelProperty(value = "转移支付规模")
+    @Excel(name = "转移支付规模")
+    private String transferPaymentScale;
+
+    @ApiModelProperty(value = "当期GDP")
+    @Excel(name = "当期GDP")
+    private String currentGdp;
+    private List<FieldVO> fieldVOS;
+
+    @Excel(name = "备注")
+    private String remark;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/importExcel/DeptExcel.java b/ruoyi-system/src/main/java/com/ruoyi/system/importExcel/DeptExcel.java
new file mode 100644
index 0000000..81bea78
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/importExcel/DeptExcel.java
@@ -0,0 +1,63 @@
+package com.ruoyi.system.importExcel;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import com.ruoyi.common.enums.DisabledEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 部门管理表
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-03-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="部门导入Excel对象")
+public class DeptExcel implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "部门地区")
+    @Excel(name = "部门地区")
+    private String areaName;
+
+    @ApiModelProperty(value = "别名")
+    @Excel(name = "别名")
+    private String areaAlias;
+
+    @ApiModelProperty(value = "区划代码")
+    @Excel(name = "区划代码")
+    private String areaCode;
+
+    @ApiModelProperty(value = "级次(省、市、县)")
+    @Excel(name = "级次(省、市、县)")
+    private String areaLevel;
+
+    @ApiModelProperty(value = "县级标志(不包含直辖市的区 0:否 1:是)")
+    @Excel(name = "县级标志 是/否",enumImportMethod = "getByDesc")
+    private DisabledEnum countyFlag;
+
+    @ApiModelProperty(value = "负责人")
+    @Excel(name = "负责人")
+    private String personInCharge;
+
+    @ApiModelProperty(value = "登录账号")
+    @Excel(name = "登录账号")
+    private String account;
+
+    @ApiModelProperty(value = "联系电话")
+    @Excel(name = "联系电话")
+    private String phone;
+
+    @ApiModelProperty(value = "登录密码")
+    @Excel(name = "登录密码")
+    private String password;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/importExcel/FieldExcel.java b/ruoyi-system/src/main/java/com/ruoyi/system/importExcel/FieldExcel.java
new file mode 100644
index 0000000..7936661
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/importExcel/FieldExcel.java
@@ -0,0 +1,32 @@
+package com.ruoyi.system.importExcel;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import com.ruoyi.common.enums.FieldTypeEnum;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * @author mitao
+ * @date 2024/3/21
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="动态字段导入Excel对象")
+public class FieldExcel implements Serializable {
+
+    private static final long serialVersionUID = -3195855772711996257L;
+
+    @Excel(name = "字段名")
+    private String fieldName;
+
+    private FieldTypeEnum fieldType;
+
+    private String levelOneCategory;
+
+    private String levelTwoCategory;
+
+    private String levelThreeCategory;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/listener/BasicDataListener.java b/ruoyi-system/src/main/java/com/ruoyi/system/listener/BasicDataListener.java
new file mode 100644
index 0000000..e3ae9c4
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/listener/BasicDataListener.java
@@ -0,0 +1,121 @@
+package com.ruoyi.system.listener;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.alibaba.excel.util.ListUtils;
+import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.google.common.collect.Lists;
+import com.ruoyi.common.NumberDisplaceChineseUtil;
+import com.ruoyi.common.enums.ReportingStatusEnum;
+import com.ruoyi.common.enums.ShowStatusEnum;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.DateUtils;
+import com.ruoyi.system.domain.TbBasicData;
+import com.ruoyi.system.domain.TbBasicDataField;
+import com.ruoyi.system.domain.TbDept;
+import com.ruoyi.system.domain.TbField;
+import com.ruoyi.system.service.TbBasicDataFieldService;
+import com.ruoyi.system.service.TbBasicDataService;
+import com.ruoyi.system.service.TbFieldService;
+import lombok.extern.slf4j.Slf4j;
+
+import java.time.LocalDate;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+public class BasicDataListener extends AnalysisEventListener<Map<Integer, String>> {
+    /**
+     * 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收
+     */
+    private static final int BATCH_COUNT = 10;
+    private List<Map<Integer, String>> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
+    public TbBasicDataService tbBasicDataService;
+    public List<TbField> fieldList;
+    public TbFieldService tbFieldService;
+    public TbDept dept;
+    public TbBasicDataFieldService tbBasicDataFieldService;
+    public BasicDataListener() {
+    }
+
+    public BasicDataListener(TbBasicDataService tbBasicDataService, List<TbField> fieldList, TbFieldService tbFieldService, TbDept dept, TbBasicDataFieldService tbBasicDataFieldService) {
+        this.tbBasicDataService = tbBasicDataService;
+        this.fieldList = fieldList;
+        this.tbFieldService = tbFieldService;
+        this.dept = dept;
+        this.tbBasicDataFieldService = tbBasicDataFieldService;
+    }
+
+    @Override
+    public void invoke(Map<Integer, String> data, AnalysisContext context) {
+        log.info("解析到一条数据:{}", JSON.toJSONString(data));
+        cachedDataList.add(data);
+        if (cachedDataList.size() >= BATCH_COUNT) {
+            try {
+                saveData();
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+            cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+        try {
+            saveData();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        log.info("所有数据解析完成!");
+    }
+
+    /**
+     * 加上存储数据库
+     */
+    private void saveData() throws Exception {
+        Map<Integer, String> headMap = cachedDataList.get(2);
+        Map<Integer, String> quarterMap = cachedDataList.get(4);
+        Map<Integer, String> dataMap = cachedDataList.get(5);
+        log.info("{}条数据,开始存储数据库!", cachedDataList.size());
+        log.info("表头:{}", JSON.toJSONString(headMap));
+        log.info("填写的数据:{}",JSON.toJSONString(dataMap));
+        int remarkIndex = headMap.size()-1;
+        Map<Integer, String> dynamicFieldsMap = headMap.entrySet().stream().filter(entry -> {
+            return !(Lists.newArrayList(0, 1, 2, 3).contains(entry.getKey()) || entry.getKey() == remarkIndex);
+        }).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+        List<String> dynamicFields = new ArrayList<>(dynamicFieldsMap.values());
+        List<String> collect = fieldList.stream().map(TbField::getFieldName).collect(Collectors.toList());
+        boolean flag = new ArrayList<>(dynamicFields).containsAll(collect);
+        if (dynamicFields.size() != collect.size() || flag){
+            throw new ServiceException("导入失败,请下载最新的导入模板");
+        }
+        Date date = new Date();
+        //当前所在季度
+        int quarterOfYear = DateUtils.getQuarterOfYear(date);
+        String quarterOfYearStr = NumberDisplaceChineseUtil.numberToChinese(quarterOfYear);
+        LocalDate now = LocalDate.now();
+        TbBasicData tbBasicData = new TbBasicData();
+        tbBasicData.setQuarter(String.format("%s年%s",now.getYear(),quarterMap.get(1)));
+        tbBasicData.setTransferPaymentScale(dataMap.get(2));
+        tbBasicData.setCurrentGdp(dataMap.get(3));
+        tbBasicData.setDeptAreaCode(dept.getAreaCode());
+        tbBasicData.setRemark(dataMap.get(remarkIndex));
+        tbBasicData.setStatus(ReportingStatusEnum.MISSING_DATA);
+        tbBasicDataService.saveOrUpdate(tbBasicData);
+        tbBasicDataFieldService.remove(Wrappers.<TbBasicDataField>lambdaQuery().eq(TbBasicDataField::getBasicDataId, tbBasicData));
+        for (Map.Entry<Integer, String> integerStringEntry : dynamicFieldsMap.entrySet()) {
+            Optional<TbField> tbField = tbFieldService.lambdaQuery().eq(TbField::getFieldName, integerStringEntry.getValue())
+                    .eq(TbField::getStatus, ShowStatusEnum.SHOW).oneOpt();
+            if (tbField.isPresent()) {
+                TbBasicDataField tbBasicDataField = new TbBasicDataField();
+                tbBasicDataField.setBasicDataId(tbBasicData.getId());
+                tbBasicDataField.setFieldId(tbField.get().getId());
+                tbBasicDataField.setFieldValue(dataMap.get(integerStringEntry.getKey()));
+                tbBasicDataFieldService.save(tbBasicDataField);
+            }
+        }
+        log.info("存储数据库成功!");
+    }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataCategoryService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataCategoryService.java
index 2c9e86a..4886641 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataCategoryService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataCategoryService.java
@@ -5,6 +5,7 @@
 import com.ruoyi.common.basic.PageDTO;
 import com.ruoyi.system.domain.TbBasicDataCategory;
 import com.ruoyi.system.dto.BasicDataCategoryDTO;
+import com.ruoyi.system.dto.ShowHideDTO;
 import com.ruoyi.system.dto.update.BasicDataCategoryUpdateDTO;
 import com.ruoyi.system.query.BasicDataCategoryQuery;
 import com.ruoyi.system.vo.BasicDataCategoryVO;
@@ -24,4 +25,6 @@
     void update(BasicDataCategoryUpdateDTO dto);
 
     PageDTO<BasicDataCategoryVO> queryPage(BasicDataCategoryQuery query);
+
+    void showHide(ShowHideDTO dto);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataService.java
index f755fe4..3c6535e 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbBasicDataService.java
@@ -1,7 +1,13 @@
 package com.ruoyi.system.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.core.domain.R;
 import com.ruoyi.system.domain.TbBasicData;
+import com.ruoyi.system.dto.BasicDataDTO;
+import com.ruoyi.system.vo.BasicDataReportingVO;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
 
 /**
  * <p>
@@ -13,4 +19,11 @@
  */
 public interface TbBasicDataService extends IService<TbBasicData> {
 
+    R<BasicDataReportingVO> getBasicFields(String deptAreaCode) throws Exception;
+
+    void saveBasicData(BasicDataDTO dto);
+
+    void downloadImportTemplate() throws Exception;
+
+    void importBasicData(MultipartFile file) throws IOException;
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbDeptService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbDeptService.java
index dd0c089..b3f34f9 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbDeptService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbDeptService.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.common.basic.PageDTO;
 import com.ruoyi.system.domain.TbDept;
+import com.ruoyi.system.dto.update.DeptFocusDTO;
 import com.ruoyi.system.query.DeptQuery;
 import com.ruoyi.system.vo.DeptVO;
 import org.springframework.web.multipart.MultipartFile;
@@ -20,4 +21,6 @@
     PageDTO<DeptVO> queryPage(DeptQuery query);
 
     void importExcel(MultipartFile file) throws Exception;
+
+    void focus(DeptFocusDTO dto);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbFieldCategoryService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbFieldCategoryService.java
index fc003f6..5392562 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbFieldCategoryService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbFieldCategoryService.java
@@ -7,6 +7,7 @@
 import com.ruoyi.system.dto.ShowHideDTO;
 import com.ruoyi.system.dto.update.FieldCategoryUpdateDTO;
 import com.ruoyi.system.query.FieldCategoryQuery;
+import com.ruoyi.system.vo.FieldCategoryDetailVO;
 import com.ruoyi.system.vo.FieldCategoryVO;
 
 import java.util.List;
@@ -35,4 +36,5 @@
 
     List<FieldCategoryVO> queryFieldCategories(Integer id);
 
+    FieldCategoryDetailVO getDetailsById(Integer id);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbFieldService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbFieldService.java
index 3dc444b..760a109 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/TbFieldService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/TbFieldService.java
@@ -5,10 +5,9 @@
 import com.ruoyi.system.domain.TbField;
 import com.ruoyi.system.dto.FieldDTO;
 import com.ruoyi.system.dto.ShowHideDTO;
+import com.ruoyi.system.dto.update.FieldUpdateDTO;
 import com.ruoyi.system.query.FieldQuery;
 import com.ruoyi.system.vo.FieldVO;
-
-import java.util.List;
 
 /**
  * <p>
@@ -26,5 +25,7 @@
 
     PageDTO<FieldVO> queryPage(FieldQuery query);
 
-    List<String> influencedData(Integer id);
+    String influencedData(Integer id);
+
+    void update(FieldUpdateDTO dto);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataCategoryServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataCategoryServiceImpl.java
index 651c0c7..30fe599 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataCategoryServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataCategoryServiceImpl.java
@@ -3,10 +3,12 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.basic.PageDTO;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.BeanUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.domain.TbBasicDataCategory;
 import com.ruoyi.system.dto.BasicDataCategoryDTO;
+import com.ruoyi.system.dto.ShowHideDTO;
 import com.ruoyi.system.dto.update.BasicDataCategoryUpdateDTO;
 import com.ruoyi.system.mapper.TbBasicDataCategoryMapper;
 import com.ruoyi.system.query.BasicDataCategoryQuery;
@@ -47,4 +49,13 @@
                 .page(new Page<>(query.getPageNum(), query.getPageSize()));
         return PageDTO.of(page,BasicDataCategoryVO.class);
     }
+
+    @Override
+    public void showHide(ShowHideDTO dto) {
+        TbBasicDataCategory basicDataCategory = this.getById(dto.getId());
+        if (Objects.isNull(basicDataCategory)) {
+            throw new ServiceException("非法参数");
+        }
+        this.lambdaUpdate().set( TbBasicDataCategory::getStatus, dto.getStatus()).eq(TbBasicDataCategory::getId, dto.getId()).update();
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataConfigServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataConfigServiceImpl.java
index 6049eeb..5a7ece4 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataConfigServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataConfigServiceImpl.java
@@ -6,7 +6,9 @@
 import com.ruoyi.common.basic.PageDTO;
 import com.ruoyi.common.enums.CalculateTypeEnum;
 import com.ruoyi.common.enums.ShowStatusEnum;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.BeanUtils;
+import com.ruoyi.common.utils.Checker;
 import com.ruoyi.common.utils.CollUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.domain.TbBasicDataConfig;
@@ -53,17 +55,29 @@
     public void add(BasicDataConfigDTO dto) {
         TbBasicDataConfig tbBasicDataConfig = BeanUtils.copyBean(dto, TbBasicDataConfig.class);
         //参数校验
-        Integer calculateType = tbBasicDataConfig.getCalculateType().getCode();
+        CalculateTypeEnum calculateType = tbBasicDataConfig.getCalculateType();
         List<CalculateDTO> dtoList = dto.getDtoList();
-        if (CalculateTypeEnum.NUMBER.getCode().equals(calculateType) && StringUtils.isBlank(dto.getNumberCalculateFormula())) {
-            throw new RuntimeException("计算公式不能为空");
+        if (CalculateTypeEnum.NUMBER.equals(calculateType) && StringUtils.isBlank(dto.getNumberCalculateFormula())) {
+            throw new ServiceException("计算公式不能为空");
         }
-        if ((CalculateTypeEnum.TEXT.getCode().equals(calculateType) || CalculateTypeEnum.PERCENTAGE.getCode().equals(calculateType))
-                && CollUtils.isEmpty(dtoList)) {
-            throw new RuntimeException("计算公式不能为空");
+        boolean verify = (CalculateTypeEnum.TEXT.equals(calculateType) || CalculateTypeEnum.PERCENTAGE.equals(calculateType)) && CollUtils.isNotEmpty(dtoList);
+        if (verify) {
+            CollUtils.check(dto.getDtoList(), new Checker<CalculateDTO>() {
+                @Override
+                public void check(CalculateDTO data) {
+                    if (StringUtils.isBlank(data.getKey())) {
+                        throw new ServiceException("基础数据配置key不能为空");
+                    }
+                    if (StringUtils.isBlank(data.getValue())) {
+                        throw new ServiceException("基础数据配置value不能为空");
+                    }
+                }
+            });
+        } else {
+            throw new ServiceException("计算公式不能为空");
         }
         this.save(tbBasicDataConfig);
-        if ((CalculateTypeEnum.TEXT.getCode().equals(calculateType) || CalculateTypeEnum.PERCENTAGE.getCode().equals(calculateType))) {
+        if (verify) {
             List<TbBasicDataConfigDetail> details = BeanUtils.copyList(dtoList, TbBasicDataConfigDetail.class);
             List<TbBasicDataConfigDetail> collect = details.stream().peek(item -> item.setBasicDataConfigId(tbBasicDataConfig.getId())).collect(Collectors.toList());
             tbBasicDataConfigDetailService.saveBatch(collect);
@@ -75,17 +89,17 @@
     public void edit(BasicDataConfigUpdateDTO dto) {
         TbBasicDataConfig tbBasicDataConfig = BeanUtils.copyBean(dto, TbBasicDataConfig.class);
         //参数校验
-        Integer calculateType = tbBasicDataConfig.getCalculateType().getCode();
+        CalculateTypeEnum calculateType = tbBasicDataConfig.getCalculateType();
         List<CalculateDTO> dtoList = dto.getDtoList();
-        if (CalculateTypeEnum.NUMBER.getCode().equals(calculateType) && StringUtils.isBlank(dto.getNumberCalculateFormula())) {
-            throw new RuntimeException("计算公式不能为空");
+        if (CalculateTypeEnum.NUMBER.equals(calculateType) && StringUtils.isBlank(dto.getNumberCalculateFormula())) {
+            throw new ServiceException("计算公式不能为空");
         }
-        if ((CalculateTypeEnum.TEXT.getCode().equals(calculateType) || CalculateTypeEnum.PERCENTAGE.getCode().equals(calculateType))
-                && CollUtils.isEmpty(dtoList)) {
-            throw new RuntimeException("计算公式不能为空");
+        boolean verify = CalculateTypeEnum.TEXT.equals(calculateType) || CalculateTypeEnum.PERCENTAGE.equals(calculateType);
+        if (verify && CollUtils.isEmpty(dtoList)) {
+            throw new ServiceException("计算公式不能为空");
         }
         this.updateById(tbBasicDataConfig);
-        if ((CalculateTypeEnum.TEXT.getCode().equals(calculateType) || CalculateTypeEnum.PERCENTAGE.getCode().equals(calculateType))) {
+        if (verify) {
             //删除原来的配置信息,重新添加新的
             tbBasicDataConfigDetailService.lambdaUpdate().eq(TbBasicDataConfigDetail::getBasicDataConfigId, tbBasicDataConfig.getId()).remove();
             List<TbBasicDataConfigDetail> details = BeanUtils.copyList(dtoList, TbBasicDataConfigDetail.class);
@@ -98,7 +112,7 @@
     public BasicDataConfigDetailVO getDetails(Integer id) {
         TbBasicDataConfig config = this.getById(id);
         if (Objects.isNull(config)) {
-            throw new RuntimeException("非法参数");
+            throw new ServiceException("非法参数");
         }
         BasicDataConfigDetailVO vo = BeanUtils.copyBean(config, BasicDataConfigDetailVO.class);
         Integer code = vo.getCalculateType().getCode();
@@ -114,7 +128,7 @@
     public void delete(Integer id) {
         TbBasicDataConfig config = this.getById(id);
         if (Objects.isNull(config)) {
-            throw new RuntimeException("非法参数");
+            throw new ServiceException("非法参数");
         }
         this.removeById(id);
     }
@@ -132,7 +146,7 @@
     public void showHide(ShowHideDTO dto) {
         TbBasicDataConfig config = this.getById(dto.getId());
         if (Objects.isNull(config)) {
-            throw new RuntimeException("非法参数");
+            throw new ServiceException("非法参数");
         }
         if (ShowStatusEnum.SHOW.equals(dto.getStatus())) {
             //查询改配置所使用字段状态
@@ -141,7 +155,7 @@
             List<TbField> list = fieldMapper.selectList(Wrappers.<TbField>lambdaQuery().in(TbField::getId, Arrays.asList(split)).eq(TbField::getStatus, ShowStatusEnum.HIDE));
             if (CollUtils.isNotEmpty(list)) {
                 String fieldNames = list.stream().map(TbField::getFieldName).collect(Collectors.joining(","));
-                throw new RuntimeException(String.format("字段“%s”已被隐藏,请重新配置后再次操作!", fieldNames));
+                throw new ServiceException(String.format("字段“%s”已被隐藏,请重新配置后再次操作!", fieldNames));
             }
         }
         this.lambdaUpdate().set( TbBasicDataConfig::getStatus, dto.getStatus()).eq(TbBasicDataConfig::getId, dto.getId()).update();
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java
index b522be8..e6639e2 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbBasicDataServiceImpl.java
@@ -1,10 +1,45 @@
 package com.ruoyi.system.service.impl;
 
+import com.alibaba.excel.EasyExcel;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
+import com.ruoyi.common.NumberDisplaceChineseUtil;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.enums.ReportingStatusEnum;
+import com.ruoyi.common.enums.ShowStatusEnum;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.BeanUtils;
+import com.ruoyi.common.utils.CollUtils;
+import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.system.domain.TbBasicData;
+import com.ruoyi.system.domain.TbBasicDataField;
+import com.ruoyi.system.domain.TbDept;
+import com.ruoyi.system.domain.TbField;
+import com.ruoyi.system.dto.BasicDataDTO;
+import com.ruoyi.system.listener.BasicDataListener;
 import com.ruoyi.system.mapper.TbBasicDataMapper;
+import com.ruoyi.system.service.TbBasicDataFieldService;
 import com.ruoyi.system.service.TbBasicDataService;
+import com.ruoyi.system.service.TbDeptService;
+import com.ruoyi.system.service.TbFieldService;
+import com.ruoyi.system.vo.BasicDataReportingVO;
+import com.ruoyi.system.vo.FieldReportingVO;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -14,7 +49,152 @@
  * @author mitao
  * @since 2024-03-13
  */
+@Slf4j
 @Service
+@RequiredArgsConstructor
 public class TbBasicDataServiceImpl extends ServiceImpl<TbBasicDataMapper, TbBasicData> implements TbBasicDataService {
 
+    private final TbDeptService tbDeptService;
+    private final HttpServletResponse response;
+    private final TbFieldService tbFieldService;
+    private final TbBasicDataFieldService tbBasicDataFieldService;
+
+    @Override
+    public R<BasicDataReportingVO> getBasicFields(String deptAreaCode) throws Exception {
+        BasicDataReportingVO vo = new BasicDataReportingVO();
+        //校验区划代码
+        TbDept dept = tbDeptService.getOne(Wrappers.<TbDept>lambdaQuery().eq(TbDept::getAreaCode, deptAreaCode));
+        if (Objects.isNull(dept)) {
+            throw new ServiceException(String.format("区划代码%s不存在", deptAreaCode));
+        }
+        Date date = new Date();
+        //当前所在季度
+        int quarterOfYear = DateUtils.getQuarterOfYear(date);
+        String quarterOfYearStr = NumberDisplaceChineseUtil.numberToChinese(quarterOfYear);
+        Map<String, Date> quarterDate = DateUtils.getQuarterDate(date);
+        //当前季度开始
+        Date quarterStart = quarterDate.get("first");
+        //当前季度结束
+        Date quarterEnd = quarterDate.get("last");
+        //判断当前时间是否在季度初1-15号
+        Instant instant = quarterStart.toInstant();
+        LocalDate quarterStartLocalDate = instant.atZone(ZoneId.systemDefault()).toLocalDate();
+        LocalDate fifteenDaysLimit = quarterStartLocalDate.plusDays(15);
+        LocalDate now = LocalDate.now();
+        vo.setQuarter(String.format("%s年%s季度",now.getYear(),quarterOfYearStr));
+        vo.setStatus(ReportingStatusEnum.UNFILLED);
+        //如果当前时间不在规定范围内:季度初1-15号
+        if (now.isBefore(quarterStartLocalDate) || now.isAfter(fifteenDaysLimit)) {
+            return R.ok(vo,"请于季度初1-15号上传季度数据。");
+        }
+        //查询是否有当前季度的填报记录
+        TbBasicData basicData = this.getOne(Wrappers.<TbBasicData>lambdaQuery()
+                .eq(TbBasicData::getDeptAreaCode, dept.getAreaCode())
+                .between(TbBasicData::getCreateTime, quarterStart,quarterEnd));
+        //查询需要填写的字段
+        List<TbField> list = tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list();
+        if (CollUtils.isNotEmpty(list)) {
+            List<FieldReportingVO> fieldReportingVOS = BeanUtils.copyList(list, FieldReportingVO.class);
+            vo.setFields(fieldReportingVOS);
+        }
+        if (Objects.isNull(basicData)) {
+            vo.setQuarter(String.format("%s年%s季度",now.getYear(),quarterOfYearStr));
+            vo.setStatus(ReportingStatusEnum.UNFILLED);
+            return R.ok(vo);
+        }else {
+            vo.setStatus(basicData.getStatus());
+            //查询已填报数据 包含数据缺失和已填报
+            List<TbBasicDataField> basicDataFields = tbBasicDataFieldService.lambdaQuery()
+                    .eq(TbBasicDataField::getBasicDataId, basicData.getId()).list();
+            if (CollUtils.isNotEmpty(basicDataFields)) {
+                Map<Integer, TbBasicDataField> fieldMap = basicDataFields.stream()
+                        .collect(Collectors.toMap(TbBasicDataField::getFieldId, Function.identity()));
+                vo.getFields().forEach(item -> {
+                    TbBasicDataField tbBasicDataField = fieldMap.get(item.getId());
+                    if (Objects.nonNull(tbBasicDataField)) {
+                        item.setValue(tbBasicDataField.getFieldValue());
+                    }
+                });
+                return R.ok(vo);
+            }
+        }
+        return R.ok(vo);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void saveBasicData(BasicDataDTO dto) {
+        //TODO
+        //LoginUser loginUser = SecurityUtils.getLoginUser();
+        //数据校验
+        if (Objects.isNull(dto) || CollUtils.isEmpty(dto.getFields())) {
+            return;
+        }
+
+        TbBasicData tbBasicData = BeanUtils.copyBean(dto, TbBasicData.class);
+        this.saveOrUpdate(tbBasicData);
+        //保存基础数据动态字段数据
+        List<TbBasicDataField> tbBasicDataFields = BeanUtils.copyList(dto.getFields(), TbBasicDataField.class);
+        tbBasicDataFields.forEach(item -> item.setBasicDataId(tbBasicData.getId()));
+        //将该基础数据的动态字段数据全部删除
+        tbBasicDataFieldService.remove(null);
+        tbBasicDataFieldService.saveBatch(tbBasicDataFields);
+    }
+
+    @Override
+    public void downloadImportTemplate() throws Exception {
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+        String fileName = "地方财政运行及“三保”情况统计表";
+        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
+        response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");
+        //查询需要填写的动态字段
+        List<TbField> list = tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list();
+        // 这里需要设置不关闭流
+        EasyExcel.write(response.getOutputStream()).head(head(list))
+                .autoCloseStream(Boolean.FALSE).sheet("模板")
+                .doWrite(dataList(list));
+    }
+
+    private List<List<Object>> dataList(List<TbField> list) throws Exception {
+        //TODO
+        //LoginUser loginUser = SecurityUtils.getLoginUser();
+        TbDept dept = tbDeptService.getById(44);
+        //当前所在季度
+        int quarterOfYear = DateUtils.getQuarterOfYear(new Date());
+        String quarterOfYearStr = NumberDisplaceChineseUtil.numberToChinese(quarterOfYear);
+        List<List<Object>> excellist = new ArrayList<List<Object>>();
+        List<List<String>> head = head(list);
+        List<Object> columnNo = Lists.newArrayList("栏号");
+        for (int i = 1; i < head.size(); i++) {
+            columnNo.add(String.valueOf(i));
+        }
+        excellist.add(columnNo);
+        excellist.add(Lists.newArrayList(dept.getAreaName(), String.format("%s季度",quarterOfYearStr)));
+        return excellist;
+    }
+
+    private List<List<String>> head(List<TbField> list) {
+        List<List<String>> headTitles = Lists.newArrayList();
+        //固定字段
+        headTitles.add(Lists.newArrayList("地区"));
+        headTitles.add(Lists.newArrayList("填报季度"));
+        headTitles.add(Lists.newArrayList("转移支付规模"));
+        headTitles.add(Lists.newArrayList("当期GDP"));
+        list.forEach(item ->{
+            headTitles.add(Lists.newArrayList(item.getLevelOneCategory(), item.getLevelTwoCategory(), item.getLevelThreeCategory(), item.getFieldName()));
+        });
+        headTitles.add(Lists.newArrayList("备注"));
+        return headTitles;
+    }
+
+    @Override
+    public void importBasicData(MultipartFile file) throws IOException {
+        //TODO
+        //LoginUser loginUser = SecurityUtils.getLoginUser();
+        TbDept dept = tbDeptService.getById(44);
+        //查询需要填写的动态字段
+        List<TbField> fieldList = tbFieldService.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list();
+        EasyExcel.read(file.getInputStream(), new BasicDataListener(this,fieldList,tbFieldService,dept,tbBasicDataFieldService)).sheet().doRead();
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbDeptServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbDeptServiceImpl.java
index d22ad84..2927eba 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbDeptServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbDeptServiceImpl.java
@@ -6,10 +6,15 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.basic.PageDTO;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.BeanUtils;
 import com.ruoyi.common.utils.CollUtils;
+import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.domain.TbDept;
+import com.ruoyi.system.dto.update.DeptFocusDTO;
 import com.ruoyi.system.handler.DeptVerifyHandler;
+import com.ruoyi.system.importExcel.DeptExcel;
 import com.ruoyi.system.mapper.TbDeptMapper;
 import com.ruoyi.system.query.DeptQuery;
 import com.ruoyi.system.service.TbDeptService;
@@ -62,18 +67,23 @@
         //使用自定义校验规则
         importParams.setVerifyHandler(deptVerifyHandler);
         InputStream inputStream = file.getInputStream();
-        ExcelImportResult<TbDept> result = ExcelImportUtil.importExcelMore(inputStream, TbDept.class, importParams);
+        ExcelImportResult<DeptExcel> result = ExcelImportUtil.importExcelMore(inputStream, DeptExcel.class, importParams);
         inputStream.close();
-        List<TbDept> list = result.getList();
-        if (Objects.requireNonNull(result).isVerfiyFail() || CollectionUtils.isEmpty(list)) {
-            throw new RuntimeException("文件校验失败,请检查数据填写是否完整");
+        List<DeptExcel> list = result.getList();
+
+        if (result.isVerifyFail() || CollectionUtils.isEmpty(list)) {
+            throw new ServiceException("文件校验失败,请检查数据填写是否完整");
         }
         List<String> strings = hasDuplicateAreaCode(list);
         if (!CollectionUtils.isEmpty(strings)) {
-            throw new RuntimeException(String.format("区划代码%s重复,请修改后重新导入", String.join(",", strings)));
+            throw new ServiceException(String.format("区划代码%s重复,请修改后重新导入", String.join(",", strings)));
         }else {
+            List<TbDept> tbDeptList = BeanUtils.copyList(list, TbDept.class);
             this.remove(null);
-            this.saveBatch(list);
+            tbDeptList.forEach(dept->{
+                dept.setPassword(SecurityUtils.encryptPassword(dept.getPassword()));
+            });
+            this.saveBatch(tbDeptList);
         }
     }
 
@@ -82,14 +92,26 @@
      * @param deptList 部门列表
      * @return 重复的区划代码
      */
-    public List<String> hasDuplicateAreaCode(List<TbDept> deptList) {
+    public List<String> hasDuplicateAreaCode(List<DeptExcel> deptList) {
         Set<String> areaCodes = new HashSet<>();
         List<String> result = new ArrayList<>();
-        for (TbDept dept : deptList) {
+        for (DeptExcel dept : deptList) {
             if (!areaCodes.add(dept.getAreaCode())) {
                 result.add(dept.getAreaCode());
             }
         }
         return result;
     }
+
+    @Override
+    public void focus(DeptFocusDTO dto) {
+        TbDept dept = this.getById(dto.getId());
+        if (Objects.isNull(dept)) {
+            throw new ServiceException("非法参数");
+        }
+        this.lambdaUpdate()
+                .eq(TbDept::getId, dto.getId())
+                .set(TbDept::getFocussed, dto.getFocussed())
+                .update();
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbFieldCategoryServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbFieldCategoryServiceImpl.java
index 022e3b5..f4a26a8 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbFieldCategoryServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbFieldCategoryServiceImpl.java
@@ -6,6 +6,7 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.basic.PageDTO;
 import com.ruoyi.common.enums.ShowStatusEnum;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.BeanUtils;
 import com.ruoyi.common.utils.CollUtils;
 import com.ruoyi.common.utils.StringUtils;
@@ -16,6 +17,7 @@
 import com.ruoyi.system.mapper.TbFieldCategoryMapper;
 import com.ruoyi.system.query.FieldCategoryQuery;
 import com.ruoyi.system.service.TbFieldCategoryService;
+import com.ruoyi.system.vo.FieldCategoryDetailVO;
 import com.ruoyi.system.vo.FieldCategoryVO;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -85,10 +87,7 @@
     }
 
     private void updateCategoryAndChildren(Integer id, ShowStatusEnum status) {
-        TbFieldCategory category = this.getById(id);
-        if (Objects.isNull(category)) {
-            throw new RuntimeException("非法id");
-        }
+        TbFieldCategory category = this.validateParam(id);
         this.lambdaUpdate()
                 .eq(TbFieldCategory::getId, id)
                 .set(TbFieldCategory::getStatus, status)
@@ -122,10 +121,7 @@
     @Transactional(rollbackFor = Exception.class)
     public void delete(Integer id) {
         //一级分类
-        TbFieldCategory category = this.getById(id);
-        if (Objects.isNull(category)) {
-            throw new RuntimeException("非法参数");
-        }
+        validateParam(id);
         //查询是否有二级分类
         List<TbFieldCategory> threeCategoryList = this.lambdaQuery().eq(TbFieldCategory::getParentId, id).list();
         if (CollectionUtils.isNotEmpty(threeCategoryList)) {
@@ -144,8 +140,17 @@
         this.removeById(id);
     }
 
+    private TbFieldCategory validateParam(Integer id) {
+        TbFieldCategory category = this.getById(id);
+        if (Objects.isNull(category)) {
+            throw new ServiceException("非法参数");
+        }
+        return category;
+    }
+
     @Override
     public void edit(FieldCategoryUpdateDTO dto) {
+        validateParam(dto.getId());
         //更新一级分类
         updateCategory(dto);
         List<FieldCategoryUpdateDTO> children = dto.getChildren();
@@ -180,4 +185,26 @@
                 .list();
         return BeanUtils.copyList(list, FieldCategoryVO.class);
     }
+
+    @Override
+    public FieldCategoryDetailVO getDetailsById(Integer id) {
+        TbFieldCategory oneCategory = this.getById(id);
+        if (Objects.isNull(oneCategory)) {
+            return new FieldCategoryDetailVO();
+        }
+        FieldCategoryDetailVO vo = BeanUtils.copyBean(oneCategory, FieldCategoryDetailVO.class);
+        //根据一级分类id,查询二级分类
+        List<TbFieldCategory> twoCategoryList = this.lambdaQuery().eq(TbFieldCategory::getParentId, oneCategory.getId()).list();
+        twoCategoryList.forEach(item->{
+            FieldCategoryDetailVO twoCategoryVO = BeanUtils.copyBean(item, FieldCategoryDetailVO.class);
+            vo.getChildren().add(twoCategoryVO);
+            //根据二级分类id,查询三级分类
+            List<TbFieldCategory> threeCategoryList = this.lambdaQuery().eq(TbFieldCategory::getParentId, item.getId()).list();
+            threeCategoryList.forEach(threeCategory->{
+                FieldCategoryDetailVO threeCategoryVO = BeanUtils.copyBean(threeCategory, FieldCategoryDetailVO.class);
+                twoCategoryVO.getChildren().add(threeCategoryVO);
+            });
+        });
+        return vo;
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbFieldServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbFieldServiceImpl.java
index 8555a6f..9c64edf 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbFieldServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbFieldServiceImpl.java
@@ -6,6 +6,7 @@
 import com.ruoyi.common.enums.FieldInputTypeEnum;
 import com.ruoyi.common.enums.FieldTypeEnum;
 import com.ruoyi.common.enums.ShowStatusEnum;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.BeanUtils;
 import com.ruoyi.common.utils.CollUtils;
 import com.ruoyi.common.utils.StringUtils;
@@ -14,6 +15,7 @@
 import com.ruoyi.system.domain.TbFieldCategory;
 import com.ruoyi.system.dto.FieldDTO;
 import com.ruoyi.system.dto.ShowHideDTO;
+import com.ruoyi.system.dto.update.FieldUpdateDTO;
 import com.ruoyi.system.mapper.TbFieldMapper;
 import com.ruoyi.system.query.FieldQuery;
 import com.ruoyi.system.service.TbBasicDataConfigService;
@@ -27,6 +29,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
 import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
@@ -52,9 +55,9 @@
         //1:数字 2:文本 3:百分比
         if (FieldTypeEnum.TEXT.getCode().equals(fieldType)) {
             if (StringUtils.isNull(dto.getTextInputType())) {
-                throw new RuntimeException("输入类型不能为空");
+                throw new ServiceException("输入类型不能为空");
             } else if (FieldInputTypeEnum.FIXED_CONTENT.getCode().equals(dto.getTextInputType()) && StringUtils.isBlank(dto.getTextContent())) {
-                throw new RuntimeException("内容设置不能为空");
+                throw new ServiceException("内容设置不能为空");
             }
         }
         TbField tbField = BeanUtils.copyBean(dto, TbField.class);
@@ -76,7 +79,7 @@
         log.info("======主线程执行showHide{}",Thread.currentThread().getName() );
         TbField field = this.getById(dto.getId());
         if (StringUtils.isNull(field)) {
-            throw new RuntimeException("非法参数");
+            throw new ServiceException("非法参数");
         }
         //隐藏字段
         this.lambdaUpdate().set(TbField::getStatus, dto.getStatus()).eq(TbField::getId, dto.getId()).update();
@@ -119,25 +122,34 @@
     }
 
     @Override
-    public List<String> influencedData(Integer id) {
-        //List<TbBasicDataConfig> list = tbBasicDataConfigService.lambdaQuery().like(TbBasicDataConfig::getFieldIdStr, id).list();
-        List<TbBasicDataConfig> list = tbBasicDataConfigService.lambdaQuery().eq(TbBasicDataConfig::getStatus, ShowStatusEnum.SHOW.getCode()).list();
+    public String influencedData(Integer id) {
+        List<TbBasicDataConfig> list = tbBasicDataConfigService.lambdaQuery().eq(TbBasicDataConfig::getStatus, ShowStatusEnum.SHOW).list();
         if (CollUtils.isEmpty(list)) {
-            return CollUtils.emptyList();
+            return "";
         }
-        List<String> collect = list.stream().map(config -> {
+        String collect = list.stream().map(config -> {
             String fieldIdStr = config.getFieldIdStr();
             String[] split = fieldIdStr.split(",");
             //字符串数组转为List
-            List<String> idList = new ArrayList<>(Arrays.asList(split));
+            List<String> idList = Arrays.asList(split);
             if (idList.contains(id.toString())) {
                 return config.getTypeName();
             }
             return null;
-        }).collect(Collectors.toList());
-        if (CollUtils.isEmpty(collect)) {
-            return CollUtils.emptyList();
+        }).filter(Objects::nonNull).collect(Collectors.joining(","));
+        if (StringUtils.isBlank(collect)) {
+            return "";
         }
         return collect;
     }
+
+    @Override
+    public void update(FieldUpdateDTO dto) {
+        TbField field = this.getById(dto.getId());
+        if (Objects.isNull(field)) {
+            throw new ServiceException("参数异常");
+        }
+        TbField tbField = BeanUtils.copyBean(dto, TbField.class);
+        this.updateById(tbField);
+    }
 }
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataFieldVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataFieldVO.java
new file mode 100644
index 0000000..85acebb
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataFieldVO.java
@@ -0,0 +1,8 @@
+package com.ruoyi.system.vo;
+
+/**
+ * @author mitao
+ * @date 2024/3/19
+ */
+public class BasicDataFieldVO {
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataReportingVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataReportingVO.java
new file mode 100644
index 0000000..21283ae
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/BasicDataReportingVO.java
@@ -0,0 +1,41 @@
+package com.ruoyi.system.vo;
+
+import com.ruoyi.common.enums.ReportingStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author mitao
+ * @date 2024/3/18
+ */
+@Data
+@ApiModel(value="基础数据填报视图对象")
+public class BasicDataReportingVO implements Serializable {
+
+    private static final long serialVersionUID = 8457240440217226595L;
+
+    @ApiModelProperty(value = "季度")
+    private String quarter;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ApiModelProperty(value = "填报状态(1=未填报 2=数据缺失 3=已填报)")
+    private ReportingStatusEnum status;
+
+    @ApiModelProperty(value = "首次填报时间")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "填报完成时间")
+    private LocalDateTime updateTime;
+
+    //1:未填报 2:数据缺失 3:已填报
+    @ApiModelProperty(value = "动态字段")
+    private List<FieldReportingVO> fields = new ArrayList<>();
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldReportingVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldReportingVO.java
new file mode 100644
index 0000000..608cf9b
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldReportingVO.java
@@ -0,0 +1,67 @@
+package com.ruoyi.system.vo;
+
+import com.ruoyi.common.enums.FieldTypeEnum;
+import com.ruoyi.common.enums.ShowStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+@ApiModel(value="数据上报字段视图对象")
+public class FieldReportingVO implements Serializable {
+
+    private static final long serialVersionUID = -7412686975187928384L;
+
+    @ApiModelProperty(value = "字段id")
+    private Integer id;
+
+    @ApiModelProperty(value = "字段名")
+    private String fieldName;
+
+    @ApiModelProperty(value = "字段类型(1=数字 2=文本 3=百分比)")
+    private FieldTypeEnum fieldType;
+
+    @ApiModelProperty(value = "一级分类id")
+    private Integer levelOneCategoryId;
+
+    @ApiModelProperty(value = "二级分类id")
+    private Integer levelTwoCategoryId;
+
+    @ApiModelProperty(value = "三级分类id")
+    private Integer levelThreeCategoryId;
+
+    @ApiModelProperty(value = "一级分类")
+    private String levelOneCategory;
+
+    @ApiModelProperty(value = "二级分类")
+    private String levelTwoCategory;
+
+    @ApiModelProperty(value = "三级分类")
+    private String levelThreeCategory;
+
+    @ApiModelProperty(value = "隐藏状态(0=展示中 1=已隐藏)")
+    private ShowStatusEnum status;
+
+    @ApiModelProperty(value = "数字最小值")
+    private Integer numMin;
+
+    @ApiModelProperty(value = "数字最大值")
+    private Integer numMax;
+
+    @ApiModelProperty(value = "文本输入类型(1=手动输入 2=固定内容)")
+    private Integer textInputType;
+
+    @ApiModelProperty(value = "文本最少字数")
+    private Integer textMinNum;
+
+    @ApiModelProperty(value = "文本最多字数")
+    private Integer textMaxNum;
+
+    @ApiModelProperty(value = "文本内容设置(不同内容以','隔开)")
+    private String textContent;
+
+    @ApiModelProperty(value = "部门上报的值")
+    private String value;
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldVO.java
index 04a1247..033a1a3 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldVO.java
@@ -1,5 +1,6 @@
 package com.ruoyi.system.vo;
 
+import com.ruoyi.common.enums.FieldTypeEnum;
 import com.ruoyi.common.enums.ShowStatusEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -20,7 +21,7 @@
     private String fieldName;
 
     @ApiModelProperty(value = "字段类型(1=数字 2=文本 3=百分比)")
-    private Integer fieldType;
+    private FieldTypeEnum fieldType;
 
     @ApiModelProperty(value = "一级分类id")
     private Integer levelOneCategoryId;

--
Gitblit v1.7.1