From a7a8a50f48c1bff5ddc52b3bad1782328f8043d8 Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期五, 12 四月 2024 18:50:20 +0800
Subject: [PATCH] 基础数据配置接口修改

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbFieldServiceImpl.java |  300 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 274 insertions(+), 26 deletions(-)

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 9c64edf..35b6d48 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,37 +1,59 @@
 package com.ruoyi.system.service.impl;
 
+import com.alibaba.excel.EasyExcel;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Lists;
 import com.ruoyi.common.basic.PageDTO;
+import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.enums.FieldInputTypeEnum;
 import com.ruoyi.common.enums.FieldTypeEnum;
 import com.ruoyi.common.enums.ShowStatusEnum;
+import com.ruoyi.common.enums.UserTypeEnum;
 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.common.utils.EasyExcelUtil;
+import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.domain.TbBasicData;
 import com.ruoyi.system.domain.TbBasicDataConfig;
+import com.ruoyi.system.domain.TbBasicDataField;
 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.dto.update.FieldUpdateDTO;
+import com.ruoyi.system.handler.CustomerHandler;
+import com.ruoyi.system.handler.SelectedSheetWriteHandler;
+import com.ruoyi.system.mapper.TbBasicDataMapper;
 import com.ruoyi.system.mapper.TbFieldMapper;
 import com.ruoyi.system.query.FieldQuery;
+import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.system.service.TbBasicDataConfigService;
+import com.ruoyi.system.service.TbBasicDataFieldService;
 import com.ruoyi.system.service.TbFieldCategoryService;
 import com.ruoyi.system.service.TbFieldService;
+import com.ruoyi.system.utils.FieldBuildUtil;
+import com.ruoyi.system.vo.BasicDataFieldVO;
 import com.ruoyi.system.vo.FieldVO;
