From 62a8797e5f6302d043987384e9c25b0d2adc404f Mon Sep 17 00:00:00 2001 From: wangqiong <1322446236@qq.com> Date: Mon, 24 Jun 2024 17:56:23 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BB=93=E6=9E=84=E6=A0=91?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=92=8C=E5=8D=95=E8=A1=8C=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E6=8E=A5=E5=8F=A3=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 5 + qomo-kn-cost-manage/pom.xml | 20 +++ .../CostStandardDetailController.java | 25 +++- .../manage/entity/CostStandardDetail.java | 31 +++- .../service/CostStandardDetailService.java | 18 ++- .../service/impl/BomTreeServiceImpl.java | 17 +++ .../impl/CostStandardDetailServiceImpl.java | 45 ++++-- .../kn/cost/manage/util/BomTreeBuilder.java | 7 +- .../kn/cost/manage/util/EasyExcelUtil.java | 135 ++++++++++++++++++ .../qomo/kn/cost/manage/vo/BomTreeInfoVO.java | 5 + .../manage/vo/CostStandardDetailSearch.java | 21 +++ 11 files changed, 308 insertions(+), 21 deletions(-) create mode 100644 qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/util/EasyExcelUtil.java create mode 100644 qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/vo/CostStandardDetailSearch.java diff --git a/pom.xml b/pom.xml index 7de4a6d..239a588 100644 --- a/pom.xml +++ b/pom.xml @@ -98,6 +98,11 @@ qomo-kn-cost-manage ${revision} + + commons-io + commons-io + 2.11.0 + diff --git a/qomo-kn-cost-manage/pom.xml b/qomo-kn-cost-manage/pom.xml index 63c79a0..47dba37 100644 --- a/qomo-kn-cost-manage/pom.xml +++ b/qomo-kn-cost-manage/pom.xml @@ -38,6 +38,26 @@ mybatis-plus-generator 3.5.1 + + com.alibaba + easyexcel + 4.0.1 + + + commons-io + commons-io + 2.11.0 + + + org.apache.poi + poi + 5.2.3 + + + org.apache.poi + poi-ooxml + 5.2.3 + \ No newline at end of file diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/controller/CostStandardDetailController.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/controller/CostStandardDetailController.java index 9d5afd6..a973e45 100644 --- a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/controller/CostStandardDetailController.java +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/controller/CostStandardDetailController.java @@ -1,23 +1,35 @@ package com.zzsmart.qomo.kn.cost.manage.controller; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.google.gson.JsonObject; import com.zzsmart.qomo.kn.cost.manage.entity.CostStandardDetail; -import com.zzsmart.qomo.kn.cost.manage.entity.CostStandardVersion; import com.zzsmart.qomo.kn.cost.manage.service.CostStandardDetailService; -import com.zzsmart.qomo.kn.cost.manage.service.ICostStandardVersionService; +import com.zzsmart.qomo.kn.cost.manage.vo.CostStandardDetailSearch; import com.zzsmart.qomo.kn.cost.manage.vo.CostStandardDetailVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.base.controller.JeecgController; +import org.jeecg.common.system.query.QueryGenerator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; -import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.lang.reflect.Field; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static com.zzsmart.qomo.kn.cost.manage.util.EasyExcelUtil.getExcelPropertyAnnotatedFields; +import static com.zzsmart.qomo.kn.cost.manage.util.EasyExcelUtil.getIncludeFields; /** *

@@ -58,11 +70,12 @@ public class CostStandardDetailController extends JeecgController @@ -18,10 +22,20 @@ import com.zzsmart.qomo.kn.cost.manage.vo.CostStandardVO; public interface CostStandardDetailService extends IService { /** * 分页查询 + * * @param page * @param * @return */ IPage pageList(Page page, CostStandardDetailVO costStandard); + /** + * 导出列表信息为Excel文件 + * + * @param request + * @param response + * @param costStandardDetailSearch + * @return + */ + JSONObject exportExcel(HttpServletRequest request, HttpServletResponse response, CostStandardDetailSearch costStandardDetailSearch); } diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/impl/BomTreeServiceImpl.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/impl/BomTreeServiceImpl.java index 13fe9f5..cfabdeb 100644 --- a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/impl/BomTreeServiceImpl.java +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/impl/BomTreeServiceImpl.java @@ -49,6 +49,16 @@ public class BomTreeServiceImpl implements BomTreeService { wrapper1.like("parent_material_number", materialNumber1); } List costStandardDetails = costStandardDetailMapper.selectList(wrapper1); + //第三层叶子节点 + List threeNodes=new ArrayList<>(); + if(costStandardDetails!=null&&costStandardDetails.size()>0){ + List materialNoList = costStandardDetails.stream().map(CostStandardDetail::getMaterialNumber).collect(Collectors.toList()); + QueryWrapper wrapper2 = new QueryWrapper<>(); + wrapper2.in("parent_material_number", materialNoList); + + threeNodes = costStandardDetailMapper.selectList(wrapper2); + } + //把第二层叶子节点转化为bomtreeinfoVO对象集合 costStandardDetailVOS=new ArrayList<>(); for (int i=0;i bomTreeInfoVOS = BomTreeBuilder.buildBomTree(costStandardDetailVOS, parentDataMap); return bomTreeInfoVOS; diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/impl/CostStandardDetailServiceImpl.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/impl/CostStandardDetailServiceImpl.java index f1e3403..84eb888 100644 --- a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/impl/CostStandardDetailServiceImpl.java +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/service/impl/CostStandardDetailServiceImpl.java @@ -1,18 +1,28 @@ package com.zzsmart.qomo.kn.cost.manage.service.impl; import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.zzsmart.qomo.kn.cost.manage.entity.CostStandardDetail; import com.zzsmart.qomo.kn.cost.manage.mapper.CostStandardDetailMapper; import com.zzsmart.qomo.kn.cost.manage.service.CostStandardDetailService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.zzsmart.qomo.kn.cost.manage.vo.CostStandardDetailSearch; import com.zzsmart.qomo.kn.cost.manage.vo.CostStandardDetailVO; -import com.zzsmart.qomo.kn.cost.manage.vo.CostStandardVO; +import org.jeecg.common.system.query.QueryGenerator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Set; + +import static com.zzsmart.qomo.kn.cost.manage.util.EasyExcelUtil.getIncludeFields; + /** *

