buhuazhen
4 天以前 c78984f3aea4505971dc12f8acd41e30cf4fdbea
feat 质检检测调整
已添加3个文件
已修改7个文件
613 ■■■■■ 文件已修改
src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/controller/QualityInspectController.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/dto/QualityInspectExportDTO.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/dto/QualityInspectExportVO.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/mapper/QualityInspectMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/service/IQualityInspectService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/service/impl/QualityInspectExportHandle.java 277 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/quality/QualityInspectMapper.xml 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java
@@ -32,26 +32,60 @@
    @Override
    public List<ProductTreeDto> selectProductList(ProductDto productDto) {
        // æŸ¥è¯¢æ ¹èŠ‚ç‚¹ï¼ˆparentId ä¸º null)
        // ä¸€æ¬¡æ€§æŸ¥è¯¢æ‰€æœ‰æ•°æ®
        LambdaQueryWrapper<Product> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.isNull(Product::getParentId);
        // å¦‚果有产品名称条件,添加到查询中
        if (productDto.getProductName() != null && !productDto.getProductName().isEmpty()) {
            queryWrapper.like(Product::getProductName, productDto.getProductName());
        }
        List<Product> allProducts = productMapper.selectList(queryWrapper);
        // æŸ¥è¯¢æ ¹èŠ‚ç‚¹åˆ—è¡¨
        List<Product> rootProducts = productMapper.selectList(queryWrapper);
        // åœ¨å†…存中构建树结构
        return buildTree(allProducts);
    }
        // è½¬æ¢ä¸ºæ ‘节点并递归构建子树
    /**
     * æž„建树结构
     * @param allProducts æ‰€æœ‰äº§å“æ•°æ®
     * @return æ ‘形结构列表
     */
    private List<ProductTreeDto> buildTree(List<Product> allProducts) {
        // æŒ‰ parentId åˆ†ç»„
        java.util.Map<Long, List<Product>> parentMap = new java.util.HashMap<>();
        List<Product> rootList = new ArrayList<>();
        for (Product product : allProducts) {
            if (product.getParentId() == null) {
                rootList.add(product);
            } else {
                parentMap.computeIfAbsent(product.getParentId(), k -> new ArrayList<>()).add(product);
            }
        }
        // é€’归构建子节点
        List<ProductTreeDto> tree = new ArrayList<>();
        for (Product product : rootProducts) {
            ProductTreeDto node = convertToTreeDto(product);
            node.setChildren(buildChildrenNodes(product.getId()));
            tree.add(node);
        for (Product root : rootList) {
            tree.add(buildNode(root, parentMap));
        }
        return tree;
    }
    /**
     * é€’归构建节点及其子节点
     * @param product äº§å“å®žä½“
     * @param parentMap æŒ‰parentId分组的map
     * @return æ ‘节点
     */
    private ProductTreeDto buildNode(Product product, java.util.Map<Long, List<Product>> parentMap) {
        ProductTreeDto node = convertToTreeDto(product);
        List<Product> children = parentMap.get(product.getId());
        if (children != null && !children.isEmpty()) {
            List<ProductTreeDto> childNodes = new ArrayList<>();
            for (Product child : children) {
                childNodes.add(buildNode(child, parentMap));
            }
            node.setChildren(childNodes);
        }
        return node;
    }
    @Override
@@ -60,24 +94,7 @@
    }
    // é€’归构建子节点
    private List<ProductTreeDto> buildChildrenNodes(Long parentId) {
        // æŸ¥è¯¢å½“前父节点的子节点
        LambdaQueryWrapper<Product> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Product::getParentId, parentId);
        List<Product> childProducts = productMapper.selectList(queryWrapper);
        // è½¬æ¢å­èŠ‚ç‚¹å¹¶é€’å½’æž„å»ºå®ƒä»¬çš„å­æ ‘
        List<ProductTreeDto> children = new ArrayList<>();
        for (Product child : childProducts) {
            ProductTreeDto childNode = convertToTreeDto(child);
            childNode.setChildren(buildChildrenNodes(child.getId()));
            children.add(childNode);
        }
        return children;
    }
    // å°† Product è½¬æ¢ä¸º ProductTreeDto
    private ProductTreeDto convertToTreeDto(Product product) {
        ProductTreeDto dto = new ProductTreeDto();
src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
@@ -215,7 +215,11 @@
            ProductProcessRouteItem item = new ProductProcessRouteItem();
            item.setProductRouteId(productRouteId);
            item.setProcessId(dto.getProcessId());
            item.setProductModelId(dto.getProductModelId());
            if (num >= dtos.size()-1) {
                item.setProductModelId(productModelId);
            }else {
                item.setProductModelId(dto.getProductModelId());
            }
            item.setProcessRouteName(dto.getProcessRouteName());
            item.setProcessRouteOpenNum(dto.getProcessRouteOpenNum());
            item.setProcessRouteNum(dto.getProcessRouteNum());
src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
@@ -8,6 +8,7 @@
import com.ruoyi.procurementrecord.service.ProcurementRecordService;
import com.ruoyi.procurementrecord.utils.StockUtils;
import com.ruoyi.quality.dto.QualityInspectDto;
import com.ruoyi.quality.dto.QualityInspectExportDTO;
import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.quality.pojo.QualityInspectFile;
import com.ruoyi.quality.pojo.QualityInspectParam;
@@ -112,16 +113,26 @@
    }
    /**
     * å¯¼å‡º
     * å¯¼å‡ºï¼ˆæ—§æŽ¥å£ï¼Œä¿ç•™å…¼å®¹ï¼‰
     * @param response
     * @param qualityInspect
     */
    @PostMapping("/export")
    public void qualityInspectExport(HttpServletResponse response,QualityInspect qualityInspect) {
    public void qualityInspectExport(HttpServletResponse response, QualityInspect qualityInspect) {
        qualityInspectService.qualityInspectExport(response, qualityInspect);
    }
    /**
     * å¯¼å‡ºï¼ˆæ–°æŽ¥å£ï¼Œæ”¯æŒé€‰ä¸­å¯¼å‡ºå’Œæ£€éªŒå‚数)
     * @param response
     * @param exportDTO
     */
    @PostMapping("/exportNew")
    public void qualityInspectExportNew(HttpServletResponse response, @RequestBody QualityInspectExportDTO exportDTO) {
        qualityInspectService.qualityInspectExportNew(response, exportDTO);
    }
    /**
     * æäº¤
     * @param qualityInspect
     * @return
src/main/java/com/ruoyi/quality/dto/QualityInspectExportDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
package com.ruoyi.quality.dto;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
 * è´¨é‡æ£€éªŒå¯¼å‡ºè¯·æ±‚参数
 */
@Data
public class QualityInspectExportDTO implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * æ£€éªŒç±»åž‹(0:原材料检验;1:过程检验;2:出厂检验)
     */
    private Integer inspectType;
    /**
     * é€‰ä¸­çš„ID列表(为空则全部导出)
     */
    private List<Long> ids;
    /**
     * ä¾›åº”商(原材料检验筛选)
     */
    private String supplier;
    /**
     * å·¥åºï¼ˆè¿‡ç¨‹æ£€éªŒç­›é€‰ï¼‰
     */
    private String process;
    /**
     * äº§å“åç§°ï¼ˆå‡ºåŽ‚æ£€éªŒç­›é€‰ï¼‰
     */
    private String productName;
    /**
     * æ£€æµ‹æ—¥æœŸå¼€å§‹
     */
    private String entryDateStart;
    /**
     * æ£€æµ‹æ—¥æœŸç»“束
     */
    private String entryDateEnd;
}
src/main/java/com/ruoyi/quality/dto/QualityInspectExportVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
package com.ruoyi.quality.dto;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
 * è´¨é‡æ£€éªŒå¯¼å‡ºæ•°æ®VO(每个检验参数一行)
 */
