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 | 330 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 295 insertions(+), 35 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 8555a6f..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,34 +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.concurrent.CompletableFuture; -import java.util.stream.Collectors; /** * <p> @@ -41,20 +66,27 @@ @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 RuntimeException("输入类型不能为空"); - } else if (FieldInputTypeEnum.FIXED_CONTENT.getCode().equals(dto.getTextInputType()) && StringUtils.isBlank(dto.getTextContent())) { - throw new RuntimeException("内容设置不能为空"); + throw new ServiceException("输入类型不能为空"); + } else if (FieldInputTypeEnum.FIXED_CONTENT.equals(dto.getTextInputType()) + && StringUtils.isBlank(dto.getTextContent())) { + throw new ServiceException("内容设置不能为空"); } } TbField tbField = BeanUtils.copyBean(dto, TbField.class); @@ -65,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); @@ -73,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 RuntimeException("非法参数"); + 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 @@ -97,47 +133,271 @@ } 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 List<String> influencedData(Integer id) { - //List<TbBasicDataConfig> list = tbBasicDataConfigService.lambdaQuery().like(TbBasicDataConfig::getFieldIdStr, id).list(); - List<TbBasicDataConfig> list = tbBasicDataConfigService.lambdaQuery().eq(TbBasicDataConfig::getStatus, ShowStatusEnum.SHOW.getCode()).list(); - if (CollUtils.isEmpty(list)) { - return CollUtils.emptyList(); + 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<String> collect = list.stream().map(config -> { + 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 ""; + } + String collect = list.stream().map(config -> { String fieldIdStr = config.getFieldIdStr(); String[] split = fieldIdStr.split(","); //字符串数组转为List - List<String> idList = new ArrayList<>(Arrays.asList(split)); + List<String> idList = Arrays.asList(split); if (idList.contains(id.toString())) { return config.getTypeName(); } return null; - }).collect(Collectors.toList()); - if (CollUtils.isEmpty(collect)) { - return CollUtils.emptyList(); + }).filter(Objects::nonNull).collect(Collectors.joining(",")); + if (StringUtils.isBlank(collect)) { + return ""; } return collect; } + + @Override + public void editField(FieldUpdateDTO dto) { + TbField field = this.getById(dto.getId()); + if (Objects.isNull(field)) { + throw new ServiceException("参数异常"); + } + TbField tbField = BeanUtils.copyBean(dto, TbField.class); + this.updateById(tbField); + } + + @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