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;
|
|
/**
|
* <p>
|
* 字段表 服务实现类
|
* </p>
|
*
|
* @author mitao
|
* @since 2024-03-13
|
*/
|
@Slf4j
|
@Service
|
@RequiredArgsConstructor
|
public class TbFieldServiceImpl extends ServiceImpl<TbFieldMapper, TbField> 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<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();
|
String[] split = fieldIdStr.split(",");
|
// 字符串数组转为List
|
List<String> 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<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())
|
.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<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 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())
|
.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<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(String type) {
|
FieldTypeEnum fieldTypeEnum;
|
try {
|
fieldTypeEnum = FieldTypeEnum.getEnumByDesc(type);
|
} catch (IllegalArgumentException e) {
|
throw new ServiceException("非法参数");
|
}
|
List<TbField> list = this.list(
|
Wrappers.<TbField>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<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 = 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<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;
|
}
|
}
|