From 92b586e7d47167421f6500be641734acebeacd79 Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期五, 15 三月 2024 20:39:30 +0800
Subject: [PATCH] 分类管理、字段管理接口

---
 ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldVO.java                              |   62 ++
 ruoyi-system/src/main/java/com/ruoyi/system/dto/FieldDTO.java                            |   53 ++
 ruoyi-system/src/main/java/com/ruoyi/system/domain/TbField.java                          |   20 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TbFieldCategoryService.java          |    9 
 ruoyi-common/src/main/java/com/ruoyi/common/enums/FieldTypeEnum.java                     |   23 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbDeptController.java             |   46 +
 ruoyi-common/src/main/java/com/ruoyi/common/enums/FieldInputTypeEnum.java                |   22 
 ruoyi-system/src/main/java/com/ruoyi/system/query/DeptQuery.java                         |    7 
 ruoyi-common/src/main/java/com/ruoyi/common/utils/NumberUtils.java                       |  148 +++++
 pom.xml                                                                                  |    8 
 ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java                           |   10 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbFieldServiceImpl.java         |  118 ++++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbFieldController.java            |  122 ++++
 ruoyi-common/src/main/java/com/ruoyi/common/basic/PageDTO.java                           |   74 ++
 ruoyi-common/src/main/java/com/ruoyi/common/utils/ArrayUtils.java                        |   54 ++
 ruoyi-system/src/main/java/com/ruoyi/system/dto/ShowHideDTO.java                         |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicData.java                      |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbDeptServiceImpl.java          |   39 
 ruoyi-system/src/main/resources/mapper/system/TbBasicDataConfigMapper.xml                |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/query/FieldCategoryQuery.java                |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/query/FieldQuery.java                        |   37 +
 ruoyi-common/src/main/java/com/ruoyi/common/utils/Checker.java                           |   18 
 ruoyi-common/src/main/java/com/ruoyi/common/utils/Convert.java                           |    8 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/TbDataScreenConfig.java               |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicDataConfig.java                |   16 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/TbFieldCategory.java                  |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/TbDept.java                           |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbFieldCategoryServiceImpl.java |   56 +
 ruoyi-system/src/main/java/com/ruoyi/system/dto/update/FieldUpdateDTO.java               |   57 ++
 ruoyi-admin/pom.xml                                                                      |    1 
 ruoyi-system/pom.xml                                                                     |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TbDeptService.java                   |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/service/TbFieldService.java                  |   14 
 ruoyi-common/src/main/java/com/ruoyi/common/utils/CollUtils.java                         |  142 +++++
 ruoyi-admin/src/main/resources/application.yml                                           |    4 
 ruoyi-common/pom.xml                                                                     |   15 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TbFieldCategoryController.java    |  109 ++--
 /dev/null                                                                                |   35 -
 ruoyi-system/src/main/resources/mapper/system/TbFieldMapper.xml                          |    2 
 ruoyi-admin-dept/src/main/resources/application.yml                                      |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldCategoryVO.java                      |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/dto/FieldCategoryDTO.java                    |    3 
 ruoyi-common/src/main/java/com/ruoyi/common/enums/ShowStatus.java                        |    4 
 ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanUtils.java                         |   59 ++
 ruoyi-common/src/main/java/com/ruoyi/common/utils/ObjectUtils.java                       |   84 +++
 45 files changed, 1,321 insertions(+), 194 deletions(-)

diff --git a/pom.xml b/pom.xml
index dd858cd..a794ada 100644
--- a/pom.xml
+++ b/pom.xml
@@ -30,6 +30,7 @@
         <poi.version>4.1.2</poi.version>
         <velocity.version>2.3</velocity.version>
         <jwt.version>0.9.1</jwt.version>
+        <hutool.version>5.7.17</hutool.version>
     </properties>
 
     <!-- 依赖声明 -->
@@ -85,7 +86,6 @@
 <!--                    </exclusion>-->
 <!--                </exclusions>-->
             </dependency>
-
             <!-- io常用工具类 -->
             <dependency>
                 <groupId>commons-io</groupId>
@@ -183,6 +183,12 @@
                 <version>${ruoyi.version}</version>
             </dependency>
 
