mitao
2024-04-09 ec76c5defdd8018ce4efcc8795508498a84de4b7
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);
@@ -84,13 +111,16 @@
            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();
        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,14 +202,19 @@
        }
        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 ->{
        basicDataFields.stream().filter(item -> item.getFieldId() == -1).findFirst()
                .ifPresent(item -> {
            FieldsTreeVO fieldsTreeVO = new FieldsTreeVO();
            fieldsTreeVO.setId(item.getFieldId());
            fieldsTreeVO.setName("转移支付规模");
@@ -179,7 +222,8 @@
            fieldsTreeVO.setCategory(Boolean.FALSE);
            root.add(fieldsTreeVO);
        });
        basicDataFields.stream().filter(item -> item.getFieldId()==-2).findFirst().ifPresent(item ->{
        basicDataFields.stream().filter(item -> item.getFieldId() == -2).findFirst()
                .ifPresent(item -> {
            FieldsTreeVO fieldsTreeVO = new FieldsTreeVO();
            fieldsTreeVO.setId(item.getFieldId());
            fieldsTreeVO.setName("当期GDP");
@@ -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;
    }
}