@Data
public class QualityInspectExportVO implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * æ£€æµ‹æ—¥æœŸ
     */
    private Date checkTime;
    /**
     * é‡‡è´­è®¢å•号/生产工单号
     */
    private String orderNo;
    /**
     * ä¾›åº”商/工序
     */
    private String supplierOrProcess;
    /**
     * æ£€éªŒå‘˜
     */
    private String checkName;
    /**
     * äº§å“åç§°
     */
    private String productName;
    /**
     * è§„格型号
     */
    private String model;
    /**
     * å•位
     */
    private String unit;
    /**
     * æ•°é‡
     */
    private BigDecimal quantity;
    /**
     * æ£€æµ‹å•位
     */
    private String checkCompany;
    /**
     * æ£€æµ‹ç»“æžœ
     */
    private String checkResult;
    /**
     * æŒ‡æ ‡
     */
    private String parameterItem;
    /**
     * æŒ‡æ ‡å•位
     */
    private String paramUnit;
    /**
     * æ ‡å‡†å€¼
     */
    private String standardValue;
    /**
     * å†…控值
     */
    private String controlValue;
    /**
     * æ£€éªŒå€¼
     */
    private String testValue;
}
src/main/java/com/ruoyi/quality/mapper/QualityInspectMapper.java
@@ -19,6 +19,11 @@
    List<QualityInspect> qualityInspectExport(@Param("qualityInspect") QualityInspect qualityInspect);
    /**
     * æ ¹æ®ID列表查询检验记录(用于导出)
     */
    List<QualityInspect> qualityInspectExportByIds(@Param("ids") List<Long> ids, @Param("qualityInspect") QualityInspect qualityInspect);
    /**
     * æ ¹æ®ç”Ÿäº§ä¸»è¡¨ID批量删除过程检验
     */
    int deleteByProductMainIds(@Param("productMainIds") List<Long> productMainIds);
