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