+            <!--hutool工具包-->
+            <dependency>
+                <groupId>cn.hutool</groupId>
+                <artifactId>hutool-all</artifactId>
+                <version>${hutool.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 
diff --git a/ruoyi-admin-dept/src/main/resources/application.yml b/ruoyi-admin-dept/src/main/resources/application.yml
index baafc7a..642ff48 100644
--- a/ruoyi-admin-dept/src/main/resources/application.yml
+++ b/ruoyi-admin-dept/src/main/resources/application.yml
@@ -91,7 +91,8 @@
         max-active: 8
         # #连接池最大阻塞等待时间(使用负值表示没有限制)
         max-wait: -1ms
-
+  jackson:
+    default-property-inclusion: non_null
 # token配置
 token:
   # 令牌自定义标识
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index d81ba56..efa2186 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -77,7 +77,6 @@
         <dependency>
             <groupId>cn.hutool</groupId>
             <artifactId>hutool-all</artifactId>
-            <version>4.6.10</version>
         </dependency>
 
         <!-- zxing生成二维码 -->
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 d9b60b6..af3f223 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
@@ -1,8 +1,8 @@
 package com.ruoyi.web.controller.api;
 
 
-import com.ruoyi.common.basic.PageVO;
-import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.basic.PageDTO;
+import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.exception.GlobalException;
 import com.ruoyi.common.utils.ExcelUtil;
 import com.ruoyi.common.utils.bean.BeanUtils;
@@ -30,11 +30,11 @@
  * @author mitao
  * @since 2024-03-13
  */
-@Api(tags = "部门管理相关接口")
 @Slf4j
 @RestController
 @RequestMapping("/dept")
 @RequiredArgsConstructor
+@Api(tags = "部门管理相关接口")
 public class TbDeptController {
 
     private final HttpServletResponse response;
@@ -58,68 +58,74 @@
     /**
      * 导入
      * @param file 文件
-     * @return AjaxResult
+     * @return R
      */
     @PostMapping("/import")
     @ApiOperation("导入")
-    public AjaxResult importExcel(@RequestPart("file")MultipartFile file) {
+    public R<Object> importExcel(@RequestPart("file")MultipartFile file) {
         try {
             tbDeptService.importExcel(file);
         } catch (Exception e) {
             log.error("导入失败", e);
             throw new RuntimeException(e.getMessage());
         }
-        return AjaxResult.success();
+        return R.ok();
     }
 
     /**
      * 分页条件查询
      * @param query 查询条件
-     * @return AjaxResult<PageVO<DeptVO>>
+     * @return R<PageVO<DeptVO>>
      */
     @PostMapping("/page")
     @ApiOperation("分页条件查询")
-    public AjaxResult<PageVO<DeptVO>> page(@RequestBody DeptQuery query) {
-        return AjaxResult.success(tbDeptService.queryPage(query));
+    public R<PageDTO<DeptVO>> page(@RequestBody DeptQuery query) {
+        return R.ok(tbDeptService.queryPage(query));
     }
 
-    @GetMapping("/{id}")
+    /**
+     * 根据id查询部门详情
+     * @param id 部门id
+     * @return DeptVO
+     */
+    @GetMapping("/getById")
     @ApiOperation("根据id查询部门详情")
-    public AjaxResult<DeptVO> getById(@PathVariable Integer id) {
+    public R<DeptVO> getById(@RequestParam Integer id) {
         TbDept dept = tbDeptService.getById(id);
         DeptVO deptVO = new DeptVO();
         BeanUtils.copyBeanProp(deptVO, dept);
-        return AjaxResult.success(deptVO);
+        return R.ok(deptVO);
     }
+
     /**
      * 编辑
-     * @param dto
-     * @return
+     * @param dto 部门更新实体
+     * @return 响应成功
      */
     @PostMapping("/edit")
     @ApiOperation("编辑")
-    public AjaxResult edit(@RequestBody DeptUpdateDTO dto){
+    public R<Object> edit(@RequestBody DeptUpdateDTO dto){
         TbDept tbDept = new TbDept();
         BeanUtils.copyBeanProp(tbDept,dto);
         tbDeptService.updateById(tbDept);
-        return AjaxResult.success();
+        return R.ok();
     }
 
     /**
      * 重点关注
-     * @param dto
-     * @return
+     * @param dto 部门更新实体
+     * @return 响应成功
      */
     @PostMapping("/focus")
     @ApiOperation("重点关注")
-    public AjaxResult focus(@RequestBody DeptFocusDTO dto){
+    public R<Object> focus(@RequestBody DeptFocusDTO dto){
         TbDept tbDept = new TbDept();
         BeanUtils.copyBeanProp(tbDept,dto);
         tbDeptService.lambdaUpdate()
                 .eq(TbDept::getId, dto.getId())
                 .set(TbDept::getFocussed, dto.getFocussed())
                 .update();
-        return AjaxResult.success();
+        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 c0b5ffd..6a4ea9d 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
@@ -1,9 +1,9 @@
 package com.ruoyi.web.controller.api;
 
 
-import com.ruoyi.common.basic.PageVO;
-import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.utils.bean.BeanUtils;
+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.system.dto.FieldCategoryDTO;
 import com.ruoyi.system.dto.ShowHideDTO;
@@ -11,15 +11,16 @@
 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 io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
-import javax.validation.constraints.NotNull;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * <p>
@@ -29,58 +30,58 @@
  * @author mitao
  * @since 2024-03-13
  */
-@Api(tags = "字段分类管理")
-@Validated
+@Slf4j
 @RestController
 @RequestMapping("/field-category")
 @RequiredArgsConstructor
+@Api(tags = "字段分类管理相关接口")
 public class TbFieldCategoryController {
+
     private final TbFieldCategoryService tbFieldCategoryService;
 
     /**
      * 添加
      * @param dto 字段分类数据传输对象
-     * @return AjaxResult
+     * @return R
      */
     @PostMapping("/add")
     @ApiOperation("添加")
-    public AjaxResult add(@RequestBody FieldCategoryDTO dto) {
+    public R<Object> add(@RequestBody @Validated FieldCategoryDTO dto) {
         try {
             tbFieldCategoryService.add(dto);
         } catch (Exception e) {
+            log.error("添加分类异常", e);
             throw new RuntimeException("操作失败");
         }
-        return AjaxResult.success();
+        return R.ok();
     }
 
     /**
      * 根据id获取字段分类详情
      * @param id 字段分类id
-     * @return AjaxResult
+     * @return R
      */
     @GetMapping("/getById")
     @ApiOperation("根据id获取字段分类详情")
-    @ApiImplicitParam(name = "id", value = "字段分类id", required = true)
-    public AjaxResult<FieldCategoryDetailVO> getById(@RequestParam(value = "id") @NotNull(message = "id不能为空") Integer id) {
+    public R<FieldCategoryDetailVO> getById(@RequestParam(value = "id") Integer id) {
         TbFieldCategory oneCategory = tbFieldCategoryService.getById(id);
-        FieldCategoryDetailVO vo = new FieldCategoryDetailVO();
-        BeanUtils.copyBeanProp(vo, oneCategory);
+        if (Objects.isNull(oneCategory)) {
+            return R.ok(new FieldCategoryDetailVO());
+        }
+        FieldCategoryDetailVO vo = BeanUtils.copyBean(oneCategory, FieldCategoryDetailVO.class);
         //根据一级分类id,查询二级分类
         List<TbFieldCategory> twoCategoryList = tbFieldCategoryService.lambdaQuery().eq(TbFieldCategory::getParentId, oneCategory.getId()).list();
         twoCategoryList.forEach(item->{
-            FieldCategoryDetailVO twoCategoryVO = new FieldCategoryDetailVO();
-            BeanUtils.copyBeanProp(twoCategoryVO, 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 = new FieldCategoryDetailVO();
-                BeanUtils.copyBeanProp(threeCategoryVO, threeCategory);
+                FieldCategoryDetailVO threeCategoryVO = BeanUtils.copyBean(threeCategory, FieldCategoryDetailVO.class);
                 twoCategoryVO.getChildren().add(threeCategoryVO);
             });
-            vo.getChildren().add(twoCategoryVO);
         });
-        return AjaxResult.success(vo);
+        return R.ok(vo);
     }
 
     /**
@@ -90,59 +91,61 @@
      */
     @PostMapping("/page")
     @ApiOperation("分页条件查询")
-    public AjaxResult<PageVO<FieldCategoryDetailVO>> page(@RequestBody FieldCategoryQuery query) {
-        return AjaxResult.success(tbFieldCategoryService.queryPage(query));
+    public R<PageDTO<FieldCategoryVO>> page(@RequestBody FieldCategoryQuery query) {
+        return R.ok(tbFieldCategoryService.queryPage(query));
     }
 
     /**
      * 隐藏显示操作
      * @param dto 显示隐藏操作数据传输对象
-     * @return AjaxResult
+     * @return R
      */
-    @PostMapping("/show-hide")
+    @PutMapping("/show-hide")
     @ApiOperation("隐藏显示操作")
-    public AjaxResult showHide(@RequestBody ShowHideDTO dto) {
-        try {
-            tbFieldCategoryService.showHide(dto);
-        } catch (Exception e) {
-            throw new RuntimeException("操作失败");
-        }
-        return AjaxResult.success();
+    public R<Object> showHide(@RequestBody ShowHideDTO dto) {
+        tbFieldCategoryService.showHide(dto);
+        return R.ok();
     }
 
-    @GetMapping("/delete-children")
+    /**
+     * 删除分类子节点
+     * @param id id
+     * @return R
+     */
+    @DeleteMapping("/delete-children")
     @ApiOperation("编辑页面删除子字段分类")
-    @ApiImplicitParam(name = "id", value = "字段分类id", required = true)
-    public AjaxResult deleteChildren(@RequestParam(value = "id") @NotNull(message = "id不能为空") Integer id){
+    public R<Object> deleteChildren(@RequestParam(value = "id") Integer id){
         try {
             tbFieldCategoryService.deleteChildren(id);
         } catch (Exception e) {
+            log.error("编辑页面删除子字段分类失败",e);
             throw new RuntimeException("操作失败");
         }
-        return AjaxResult.success();
+        return R.ok();
     }
 
-    @GetMapping("/delete")
+    /**
+     * 删除分类
+     * @param id id
+     * @return R
+     */
+    @DeleteMapping("/delete")
     @ApiOperation("列表页面删除分类")
-    @ApiImplicitParam(name = "id", value = "字段分类id", required = true)
-    public AjaxResult delete(@RequestParam(value = "id") @NotNull(message = "id不能为空") Integer id){
-        try {
-            tbFieldCategoryService.delete(id);
-        } catch (Exception e) {
-            throw new RuntimeException("操作失败");
-        }
-        return AjaxResult.success();
+    public R<Void> delete(@RequestParam(value = "id") Integer id){
+        tbFieldCategoryService.delete(id);
+        return R.ok();
     }
 
-    @PostMapping("/edit")
+    /**
+     * 编辑分类
+     * @param dto 字段分类更新数据传输对象
+     * @return R
+     */
+    @PutMapping("/edit")
     @ApiOperation("编辑")
-    public AjaxResult edit(@RequestBody FieldCategoryUpdateDTO dto) {
-        try {
-            tbFieldCategoryService.edit(dto);
-        } catch (Exception e) {
-            throw new RuntimeException("操作失败");
-        }
-        return AjaxResult.success();
+    public R<Object> edit(@RequestBody FieldCategoryUpdateDTO dto) {
+        tbFieldCategoryService.edit(dto);
+        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 895dba4..0db336e 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
@@ -1,8 +1,27 @@
 package com.ruoyi.web.controller.api;
 
 
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.basic.PageDTO;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.utils.BeanUtils;
+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.service.TbFieldCategoryService;
+import com.ruoyi.system.service.TbFieldService;
+import com.ruoyi.system.vo.FieldCategoryVO;
+import com.ruoyi.system.vo.FieldVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+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>
@@ -12,9 +31,106 @@
  * @author mitao
  * @since 2024-03-13
  */
+@Slf4j
 @RestController
-@RequestMapping("/tb-field")
+@RequiredArgsConstructor
+@RequestMapping("/field")
+@Api(tags = "字段管理相关接口")
 public class TbFieldController {
 
+    private final TbFieldService tbFieldService;
+    private final TbFieldCategoryService  tbFieldCategoryService;
+
+    /**
+     * 获取分类列表
+     * @param id 分类id
+     * @return 分类列表
+     */
+    @GetMapping("/categories")
+    @ApiOperation(value = "获取分类列表",notes = "一级分类id传0,二级分类传一级分类id,三级分类同理")
+    public R<List<FieldCategoryVO>> queryFieldCategories(@RequestParam Integer id) {
+        return R.ok(tbFieldCategoryService.queryFieldCategories(id));
+    }
+
+    /**
+     * 添加字段
+     * @param dto 字段数据传输对象
+     * @return 响应状态
+     */
+    @PostMapping("/add")
+    @ApiOperation("添加字段")
+    public R<Void> add(@RequestBody @Validated FieldDTO dto){
+        tbFieldService.add(dto);
+        return R.ok();
+    }
+
+    @GetMapping("/influenced-data")
+    @ApiOperation("隐藏字段,获取同步隐藏的基础数据")
+    public R<List<String>> influencedData(@RequestParam Integer id) {
+        return R.ok(tbFieldService.influencedData(id));
+    }
+    /**
+     * 隐藏显示操作
+     * @param dto 显示隐藏操作数据传输对象
+     * @return R
+     */
+    @PostMapping("/show-hide")
+    @ApiOperation("隐藏显示操作")
+    public R<Void> showHide(@RequestBody ShowHideDTO dto) {
+        tbFieldService.showHide(dto);
+        return R.ok();
+    }
+
+    /**
+     * 编辑字段
+     * @param dto 字段数据传输对象
+     * @return 响应状态
+     */
+    @PostMapping("/edit")
+    @ApiOperation("编辑字段")
+    public R<Void> add(@RequestBody @Validated FieldUpdateDTO dto){
+        TbField field = tbFieldService.getById(dto.getId());
+        if (Objects.isNull(field)) {
+            throw new RuntimeException("参数异常");
+        }
+        TbField tbField = BeanUtils.copyBean(dto, TbField.class);
+        tbFieldService.updateById(tbField);
+        return R.ok();
+    }
+
+    /**
+     * 分页条件查询
+     * @param query 部门条件查询对象
+     * @return PageVO<FieldCategoryDetailVO>
+     */
+    @PostMapping("/page")
+    @ApiOperation("分页条件查询")
+    public R<PageDTO<FieldVO>> page(@RequestBody FieldQuery query) {
+        return R.ok(tbFieldService.queryPage(query));
+    }
+
+    /**
+     * 获取详情
+     * @param id id
+     * @return FieldVO
+     */
+    @GetMapping("/getById")
+    @ApiOperation("获取详情")
+    public R<FieldVO> getById(@RequestParam Integer id){
+        TbField field = tbFieldService.getById(id);
+        return R.ok(BeanUtils.copyBean(field, FieldVO.class));
+    }
+
+    /**
+     * 删除
+     * @param id id
+     * @return 响应状态
+     */
+    @DeleteMapping("/delete")
+    @ApiOperation("删除")
+    public R<Void> delete(@RequestParam Integer id){
+        tbFieldService.removeById(id);
+        return R.ok();
+    }
 }
 
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 814151b..157740c 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -68,7 +68,7 @@
   devtools:
     restart:
       # 热部署开关
-      enabled: false
+      enabled: true
   # redis 配置
   redis:
     # 地址
@@ -91,6 +91,8 @@
         max-active: 8
         # #连接池最大阻塞等待时间(使用负值表示没有限制)
         max-wait: -1ms
+  jackson:
+    default-property-inclusion: non_null
 
 # token配置
 token:
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index 4613897..c52a894 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -146,15 +146,10 @@
             <artifactId>springfox-swagger-ui</artifactId>
             <version>3.0.0</version>
         </dependency>
-<!--        <dependency>-->
-<!--            <groupId>com.github.xiaoymin</groupId>-->
-<!--            <artifactId>knife4j-spring-boot-starter</artifactId>-->
-<!--            <version>3.0.3</version>-->
-<!--        </dependency>-->
         <dependency>
             <groupId>com.github.xiaoymin</groupId>
-            <artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
-            <version>4.4.0</version>
+            <artifactId>knife4j-spring-boot-starter</artifactId>
+            <version>3.0.3</version>
         </dependency>
 <!--        <dependency>-->
 <!--            <groupId>io.swagger</groupId>-->
@@ -178,6 +173,12 @@
             <artifactId>easypoi-spring-boot-starter</artifactId>
             <version>4.4.0</version>
         </dependency>
+
+        <!--hutool工具包-->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+        </dependency>
     </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/basic/PageDTO.java b/ruoyi-common/src/main/java/com/ruoyi/common/basic/PageDTO.java
new file mode 100644
index 0000000..91b0942
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/basic/PageDTO.java
@@ -0,0 +1,74 @@
+package com.ruoyi.common.basic;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.ruoyi.common.utils.BeanUtils;
+import com.ruoyi.common.utils.CollUtils;
+import com.ruoyi.common.utils.Convert;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel(description = "分页结果")
+public class PageDTO<T> {
+    @ApiModelProperty("总条数")
+    protected Long total;
+    @ApiModelProperty("总页码数")
+    protected Long pages;
+    @ApiModelProperty("当前页数据")
+    protected List<T> list;
+
+    public static <T> PageDTO<T> empty(Long total, Long pages) {
+        return new PageDTO<>(total, pages, CollUtils.emptyList());
+    }
+    public static <T> PageDTO<T> empty(Page<?> page) {
+        return new PageDTO<>(page.getTotal(), page.getPages(), CollUtils.emptyList());
+    }
+
+    public static <T> PageDTO<T> of(Page<T> page) {
+        if(page == null){
+            return new PageDTO<>();
+        }
+        if (CollUtils.isEmpty(page.getRecords())) {
+            return empty(page);
+        }
+        return new PageDTO<>(page.getTotal(), page.getPages(), page.getRecords());
+    }
+    public static <T,R> PageDTO<T> of(Page<R> page, Function<R, T> mapper) {
+        if(page == null){
+            return new PageDTO<>();
+        }
+        if (CollUtils.isEmpty(page.getRecords())) {
+            return empty(page);
+        }
+        return new PageDTO<>(page.getTotal(), page.getPages(),
+                page.getRecords().stream().map(mapper).collect(Collectors.toList()));
+    }
+    public static <T> PageDTO<T> of(Page<?> page, List<T> list) {
+        return new PageDTO<>(page.getTotal(), page.getPages(), list);
+    }
+
+    public static <T, R> PageDTO<T> of(Page<R> page, Class<T> clazz) {
+        return new PageDTO<>(page.getTotal(), page.getPages(), BeanUtils.copyList(page.getRecords(), clazz));
+    }
+
+    public static <T, R> PageDTO<T> of(Page<R> page, Class<T> clazz, Convert<R, T> convert) {
+        return new PageDTO<>(page.getTotal(), page.getPages(), BeanUtils.copyList(page.getRecords(), clazz, convert));
+    }
+
+    @ApiModelProperty(hidden = true)
+    @JsonIgnore
+    public boolean isEmpty(){
+        return list == null || list.size() == 0;
+    }
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/basic/PageVO.java b/ruoyi-common/src/main/java/com/ruoyi/common/basic/PageVO.java
deleted file mode 100644
index 5ae5ed3..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/basic/PageVO.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.ruoyi.common.basic;
-
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-
-import java.util.ArrayList;
-import java.util.List;
-
-@Data
-public class PageVO<T> {
-    /**
-     * 页码
-     */
-	@ApiModelProperty(name="pageNo", notes="当前页码")
-    private long pageNo;
-    /**
-     * 每页显示数量
-     */
-	@ApiModelProperty(name="pageSize", notes="每页显示数量")
-    private long pageSize;
-    /**
-     * 总页数
-     */
-	@ApiModelProperty(name="totalPages", notes="总页数")
-    private long totalPages;
-    /**
-     * 总记录数
-     */
-	@ApiModelProperty(name="totalCount", notes="总记录数")
-    protected long totalCount;
-    /**
-     * 数据
-     */
-    private List<T> records = new ArrayList<>();
-}
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java
index ef15802..5b69c41 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java
@@ -1,7 +1,9 @@
 package com.ruoyi.common.core.domain;
 
-import java.io.Serializable;
 import com.ruoyi.common.constant.HttpStatus;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
 
 /**
  * 响应信息主体
@@ -17,11 +19,11 @@
 
     /** 失败 */
     public static final int FAIL = HttpStatus.ERROR;
-
+    @ApiModelProperty(value = "业务状态码,200-成功,其它-失败")
     private int code;
-
+    @ApiModelProperty(value = "响应消息", example = "操作成功")
     private String msg;
-
+    @ApiModelProperty(value = "响应数据")
     private T data;
 
     public static <T> R<T> ok()
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/FieldInputTypeEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/FieldInputTypeEnum.java
new file mode 100644
index 0000000..ea64f42
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/FieldInputTypeEnum.java
@@ -0,0 +1,22 @@
+package com.ruoyi.common.enums;
+
+import lombok.Getter;
+import lombok.AllArgsConstructor;
+@Getter
+@AllArgsConstructor
+public enum FieldInputTypeEnum {
+	MANUAL_INPUT(1, "手动输入"),
+	FIXED_CONTENT(2, "固定内容");
+
+	private final Integer code;
+	private final String desc;
+
+	public static FieldInputTypeEnum getEnumByCode(Integer code) {
+		for (FieldInputTypeEnum e : FieldInputTypeEnum.values()) {
+			if (e.code.equals(code)) {
+				return e;
+			}
+		}
+		return null;
+	}
+} 
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/FieldTypeEnum.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/FieldTypeEnum.java
new file mode 100644
index 0000000..7d5ace4
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/FieldTypeEnum.java
@@ -0,0 +1,23 @@
+package com.ruoyi.common.enums;
+
+import lombok.Getter;
+import lombok.AllArgsConstructor;
+@Getter
+@AllArgsConstructor
+public enum FieldTypeEnum {
+	NUMBER(1, "数字"),
+	TEXT(2, "文本"),
+	PERCENTAGE(3, "百分比");
+
+	private final Integer code;
+	private final String desc;
+
+	public static FieldTypeEnum getEnumByCode(Integer code) {
+		for (FieldTypeEnum e : FieldTypeEnum.values()) {
+			if (e.code.equals(code)) {
+				return e;
+			}
+		}
+		return null;
+	}
+} 
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/enums/ShowStatus.java b/ruoyi-common/src/main/java/com/ruoyi/common/enums/ShowStatus.java
index 416d9c1..28a650c 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/enums/ShowStatus.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/enums/ShowStatus.java
@@ -5,8 +5,8 @@
 @Getter
 @AllArgsConstructor
 public enum ShowStatus {
-	HIDE(0, "隐藏"),
-	SHOW(1, "展示");
+	SHOW(0, "展示"),
+	HIDE(1, "隐藏");
 
 	private final Integer code;
 	private final String desc;
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ArrayUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ArrayUtils.java
new file mode 100644
index 0000000..da2695c
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ArrayUtils.java
@@ -0,0 +1,54 @@
+package com.ruoyi.common.utils;
+
+import cn.hutool.core.util.ArrayUtil;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 数组工具类
+ * @ClassName ArrayUtils
+ * @author wusongsong
+ * @since 2022/7/10 12:02
+ * @version 1.0.0
+ **/
+public class ArrayUtils extends ArrayUtil {
+
+
+
+    /**
+     * 将源数组转换成指定类型的列表
+     *
+     * @param originList  原始列表
+     * @param targetClazz 转换后列表元素的类型
+     * @param <R>         原始列表元素的类型
+     * @param <T>         目标列表元素的类型
+     * @return 目标类型的集合
+     */
+    public static <R, T> List<T> convert(R[] originList, Class<T> targetClazz) {
+       return convert(originList, targetClazz, null);
+
+    }
+
+    /**
+     * 将源数组转换成指定类型的列表
+     *
+     * @param originList  原始列表
+     * @param targetClazz 转换后列表元素的类型
+     * @param convert     转换特殊字段接口
+     * @param <R>         原始列表元素的类型
+     * @param <T>         目标列表元素的类型
+     * @return 目标类型的集合
+     */
+    public static <R, T> List<T> convert(R[] originList, Class<T> targetClazz, Convert<R, T> convert) {
+        if (isEmpty(originList)) {
+            return null;
+        }
+
+        return Arrays.stream(originList)
+                .map(origin -> BeanUtils.copyBean(origin, targetClazz, convert))
+                .collect(Collectors.toList());
+
+    }
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanUtils.java
new file mode 100644
index 0000000..769f708
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/BeanUtils.java
@@ -0,0 +1,59 @@
+package com.ruoyi.common.utils;
+
+import cn.hutool.core.bean.BeanUtil;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 继承自 hutool 的BeanUtil,增加了bean转换时自定义转换器的功能
+ */
+public class BeanUtils extends BeanUtil {
+
+    /**
+     * 将原对象转换成目标对象,对于字段不匹配的字段可以使用转换器处理
+     *
+     * @param source  原对象
+     * @param clazz   目标对象的class
+     * @param convert 转换器
+     * @param <R>     原对象类型
+     * @param <T>     目标对象类型
+     * @return 目标对象
+     */
+    public static <R, T> T copyBean(R source, Class<T> clazz, Convert<R, T> convert) {
+        T target = copyBean(source, clazz);
+        if (convert != null) {
+            convert.convert(source, target);
+        }
+        return target;
+    }
+    /**
+     * 将原对象转换成目标对象,对于字段不匹配的字段可以使用转换器处理
+     *
+     * @param source  原对象
+     * @param clazz   目标对象的class
+     * @param <R>     原对象类型
+     * @param <T>     目标对象类型
+     * @return 目标对象
+     */
+    public static <R, T> T copyBean(R source, Class<T> clazz){
+        if (source == null) {
+            return null;
+        }
+        return toBean(source, clazz);
+    }
+
+    public static <R, T> List<T> copyList(List<R> list, Class<T> clazz) {
+        if (list == null || list.size() == 0) {
+            return CollUtils.emptyList();
+        }
+        return copyToList(list, clazz);
+    }
+
+    public static <R, T> List<T> copyList(List<R> list, Class<T> clazz, Convert<R, T> convert) {
+        if (list == null || list.size() == 0) {
+            return CollUtils.emptyList();
+        }
+        return list.stream().map(r -> copyBean(r, clazz, convert)).collect(Collectors.toList());
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/Checker.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/Checker.java
new file mode 100644
index 0000000..29f7d03
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/Checker.java
@@ -0,0 +1,18 @@
+package com.ruoyi.common.utils;
+
+/**
+ * 实现后在接口访问时如果接口实现了这个接口
+ * 会被自动自行接口check进行校验
+ **/
+public interface Checker<T> {
+
+    /**
+     * 用于实现validation不能校验的数据逻辑
+     */
+    default void check(){
+
+    }
+
+    default void check(T data){
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/CollUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/CollUtils.java
new file mode 100644
index 0000000..be9246e
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/CollUtils.java
@@ -0,0 +1,142 @@
+package com.ruoyi.common.utils;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.collection.IterUtil;
+
+
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 继承自 hutool 的集合工具类
+ */
+public class CollUtils extends CollectionUtil {
+
+    public static <T> List<T> emptyList() {
+        return Collections.emptyList();
+    }
+
+    public static <T> Set<T> emptySet() {
+        return Collections.emptySet();
+    }
+
+    public static <K,V> Map<K, V> emptyMap() {
+        return Collections.emptyMap();
+    }
+
+    public static <T> Set<T> singletonSet(T t) {
+        return Collections.singleton(t);
+    }
+
+    public static <T> List<T> singletonList(T t) {
+        return Collections.singletonList(t);
+    }
+
+    public static List<Integer> convertToInteger(List<String> originList){
+        return CollUtils.isNotEmpty(originList) ? originList.stream().map(NumberUtils::parseInt).collect(Collectors.toList()) : null;
+    }
+
+    public static List<Long> convertToLong(List<String> originLIst){
+        return CollUtils.isNotEmpty(originLIst) ? originLIst.stream().map(NumberUtils::parseLong).collect(Collectors.toList()) : null;
+    }
+
+    /**
+     * 以 conjunction 为分隔符将集合转换为字符串 如果集合元素为数组、Iterable或Iterator,则递归组合其为字符串
+     * @param collection 集合
+     * @param conjunction 分隔符
+     * @param <T> 集合元素类型
+     * @return 连接后的字符串
+     * See Also: IterUtil.join(Iterator, CharSequence)
+     */
+    public static <T> String join(Collection<T> collection, CharSequence conjunction) {
+        if (null == collection || collection.isEmpty()) {
+            return null;
+        }
+        return IterUtil.join(collection.iterator(), conjunction);
+    }
+
+    public static <T> String joinIgnoreNull(Collection<T> collection, CharSequence conjunction) {
+        if (null == collection || collection.isEmpty()) {
+            return null;
+        }
+        StringBuilder sb = new StringBuilder();
+        for (T t : collection) {
+            if(t == null) continue;
+            sb.append(t).append(",");
+        }
+        if(sb.length() <= 0){
+            return null;
+        }
+        return sb.deleteCharAt(sb.length() - 1).toString();
+    }
+
+    /**
+     * 集合校验逻辑
+     *
+     * @param data 要校验的集合
+     * @param checker 校验器
+     * @param <T> 集合元素类型
+     */
+    public static  <T> void  check(List<T> data, Checker<T> checker){
+        if(data == null){
+            return;
+        }
+        for (T t : data){
+            checker.check(t);
+        }
+    }
+
+    /**
+     * 集合校验逻辑
+     *
+     * @param data 要校验的集合
+     * @param <T> 集合元素类型
+     */
+    public static  <T extends Checker<T>> void  check(List<T> data){
+        if(data == null){
+            return;
+        }
+        for (T t : data){
+            t.check();
+        }
+    }
+
+    /**
+     * 将元素加入到集合中,为null的过滤掉
+     *
+     * @param list 集合
+     * @param data 要添加的数据
+     * @param <T> 元素类型
+     */
+    public static <T> void add(Collection<T> list, T... data) {
+        if (list == null || ArrayUtils.isEmpty(data)) {
+            return;
+        }
+        for (T t : data) {
+            if (ObjectUtils.isNotEmpty(t)) {
+                list.add(t);
+            }
+        }
+    }
+    //将两个集合出现次数相加
+    public static Map<Long, Integer> union(Map<Long, Integer> map1, Map<Long, Integer> map2) {
+        if (CollUtils.isEmpty(map1)) {
+            return map2;
+        } else if (CollUtils.isEmpty(map2)) {
+            return map1;
+        }
+        for (Map.Entry<Long, Integer> entry : map1.entrySet()) {
+            Integer num = map2.get(entry.getKey());
+            map2.put(entry.getKey(), NumberUtils.null2Zero(num) + entry.getValue());
+        }
+        return map2;
+    }
+
+    public static <T,R> R getFiledOfFirst(List<T> list, Function<T, R> function) {
+        if (CollUtils.isEmpty(list)) {
+            return null;
+        }
+        return function.apply(list.get(0));
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/Convert.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/Convert.java
new file mode 100644
index 0000000..514b467
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/Convert.java
@@ -0,0 +1,8 @@
+package com.ruoyi.common.utils;
+
+/**
+ * 对原对象进行计算,设置到目标对象中
+ **/
+public interface Convert<R,T>{
+    void convert(R origin, T target);
+}
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/NumberUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/NumberUtils.java
new file mode 100644
index 0000000..af65116
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/NumberUtils.java
@@ -0,0 +1,148 @@
+package com.ruoyi.common.utils;
+
+import cn.hutool.core.util.NumberUtil;
+
+import java.math.BigDecimal;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class NumberUtils extends NumberUtil {
+
+
+    /**
+     * 如果number为空,将number转换为0,否则原数字返回
+     *
+     * @param number 原数值
+     * @return 整型数字,0或原数字
+     */
+    public static Integer null2Zero(Integer number){
+        return number == null ? 0 : number;
+    }
+
+    /**
+     * 如果number为空,将number转换为0,否则原数字返回
+     *
+     * @param number 原数值
+     * @return 整型数字,0或原数字
+     */
+    public static Double null2Zero(Double number){
+        return number == null ? 0 : number;
+    }
+
+    /**
+     * 如果number为空,将number转换为0L,否则原数字返回
+     *
+     * @param number  原数值
+     * @return 长整型数字,0L或原数字
+     */
+    public static Long null2Zero(Long number){
+        return number == null ? 0L : number;
+    }
+
+
+    public static Double setScale(Double number) {
+        return new BigDecimal(number)
+                .setScale(2, BigDecimal.ROUND_HALF_UP)
+                .doubleValue();
+    }
+    /**
+     * 比较两个数字是否相同,
+     * @param number1 数值1
+     * @param number2 数值2
+     * @return 是否一致
+     */
+    public static boolean equals(Integer number1, Integer number2) {
+        if(number1 == null || number2 == null){
+            return false;
+        }
+        return number1.equals(number2);
+    }
+
+    /**
+     * 数字除法保留指定小数位
+     * @param num1 被除数
+     * @param num2 除数
+     * @param scale 小数点位数
+     * @return 结果
+     */
+    public static Double divToDouble(Integer num1, Integer num2, int scale){
+        if(num2 == null || num2 ==0 || num1 == null || num1 == 0) {
+            return 0d;
+        }
+        return div(num1, num2, scale).doubleValue();
+    }
+
+    public static  Double max(List<Double> data){
+        if(CollUtils.isEmpty(data)){
+            return null;
+        }
+        return data.stream()
+                .max(Comparator.comparingDouble(num -> num))
+                .orElse(0d);
+    }
+    public static  Double min(List<Double> data){
+        if(CollUtils.isEmpty(data)){
+            return null;
+        }
+        return data.stream()
+                .min(Comparator.comparingDouble(num -> num))
+                .orElse(0d);
+    }
+
+    public static Double average(List<Double> data){
+        if(CollUtils.isEmpty(data)){
+            return 0d;
+        }
+        return data.stream()
+                .collect(Collectors.averagingDouble(Double::doubleValue));
+
+    }
+
+    public static Integer toInt(Object obj) {
+        return obj == null ? null
+                : obj instanceof Integer
+                ? (int) obj : null;
+    }
+
+    /**
+     * 取绝对值,如果为null,返回0
+     * @param number 数值
+     * @return 绝对值
+     */
+    public static int abs(Integer number) {
+        return number == null
+                ? 0
+                : Math.abs(number);
+    }
+
+    /**
+     * 数字格式化字符串,不足位数补0
+     *
+     * @param originNumber 原始数字
+     * @param digit 数字位数
+     * @return 字符串
+     */
+    public static String  repair0(Integer originNumber, Integer digit){
+        StringBuilder number = new StringBuilder(originNumber + "");
+        while (number.length() < digit) {
+            number.insert(0, "0");
+        }
+        return number.toString();
+    }
+
+
+    public static String scaleToStr(Integer num, int offset) {
+        // 1.计算位数
+        int m = (int) Math.pow(10, offset);
+        // 2.计算商
+        int s = num / m;
+        // 3.计算余数
+        int y = num % m;
+        if (y == 0) {
+            return Integer.toString(s);
+        }
+        // 2.计算余数
+        return s + "." + y;
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ObjectUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ObjectUtils.java
new file mode 100644
index 0000000..e3cfaab
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ObjectUtils.java
@@ -0,0 +1,84 @@
+package com.ruoyi.common.utils;
+
+import cn.hutool.core.util.ObjectUtil;
+
+import java.lang.reflect.Field;
+import java.math.BigDecimal;
+
+/**
+ * Object操作工具
+ **/
+public class ObjectUtils extends ObjectUtil {
+
+    /**
+     * 为object设置默认值,对target中的基本类型进行默认值初始化,
+     * 为null的对象不操作
+     *
+     * @param target 需要初始化的对象
+     */
+    public static void setDefault(Object target) {
+        if (target == null) {
+            return;
+        }
+        Class<?> clazz = target.getClass();
+        Field[] declaredFields = clazz.getDeclaredFields();
+        for (Field field : declaredFields) {
+            setDefault(field, target);
+        }
+
+    }
+
+    /**
+     * 给某个字段设置为默认值
+     *
+     * @param field
+     * @param target
+     */
+    private static void setDefault(Field field, Object target) {
+        field.setAccessible(true);
+        try {
+            Object value = field.get(target);
+            if (value != null) {
+                return;
+            }
+            String type = field.getGenericType().toString();
+            Object defaultValue;
+            switch (type) {
+                case "class java.lang.String":
+                case "class java.lang.Character":
+                    defaultValue = "";
+                    break;
+                case "class java.lang.Double":
+                    defaultValue = 0.0d;
+                    break;
+                case "class java.lang.Long":
+                    defaultValue = 0L;
+                    break;
+                case "class java.lang.Short":
+                    defaultValue = (short) 0;
+                    break;
+                case "class java.lang.Integer":
+                    defaultValue = 0;
+                    break;
+                case "class java.lang.Float":
+                    defaultValue = 0f;
+                    break;
+                case "class java.lang.Byte":
+                    defaultValue = (byte) 0;
+                    break;
+                case "class java.math.BigDecimal":
+                    defaultValue = BigDecimal.ZERO;
+                    break;
+                case "class java.lang.Boolean":
+                    defaultValue = Boolean.FALSE;
+                    break;
+                default:
+                    defaultValue = null;
+
+            }
+            field.set(target, defaultValue);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/ruoyi-system/pom.xml b/ruoyi-system/pom.xml
index 10998d3..5711da5 100644
--- a/ruoyi-system/pom.xml
+++ b/ruoyi-system/pom.xml
@@ -71,6 +71,11 @@
             <artifactId>tomcat-embed-core</artifactId>
         </dependency>
 
+        <!--hutool工具包-->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+        </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 ff8ac2a..1cee284 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
@@ -51,7 +51,7 @@
 
     @ApiModelProperty(value = "填报状态(1=未填报 2=数据缺失 3=已填报)")
     @TableField("status")
-    private Boolean status;
+    private Integer status;
 
     @ApiModelProperty(value = "删除标志(0代表存在 1代表删除)")
     @TableField("del_flag")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicDataConfig.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicDataConfig.java
index 07c7947..9a7e1d3 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicDataConfig.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbBasicDataConfig.java
@@ -42,12 +42,20 @@
     private String fieldDescription;
 
     @ApiModelProperty(value = "计算类型(1=数字计算 2=文本统计 3=百分比统计)")
-    @TableField("caculate_type")
-    private Boolean caculateType;
+    @TableField("calculate_type")
+    private Integer calculateType;
+
+    @ApiModelProperty(value = "字段id")
+    @TableField("field_id")
+    private Integer fieldId;
 
     @ApiModelProperty(value = "计算公式")
-    @TableField("caculate_formula")
-    private String caculateFormula;
+    @TableField("calculate_formula")
+    private String calculateFormula;
+
+    @ApiModelProperty(value = "隐藏状态(0=展示中 1=已隐藏)")
+    @TableField("status")
+    private Integer status;
 
     @ApiModelProperty(value = "删除标志(0代表存在 1代表删除)")
     @TableField("del_flag")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbDataScreenConfig.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbDataScreenConfig.java
index 538ef04..d036394 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbDataScreenConfig.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbDataScreenConfig.java
@@ -39,7 +39,7 @@
 
     @ApiModelProperty(value = "配置类型子类型(1=数据指标一/形式指标一 2=数据指标二/形式指标二 3=数据指标三/形式指标三 4=数据指标四/形式指标四)")
     @TableField("sub_type")
-    private Boolean subType;
+    private Integer subType;
 
     @ApiModelProperty(value = "删除标志(0代表存在 1代表删除)")
     @TableField("del_flag")
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 4e8e8cf..f1cb912 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
@@ -53,7 +53,7 @@
     @ApiModelProperty(value = "县级标志(不包含直辖市的区 0:否 1:是)")
     @TableField("county_flag")
     @Excel(name = "县级标志 是/否",replace = {"是_1","否_2"})
-    private Boolean countyFlag;
+    private Integer countyFlag;
 
     @ApiModelProperty(value = "负责人")
     @TableField("person_in_charge")
@@ -77,7 +77,7 @@
 
     @ApiModelProperty(value = "是否重点关注(0:否 1:是)")
     @TableField("focussed")
-    private Boolean focussed;
+    private Integer focussed;
 
     @ApiModelProperty(value = "创建者")
     @TableField("create_by")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbField.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbField.java
index 0334da5..ae27823 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbField.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbField.java
@@ -35,7 +35,19 @@
 
     @ApiModelProperty(value = "字段类型(1=数字 2=文本 3=百分比)")
     @TableField("field_type")
-    private Boolean fieldType;
+    private Integer fieldType;
+
+    @ApiModelProperty(value = "一级分类id")
+    @TableField("level_one_category_id")
+    private Integer levelOneCategoryId;
+
+    @ApiModelProperty(value = "二级分类id")
+    @TableField("level_two_category_id")
+    private Integer levelTwoCategoryId;
+
+    @ApiModelProperty(value = "三级分类id")
+    @TableField("level_three_category_id")
+    private Integer levelThreeCategoryId;
 
     @ApiModelProperty(value = "一级分类")
     @TableField("level_one_category")
@@ -49,9 +61,9 @@
     @TableField("level_three_category")
     private String levelThreeCategory;
 
-    @ApiModelProperty(value = "隐藏状态法(0=展示中 1=已隐藏)")
-    @TableField("hidden")
-    private Integer hidden;
+    @ApiModelProperty(value = "隐藏状态(0=展示中 1=已隐藏)")
+    @TableField("status")
+    private Integer status;
 
     @ApiModelProperty(value = "数字最小值")
     @TableField("num_min")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbFieldCategory.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbFieldCategory.java
index ecc5a67..24593d3 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbFieldCategory.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/TbFieldCategory.java
@@ -41,7 +41,7 @@
     @TableField("sort_order")
     private Integer sortOrder;
 
-    @ApiModelProperty(value = "状态(0=隐藏 1=显示)")
+    @ApiModelProperty(value = "状态(0=展示 1=隐藏)")
     @TableField("status")
     private Integer status;
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/FieldCategoryDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/FieldCategoryDTO.java
index 8138aa2..d10d0bc 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/FieldCategoryDTO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/FieldCategoryDTO.java
@@ -5,6 +5,7 @@
 import lombok.Data;
 
 import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
@@ -24,7 +25,7 @@
     private String fieldCategoryName;
 
     @ApiModelProperty(value = "序号")
-    @NotBlank(message = "序号不能为空")
+    @NotNull(message = "序号不能为空")
     private Integer sortOrder;
 
     @ApiModelProperty(value = "子分类")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/FieldDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/FieldDTO.java
new file mode 100644
index 0000000..964493f
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/FieldDTO.java
@@ -0,0 +1,53 @@
+package com.ruoyi.system.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author mitao
+ * @date 2024/3/15
+ */
+@Data
+@ApiModel(value = "字段数据传输对象")
+public class FieldDTO {
+
+    @ApiModelProperty(value = "字段名")
+    @NotBlank(message="字段名不能为空")
+    private String fieldName;
+
+    @ApiModelProperty(value = "字段类型(1=数字 2=文本 3=百分比)")
+    @NotNull(message="字段类型不能为空")
+    private Integer fieldType;
+
+    @ApiModelProperty(value = "一级分类id")
+    @NotNull(message="分类id不能为空")
+    private Integer levelOneCategoryId;
+
+    @ApiModelProperty(value = "二级分类id")
+    private Integer levelTwoCategoryId;
+
+    @ApiModelProperty(value = "三级分类id")
+    private Integer levelThreeCategoryId;
+
+    @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;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/ShowHideDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/ShowHideDTO.java
index eb7f0dd..096cb23 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/ShowHideDTO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/ShowHideDTO.java
@@ -18,7 +18,7 @@
     @NotNull(message = "id不能为空")
     private Integer id;
 
-    @ApiModelProperty(value = "状态(0=隐藏 1=显示)")
+    @ApiModelProperty(value = "状态(0=展示 1=隐藏)")
     @NotNull(message = "status不能为空")
     private Integer status;
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/update/FieldUpdateDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/update/FieldUpdateDTO.java
new file mode 100644
index 0000000..b10d0b6
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/update/FieldUpdateDTO.java
@@ -0,0 +1,57 @@
+package com.ruoyi.system.dto.update;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author mitao
+ * @date 2024/3/15
+ */
+@Data
+@ApiModel(value = "字段数据传输对象")
+public class FieldUpdateDTO {
+
+    @ApiModelProperty(value = "id")
+    @NotBlank(message = "id不能为空")
+    private Integer id;
+
+    @ApiModelProperty(value = "字段名")
+    @NotBlank(message="字段名不能为空")
+    private String fieldName;
+
+    @ApiModelProperty(value = "字段类型(1=数字 2=文本 3=百分比)")
+    @NotNull(message="字段类型不能为空")
+    private Integer fieldType;
+
+    @ApiModelProperty(value = "一级分类id")
+    @NotNull(message="分类id不能为空")
+    private Integer levelOneCategoryId;
+
+    @ApiModelProperty(value = "二级分类id")
+    private Integer levelTwoCategoryId;
+
+    @ApiModelProperty(value = "三级分类id")
+    private Integer levelThreeCategoryId;
+
+    @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;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/DeptQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/DeptQuery.java
index c80c69e..6faae3c 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/query/DeptQuery.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/DeptQuery.java
@@ -4,14 +4,19 @@
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 /**
  * @author mitao
  * @date 2024/3/13
  */
-@ApiModel("部门条件查询对象")
 @Data
+@ApiModel("部门条件查询对象")
+@EqualsAndHashCode(callSuper = true)
 public class DeptQuery  extends BasePage {
+
+    private static final long serialVersionUID = 2925694647205543161L;
+
     @ApiModelProperty("部门名称")
     private String areaName;
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/FieldCategoryQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/FieldCategoryQuery.java
index b95d1ae..3eef42f 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/query/FieldCategoryQuery.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/FieldCategoryQuery.java
@@ -4,13 +4,15 @@
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 /**
  * @author mitao
  * @date 2024/3/14
  */
-@ApiModel("部门条件查询对象")
 @Data
+@ApiModel("部门条件查询对象")
+@EqualsAndHashCode(callSuper = true)
 public class FieldCategoryQuery extends BasePage {
 
     private static final long serialVersionUID = -1051848065579715873L;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/FieldQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/FieldQuery.java
new file mode 100644
index 0000000..898eb75
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/FieldQuery.java
@@ -0,0 +1,37 @@
+package com.ruoyi.system.query;
+
+import com.ruoyi.common.core.domain.BasePage;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * @author mitao
+ * @date 2024/3/15
+ */
+@Data
+@ApiModel("字段条件查询对象")
+@EqualsAndHashCode(callSuper = true)
+public class FieldQuery extends BasePage {
+
+    private static final long serialVersionUID = 4027555973828289972L;
+
+    @ApiModelProperty(value = "字段名")
+    private String fieldName;
+
+    @ApiModelProperty(value = "字段类型(1=数字 2=文本 3=百分比)")
+    private Integer fieldType;
+
+    @ApiModelProperty(value = "所属分类")
+    private String levelOneCategory;
+
+    @ApiModelProperty(value = "二级分类")
+    private String levelTwoCategory;
+
+    @ApiModelProperty(value = "三级分类")
+    private String levelThreeCategory;
+
+    @ApiModelProperty(value = "状态 0=展示 1=隐藏")
+    private Integer status;
+}
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 87c41fd..dd0c089 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
@@ -1,7 +1,7 @@
 package com.ruoyi.system.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.ruoyi.common.basic.PageVO;
+import com.ruoyi.common.basic.PageDTO;
 import com.ruoyi.system.domain.TbDept;
 import com.ruoyi.system.query.DeptQuery;
 import com.ruoyi.system.vo.DeptVO;
@@ -17,7 +17,7 @@
  */
 public interface TbDeptService extends IService<TbDept> {
 
-    PageVO<DeptVO> queryPage(DeptQuery query);
+    PageDTO<DeptVO> queryPage(DeptQuery query);
 
     void importExcel(MultipartFile file) throws Exception;
 }
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 4e92d58..fc003f6 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
@@ -1,13 +1,15 @@
 package com.ruoyi.system.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.ruoyi.common.basic.PageVO;
+import com.ruoyi.common.basic.PageDTO;
 import com.ruoyi.system.domain.TbFieldCategory;
 import com.ruoyi.system.dto.FieldCategoryDTO;
 import com.ruoyi.system.dto.ShowHideDTO;
 import com.ruoyi.system.dto.update.FieldCategoryUpdateDTO;
 import com.ruoyi.system.query.FieldCategoryQuery;
 import com.ruoyi.system.vo.FieldCategoryVO;
+
+import java.util.List;
 
 /**
  * <p>
@@ -21,7 +23,7 @@
 
     void add(FieldCategoryDTO dto);
 
-    PageVO<FieldCategoryVO> queryPage(FieldCategoryQuery query);
+    PageDTO<FieldCategoryVO> queryPage(FieldCategoryQuery query);
 
     void showHide(ShowHideDTO dto);
 
@@ -30,4 +32,7 @@
     void deleteChildren(Integer id);
 
     void delete(Integer id);
+
+    List<FieldCategoryVO> queryFieldCategories(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 8512153..3dc444b 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
@@ -1,7 +1,14 @@
 package com.ruoyi.system.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.common.basic.PageDTO;
 import com.ruoyi.system.domain.TbField;
+import com.ruoyi.system.dto.FieldDTO;
+import com.ruoyi.system.dto.ShowHideDTO;
+import com.ruoyi.system.query.FieldQuery;
+import com.ruoyi.system.vo.FieldVO;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +20,11 @@
  */
 public interface TbFieldService extends IService<TbField> {
 
+    void add(FieldDTO dto);
+
+    void showHide(ShowHideDTO dto);
+
+    PageDTO<FieldVO> queryPage(FieldQuery query);
+
+    List<String> influencedData(Integer id);
 }
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 dfe0464..d22ad84 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
@@ -3,13 +3,11 @@
 import cn.afterturn.easypoi.excel.ExcelImportUtil;
 import cn.afterturn.easypoi.excel.entity.ImportParams;
 import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.common.basic.PageVO;
+import com.ruoyi.common.basic.PageDTO;
+import com.ruoyi.common.utils.CollUtils;
 import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.system.domain.TbDept;
 import com.ruoyi.system.handler.DeptVerifyHandler;
 import com.ruoyi.system.mapper.TbDeptMapper;
@@ -22,7 +20,6 @@
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.multipart.MultipartFile;
 
-import javax.servlet.http.HttpServletResponse;
 import java.io.InputStream;
 import java.util.*;
 
@@ -37,29 +34,21 @@
 @Service
 @RequiredArgsConstructor
 public class TbDeptServiceImpl extends ServiceImpl<TbDeptMapper, TbDept> implements TbDeptService {
+
     private final DeptVerifyHandler deptVerifyHandler;
-    private final HttpServletResponse response;
+
     @Override
-    public PageVO<DeptVO> queryPage(DeptQuery query) {
+    public PageDTO<DeptVO> queryPage(DeptQuery query) {
         Page<TbDept> page = new Page<>(query.getPageNum(), query.getPageSize());
-        LambdaQueryWrapper<TbDept> queryWrapper = new LambdaQueryWrapper<TbDept>()
-                .like(StringUtils.isNotEmpty(query.getAreaName()), TbDept::getAreaName, query.getAreaName())
+        Page<TbDept> tbDeptPage = this.lambdaQuery().like(StringUtils.isNotEmpty(query.getAreaName()), TbDept::getAreaName, query.getAreaName())
                 .like(StringUtils.isNotEmpty(query.getAccount()), TbDept::getAccount, query.getAccount())
                 .like(StringUtils.isNotEmpty(query.getPhone()), TbDept::getPhone, query.getPhone())
-                .orderByDesc(TbDept::getCreateTime);
-        Page<TbDept> deptPage = this.baseMapper.selectPage(page, queryWrapper);
-        PageVO<DeptVO> pageVO = new PageVO<>();
-        pageVO.setPageNo(deptPage.getPages());
-        pageVO.setPageSize(deptPage.getSize());
-        pageVO.setTotalPages(deptPage.getTotal());
-        pageVO.setTotalCount(deptPage.getTotal());
-        IPage<DeptVO> convert = deptPage.convert(result -> {
-            DeptVO deptVO = new DeptVO();
-            BeanUtils.copyBeanProp(deptVO, result);
-            return deptVO;
-        });
-        pageVO.setRecords(convert.getRecords());
-        return pageVO;
+                .orderByDesc(TbDept::getCreateTime)
+                .page(page);
+        if (CollUtils.isEmpty(tbDeptPage.getRecords())) {
+            return PageDTO.empty(page);
+        }
+        return PageDTO.of(tbDeptPage, DeptVO.class);
     }
 
     @Override
@@ -90,8 +79,8 @@
 
     /**
      * 校验区划代码是否重复
-     * @param deptList
-     * @return
+     * @param deptList 部门列表
+     * @return 重复的区划代码
      */
     public List<String> hasDuplicateAreaCode(List<TbDept> deptList) {
         Set<String> areaCodes = new HashSet<>();
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 2a7e491..bb46ead 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
@@ -4,9 +4,11 @@
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.common.basic.PageVO;
+import com.ruoyi.common.basic.PageDTO;
+import com.ruoyi.common.enums.ShowStatus;
+import com.ruoyi.common.utils.BeanUtils;
+import com.ruoyi.common.utils.CollUtils;
 import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.system.domain.TbFieldCategory;
 import com.ruoyi.system.dto.FieldCategoryDTO;
 import com.ruoyi.system.dto.ShowHideDTO;
@@ -63,31 +65,39 @@
     }
 
     @Override
-    public PageVO<FieldCategoryVO> queryPage(FieldCategoryQuery query) {
+    public PageDTO<FieldCategoryVO> queryPage(FieldCategoryQuery query) {
         Page<TbFieldCategory> page = this.lambdaQuery()
                 .like(StringUtils.isNotBlank(query.getFieldCategoryName()), TbFieldCategory::getFieldCategoryName, query.getFieldCategoryName())
                 .eq(ObjectUtils.isNotEmpty(query.getStatus()), TbFieldCategory::getStatus, query.getStatus())
+                .eq(TbFieldCategory::getParentId, 0)
+                .orderByDesc(TbFieldCategory::getCreateTime)
                 .page(new Page<>(query.getPageNum(), query.getPageSize()));
-        PageVO<FieldCategoryVO> pageVO = new PageVO<>();
-        pageVO.setPageNo(page.getPages());
-        pageVO.setPageSize(page.getSize());
-        pageVO.setTotalPages(page.getTotal());
-        pageVO.setTotalCount(page.getTotal());
-        pageVO.setRecords(page.getRecords().stream().map(item -> {
-            FieldCategoryVO fieldCategoryVO = new FieldCategoryVO();
-            BeanUtils.copyBeanProp(fieldCategoryVO, item);
-            return fieldCategoryVO;
-        }).collect(Collectors.toList()));
-        return pageVO;
+        if (CollUtils.isEmpty(page.getRecords())) {
+            return PageDTO.empty(page);
+        }
+        return PageDTO.of(page, FieldCategoryVO.class);
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void showHide(ShowHideDTO dto) {
-        TbFieldCategory category = this.getById(dto.getId());
+        updateCategoryAndChildren(dto.getId(), dto.getStatus());
+    }
+
+    private void updateCategoryAndChildren(Integer id, Integer status) {
+        TbFieldCategory category = this.getById(id);
         if (Objects.isNull(category)) {
             throw new RuntimeException("非法id");
         }
-        this.lambdaUpdate().eq(TbFieldCategory::getId, dto.getId()).set(TbFieldCategory::getStatus, dto.getStatus());
+        this.lambdaUpdate()
+                .eq(TbFieldCategory::getId, id)
+                .set(TbFieldCategory::getStatus, status)
+                .update();
+        List<TbFieldCategory> children = this.lambdaQuery().eq(TbFieldCategory::getParentId, category.getId()).list();
+        if (CollUtils.isNotEmpty(children)) {
+            List<Integer> childIds = children.stream().map(TbFieldCategory::getId).collect(Collectors.toList());
+            childIds.forEach(childId -> updateCategoryAndChildren(childId, status));
+        }
     }
 
     @Override
@@ -113,6 +123,9 @@
     public void delete(Integer id) {
         //一级分类
         TbFieldCategory category = this.getById(id);
+        if (Objects.isNull(category)) {
+            throw new RuntimeException("非法参数");
+        }
         //查询是否有二级分类
         List<TbFieldCategory> threeCategoryList = this.lambdaQuery().eq(TbFieldCategory::getParentId, id).list();
         if (CollectionUtils.isNotEmpty(threeCategoryList)) {
@@ -148,6 +161,7 @@
             });
         }
     }
+
     private void updateCategory(FieldCategoryUpdateDTO dto) {
         if (dto == null) return;
         this.lambdaUpdate()
@@ -156,4 +170,14 @@
                 .eq(TbFieldCategory::getId, dto.getId())
                 .update();
     }
+
+    @Override
+    public List<FieldCategoryVO> queryFieldCategories(Integer id) {
+        List<TbFieldCategory> list = this.lambdaQuery()
+                .select(TbFieldCategory::getId,TbFieldCategory::getFieldCategoryName)
+                .eq(TbFieldCategory::getParentId, id)
+                .eq(TbFieldCategory::getStatus, ShowStatus.SHOW)
+                .list();
+        return BeanUtils.copyList(list, FieldCategoryVO.class);
+    }
 }
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 89e2c66..521952d 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
@@ -1,10 +1,33 @@
 package com.ruoyi.system.service.impl;
 
+import cn.hutool.json.JSONArray;
+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.enums.FieldInputTypeEnum;
+import com.ruoyi.common.enums.FieldTypeEnum;
+import com.ruoyi.common.utils.BeanUtils;
+import com.ruoyi.common.utils.CollUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.domain.TbBasicDataConfig;
 import com.ruoyi.system.domain.TbField;
+import com.ruoyi.system.domain.TbFieldCategory;
+import com.ruoyi.system.dto.FieldDTO;
+import com.ruoyi.system.dto.ShowHideDTO;
 import com.ruoyi.system.mapper.TbFieldMapper;
+import com.ruoyi.system.query.FieldQuery;
+import com.ruoyi.system.service.TbBasicDataConfigService;
+import com.ruoyi.system.service.TbFieldCategoryService;
 import com.ruoyi.system.service.TbFieldService;
+import com.ruoyi.system.vo.FieldVO;
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -14,7 +37,102 @@
  * @author mitao
  * @since 2024-03-13
  */
+@Slf4j
 @Service
+@RequiredArgsConstructor
 public class TbFieldServiceImpl extends ServiceImpl<TbFieldMapper, TbField> implements TbFieldService {
+    private final TbFieldCategoryService tbFieldCategoryService;
+    private final TbBasicDataConfigService tbBasicDataConfigService;
 
+    @Override
+    public void add(FieldDTO dto) {
+        //参数校验
+        Integer fieldType = dto.getFieldType();
+        //1:数字 2:文本 3:百分比
+        if (FieldTypeEnum.TEXT.getCode().equals(fieldType)) {
+            if (StringUtils.isNull(dto.getTextInputType())) {
+                throw new RuntimeException("输入类型不能为空");
+            } else if (FieldInputTypeEnum.FIXED_CONTENT.getCode().equals(dto.getTextInputType()) && StringUtils.isBlank(dto.getTextContent())) {
+                throw new RuntimeException("内容设置不能为空");
+            }
+        }
+        TbField tbField = BeanUtils.copyBean(dto, TbField.class);
+        TbFieldCategory category1 = tbFieldCategoryService.getById(dto.getLevelOneCategoryId());
+        tbField.setLevelOneCategory(category1.getFieldCategoryName());
+        if (StringUtils.isNotNull(dto.getLevelTwoCategoryId())) {
+            TbFieldCategory category2 = tbFieldCategoryService.getById(dto.getLevelTwoCategoryId());
+            tbField.setLevelTwoCategory(category2.getFieldCategoryName());
+        }
+        if (StringUtils.isNotNull(dto.getLevelThreeCategoryId())) {
+            TbFieldCategory category3 = tbFieldCategoryService.getById(dto.getLevelThreeCategoryId());
+            tbField.setLevelThreeCategory(category3.getFieldCategoryName());
+        }
+        this.save(tbField);
+    }
+
+    @Override
+    public void showHide(ShowHideDTO dto) {
+        TbField field = this.getById(dto.getId());
+        if (StringUtils.isNull(field)) {
+            throw new RuntimeException("非法参数");
+        }
+        //隐藏字段
+        this.lambdaUpdate().set(TbField::getStatus, dto.getStatus()).eq(TbField::getId, dto.getId()).update();
+        //隐藏基础数据 TODO
+        tbBasicDataConfigService.lambdaUpdate().eq(TbBasicDataConfig::getFieldId, dto.getId()).set(TbBasicDataConfig::getStatus, dto.getStatus()).update();
+    }
+
+    @Override
+    public PageDTO<FieldVO> queryPage(FieldQuery query) {
+        Page<TbField> page = this.lambdaQuery()
+                .like(StringUtils.isNotEmpty(query.getFieldName()), TbField::getFieldName, query.getFieldName())
+                .like(StringUtils.isNotEmpty(query.getLevelOneCategory()), TbField::getLevelOneCategory, query.getLevelOneCategory())
+                .like(StringUtils.isNotEmpty(query.getLevelTwoCategory()), TbField::getLevelTwoCategory, query.getLevelTwoCategory())
+                .like(StringUtils.isNotEmpty(query.getLevelThreeCategory()), TbField::getLevelThreeCategory, query.getLevelThreeCategory())
+                .eq(StringUtils.isNotNull(query.getStatus()), TbField::getStatus, query.getStatus())
+                .eq(StringUtils.isNotNull(query.getFieldType()), TbField::getFieldType, query.getFieldType())
+                .orderByDesc(TbField::getCreateTime)
+                .page(new Page<>(query.getPageNum(), query.getPageSize()));
+        if (CollUtils.isEmpty(page.getRecords())) {
+            return PageDTO.empty(page);
+        }
+        return PageDTO.of(page, FieldVO.class);
+    }
+
+    @Override
+    public List<String> influencedData(Integer id) {
+        List<TbBasicDataConfig> list = tbBasicDataConfigService.lambdaQuery().eq(TbBasicDataConfig::getFieldId, id).list();
+        if (CollUtils.isEmpty(list)) {
+            return CollUtils.emptyList();
+        }
+        return list.stream().map(TbBasicDataConfig::getTypeName).collect(Collectors.toList());
+    }
+
+    public static void main(String[] args) {
+        String string = "蓝色_10,红色_20,绿色_30";
+        String[] split = string.split(",");
+        for (String s : split) {
+            String[] split1 = s.split("_");
+            System.out.println(split1[1]);
+        }
+        //百分比1_百分比2:得分
+        String string1 = "10_20:50,20_30:50,30_40:60";
+        CalculateDTO calculateDTO = new CalculateDTO();
+        calculateDTO.setKey("10_20");
+        calculateDTO.setValue("20");
+        CalculateDTO calculateDTO1 = new CalculateDTO();
+        calculateDTO1.setKey("20_30");
+        calculateDTO1.setValue("30");
+        List<CalculateDTO> list = new ArrayList<>();
+        list.add(calculateDTO);
+        list.add(calculateDTO1);
+        JSONArray objects = new JSONArray(list);
+        String jsonString = objects.toJSONString(2);
+        System.err.println(jsonString);
+    }
 }
+@Data
+class CalculateDTO{
+    private String key;
+    private String value;
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldCategoryVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldCategoryVO.java
index 9a11378..de1b381 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldCategoryVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldCategoryVO.java
@@ -14,7 +14,7 @@
     @ApiModelProperty(value = "分类id")
     private Integer id;
 
-    @ApiModelProperty(value = "状态(0=隐藏 1=显示)")
+    @ApiModelProperty(value = "状态(0=展示 1=隐藏)")
     private Integer status;
 
     @ApiModelProperty(value = "分类名称")
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
new file mode 100644
index 0000000..3a59c0c
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/FieldVO.java
@@ -0,0 +1,62 @@
+package com.ruoyi.system.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author mitao
+ * @date 2024/3/15
+ */
+@Data
+@ApiModel(value="字段视图对象")
+public class FieldVO {
+
+    @ApiModelProperty(value = "字段id")
+    private Integer id;
+
+    @ApiModelProperty(value = "字段名")
+    private String fieldName;
+
+    @ApiModelProperty(value = "字段类型(1=数字 2=文本 3=百分比)")
+    private Integer 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 Integer 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;
+}
diff --git a/ruoyi-system/src/main/resources/mapper/system/TbBasicDataConfigMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TbBasicDataConfigMapper.xml
index bd1bb9b..d314d95 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TbBasicDataConfigMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TbBasicDataConfigMapper.xml
@@ -8,8 +8,10 @@
         <result column="basic_data_category_id" property="basicDataCategoryId" />
         <result column="type_name" property="typeName" />
         <result column="field_description" property="fieldDescription" />
-        <result column="caculate_type" property="caculateType" />
-        <result column="caculate_formula" property="caculateFormula" />
+        <result column="calculate_type" property="calculateType" />
+        <result column="calculate_formula" property="calculateFormula" />
+        <result column="status" property="status" />
+        <result column="field_id" property="fieldId" />
         <result column="del_flag" property="delFlag" />
         <result column="create_by" property="createBy" />
         <result column="create_time" property="createTime" />
diff --git a/ruoyi-system/src/main/resources/mapper/system/TbFieldMapper.xml b/ruoyi-system/src/main/resources/mapper/system/TbFieldMapper.xml
index ea271cc..812b343 100644
--- a/ruoyi-system/src/main/resources/mapper/system/TbFieldMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/TbFieldMapper.xml
@@ -10,7 +10,7 @@
         <result column="level_one_category" property="levelOneCategory" />
         <result column="level_two_category" property="levelTwoCategory" />
         <result column="level_three_category" property="levelThreeCategory" />
-        <result column="hidden" property="hidden" />
+        <result column="status" property="status" />
         <result column="num_min" property="numMin" />
         <result column="num_max" property="numMax" />
         <result column="text_input_type" property="textInputType" />

--
Gitblit v1.7.1