src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.quality.dto.QualityInspectDto;
import com.ruoyi.quality.dto.QualityInspectExportDTO;
import com.ruoyi.quality.pojo.QualityInspect;
import javax.servlet.http.HttpServletResponse;
@@ -19,6 +20,13 @@
    void qualityInspectExport(HttpServletResponse response, QualityInspect qualityInspect);
    /**
     * å¯¼å‡ºæ£€éªŒè®°å½•(支持选中导出和全部导出,包含检验参数)
     * @param response å“åº”
     * @param exportDTO å¯¼å‡ºå‚æ•°
     */
    void qualityInspectExportNew(HttpServletResponse response, QualityInspectExportDTO exportDTO);
    QualityInspectDto getDetailById(Integer id);
    int submit(QualityInspect qualityInspect);
src/main/java/com/ruoyi/quality/service/impl/QualityInspectExportHandle.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,277 @@
package com.ruoyi.quality.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.quality.dto.QualityInspectExportDTO;
import com.ruoyi.quality.dto.QualityInspectExportVO;
import com.ruoyi.quality.mapper.QualityInspectMapper;
import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.quality.pojo.QualityInspectParam;
import com.ruoyi.quality.service.IQualityInspectParamService;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * è´¨é‡æ£€éªŒå¯¼å‡ºå¤„理类
 */
