From ec76c5defdd8018ce4efcc8795508498a84de4b7 Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期二, 09 四月 2024 19:09:33 +0800
Subject: [PATCH] 平台历史数据 导入导出接口

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TbFieldServiceImpl.java |  229 +++++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 191 insertions(+), 38 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 4534eac..e485974 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,22 +1,36 @@
 package com.ruoyi.system.service.impl;
 
+import com.alibaba.excel.EasyExcel;
 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.*;
+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;
@@ -25,13 +39,20 @@
 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.*;
-import java.util.concurrent.CompletableFuture;
-import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -44,11 +65,15 @@
 @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) {
@@ -58,7 +83,8 @@
         if (FieldTypeEnum.TEXT.equals(fieldType)) {
             if (StringUtils.isNull(dto.getTextInputType())) {
                 throw new ServiceException("输入类型不能为空");
-            } else if (FieldInputTypeEnum.FIXED_CONTENT.equals(dto.getTextInputType()) && StringUtils.isBlank(dto.getTextContent())) {
+            } else if (FieldInputTypeEnum.FIXED_CONTENT.equals(dto.getTextInputType())
+                    && StringUtils.isBlank(dto.getTextContent())) {
                 throw new ServiceException("内容设置不能为空");
             }
         }
@@ -70,7 +96,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);
@@ -78,19 +105,22 @@
 
     @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<Long> ids = list.stream().map(config -> {
                 String fieldIdStr = config.getFieldIdStr();
@@ -102,19 +132,26 @@
                 }
                 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())) {
@@ -125,7 +162,8 @@
 
     @Override
     public String influencedData(Long id) {
-        List<TbBasicDataConfig> list = tbBasicDataConfigService.lambdaQuery().eq(TbBasicDataConfig::getStatus, ShowStatusEnum.SHOW).list();
+        List<TbBasicDataConfig> list = tbBasicDataConfigService.lambdaQuery()
+                .eq(TbBasicDataConfig::getStatus, ShowStatusEnum.SHOW).list();
         if (CollUtils.isEmpty(list)) {
             return "";
         }
@@ -164,29 +202,35 @@
         }
         BasicDataFieldVO vo = BeanUtils.copyBean(basicData, BasicDataFieldVO.class);
         // 查询动态字段
-        List<TbBasicDataField> basicDataFields = tbBasicDataFieldService.lambdaQuery().eq(TbBasicDataField::getBasicDataId, basicData.getId()).list();
+        List<TbBasicDataField> basicDataFields = tbBasicDataFieldService.lambdaQuery()
+                .eq(TbBasicDataField::getBasicDataId, basicData.getId()).list();
         // 获取所有字段ID
-        Set<Long> fieldIds = basicDataFields.stream().map(TbBasicDataField::getFieldId).collect(Collectors.toSet());
+        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));
+        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);
-        });
+        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);
@@ -197,4 +241,113 @@
         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