+import com.ruoyi.system.vo.FieldsTreeVO;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+import java.util.stream.Collectors;
+import javax.servlet.http.HttpServletResponse;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
-
-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;
 
 /**
  * <p>
@@ -44,19 +66,26 @@
 @Slf4j
 @Service
 @RequiredArgsConstructor
-public class TbFieldServiceImpl extends ServiceImpl<TbFieldMapper, TbField> implements TbFieldService {
+public class TbFieldServiceImpl extends ServiceImpl<TbFieldMapper, TbField> implements
+        TbFieldService {
+
     private final TbFieldCategoryService tbFieldCategoryService;
     private final TbBasicDataConfigService tbBasicDataConfigService;
+    private final TbBasicDataMapper tbBasicDataMapper;
+    private final TbBasicDataFieldService tbBasicDataFieldService;
+    private final HttpServletResponse response;
+    private final ISysUserService sysUserService;
 
     @Override
     public void add(FieldDTO dto) {
         //参数校验
-        Integer fieldType = dto.getFieldType();
+        FieldTypeEnum fieldType = dto.getFieldType();
         //1:数字 2:文本 3:百分比
-        if (FieldTypeEnum.TEXT.getCode().equals(fieldType)) {
+        if (FieldTypeEnum.TEXT.equals(fieldType)) {
             if (StringUtils.isNull(dto.getTextInputType())) {
                 throw new ServiceException("输入类型不能为空");
-            } else if (FieldInputTypeEnum.FIXED_CONTENT.getCode().equals(dto.getTextInputType()) && StringUtils.isBlank(dto.getTextContent())) {
+            } else if (FieldInputTypeEnum.FIXED_CONTENT.equals(dto.getTextInputType())
+                    && StringUtils.isBlank(dto.getTextContent())) {
                 throw new ServiceException("内容设置不能为空");
             }
         }
@@ -68,7 +97,8 @@
             tbField.setLevelTwoCategory(category2.getFieldCategoryName());
         }
         if (StringUtils.isNotNull(dto.getLevelThreeCategoryId())) {
-            TbFieldCategory category3 = tbFieldCategoryService.getById(dto.getLevelThreeCategoryId());
+            TbFieldCategory category3 = tbFieldCategoryService.getById(
+                    dto.getLevelThreeCategoryId());
             tbField.setLevelThreeCategory(category3.getFieldCategoryName());
         }
         this.save(tbField);
@@ -76,21 +106,24 @@
 
     @Override
     public void showHide(ShowHideDTO dto) {
-        log.info("======主线程执行showHide{}",Thread.currentThread().getName() );
+        log.info("======主线程执行showHide{}", Thread.currentThread().getName());
         TbField field = this.getById(dto.getId());
         if (StringUtils.isNull(field)) {
             throw new ServiceException("非法参数");
         }
         //隐藏字段
-        this.lambdaUpdate().set(TbField::getStatus, dto.getStatus()).eq(TbField::getId, dto.getId()).update();
+        this.lambdaUpdate().set(TbField::getStatus, dto.getStatus()).eq(TbField::getId, dto.getId())
+                .update();
         //异步隐藏基础数据配置
         CompletableFuture.runAsync(() -> handleDataConfig(dto, field));
     }
+
     private void handleDataConfig(ShowHideDTO dto, TbField field) {
-        log.info("======子线程执行handleDataConfig{}",Thread.currentThread().getName() );
-        List<TbBasicDataConfig> list = tbBasicDataConfigService.lambdaQuery().eq(TbBasicDataConfig::getStatus, ShowStatusEnum.SHOW.getCode()).list();
+        log.info("======子线程执行handleDataConfig{}", Thread.currentThread().getName());
+        List<TbBasicDataConfig> list = tbBasicDataConfigService.lambdaQuery()
+                .eq(TbBasicDataConfig::getStatus, ShowStatusEnum.SHOW.getCode()).list();
         if (CollUtils.isNotEmpty(list)) {
-            List<Integer> ids = list.stream().map(config -> {
+            List<Long> ids = list.stream().map(config -> {
                 String fieldIdStr = config.getFieldIdStr();
                 String[] split = fieldIdStr.split(",");
                 //字符串数组转为List
@@ -100,30 +133,87 @@
                 }
                 return null;
             }).collect(Collectors.toList());
-            tbBasicDataConfigService.lambdaUpdate().set(TbBasicDataConfig::getStatus, dto.getStatus()).in(TbBasicDataConfig::getId, ids).update();
+            tbBasicDataConfigService.lambdaUpdate()
+                    .set(TbBasicDataConfig::getStatus, dto.getStatus())
+                    .in(TbBasicDataConfig::getId, ids).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())
+                .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())
+                .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);
         }
+        List<TbField> collect = page.getRecords().stream().peek(item -> {
+            if (StringUtils.isBlank(item.getLevelTwoCategory())) {
+                item.setLevelTwoCategory("无");
+                item.setLevelThreeCategory("无");
+            } else {
+                item.setLevelThreeCategory("无");
+            }
+        }).collect(Collectors.toList());
+        page.setRecords(collect);
         return PageDTO.of(page, FieldVO.class);
     }
 
     @Override
-    public String influencedData(Integer id) {
-        List<TbBasicDataConfig> list = tbBasicDataConfigService.lambdaQuery().eq(TbBasicDataConfig::getStatus, ShowStatusEnum.SHOW).list();
+    public PageDTO<FieldVO> queryShowPage(FieldQuery query) {
+        Page<TbField> page = this.lambdaQuery()
+                .select(TbField::getId, TbField::getFieldName, TbField::getLevelOneCategory,
+                        TbField::getLevelTwoCategory, TbField::getLevelThreeCategory)
+                .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(TbField::getStatus, ShowStatusEnum.SHOW)
+                .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);
+        }
+        List<TbField> collect = page.getRecords().stream().peek(item -> {
+            if (StringUtils.isBlank(item.getLevelTwoCategory())) {
+                item.setLevelTwoCategory("无");
+                item.setLevelThreeCategory("无");
+            } else {
+                item.setLevelThreeCategory("无");
+            }
+        }).collect(Collectors.toList());
+        page.setRecords(collect);
+        return PageDTO.of(page, FieldVO.class);
+    }
+
+    @Override
+    public List<FieldVO> listFields() {
+        List<TbField> list = this.list(
+                Wrappers.<TbField>lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW));
+        return BeanUtils.copyList(list, FieldVO.class);
+    }
+
+    @Override
+    public String influencedData(Long id) {
+        List<TbBasicDataConfig> list = tbBasicDataConfigService.lambdaQuery()
+                .eq(TbBasicDataConfig::getStatus, ShowStatusEnum.SHOW).list();
         if (CollUtils.isEmpty(list)) {
             return "";
         }
@@ -144,7 +234,7 @@
     }
 
     @Override
-    public void update(FieldUpdateDTO dto) {
+    public void editField(FieldUpdateDTO dto) {
         TbField field = this.getById(dto.getId());
         if (Objects.isNull(field)) {
             throw new ServiceException("参数异常");
@@ -152,4 +242,162 @@
         TbField tbField = BeanUtils.copyBean(dto, TbField.class);
         this.updateById(tbField);
     }
+
+    @Override
+    public BasicDataFieldVO getHistoryFields(Long id) {
+        // 从数据库中获取基本数据
+        TbBasicData basicData = tbBasicDataMapper.selectById(id);
+        if (Objects.isNull(basicData)) {
+            throw new ServiceException("非法参数");
+        }
+        BasicDataFieldVO vo = BeanUtils.copyBean(basicData, BasicDataFieldVO.class);
+        // 查询动态字段
+        List<TbBasicDataField> basicDataFields = tbBasicDataFieldService.lambdaQuery()
+                .eq(TbBasicDataField::getBasicDataId, basicData.getId()).list();
+        // 获取所有字段ID
+        Set<Long> fieldIds = basicDataFields.stream().map(TbBasicDataField::getFieldId)
+                .collect(Collectors.toSet());
+        // 根据字段ID查询字段信息并构建字段ID到字段对象的映射
+        Map<Long, TbField> fieldMap = this.lambdaQuery()
+                .in(!fieldIds.isEmpty(), TbField::getId, fieldIds).list().stream()
+                .collect(Collectors.toMap(TbField::getId, e -> e));
+        // 根节点
+        List<FieldsTreeVO> root = new ArrayList<>();
+        basicDataFields.stream().filter(item -> item.getFieldId() == -1).findFirst()
+                .ifPresent(item -> {
+                    FieldsTreeVO fieldsTreeVO = new FieldsTreeVO();
+                    fieldsTreeVO.setId(item.getFieldId());
+                    fieldsTreeVO.setName("转移支付规模");
+                    fieldsTreeVO.setValue(item.getFieldValue());
+                    fieldsTreeVO.setCategory(Boolean.FALSE);
+                    root.add(fieldsTreeVO);
+                });
+        basicDataFields.stream().filter(item -> item.getFieldId() == -2).findFirst()
+                .ifPresent(item -> {
+                    FieldsTreeVO fieldsTreeVO = new FieldsTreeVO();
+                    fieldsTreeVO.setId(item.getFieldId());
+                    fieldsTreeVO.setName("当期GDP");
+                    fieldsTreeVO.setValue(item.getFieldValue());
+                    fieldsTreeVO.setCategory(Boolean.FALSE);
+                    root.add(fieldsTreeVO);
+                });
+        FieldBuildUtil.buildTreeStructure(basicDataFields, fieldMap, root);
+        FieldsTreeVO fieldsTreeVO = new FieldsTreeVO();
+        fieldsTreeVO.setId(-3L);
+        fieldsTreeVO.setName("备注");
+        fieldsTreeVO.setValue(vo.getRemark());
+        fieldsTreeVO.setCategory(Boolean.FALSE);
+        root.add(fieldsTreeVO);
+        vo.setFields(root);
+        return vo;
+    }
+
+    @Override
+    public void downloadImportTemplate() throws Exception {
+        response.setContentType("application/vnd.ms-excel");
+        response.setCharacterEncoding("utf-8");
+        String fileName = "地方财政运行及“三保”情况统计表";
+        response.setHeader(
+                "Content-disposition",
+                "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");
+        SysUser user = SecurityUtils.getLoginUser().getUser();
+        // 查询需要填写的动态字段
+        List<TbField> list =
+                this.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list();
+        List<List<String>> head = head(list);
+        List<TbField> collect =
+                list.stream()
+                        .filter(item -> FieldTypeEnum.TEXT.equals(item.getFieldType()))
+                        .filter(item -> FieldInputTypeEnum.FIXED_CONTENT.equals(
+                                item.getTextInputType()))
+                        .collect(Collectors.toList());
+        Map<Integer, String[]> selectedMap = new HashMap<>();
+        if (CollUtils.isNotEmpty(collect)) {
+            selectedMap = new HashMap<>();
+            for (TbField tbField : collect) {
+                int outerListIndex = getOuterListIndex(head, tbField.getFieldName());
+                String[] selectStr = tbField.getTextContent().split(",");
+                selectedMap.put(outerListIndex, selectStr);
+            }
+        }
+        boolean isPlatform = UserTypeEnum.PLATFORM.equals(user.getUserType());
+        //默认生成下拉框的行数为1
+        int rows = 1;
+        if (isPlatform) {
+            //查询所有的地区
+            List<SysUser> userList = sysUserService.lambdaQuery()
+                    .eq(SysUser::getUserType, UserTypeEnum.DEPARTMENT).list();
+            String[] userNameArr = userList.stream().map(SysUser::getAreaName)
+                    .toArray(String[]::new);
+            selectedMap.put(0, userNameArr);
+            //生成下拉框的行数为部门的数量
+            rows = userList.size();
+        }
+        // 这里需要设置不关闭流
+        EasyExcel.write(response.getOutputStream())
+                .head(head)
+                .autoCloseStream(Boolean.TRUE)
+                .sheet("模板")
+                .registerWriteHandler(new SelectedSheetWriteHandler(selectedMap, rows))
+                .registerWriteHandler(new CustomerHandler())
+                .registerWriteHandler(EasyExcelUtil.getStyleStrategy())
+                .doWrite(dataList(list, user));
+    }
+
+    /**
+     * 根据字段名获取该字段下标
+     *
+     * @param list  表头
+     * @param value 字段名
+     * @return 下标
+     */
+    public int getOuterListIndex(List<List<String>> list, String value) {
+        for (int i = 0; i < list.size(); i++) {
+            if (list.get(i).contains(value)) {
+                return i;
+            }
+        }
+        return -1; // 返回-1表示未找到
+    }
+
+    private List<List<Object>> dataList(List<TbField> list, SysUser user) throws Exception {
+        String areaName = "";
+        boolean isDept = UserTypeEnum.DEPARTMENT.equals(user.getUserType());
+        areaName = isDept ? user.getAreaName() : areaName;
+        List<List<Object>> excellist = new ArrayList<>();
+        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(areaName, isDept ? DateUtils.getNowQuarter() : ""));
+        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 -> {
+                    String levelOneCategory = item.getLevelOneCategory();
+                    String levelTwoCategory = item.getLevelTwoCategory();
+                    String levelThreeCategory = item.getLevelThreeCategory();
+                    String fieldName = item.getFieldName();
+                    headTitles.add(
+                            Lists.newArrayList(
+                                    levelOneCategory,
+                                    StringUtils.isBlank(levelTwoCategory) ? fieldName
+                                            : levelTwoCategory,
+                                    StringUtils.isBlank(levelThreeCategory) ? fieldName
+                                            : levelThreeCategory,
+                                    fieldName));
+                });
+        headTitles.add(Lists.newArrayList("备注"));
+        return headTitles;
+    }
 }
\ No newline at end of file

--
Gitblit v1.7.1