@Component
public class QualityInspectExportHandle {
    @Resource
    private QualityInspectMapper qualityInspectMapper;
    @Resource
    private IQualityInspectParamService qualityInspectParamService;
    /**
     * æŸ¥è¯¢æ£€éªŒè®°å½•(支持选中导出和全部导出)
     * @param exportDTO å¯¼å‡ºå‚æ•°
     * @return æ£€éªŒè®°å½•列表
     */
    public List<QualityInspect> queryInspectList(QualityInspectExportDTO exportDTO) {
        QualityInspect qualityInspect = new QualityInspect();
        qualityInspect.setInspectType(exportDTO.getInspectType());
        qualityInspect.setSupplier(exportDTO.getSupplier());
        qualityInspect.setProcess(exportDTO.getProcess());
        qualityInspect.setProductName(exportDTO.getProductName());
        qualityInspect.setEntryDateStart(exportDTO.getEntryDateStart());
        qualityInspect.setEntryDateEnd(exportDTO.getEntryDateEnd());
        if (!CollectionUtils.isEmpty(exportDTO.getIds())) {
            return qualityInspectMapper.qualityInspectExportByIds(exportDTO.getIds(), qualityInspect);
        } else {
            return qualityInspectMapper.qualityInspectExportByIds(null, qualityInspect);
        }
    }
    /**
     * æž„建导出数据(每个检验参数一行)
     * åŒä¸€æ£€éªŒè®°å½•的多个参数行,只在第一行显示左侧基础信息,后续行留空
     * @param qualityInspects æ£€éªŒè®°å½•列表
     * @param inspectType æ£€éªŒç±»åž‹
     * @return å¯¼å‡ºæ•°æ®åˆ—表
     */
    public List<QualityInspectExportVO> buildExportData(List<QualityInspect> qualityInspects, Integer inspectType) {
        if (CollectionUtils.isEmpty(qualityInspects)) {
            return new ArrayList<>();
        }
        // èŽ·å–æ‰€æœ‰æ£€éªŒè®°å½•çš„ID,批量查询检验参数
        List<Long> inspectIds = qualityInspects.stream().map(QualityInspect::getId).collect(Collectors.toList());
        List<QualityInspectParam> allParams = qualityInspectParamService.list(
            Wrappers.<QualityInspectParam>lambdaQuery().in(QualityInspectParam::getInspectId, inspectIds)
        );
        // æŒ‰inspectId分组
        Map<Long, List<QualityInspectParam>> paramMap = allParams.stream()
            .collect(Collectors.groupingBy(QualityInspectParam::getInspectId));
        // æž„建导出数据:每个检验参数一行
        List<QualityInspectExportVO> exportList = new ArrayList<>();
        for (QualityInspect inspect : qualityInspects) {
            List<QualityInspectParam> params = paramMap.getOrDefault(inspect.getId(), new ArrayList<>());
            if (params.isEmpty()) {
                // æ²¡æœ‰æ£€éªŒå‚数,也输出一行
                QualityInspectExportVO vo = buildVO(inspect, null, inspectType, true);
                exportList.add(vo);
            } else {
                // æœ‰æ£€éªŒå‚数,每个参数一行,第一行显示基础信息,后续行左侧留空
                boolean isFirst = true;
                for (QualityInspectParam param : params) {
                    QualityInspectExportVO vo = buildVO(inspect, param, inspectType, isFirst);
                    exportList.add(vo);
                    isFirst = false;
                }
            }
        }
        return exportList;
    }
    /**
     * æž„建单行导出数据
     * @param inspect æ£€éªŒè®°å½•
     * @param param æ£€éªŒå‚数(可为null)
     * @param inspectType æ£€éªŒç±»åž‹
     * @param showBaseInfo æ˜¯å¦æ˜¾ç¤ºå·¦ä¾§åŸºç¡€ä¿¡æ¯ï¼ˆåŒä¸€æ£€éªŒè®°å½•的多行,只在第一行显示)
     */
    private QualityInspectExportVO buildVO(QualityInspect inspect, QualityInspectParam param, Integer inspectType, boolean showBaseInfo) {
        QualityInspectExportVO vo = new QualityInspectExportVO();
        // åªæœ‰ç¬¬ä¸€è¡Œæ˜¾ç¤ºå·¦ä¾§åŸºç¡€ä¿¡æ¯ï¼ŒåŽç»­è¡Œç•™ç©º
        if (showBaseInfo) {
            vo.setCheckTime(inspect.getCheckTime());
            vo.setCheckName(inspect.getCheckName());
            vo.setProductName(inspect.getProductName());
            vo.setModel(inspect.getModel());
            vo.setUnit(inspect.getUnit());
            vo.setQuantity(inspect.getQuantity());
            vo.setCheckCompany(inspect.getCheckCompany());
            vo.setCheckResult(inspect.getCheckResult());
            // è®¾ç½®è®¢å•号和供应商/工序
            if (inspectType == 0) {
                vo.setOrderNo(inspect.getPurchaseContractNo());
                vo.setSupplierOrProcess(inspect.getSupplier());
            } else if (inspectType == 1) {
                vo.setOrderNo(inspect.getWorkOrderNo());
                vo.setSupplierOrProcess(inspect.getProcess());
            } else {
                vo.setOrderNo(inspect.getWorkOrderNo());
                vo.setSupplierOrProcess("");
            }
        }
        // è®¾ç½®æ£€éªŒå‚数(每行都要显示)
        if (param != null) {
            vo.setParameterItem(param.getParameterItem());
            vo.setParamUnit(param.getUnit());
            vo.setStandardValue(param.getStandardValue());
            vo.setControlValue(param.getControlValue());
            vo.setTestValue(param.getTestValue());
        }
        return vo;
    }
    /**
     * å¯¼å‡ºExcel
     * @param response å“åº”
     * @param exportList å¯¼å‡ºæ•°æ®
     * @param inspectType æ£€éªŒç±»åž‹
     */
    public void exportExcel(HttpServletResponse response, List<QualityInspectExportVO> exportList, Integer inspectType) {
        try {
            Workbook workbook = new XSSFWorkbook();
            Sheet sheet = workbook.createSheet();
            // åˆ›å»ºæ ·å¼
            CellStyle headerStyle = createHeaderStyle(workbook);
            CellStyle dataStyle = createDataStyle(workbook);
            // æž„建表头
            Row headerRow = sheet.createRow(0);
            String[] headers = {"检测日期", "订单号", "供应商/工序", "检验员", "产品名称", "规格型号", "单位", "数量", "检测单位", "检测结果", "指标", "指标单位", "标准值", "内控值", "检验值"};
            for (int i = 0; i < headers.length; i++) {
                Cell cell = headerRow.createCell(i);
                cell.setCellValue(headers[i]);
                cell.setCellStyle(headerStyle);
            }
            // å¡«å……数据
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            int rowIndex = 1;
            for (QualityInspectExportVO vo : exportList) {
                Row dataRow = sheet.createRow(rowIndex++);
                createCell(dataRow, 0, vo.getCheckTime() != null ? sdf.format(vo.getCheckTime()) : "", dataStyle);
                createCell(dataRow, 1, vo.getOrderNo() != null ? vo.getOrderNo() : "", dataStyle);
                createCell(dataRow, 2, vo.getSupplierOrProcess() != null ? vo.getSupplierOrProcess() : "", dataStyle);
                createCell(dataRow, 3, vo.getCheckName() != null ? vo.getCheckName() : "", dataStyle);
                createCell(dataRow, 4, vo.getProductName() != null ? vo.getProductName() : "", dataStyle);
                createCell(dataRow, 5, vo.getModel() != null ? vo.getModel() : "", dataStyle);
                createCell(dataRow, 6, vo.getUnit() != null ? vo.getUnit() : "", dataStyle);
                createCell(dataRow, 7, vo.getQuantity() != null ? vo.getQuantity().toString() : "", dataStyle);
                createCell(dataRow, 8, vo.getCheckCompany() != null ? vo.getCheckCompany() : "", dataStyle);
                createCell(dataRow, 9, vo.getCheckResult() != null ? vo.getCheckResult() : "", dataStyle);
                createCell(dataRow, 10, vo.getParameterItem() != null ? vo.getParameterItem() : "", dataStyle);
                createCell(dataRow, 11, vo.getParamUnit() != null ? vo.getParamUnit() : "", dataStyle);
                createCell(dataRow, 12, vo.getStandardValue() != null ? vo.getStandardValue() : "", dataStyle);
                createCell(dataRow, 13, vo.getControlValue() != null ? vo.getControlValue() : "", dataStyle);
                createCell(dataRow, 14, vo.getTestValue() != null ? vo.getTestValue() : "", dataStyle);
            }
            // è®¾ç½®åˆ—宽
            for (int i = 0; i < headers.length; i++) {
                sheet.setColumnWidth(i, 15 * 256);
            }
            // å¯¼å‡ºæ–‡ä»¶å
            String fileName = getFileName(inspectType);
            // è¾“出
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
            response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".xlsx", "UTF-8"));
            OutputStream os = response.getOutputStream();
            workbook.write(os);
            os.flush();
            os.close();
            workbook.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("导出失败: " + e.getMessage());
        }
    }
    /**
     * åˆ›å»ºè¡¨å¤´æ ·å¼
     */
    private CellStyle createHeaderStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        style.setAlignment(HorizontalAlignment.CENTER);
        style.setBorderBottom(BorderStyle.THIN);
        style.setBorderTop(BorderStyle.THIN);
        style.setBorderLeft(BorderStyle.THIN);
        style.setBorderRight(BorderStyle.THIN);
        Font font = workbook.createFont();
        font.setBold(true);
        style.setFont(font);
        return style;
    }
    /**
     * åˆ›å»ºæ•°æ®æ ·å¼
     */
    private CellStyle createDataStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER);
        style.setBorderBottom(BorderStyle.THIN);
        style.setBorderTop(BorderStyle.THIN);
        style.setBorderLeft(BorderStyle.THIN);
        style.setBorderRight(BorderStyle.THIN);
        return style;
    }
    /**
     * åˆ›å»ºå•元格并设置值
     */
    private void createCell(Row row, int colIndex, String value, CellStyle style) {
        Cell cell = row.createCell(colIndex);
        cell.setCellValue(value);
        cell.setCellStyle(style);
    }
    /**
     * èŽ·å–å¯¼å‡ºæ–‡ä»¶å
     */
    private String getFileName(Integer inspectType) {
        if (inspectType == null) {
            return "检验导出";
        }
        switch (inspectType) {
            case 0:
                return "原材料检验导出";
            case 1:
                return "过程检验导出";
            case 2:
                return "出厂检验导出";
            default:
                return "检验导出";
        }
    }
}
src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -9,25 +9,24 @@
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.utils.HackLoopTableRenderPolicy;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.procurementrecord.service.ProcurementRecordService;
import com.ruoyi.procurementrecord.utils.StockUtils;
import com.ruoyi.quality.dto.QualityInspectDto;
import com.ruoyi.quality.dto.QualityInspectExportDTO;
import com.ruoyi.quality.dto.QualityInspectExportVO;
import com.ruoyi.quality.mapper.QualityInspectMapper;
import com.ruoyi.quality.mapper.QualityTestStandardMapper;
import com.ruoyi.quality.mapper.QualityUnqualifiedMapper;
import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.quality.pojo.QualityInspectParam;
import com.ruoyi.quality.pojo.QualityUnqualified;
import com.ruoyi.quality.service.IQualityInspectParamService;
import com.ruoyi.quality.service.IQualityInspectService;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
@@ -47,13 +46,9 @@
    private IQualityInspectParamService qualityInspectParamService;
    private QualityTestStandardMapper qualityTestStandardMapper;
    private QualityUnqualifiedMapper qualityUnqualifiedMapper;
    private SalesLedgerProductMapper salesLedgerProductMapper;
    private ProcurementRecordService procurementRecordService;
    private QualityInspectExportHandle qualityInspectExportHandle;
    @Override
    public int add(QualityInspectDto qualityInspectDto) {
@@ -78,15 +73,12 @@
        return qualityInspectDto;
    }
    //提交
    @Override
    public int submit(QualityInspect inspect) {
        QualityInspect qualityInspect = qualityInspectMapper.selectById(inspect.getId());
        //提交前必须判断是否合格
        if (ObjectUtils.isNull(qualityInspect.getCheckResult())) {
            throw new RuntimeException("请先判断是否合格");
        }
        /*判断不合格*/
        if (qualityInspect.getCheckResult().equals("不合格")) {
            QualityUnqualified qualityUnqualified = new QualityUnqualified();
            BeanUtils.copyProperties(qualityInspect, qualityUnqualified);
@@ -104,7 +96,6 @@
        return qualityInspectMapper.updateById(qualityInspect);
    }
    /*生成检验报告*/
    @Override
    public void down(HttpServletResponse response, QualityInspect qualityInspect) {
        QualityInspect inspect = qualityInspectMapper.selectById(qualityInspect.getId());
@@ -140,11 +131,9 @@
        try {
            response.setContentType("application/msword");
            String fileName = URLEncoder.encode(
                    "检验报告", "UTF-8");
            String fileName = URLEncoder.encode("检验报告", "UTF-8");
            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
            response.setHeader("Content-disposition",
                    "attachment;filename=" + fileName + ".docx");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".docx");
            OutputStream os = response.getOutputStream();
            template.write(os);
            os.flush();
@@ -190,8 +179,25 @@
                util.exportExcel(response, qualityInspects, "出厂检验导出");
                break;
        }
    }
    /**
     * å¯¼å‡ºæ£€éªŒè®°å½•(支持选中导出和全部导出,包含检验参数)
     * æ¯ä¸ªæ£€éªŒå‚数一行(一个检验记录展开成多行)
     */
    @Override
    public void qualityInspectExportNew(HttpServletResponse response, QualityInspectExportDTO exportDTO) {
        // 1. æŸ¥è¯¢æ£€éªŒè®°å½•
        List<QualityInspect> qualityInspects = qualityInspectExportHandle.queryInspectList(exportDTO);
        if (CollectionUtils.isEmpty(qualityInspects)) {
            throw new RuntimeException("没有可导出的数据");
        }
        // 2. æž„建导出数据(每个检验参数一行)
        List<QualityInspectExportVO> exportList = qualityInspectExportHandle.buildExportData(qualityInspects, exportDTO.getInspectType());
        // 3. å¯¼å‡ºExcel
        qualityInspectExportHandle.exportExcel(response, exportList, exportDTO.getInspectType());
    }
}
src/main/resources/mapper/quality/QualityInspectMapper.xml
@@ -66,6 +66,52 @@
        </if>
    </select>
    <select id="qualityInspectExportByIds" resultType="com.ruoyi.quality.pojo.QualityInspect">
        SELECT
        qi.*,
        <choose>
            <when test="qualityInspect.inspectType == 0">
                pl.purchase_contract_number as purchase_contract_no
            </when>
            <otherwise>
                pwo.work_order_no
            </otherwise>
        </choose>
        FROM quality_inspect qi
        <choose>
            <when test="qualityInspect.inspectType == 0">
                LEFT JOIN purchase_ledger pl ON pl.id = qi.purchase_ledger_id
            </when>
            <otherwise>
                LEFT JOIN production_product_main ppm ON qi.product_main_id = ppm.id
                LEFT JOIN product_work_order pwo ON ppm.work_order_id = pwo.id
            </otherwise>
        </choose>
        WHERE qi.inspect_type=#{qualityInspect.inspectType}
        <if test="ids != null and ids.size() > 0">
            AND qi.id IN
            <foreach collection="ids" item="id" open="(" separator="," close=")">
                #{id}
            </foreach>
        </if>
        <if test="qualityInspect.supplier != null and qualityInspect.supplier != '' ">
            AND qi.supplier like concat('%',#{qualityInspect.supplier},'%')
        </if>
        <if test="qualityInspect.process != null and qualityInspect.process != '' ">
            AND qi.process like concat('%',#{qualityInspect.process},'%')
        </if>
        <if test="qualityInspect.productName != null and qualityInspect.productName != '' ">
            AND qi.product_name like concat('%',#{qualityInspect.productName},'%')
        </if>
        <if test="qualityInspect.entryDateStart != null and qualityInspect.entryDateStart != '' ">
            AND qi.check_time &gt;= DATE_FORMAT(#{qualityInspect.entryDateStart},'%Y-%m-d')
        </if>
        <if test="qualityInspect.entryDateEnd != null and qualityInspect.entryDateEnd != '' ">
            AND qi.check_time &lt;= DATE_FORMAT(#{qualityInspect.entryDateEnd},'%Y-%m-d')
        </if>
        ORDER BY qi.check_time DESC
    </select>
    <delete id="deleteByProductMainIds">
        DELETE FROM quality_inspect
        WHERE product_main_id IN