|
@@ -1,10 +1,12 @@
|
|
package com.ruoyi.ams.bionutrition.doc.service.impl;
|
|
package com.ruoyi.ams.bionutrition.doc.service.impl;
|
|
|
|
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
import cn.hutool.core.bean.BeanUtil;
|
|
|
|
+import cn.hutool.core.collection.CollUtil;
|
|
import cn.hutool.core.collection.CollectionUtil;
|
|
import cn.hutool.core.collection.CollectionUtil;
|
|
import cn.hutool.core.lang.Assert;
|
|
import cn.hutool.core.lang.Assert;
|
|
import cn.hutool.core.util.ArrayUtil;
|
|
import cn.hutool.core.util.ArrayUtil;
|
|
import cn.hutool.core.util.NumberUtil;
|
|
import cn.hutool.core.util.NumberUtil;
|
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
@@ -25,11 +27,18 @@ import com.ruoyi.ams.bionutrition.doc.mapper.BionutritionDocHeaderMapper;
|
|
import com.ruoyi.ams.bionutrition.doc.service.BionutritionDocDetailsService;
|
|
import com.ruoyi.ams.bionutrition.doc.service.BionutritionDocDetailsService;
|
|
import com.ruoyi.ams.bionutrition.doc.service.BionutritionDocHeaderService;
|
|
import com.ruoyi.ams.bionutrition.doc.service.BionutritionDocHeaderService;
|
|
import com.ruoyi.ams.bionutrition.doc.util.BionutritionDocUtil;
|
|
import com.ruoyi.ams.bionutrition.doc.util.BionutritionDocUtil;
|
|
|
|
+import com.ruoyi.base.constant.Constant;
|
|
|
|
+import com.ruoyi.base.constant.type.BizEnum;
|
|
|
|
+import com.ruoyi.common.constant.base.EnumUtils;
|
|
import com.ruoyi.common.utils.ConvertUtils;
|
|
import com.ruoyi.common.utils.ConvertUtils;
|
|
import com.ruoyi.common.utils.PageUtil;
|
|
import com.ruoyi.common.utils.PageUtil;
|
|
import com.ruoyi.common.utils.StringUtils;
|
|
import com.ruoyi.common.utils.StringUtils;
|
|
|
|
+import com.ruoyi.framework.service.impl.BaseServiceImpl;
|
|
import com.ruoyi.framework.service.impl.CrudServiceImpl;
|
|
import com.ruoyi.framework.service.impl.CrudServiceImpl;
|
|
|
|
+import com.ruoyi.system.service.ISysConfigService;
|
|
|
|
+import com.ruoyi.system.service.impl.SysConfigServiceImpl;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
+import org.apache.poi.ss.usermodel.*;
|
|
import org.apache.poi.ss.util.CellRangeAddress;
|
|
import org.apache.poi.ss.util.CellRangeAddress;
|
|
import org.apache.poi.xssf.streaming.SXSSFCell;
|
|
import org.apache.poi.xssf.streaming.SXSSFCell;
|
|
import org.apache.poi.xssf.streaming.SXSSFRow;
|
|
import org.apache.poi.xssf.streaming.SXSSFRow;
|
|
@@ -42,11 +51,10 @@ import javax.servlet.http.HttpServletResponse;
|
|
import java.io.IOException;
|
|
import java.io.IOException;
|
|
import java.io.OutputStream;
|
|
import java.io.OutputStream;
|
|
import java.lang.reflect.Field;
|
|
import java.lang.reflect.Field;
|
|
|
|
+import java.lang.reflect.InvocationTargetException;
|
|
|
|
+import java.lang.reflect.Method;
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
-import java.util.ArrayList;
|
|
|
|
-import java.util.Arrays;
|
|
|
|
-import java.util.List;
|
|
|
|
-import java.util.Map;
|
|
|
|
|
|
+import java.util.*;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
@Service
|
|
@Service
|
|
@@ -55,20 +63,24 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
private BionutritionDocDetailsService bionutritionDocDetailsService;
|
|
private BionutritionDocDetailsService bionutritionDocDetailsService;
|
|
|
|
+ @Autowired
|
|
|
|
+ private ISysConfigService sysConfigService;
|
|
|
|
|
|
/**
|
|
/**
|
|
* 查询单据头分页数据
|
|
* 查询单据头分页数据
|
|
|
|
+ *
|
|
* @param docHeaderDTO
|
|
* @param docHeaderDTO
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
public PageInfo<BionutritionDocHeaderDTO> getDocHeaderPageInfo(BionutritionDocHeaderDTO docHeaderDTO) {
|
|
public PageInfo<BionutritionDocHeaderDTO> getDocHeaderPageInfo(BionutritionDocHeaderDTO docHeaderDTO) {
|
|
- Page<BionutritionDocHeader> docEntitiesPage = (Page<BionutritionDocHeader>)baseDao.selectDocs(BeanUtil.beanToMap(docHeaderDTO));
|
|
|
|
- return PageUtil.convert(docEntitiesPage, BionutritionDocHeaderDTO.class) ;
|
|
|
|
|
|
+ Page<BionutritionDocHeader> docEntitiesPage = (Page<BionutritionDocHeader>) baseDao.selectDocs(BeanUtil.beanToMap(docHeaderDTO));
|
|
|
|
+ return PageUtil.convert(docEntitiesPage, BionutritionDocHeaderDTO.class);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
* 根据单号查询单据头
|
|
* 根据单号查询单据头
|
|
|
|
+ *
|
|
* @param docNo
|
|
* @param docNo
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
@@ -79,6 +91,7 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
|
|
|
|
|
|
/**
|
|
/**
|
|
* 插入单据头
|
|
* 插入单据头
|
|
|
|
+ *
|
|
* @param docHeaderDTO
|
|
* @param docHeaderDTO
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
@@ -92,19 +105,21 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
|
|
|
|
|
|
/**
|
|
/**
|
|
* 修改单据头
|
|
* 修改单据头
|
|
|
|
+ *
|
|
* @param docHeaderDTO
|
|
* @param docHeaderDTO
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
public int updateDoc(BionutritionDocHeaderDTO docHeaderDTO) {
|
|
public int updateDoc(BionutritionDocHeaderDTO docHeaderDTO) {
|
|
UpdateWrapper<BionutritionDocHeader> updateWrapper = new UpdateWrapper<>();
|
|
UpdateWrapper<BionutritionDocHeader> updateWrapper = new UpdateWrapper<>();
|
|
- updateWrapper.lambda().eq(StringUtils.isNotBlank(docHeaderDTO.getId()),BionutritionDocHeader::getId, docHeaderDTO.getId());
|
|
|
|
|
|
+ updateWrapper.lambda().eq(StringUtils.isNotBlank(docHeaderDTO.getId()), BionutritionDocHeader::getId, docHeaderDTO.getId());
|
|
// .eq(StringUtils.isNotBlank(docHeaderDTO.getDocNo()), BionutritionDocHeader::getDocNo, docHeaderDTO.getDocNo());
|
|
// .eq(StringUtils.isNotBlank(docHeaderDTO.getDocNo()), BionutritionDocHeader::getDocNo, docHeaderDTO.getDocNo());
|
|
return baseDao.update(ConvertUtils.sourceToTarget(docHeaderDTO, BionutritionDocHeader.class), updateWrapper);
|
|
return baseDao.update(ConvertUtils.sourceToTarget(docHeaderDTO, BionutritionDocHeader.class), updateWrapper);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
* 根据id删除单据头
|
|
* 根据id删除单据头
|
|
|
|
+ *
|
|
* @param ids
|
|
* @param ids
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
@@ -123,6 +138,7 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
|
|
|
|
|
|
/**
|
|
/**
|
|
* 根据id获取单据数据
|
|
* 根据id获取单据数据
|
|
|
|
+ *
|
|
* @param ids
|
|
* @param ids
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
@@ -130,19 +146,19 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
|
|
public List<BionutritionDocBaseDTO> getDicListByIds(String[] ids) {
|
|
public List<BionutritionDocBaseDTO> getDicListByIds(String[] ids) {
|
|
List<BionutritionDocHeaderDTO> docHeaderDTOList = ArrayUtil.isNotEmpty(ids) ?
|
|
List<BionutritionDocHeaderDTO> docHeaderDTOList = ArrayUtil.isNotEmpty(ids) ?
|
|
getBionutritionDocHeaderDTOList(Arrays.asList(ids)) :
|
|
getBionutritionDocHeaderDTOList(Arrays.asList(ids)) :
|
|
- ConvertUtils.sourceToTarget(baseDao.selectList(Wrappers.emptyWrapper()),BionutritionDocHeaderDTO.class);
|
|
|
|
|
|
+ ConvertUtils.sourceToTarget(baseDao.selectList(Wrappers.emptyWrapper()), BionutritionDocHeaderDTO.class);
|
|
return buildBionutritionDocDifferentTypeList(docHeaderDTOList);
|
|
return buildBionutritionDocDifferentTypeList(docHeaderDTOList);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * 导出单据excel
|
|
|
|
- * @param response
|
|
|
|
|
|
+ * 单据导出excel
|
|
|
|
+ *
|
|
|
|
+ * @param response todo 单据单头中文
|
|
* @param docExcelQueryDTO
|
|
* @param docExcelQueryDTO
|
|
*/
|
|
*/
|
|
@Override
|
|
@Override
|
|
- public void exportExcel(HttpServletResponse response, DocExcelQueryDTO docExcelQueryDTO) {
|
|
|
|
- List<BionutritionDocBaseDTO> list = StringUtils.isNotBlank(docExcelQueryDTO.getDocType()) ?
|
|
|
|
- getDocList(docExcelQueryDTO) : getDicListByIds(docExcelQueryDTO.getIds());
|
|
|
|
|
|
+ public <E> void exportExcel(HttpServletResponse response, DocExcelQueryDTO docExcelQueryDTO) throws ClassNotFoundException {
|
|
|
|
+ List<BionutritionDocBaseDTO> list = getDocList(docExcelQueryDTO);
|
|
List<BionutritionDocBaseExcel> docBaseExcels = list.stream()
|
|
List<BionutritionDocBaseExcel> docBaseExcels = list.stream()
|
|
.map(item -> BionutritionDocUtil.buildBionutritionDocBaseExcel(item.getBionutritionDocHeaderBaseDTO().getDocType(), item))
|
|
.map(item -> BionutritionDocUtil.buildBionutritionDocBaseExcel(item.getBionutritionDocHeaderBaseDTO().getDocType(), item))
|
|
.collect(Collectors.toList());
|
|
.collect(Collectors.toList());
|
|
@@ -150,98 +166,261 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
|
|
// 创建工作簿对象
|
|
// 创建工作簿对象
|
|
SXSSFWorkbook workbook = new SXSSFWorkbook();
|
|
SXSSFWorkbook workbook = new SXSSFWorkbook();
|
|
SXSSFSheet sheet = workbook.createSheet();
|
|
SXSSFSheet sheet = workbook.createSheet();
|
|
|
|
+
|
|
|
|
+ // 设置单元格样式
|
|
|
|
+ CellStyle cellStyle = workbook.createCellStyle();
|
|
|
|
+ // 上下左右居中
|
|
|
|
+ cellStyle.setAlignment(HorizontalAlignment.CENTER);
|
|
|
|
+ cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
|
|
|
|
+
|
|
Integer startRow = 0;
|
|
Integer startRow = 0;
|
|
// 总列数
|
|
// 总列数
|
|
Integer collLength = 0;
|
|
Integer collLength = 0;
|
|
- //是同一类型的单据
|
|
|
|
- if (StringUtils.isNotBlank(docExcelQueryDTO.getDocType())){
|
|
|
|
-
|
|
|
|
- BionutritionDocBaseExcel bionutritionDocBaseExcel = docBaseExcels.get(0);
|
|
|
|
- Class<? extends BionutritionDocHeaderBaseExcel> aClass = bionutritionDocBaseExcel.getBionutritionDocHeaderBaseExcelDTO().getClass();
|
|
|
|
- Field[] headerSonFields = aClass.getDeclaredFields();
|
|
|
|
- Field[] headerFatherFields = aClass.getSuperclass().getDeclaredFields();
|
|
|
|
- //1.设置列数,长度为单头和明细的字段数和
|
|
|
|
- // 单头字段数
|
|
|
|
- collLength = headerSonFields.length + headerFatherFields.length;
|
|
|
|
- log.info("=====单头字段长度:{}",collLength);
|
|
|
|
-
|
|
|
|
- List<BionutritionDocDetailsBaseExcel> detailsBaseExcelList = bionutritionDocBaseExcel.getBionutritionDocDetailsBaseExcelList();
|
|
|
|
- Class<? extends BionutritionDocDetailsBaseExcel> bClass = detailsBaseExcelList.get(0).getClass();
|
|
|
|
- Field[] detailSonField = bClass.getDeclaredFields();
|
|
|
|
- Field[] detailFatherFields = bClass.getSuperclass().getDeclaredFields();
|
|
|
|
- // 加上明细字段数
|
|
|
|
- collLength = collLength + detailSonField.length +detailFatherFields.length;
|
|
|
|
-
|
|
|
|
- // 获取所有字段
|
|
|
|
- Field[] totalFields = new Field[collLength];
|
|
|
|
- System.arraycopy(headerSonFields,0,totalFields,0,headerSonFields.length);
|
|
|
|
- System.arraycopy(headerFatherFields,0,totalFields,headerSonFields.length,headerFatherFields.length);
|
|
|
|
- System.arraycopy(detailSonField,0,totalFields,headerSonFields.length + headerFatherFields.length,detailSonField.length);
|
|
|
|
- System.arraycopy(detailFatherFields,0,totalFields,headerSonFields.length + headerFatherFields.length + detailSonField.length,detailFatherFields.length);
|
|
|
|
- log.info("==所有字段:{}",totalFields);
|
|
|
|
-
|
|
|
|
- //2.创建第一行标题
|
|
|
|
- SXSSFRow row0 = sheet.createRow(0);
|
|
|
|
- SXSSFCell cell1 = row0.createCell(0);
|
|
|
|
- cell1.setCellValue("单头");
|
|
|
|
- SXSSFCell cell2 = row0.createCell(headerSonFields.length + headerFatherFields.length+1);
|
|
|
|
- cell2.setCellValue("明细");
|
|
|
|
- // ‘单头’标题所占的列合并
|
|
|
|
- sheet.addMergedRegion(new CellRangeAddress(0,0,0,headerSonFields.length + headerFatherFields.length));
|
|
|
|
- // ‘明细’标题所占的列合并
|
|
|
|
- sheet.addMergedRegion(new CellRangeAddress(0,0,headerSonFields.length + headerFatherFields.length+1,collLength));
|
|
|
|
-
|
|
|
|
- //3.创建第二行标题
|
|
|
|
- SXSSFRow row1 = sheet.createRow(1);
|
|
|
|
- for (int i = 0; i < collLength; i++) {
|
|
|
|
- SXSSFCell cell = row1.createCell(i);
|
|
|
|
- cell.setCellValue(totalFields[i].getName());
|
|
|
|
- }
|
|
|
|
|
|
+ //是同一类型的单据 todo 暂时只能导出同一种类型单据
|
|
|
|
+ Assert.isTrue(StringUtils.isNotBlank(docExcelQueryDTO.getDocType()), "请选择单据类型");
|
|
|
|
+
|
|
|
|
+ BizEnum.BionutritionHeaderExcelDocTypeEnum bionutritionHeaderExcelDocTypeEnum = EnumUtils.getEnumByCode(docExcelQueryDTO.getDocType(), BizEnum.BionutritionHeaderExcelDocTypeEnum.class);
|
|
|
|
+ Class<E> docHeaderClass = (Class<E>) Class.forName(bionutritionHeaderExcelDocTypeEnum.getClassName());
|
|
|
|
+ BizEnum.BionutritionDetailsExcelDocTypeEnum bionutritionDetailsExcelDocTypeEnum = EnumUtils.getEnumByCode(docExcelQueryDTO.getDocType(), BizEnum.BionutritionDetailsExcelDocTypeEnum.class);
|
|
|
|
+ Class<E> docDetailsClass = (Class<E>) Class.forName(bionutritionDetailsExcelDocTypeEnum.getClassName());
|
|
|
|
+
|
|
|
|
+ Field[] headerSonFields = docHeaderClass.getDeclaredFields();
|
|
|
|
+ Field[] headerFatherFields = docHeaderClass.getSuperclass().getDeclaredFields();
|
|
|
|
+
|
|
|
|
+ //1.设置列数,长度为单头和明细的字段数和
|
|
|
|
+ // 单头字段数
|
|
|
|
+ collLength = headerSonFields.length + headerFatherFields.length;
|
|
|
|
+ // 所有单头字段
|
|
|
|
+ Field[] totalHeaderFields = new Field[collLength];
|
|
|
|
+ System.arraycopy(headerSonFields, 0, totalHeaderFields, 0, headerSonFields.length);
|
|
|
|
+ System.arraycopy(headerFatherFields, 0, totalHeaderFields, headerSonFields.length, headerFatherFields.length);
|
|
|
|
+ // 设置单头字段为可访问
|
|
|
|
+ totalHeaderFields = setFieldsAccessible(totalHeaderFields);
|
|
|
|
+ log.info("=====单头字段长度:{}", collLength);
|
|
|
|
+
|
|
|
|
+ Field[] detailSonField = docDetailsClass.getDeclaredFields();
|
|
|
|
+ Field[] detailFatherFields = docDetailsClass.getSuperclass().getDeclaredFields();
|
|
|
|
+
|
|
|
|
+ // 所有明细字段
|
|
|
|
+ Field[] totalDetailFields = new Field[detailSonField.length + detailFatherFields.length];
|
|
|
|
+ System.arraycopy(detailSonField, 0, totalDetailFields, 0, detailSonField.length);
|
|
|
|
+ System.arraycopy(detailFatherFields, 0, totalDetailFields, detailSonField.length, detailFatherFields.length);
|
|
|
|
+ // 设置明细字段为可访问
|
|
|
|
+ totalDetailFields = setFieldsAccessible(totalDetailFields);
|
|
|
|
+ // 加上明细字段数
|
|
|
|
+ collLength = collLength + detailSonField.length + detailFatherFields.length;
|
|
|
|
+
|
|
|
|
+ // 获取所有字段
|
|
|
|
+ Field[] totalFields = new Field[collLength];
|
|
|
|
+ System.arraycopy(totalHeaderFields, 0, totalFields, 0, totalHeaderFields.length);
|
|
|
|
+ System.arraycopy(totalDetailFields, 0, totalFields, totalHeaderFields.length, totalDetailFields.length);
|
|
|
|
+ log.info("==所有字段:{}", totalFields);
|
|
|
|
+
|
|
|
|
+ //2.创建第一行和第二行标题
|
|
|
|
+ SXSSFRow row0 = sheet.createRow(0);
|
|
|
|
+ SXSSFCell cell0 = row0.createCell(0);
|
|
|
|
+ BizEnum.BionutritionExcelDocTitleEnum excelDocTitleEnum = EnumUtils.getEnumByCode(docExcelQueryDTO.getDocType(), BizEnum.BionutritionExcelDocTitleEnum.class);
|
|
|
|
+ cell0.setCellValue(excelDocTitleEnum.getTitleName());
|
|
|
|
+ cell0.setCellStyle(cellStyle);
|
|
|
|
+ // ‘单据’标题所占的列合并
|
|
|
|
+ sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, collLength - 1));
|
|
|
|
+
|
|
|
|
+ SXSSFRow row1 = sheet.createRow(1);
|
|
|
|
+ SXSSFCell cell1 = row1.createCell(0);
|
|
|
|
+ cell1.setCellValue("单头");
|
|
|
|
+ cell1.setCellStyle(cellStyle);
|
|
|
|
+ SXSSFCell cell2 = row1.createCell(totalHeaderFields.length);
|
|
|
|
+ cell2.setCellValue("明细");
|
|
|
|
+ cell2.setCellStyle(cellStyle);
|
|
|
|
+ // ‘单头’标题所占的列合并
|
|
|
|
+ sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, totalHeaderFields.length - 1));
|
|
|
|
+ // ‘明细’标题所占的列合并
|
|
|
|
+ sheet.addMergedRegion(new CellRangeAddress(1, 1, totalHeaderFields.length, collLength - 1));
|
|
|
|
+
|
|
|
|
+ //3.创建第二行标题
|
|
|
|
+ SXSSFRow row2 = sheet.createRow(2);
|
|
|
|
+ // 获取单据中文字段配置信息
|
|
|
|
+ String docFieldRemark = sysConfigService.selectConfigByKey(Constant.SYS_DOC_FIELD_REMARK);
|
|
|
|
+ log.info("单据字段对应配置信息:{}",docFieldRemark);
|
|
|
|
+ Assert.isTrue(StringUtils.isNotBlank(docFieldRemark),"单据中文字段配置信息获取失败");
|
|
|
|
+ Map<String, String> docFieldRemarkMap = JSONObject.parseObject(docFieldRemark, Map.class);
|
|
|
|
+
|
|
|
|
+ for (int i = 0; i < collLength; i++) {
|
|
|
|
+ SXSSFCell cell = row2.createCell(i);
|
|
|
|
+ cell.setCellStyle(cellStyle);
|
|
|
|
+ // 根据字段名获取对应中文并设置到标题中
|
|
|
|
+ cell.setCellValue(docFieldRemarkMap.get(totalFields[i].getName()));
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ startRow = 3;
|
|
|
|
+ try {
|
|
// 4.设置数据
|
|
// 4.设置数据
|
|
-
|
|
|
|
- // 5.响应到客户端
|
|
|
|
- OutputStream out = null;
|
|
|
|
- try {
|
|
|
|
- out = response.getOutputStream();
|
|
|
|
- response.setContentType("application/x-msdownload");
|
|
|
|
- response.setHeader("Content-Disposition","attachment;filename=test1");
|
|
|
|
- workbook.write(out);
|
|
|
|
- } catch (IOException e) {
|
|
|
|
- e.printStackTrace();
|
|
|
|
|
|
+ for (BionutritionDocBaseExcel baseExcel : docBaseExcels) {
|
|
|
|
+
|
|
|
|
+ BionutritionDocHeaderBaseExcel headerExcel = baseExcel.getBionutritionDocHeaderBaseExcelDTO();
|
|
|
|
+ List<BionutritionDocDetailsBaseExcel> detailsExcelList = baseExcel.getBionutritionDocDetailsBaseExcelList();
|
|
|
|
+ // 获取当前单头字段值
|
|
|
|
+ Map<String, Object> headerPropertyMap = getPropertyMap(docHeaderClass, (Object) totalHeaderFields, headerExcel);
|
|
|
|
+ log.info("单头字段值:{}", headerPropertyMap);
|
|
|
|
+ // 明细数据为空 只设置单据头
|
|
|
|
+ if (CollUtil.isEmpty(detailsExcelList)) {
|
|
|
|
+ // 创建行
|
|
|
|
+ SXSSFRow row = sheet.createRow(startRow);
|
|
|
|
+ Integer cellNum = 0;
|
|
|
|
+ // 设置单头字段的值
|
|
|
|
+ setExcelField(totalHeaderFields, headerPropertyMap, row, cellNum, cellStyle);
|
|
|
|
+ startRow++;
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+ // 单元格合并 合并列,不合并行 明细只有一条数据无需合并
|
|
|
|
+ if (detailsExcelList.size() != 1){
|
|
|
|
+ mergeSameColumn(sheet, startRow, totalHeaderFields, detailsExcelList);
|
|
|
|
+ }
|
|
|
|
+ // 有明细数据 需要合并单头单元格
|
|
|
|
+ for (BionutritionDocDetailsBaseExcel detailsExcel : detailsExcelList) {
|
|
|
|
+ Map<String, Object> detailPropertyMap = getDetailPropertyMap(docDetailsClass, (Object) totalDetailFields, detailsExcel);
|
|
|
|
+ // 创建行
|
|
|
|
+ SXSSFRow row = sheet.createRow(startRow);
|
|
|
|
+ Integer cellNum = 0;
|
|
|
|
+ // 设置单头字段的值
|
|
|
|
+ cellNum = setExcelField(totalHeaderFields, headerPropertyMap, row, cellNum, cellStyle);
|
|
|
|
+ // 设置单明细的值
|
|
|
|
+ setExcelField(totalDetailFields, detailPropertyMap, row, cellNum, cellStyle);
|
|
|
|
+ startRow++;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
+ } catch (NoSuchMethodException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ } catch (IllegalAccessException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ } catch (InvocationTargetException e) {
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ // 5.响应到客户端
|
|
|
|
+ OutputStream out = null;
|
|
|
|
+ try {
|
|
|
|
+ out = response.getOutputStream();
|
|
|
|
+ response.setContentType("application/x-msdownload");
|
|
|
|
+ response.setHeader("Content-Disposition", "attachment;filename=test1");
|
|
|
|
+ workbook.write(out);
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
+ e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 单元格合并同列不合并同行
|
|
|
|
+ * @param sheet
|
|
|
|
+ * @param startRow
|
|
|
|
+ * @param totalHeaderFields
|
|
|
|
+ * @param detailsExcelList
|
|
|
|
+ */
|
|
|
|
+ private void mergeSameColumn(SXSSFSheet sheet, Integer startRow, Field[] totalHeaderFields, List<BionutritionDocDetailsBaseExcel> detailsExcelList) {
|
|
|
|
+ for (int i = 0; i < totalHeaderFields.length; i++) {
|
|
|
|
+ sheet.addMergedRegion(new CellRangeAddress(
|
|
|
|
+ startRow, startRow + detailsExcelList.size() - 1, i, i));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取当前导出单据明细字段值
|
|
|
|
+ * @param docDetailsClass
|
|
|
|
+ * @param totalDetailFields
|
|
|
|
+ * @param detailsExcel
|
|
|
|
+ * @param <E>
|
|
|
|
+ * @return
|
|
|
|
+ * @throws NoSuchMethodException
|
|
|
|
+ * @throws IllegalAccessException
|
|
|
|
+ * @throws InvocationTargetException
|
|
|
|
+ */
|
|
|
|
+ private <E> Map<String, Object> getDetailPropertyMap(Class<E> docDetailsClass, Object totalDetailFields, BionutritionDocDetailsBaseExcel detailsExcel) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
|
|
|
|
+ //获取当前明细字段值
|
|
|
|
+ Method getProperties = docDetailsClass.getDeclaredMethod("getProperties", Field[].class);
|
|
|
|
+ // 获取单头对象的所有字段值
|
|
|
|
+ Map<String, Object> detailPropertyMap = (Map<String, Object>) getProperties.invoke(detailsExcel, totalDetailFields);
|
|
|
|
+ return detailPropertyMap;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 设置excel单元格值
|
|
|
|
+ * @param totalFields
|
|
|
|
+ * @param propertyMap
|
|
|
|
+ * @param row
|
|
|
|
+ * @param cellNum
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private Integer setExcelField(Field[] totalFields, Map<String, Object> propertyMap, SXSSFRow row, Integer cellNum, CellStyle cellStyle) {
|
|
|
|
+ for (Field field : totalFields) {
|
|
|
|
+ SXSSFCell cell = row.createCell(cellNum);
|
|
|
|
+ cell.setCellStyle(cellStyle);
|
|
|
|
+ cell.setCellValue(String.valueOf(propertyMap.get(field.getName())) );
|
|
|
|
+ cellNum++;
|
|
|
|
+ }
|
|
|
|
+ return cellNum;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取当前导出单据头的字段的值
|
|
|
|
+ *
|
|
|
|
+ * @param docHeaderClass
|
|
|
|
+ * @param totalHeaderFields
|
|
|
|
+ * @param headerExcel
|
|
|
|
+ * @param <E>
|
|
|
|
+ * @return
|
|
|
|
+ * @throws NoSuchMethodException
|
|
|
|
+ * @throws IllegalAccessException
|
|
|
|
+ * @throws InvocationTargetException
|
|
|
|
+ */
|
|
|
|
+ private <E> Map<String, Object> getPropertyMap(Class<E> docHeaderClass, Object totalHeaderFields, BionutritionDocHeaderBaseExcel headerExcel) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
|
|
|
|
+ Method getProperties = docHeaderClass.getDeclaredMethod("getProperties", Field[].class);
|
|
|
|
+ // 获取单头对象的所有字段值
|
|
|
|
+ Map<String, Object> propertyMap = (Map<String, Object>) getProperties.invoke(headerExcel, totalHeaderFields);
|
|
|
|
+ return propertyMap;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 设置字段权限为可访问
|
|
|
|
+ * @param totalFields
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public Field[] setFieldsAccessible(Field[] totalFields) {
|
|
|
|
+ for (Field field : totalFields) {
|
|
|
|
+ field.setAccessible(true);
|
|
|
|
+ }
|
|
|
|
+ return totalFields;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
* 构建类型单据内容(单个)
|
|
* 构建类型单据内容(单个)
|
|
|
|
+ *
|
|
* @param docNo
|
|
* @param docNo
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
- public BionutritionDocBaseDTO buildBionutritionDocBaseDTOByDocNo(String docNo){
|
|
|
|
|
|
+ public BionutritionDocBaseDTO buildBionutritionDocBaseDTOByDocNo(String docNo) {
|
|
BionutritionDocHeaderDTO bionutritionDocHeaderDTO = getBionutritionDocHeaderDTOListByDocNo(docNo);
|
|
BionutritionDocHeaderDTO bionutritionDocHeaderDTO = getBionutritionDocHeaderDTOListByDocNo(docNo);
|
|
return buildBionutritionDocBaseDTO(bionutritionDocHeaderDTO);
|
|
return buildBionutritionDocBaseDTO(bionutritionDocHeaderDTO);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
* 构建类型单据内容(单个)
|
|
* 构建类型单据内容(单个)
|
|
|
|
+ *
|
|
* @param id
|
|
* @param id
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
- public BionutritionDocBaseDTO buildBionutritionDocBaseDTOById(String id){
|
|
|
|
|
|
+ public BionutritionDocBaseDTO buildBionutritionDocBaseDTOById(String id) {
|
|
BionutritionDocHeaderDTO bionutritionDocHeaderDTO = getBionutritionDocHeaderDTOListById(id);
|
|
BionutritionDocHeaderDTO bionutritionDocHeaderDTO = getBionutritionDocHeaderDTOListById(id);
|
|
return buildBionutritionDocBaseDTO(bionutritionDocHeaderDTO);
|
|
return buildBionutritionDocBaseDTO(bionutritionDocHeaderDTO);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
* 构建类型单据内容(多个)
|
|
* 构建类型单据内容(多个)
|
|
|
|
+ *
|
|
* @param docNoList
|
|
* @param docNoList
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
- public List<BionutritionDocBaseDTO> buildBionutritionDocBaseDTOByDocNoList(List<String> docNoList){
|
|
|
|
|
|
+ public List<BionutritionDocBaseDTO> buildBionutritionDocBaseDTOByDocNoList(List<String> docNoList) {
|
|
List<BionutritionDocHeaderDTO> bionutritionDocHeaderDTOList = getBionutritionDocHeaderDTOListByDocNo(docNoList);
|
|
List<BionutritionDocHeaderDTO> bionutritionDocHeaderDTOList = getBionutritionDocHeaderDTOListByDocNo(docNoList);
|
|
List<String> docTypeList = bionutritionDocHeaderDTOList.stream().map(item -> item.getDocType()).distinct().collect(Collectors.toList());
|
|
List<String> docTypeList = bionutritionDocHeaderDTOList.stream().map(item -> item.getDocType()).distinct().collect(Collectors.toList());
|
|
return NumberUtil.isGreater(BigDecimal.valueOf(docTypeList.size()), BigDecimal.ONE) ?
|
|
return NumberUtil.isGreater(BigDecimal.valueOf(docTypeList.size()), BigDecimal.ONE) ?
|
|
@@ -250,10 +429,11 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
|
|
|
|
|
|
/**
|
|
/**
|
|
* 构建类型单据内容(多个)
|
|
* 构建类型单据内容(多个)
|
|
|
|
+ *
|
|
* @param idList
|
|
* @param idList
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
- public List<BionutritionDocBaseDTO> buildBionutritionDocBaseDTOByIdList(List<String> idList){
|
|
|
|
|
|
+ public List<BionutritionDocBaseDTO> buildBionutritionDocBaseDTOByIdList(List<String> idList) {
|
|
List<BionutritionDocHeaderDTO> bionutritionDocHeaderDTOList = getBionutritionDocHeaderDTOList(idList);
|
|
List<BionutritionDocHeaderDTO> bionutritionDocHeaderDTOList = getBionutritionDocHeaderDTOList(idList);
|
|
List<String> docTypeList = bionutritionDocHeaderDTOList.stream().map(item -> item.getDocType()).distinct().collect(Collectors.toList());
|
|
List<String> docTypeList = bionutritionDocHeaderDTOList.stream().map(item -> item.getDocType()).distinct().collect(Collectors.toList());
|
|
return NumberUtil.isGreater(BigDecimal.valueOf(docTypeList.size()), BigDecimal.ONE) ?
|
|
return NumberUtil.isGreater(BigDecimal.valueOf(docTypeList.size()), BigDecimal.ONE) ?
|
|
@@ -262,10 +442,11 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
|
|
|
|
|
|
/**
|
|
/**
|
|
* 构建类型单据内容(单个)
|
|
* 构建类型单据内容(单个)
|
|
|
|
+ *
|
|
* @param bionutritionDocHeaderDTO
|
|
* @param bionutritionDocHeaderDTO
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
- private BionutritionDocBaseDTO buildBionutritionDocBaseDTO(BionutritionDocHeaderDTO bionutritionDocHeaderDTO){
|
|
|
|
|
|
+ private BionutritionDocBaseDTO buildBionutritionDocBaseDTO(BionutritionDocHeaderDTO bionutritionDocHeaderDTO) {
|
|
BionutritionDocHeaderBaseDTO bionutritionDocHeaderBaseDTO = BionutritionDocUtil.buildBionutritionDocHeaderDTO(bionutritionDocHeaderDTO);
|
|
BionutritionDocHeaderBaseDTO bionutritionDocHeaderBaseDTO = BionutritionDocUtil.buildBionutritionDocHeaderDTO(bionutritionDocHeaderDTO);
|
|
List<BionutritionDocDetailsDTO> bionutritionDocDetailsDTOList = bionutritionDocDetailsService.getBionutritionDocDetailsDTOList(
|
|
List<BionutritionDocDetailsDTO> bionutritionDocDetailsDTOList = bionutritionDocDetailsService.getBionutritionDocDetailsDTOList(
|
|
bionutritionDocHeaderBaseDTO.getId());
|
|
bionutritionDocHeaderBaseDTO.getId());
|
|
@@ -279,10 +460,11 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
|
|
|
|
|
|
/**
|
|
/**
|
|
* 构建类型单据内容(多个 相同类型单据)
|
|
* 构建类型单据内容(多个 相同类型单据)
|
|
|
|
+ *
|
|
* @param bionutritionDocHeaderDTOList
|
|
* @param bionutritionDocHeaderDTOList
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
- private List<BionutritionDocBaseDTO> buildBionutritionDocSameTypeList(List<BionutritionDocHeaderDTO> bionutritionDocHeaderDTOList){
|
|
|
|
|
|
+ private List<BionutritionDocBaseDTO> buildBionutritionDocSameTypeList(List<BionutritionDocHeaderDTO> bionutritionDocHeaderDTOList) {
|
|
List<BionutritionDocHeaderBaseDTO> bionutritionDocHeaderBaseDTOList = BionutritionDocUtil.buildBionutritionDocHeaderDTOList(bionutritionDocHeaderDTOList);
|
|
List<BionutritionDocHeaderBaseDTO> bionutritionDocHeaderBaseDTOList = BionutritionDocUtil.buildBionutritionDocHeaderDTOList(bionutritionDocHeaderDTOList);
|
|
List<BionutritionDocDetailsDTO> bionutritionDocDetailsDTOList = bionutritionDocDetailsService.getBionutritionDocDetailsDTOList(
|
|
List<BionutritionDocDetailsDTO> bionutritionDocDetailsDTOList = bionutritionDocDetailsService.getBionutritionDocDetailsDTOList(
|
|
bionutritionDocHeaderDTOList.stream().map(BionutritionDocHeaderDTO::getId).distinct().collect(Collectors.toList()));
|
|
bionutritionDocHeaderDTOList.stream().map(BionutritionDocHeaderDTO::getId).distinct().collect(Collectors.toList()));
|
|
@@ -293,10 +475,11 @@ public class BionutritionDocHeaderServiceImpl extends CrudServiceImpl<Bionutriti
|
|
|
|
|
|
/**
|
|
/**
|
|
* 构建类型单据内容(多个 不同类型单据)
|
|
* 构建类型单据内容(多个 不同类型单据)
|
|
|
|
+ *
|
|
* @param bionutritionDocHeaderDTOList
|
|
* @param bionutritionDocHeaderDTOList
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
- private List<BionutritionDocBaseDTO> buildBionutritionDocDifferentTypeList(List<BionutritionDocHeaderDTO> bionutritionDocHeaderDTOList){
|
|
|
|
|
|
+ private List<BionutritionDocBaseDTO> buildBionutritionDocDifferentTypeList(List<BionutritionDocHeaderDTO> bionutritionDocHeaderDTOList) {
|
|
Map<String, List<BionutritionDocHeaderBaseDTO>> bionutritionDocHeaderMap = BionutritionDocUtil.buildBionutritionDocHeaderDTOByDocTypeMap(bionutritionDocHeaderDTOList);
|
|
Map<String, List<BionutritionDocHeaderBaseDTO>> bionutritionDocHeaderMap = BionutritionDocUtil.buildBionutritionDocHeaderDTOByDocTypeMap(bionutritionDocHeaderDTOList);
|
|
List<BionutritionDocDetailsDTO> bionutritionDocDetailsDTOList = bionutritionDocDetailsService.getBionutritionDocDetailsDTOList(
|
|
List<BionutritionDocDetailsDTO> bionutritionDocDetailsDTOList = bionutritionDocDetailsService.getBionutritionDocDetailsDTOList(
|
|
bionutritionDocHeaderDTOList.stream().map(BionutritionDocHeaderDTO::getId).distinct().collect(Collectors.toList()));
|
|
bionutritionDocHeaderDTOList.stream().map(BionutritionDocHeaderDTO::getId).distinct().collect(Collectors.toList()));
|