package com.finance.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.finance.common.basic.PageDTO; import com.finance.common.core.domain.entity.SysUser; import com.finance.common.enums.FieldInputTypeEnum; import com.finance.common.enums.FieldTypeEnum; import com.finance.common.enums.ShowStatusEnum; import com.finance.common.enums.UserTypeEnum; import com.finance.common.exception.ServiceException; import com.finance.common.utils.BeanUtils; import com.finance.common.utils.CollUtils; import com.finance.common.utils.DateUtils; import com.finance.common.utils.EasyExcelUtil; import com.finance.common.utils.SecurityUtils; import com.finance.common.utils.StringUtils; import com.finance.system.domain.TbBasicData; import com.finance.system.domain.TbBasicDataConfig; import com.finance.system.domain.TbBasicDataField; import com.finance.system.domain.TbField; import com.finance.system.domain.TbFieldCategory; import com.finance.system.dto.FieldDTO; import com.finance.system.dto.ShowHideDTO; import com.finance.system.dto.update.FieldUpdateDTO; import com.finance.system.handler.CustomerHandler; import com.finance.system.handler.SelectedSheetWriteHandler; import com.finance.system.mapper.TbBasicDataMapper; import com.finance.system.mapper.TbFieldCategoryMapper; import com.finance.system.mapper.TbFieldMapper; import com.finance.system.query.FieldQuery; import com.finance.system.service.ISysUserService; import com.finance.system.service.TbBasicDataConfigService; import com.finance.system.service.TbBasicDataFieldService; import com.finance.system.service.TbFieldService; import com.finance.system.utils.FieldBuildUtil; import com.finance.system.vo.BasicDataFieldVO; import com.finance.system.vo.FieldVO; import com.finance.system.vo.FieldsTreeVO; import com.google.common.collect.Lists; 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; /** *

* 字段表 服务实现类 *

* * @author mitao * @since 2024-03-13 */ @Slf4j @Service @RequiredArgsConstructor public class TbFieldServiceImpl extends ServiceImpl implements TbFieldService { private final TbFieldCategoryMapper tbFieldCategoryMapper; 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) { // 参数校验 FieldTypeEnum fieldType = dto.getFieldType(); // 1:数字 2:文本 3:百分比 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())) { throw new ServiceException("内容设置不能为空"); } } TbField tbField = BeanUtils.copyBean(dto, TbField.class); TbFieldCategory category1 = tbFieldCategoryMapper.selectById(dto.getLevelOneCategoryId()); tbField.setLevelOneCategory(category1.getFieldCategoryName()); if (StringUtils.isNotNull(dto.getLevelTwoCategoryId())) { TbFieldCategory category2 = tbFieldCategoryMapper.selectById( dto.getLevelTwoCategoryId()); tbField.setLevelTwoCategory(category2.getFieldCategoryName()); } if (StringUtils.isNotNull(dto.getLevelThreeCategoryId())) { TbFieldCategory category3 = tbFieldCategoryMapper.selectById( dto.getLevelThreeCategoryId()); tbField.setLevelThreeCategory(category3.getFieldCategoryName()); } this.save(tbField); } @Override public void showHide(ShowHideDTO dto) { 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(); // 异步隐藏基础数据配置 CompletableFuture.runAsync(() -> handleDataConfig(dto, field)); } private void handleDataConfig(ShowHideDTO dto, TbField field) { log.info("======子线程执行handleDataConfig{}", Thread.currentThread().getName()); List list = tbBasicDataConfigService.lambdaQuery() .eq(TbBasicDataConfig::getStatus, ShowStatusEnum.SHOW.getCode()).list(); if (CollUtils.isNotEmpty(list)) { List ids = list.stream().map(config -> { String fieldIdStr = config.getFieldIdStr(); String[] split = fieldIdStr.split(","); // 字符串数组转为List List idList = new ArrayList<>(Arrays.asList(split)); if (idList.contains(field.getId().toString())) { return config.getId(); } return null; }).collect(Collectors.toList()); tbBasicDataConfigService.lambdaUpdate() .set(TbBasicDataConfig::getStatus, dto.getStatus()) .in(TbBasicDataConfig::getId, ids).update(); } } @Override public PageDTO queryPage(FieldQuery query) { Page 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); } List 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 PageDTO queryShowPage(FieldQuery query) { Page 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()) .eq(TbField::getFieldType, FieldTypeEnum.NUMBER) .orderByDesc(TbField::getCreateTime) .page(new Page<>(query.getPageNum(), query.getPageSize())); if (CollUtils.isEmpty(page.getRecords())) { return PageDTO.empty(page); } List 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 listFields(String type) { FieldTypeEnum fieldTypeEnum; try { fieldTypeEnum = FieldTypeEnum.getEnumByDesc(type); } catch (IllegalArgumentException e) { throw new ServiceException("非法参数"); } List list = this.list( Wrappers.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW) .eq(Objects.nonNull(fieldTypeEnum), TbField::getFieldType, fieldTypeEnum)); return BeanUtils.copyList(list, FieldVO.class); } @Override public String influencedData(Long id) { List 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 idList = Arrays.asList(split); if (idList.contains(id.toString())) { return config.getTypeName(); } return null; }).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 basicDataFields = tbBasicDataFieldService.lambdaQuery() .eq(TbBasicDataField::getBasicDataId, basicData.getId()).list(); // 获取所有字段ID Set fieldIds = basicDataFields.stream().map(TbBasicDataField::getFieldId) .collect(Collectors.toSet()); // 根据字段ID查询字段信息并构建字段ID到字段对象的映射 Map fieldMap = this.lambdaQuery() .in(!fieldIds.isEmpty(), TbField::getId, fieldIds).list().stream() .collect(Collectors.toMap(TbField::getId, e -> e)); // 根节点 List 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 list = this.lambdaQuery().eq(TbField::getStatus, ShowStatusEnum.SHOW).list(); List> head = head(list); List collect = list.stream() .filter(item -> FieldTypeEnum.TEXT.equals(item.getFieldType())) .filter(item -> FieldInputTypeEnum.FIXED_CONTENT.equals( item.getTextInputType())) .collect(Collectors.toList()); Map selectedMap = new HashMap<>(); if (CollUtils.isNotEmpty(collect)) { 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 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 value) { for (int i = 0; i < list.size(); i++) { if (list.get(i).contains(value)) { return i; } } return -1; // 返回-1表示未找到 } private List> dataList(List list, SysUser user) throws Exception { String areaName = ""; boolean isDept = UserTypeEnum.DEPARTMENT.equals(user.getUserType()); areaName = isDept ? user.getAreaName() : areaName; List> excellist = new ArrayList<>(); List> head = head(list); List 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 ? "2024年一季度" : "")); excellist.add(Lists.newArrayList(areaName, isDept ? DateUtils.getPreviousQuarter() : "")); return excellist; } private List> head(List list) { List> 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; } }