* 标准成本明细表 服务实现类 @@ -26,6 +36,7 @@ public class CostStandardDetailServiceImpl extends ServiceImpl) costStandardDetailMapper.pageList(page,queryWrapper); + return (IPage) costStandardDetailMapper.pageList(page, queryWrapper); } + + @Override + public JSONObject exportExcel(HttpServletRequest request, HttpServletResponse response, CostStandardDetailSearch costStandardDetailSearch) { + QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(costStandardDetailSearch, request.getParameterMap()); + if (costStandardDetailSearch != null && costStandardDetailSearch.getSelections() != null && costStandardDetailSearch.getSelections().size() > 0) { + queryWrapper.in("id", costStandardDetailSearch.getSelections()); + } + List exportList = list(queryWrapper); +// EasyExcelUtil.export(response, "D:/WorkDoc/PHM/单机部署/单行查询.xls", null, exportList,CostStandardDetail.class); + // 根据用户传入字段 假设我们要忽略 date + Set includeFields = getIncludeFields(CostStandardDetail.class); + EasyExcel.write("D:/WorkDoc/PHM/单机部署/单行查询.xls", CostStandardDetail.class).includeColumnFieldNames(includeFields).sheet("模板").doWrite(exportList); + // return super.exportXls(request, costStandardDetail, CostStandardDetail.class, "单行查询"); + JSONObject result = new JSONObject(); + result.put("filePath", "D:/WorkDoc/PHM/单机部署/单行查询.xls"); + return result; + } + } diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/util/BomTreeBuilder.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/util/BomTreeBuilder.java index 1d20494..fad41e6 100644 --- a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/util/BomTreeBuilder.java +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/util/BomTreeBuilder.java @@ -13,7 +13,7 @@ import java.util.stream.Collectors; public class BomTreeBuilder { public static List buildBomTree(List sourceData, Map parentDataMap) { List result = new ArrayList<>(); - if ((sourceData == null || (sourceData != null && sourceData.size() < 1))&& (parentDataMap == null || (parentDataMap != null && parentDataMap.size() < 1))) { + if ((sourceData == null || (sourceData != null && sourceData.size() < 1)) && (parentDataMap == null || (parentDataMap != null && parentDataMap.size() < 1))) { return result; } //1.把BOM信息分成按照物料号分组 @@ -54,6 +54,11 @@ public class BomTreeBuilder { if (parentBomTreeInfoVO != null) { //4.根据物料号查找子节点 List childs = childDataMap.get(parentBomTreeInfoVO.getMaterialNumber()); + if (childs != null && childs.size() > 0) { + parentBomTreeInfoVO.setHasChildren(true); + } else { + parentBomTreeInfoVO.setHasChildren(false); + } //构造父节点下的bomtree结构数据 List children = new ArrayList<>(); for (int j = 0; childs != null && childs.size() > 0 && j < childs.size(); j++) { diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/util/EasyExcelUtil.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/util/EasyExcelUtil.java new file mode 100644 index 0000000..f774a26 --- /dev/null +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/util/EasyExcelUtil.java @@ -0,0 +1,135 @@ +package com.zzsmart.qomo.kn.cost.manage.util; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.write.metadata.style.WriteCellStyle; +import com.alibaba.excel.write.metadata.style.WriteFont; +import com.alibaba.excel.write.style.HorizontalCellStyleStrategy; +import com.zzsmart.qomo.kn.cost.manage.entity.CostStandardDetail; +import org.apache.poi.ss.usermodel.*; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.Field; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class EasyExcelUtil { + /** + * 导出Excel文件到HTTP响应流,包含自定义表头。 + * + * @param response HTTP响应对象 + * @param fileName 导出的文件名 + * @param head 表头信息列表 + * @param data 需要导出的数据列表 + * @param clazz 数据模型的Class类型 + * @throws IOException IO异常 + */ + public static void export(HttpServletResponse response, String fileName, List head, List data, Class clazz) throws IOException { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding(StandardCharsets.UTF_8.name()); + try { + fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.name()).replaceAll("\\+", "%20"); + response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + + // 自定义表头样式 + HorizontalCellStyleStrategy horizontalCellStyleStrategy = getHorizontalCellStyleStrategy(); + + // 使用EasyExcel导出 + try { + EasyExcel.write(response.getOutputStream(), clazz) + // 注册样式策略 + .registerWriteHandler(horizontalCellStyleStrategy).sheet("1111").doWrite(data); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException(e); + } +// FileOutputStream outputStream= new FileOutputStream(fileName); +// try { +// EasyExcel.write(outputStream) +// // 设置自定义样式,可选 +// .sheet("Sheet1") // 设置工作表名称 +// .doWrite(data); // 将数据写入Excel +// } catch (Exception e) { +// e.printStackTrace(); +// System.out.println("zheli=============="); +// } finally { +//// if (excelWriter != null) { +//// excelWriter.finish(); +//// } +// if (outputStream != null) { +// outputStream.close(); +// } + +// } + } + + /** + * 创建自定义的水平单元格样式策略,用于表头样式。 + * + * @return 水平单元格样式策略 + */ + private static HorizontalCellStyleStrategy getHorizontalCellStyleStrategy() { + // 设置表头字体样式 + WriteFont headFont = new WriteFont(); + headFont.setFontHeightInPoints((short) 12); + headFont.setFontName("Arial"); + headFont.setBold(true); + + // 设置表头单元格样式 + WriteCellStyle headCellStyle = new WriteCellStyle(); + headCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); + headCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + headCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + headCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND); + headCellStyle.setBorderLeft(BorderStyle.THIN); + headCellStyle.setBorderRight(BorderStyle.THIN); + headCellStyle.setBorderTop(BorderStyle.THIN); + headCellStyle.setBorderBottom(BorderStyle.THIN); + headCellStyle.setWriteFont(headFont); + + // 创建并返回水平单元格样式策略 + return new HorizontalCellStyleStrategy(headCellStyle, (List) null); + } + + /** + * 获取带有@Excel注解的属性集合 + * + * @param clazz 实体类的Class对象 + * @return 带有@Excel注解的Field集合 + */ + public static Field[] getExcelPropertyAnnotatedFields(Class clazz) { + Field[] fields = clazz.getDeclaredFields(); + List annotatedFields = new ArrayList<>(); + + for (Field field : fields) { + if (field.isAnnotationPresent(ExcelProperty.class)) { + annotatedFields.add(field); + } + } + return annotatedFields.toArray(new Field[0]); + } + + /** + * 查询类需要导出的列名 + * + * @param clazz + * @return + */ + public static Set getIncludeFields(Class clazz) { + Field[] excelPropertyAnnotatedFields = getExcelPropertyAnnotatedFields(CostStandardDetail.class); + Set includeColumnFiledNames = new HashSet(); + for (int i = 0; i < excelPropertyAnnotatedFields.length; i++) { + includeColumnFiledNames.add(excelPropertyAnnotatedFields[i].getName()); + } + return includeColumnFiledNames; + } +} diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/vo/BomTreeInfoVO.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/vo/BomTreeInfoVO.java index 56d8741..3356e57 100644 --- a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/vo/BomTreeInfoVO.java +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/vo/BomTreeInfoVO.java @@ -137,4 +137,9 @@ public class BomTreeInfoVO { */ @ApiModelProperty(value = "子节点") private List children; + /** + * 是否有叶子节点 + */ + @ApiModelProperty(value = "是否有叶子节点") + private boolean hasChildren; } diff --git a/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/vo/CostStandardDetailSearch.java b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/vo/CostStandardDetailSearch.java new file mode 100644 index 0000000..01c8565 --- /dev/null +++ b/qomo-kn-cost-manage/src/main/java/com/zzsmart/qomo/kn/cost/manage/vo/CostStandardDetailSearch.java @@ -0,0 +1,21 @@ +package com.zzsmart.qomo.kn.cost.manage.vo; + +import io.swagger.annotations.ApiModel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@ApiModel(value="bom结构树", description="bom结构树") +public class CostStandardDetailSearch extends CostStandardDetailVO { + /** + * 选择行的id + */ + private List selections; +}