package com.ruoyi.quality.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; 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.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; 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.production.dto.ProductMaterialSkuDto; import com.ruoyi.production.dto.ProductionProductRouteItemParamDto; import com.ruoyi.production.mapper.ProductOrderMapper; import com.ruoyi.production.mapper.ProductionProductRouteItemMapper; import com.ruoyi.production.mapper.ProductionProductRouteItemParamMapper; import com.ruoyi.production.pojo.ProductionProductInput; import com.ruoyi.production.pojo.ProductionProductRouteItemParam; import com.ruoyi.production.service.ProductBomService; import com.ruoyi.production.service.ProductMaterialService; import com.ruoyi.production.service.ProductionProductInputService; import com.ruoyi.quality.dto.FinishedPageDto; import com.ruoyi.quality.dto.FinishedRatioDto; import com.ruoyi.quality.dto.ProcessPageDto; import com.ruoyi.quality.dto.QualityInspectDto; 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 javax.servlet.http.HttpServletResponse; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; @AllArgsConstructor @Service @Transactional(rollbackFor = Exception.class) public class QualityInspectServiceImpl extends ServiceImpl implements IQualityInspectService { private final StockUtils stockUtils; private final QualityInspectMapper qualityInspectMapper; private final IQualityInspectParamService qualityInspectParamService; private final QualityTestStandardMapper qualityTestStandardMapper; private final QualityUnqualifiedMapper qualityUnqualifiedMapper; private final SalesLedgerProductMapper salesLedgerProductMapper; private final ProcurementRecordService procurementRecordService; private final ProductionProductRouteItemMapper productionProductRouteItemMapper; private final ProductionProductRouteItemParamMapper productionProductRouteItemParamMapper; private final ProductOrderMapper productOrderMapper; private final ProductionProductInputService productionProductInputService; private final ProductMaterialService productMaterialService; private final ProductBomService productBomService; @Override public int add(QualityInspectDto qualityInspectDto) { QualityInspect qualityInspect = new QualityInspect(); BeanUtils.copyProperties(qualityInspectDto, qualityInspect); qualityInspect.setInspectState(0);//默认未提交 qualityInspectMapper.insert(qualityInspect); for (QualityInspectParam qualityInspectParam : qualityInspectDto.getQualityInspectParams()) { qualityInspectParam.setInspectId(qualityInspect.getId()); } qualityInspectParamService.saveBatch(qualityInspectDto.getQualityInspectParams()); return 0; } @Override public QualityInspectDto getDetailById(Integer id) { QualityInspect qualityInspect = qualityInspectMapper.selectById(id); List qualityInspectParams = qualityInspectParamService.list(Wrappers.lambdaQuery().eq(QualityInspectParam::getInspectId, id)); QualityInspectDto qualityInspectDto = new QualityInspectDto(); BeanUtils.copyProperties(qualityInspect, qualityInspectDto); qualityInspectDto.setQualityInspectParams(qualityInspectParams); 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); qualityUnqualified.setInspectState(0);//待处理 List inspectParams = qualityInspectParamService.list(Wrappers.lambdaQuery().eq(QualityInspectParam::getInspectId, inspect.getId())); String text = inspectParams.stream().map(QualityInspectParam::getParameterItem).collect(Collectors.joining(",")); qualityUnqualified.setDefectivePhenomena(text + "这些指标中存在不合格");//不合格现象 qualityUnqualified.setInspectId(qualityInspect.getId()); qualityUnqualifiedMapper.insert(qualityUnqualified); } else { //合格直接入库 stockUtils.addStock(qualityInspect.getProductModelId(), qualityInspect.getQuantity(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(), qualityInspect.getId()); } qualityInspect.setInspectState(1);//已提交 return qualityInspectMapper.updateById(qualityInspect); } /*生成检验报告*/ @Override public void down(HttpServletResponse response, QualityInspect qualityInspect) { QualityInspect inspect = qualityInspectMapper.selectById(qualityInspect.getId()); String inspectType = ""; switch (inspect.getInspectType()) { case 0: inspectType = "原材料检验"; break; case 1: inspectType = "过程检验"; break; case 2: inspectType = "出厂检验"; break; } List paramList = qualityInspectParamService.list(Wrappers.lambdaQuery().eq(QualityInspectParam::getInspectId, inspect.getId())); int index = 1; for (QualityInspectParam detail : paramList) { detail.setIndex(index); index++; } InputStream inputStream = this.getClass().getResourceAsStream("/static/report-template.docx"); Configure configure = Configure.builder() .bind("paramList", new HackLoopTableRenderPolicy()) .build(); String finalInspectType = inspectType; XWPFTemplate template = XWPFTemplate.compile(inputStream, configure).render( new HashMap() {{ put("inspect", inspect); put("inspectType", finalInspectType); put("paramList", paramList); }}); try { response.setContentType("application/msword"); String fileName = URLEncoder.encode( "检验报告", "UTF-8"); response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".docx"); OutputStream os = response.getOutputStream(); template.write(os); os.flush(); os.close(); inputStream.close(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("导出失败"); } } @Override public IPage processPage(Page page, ProcessPageDto processPageDto) { return productionProductRouteItemMapper.processPage(page,processPageDto); } @Override public List processDetails(ProcessPageDto processPageDto) { List resultList = new ArrayList<>(); // 1. 查询普通参数 List paramList = productionProductRouteItemParamMapper.processDetails(processPageDto.getProductionProductRouteItemId()); if (paramList != null && !paramList.isEmpty()) { resultList.addAll(paramList.stream().map(param -> { ProductionProductRouteItemParamDto dto = new ProductionProductRouteItemParamDto(); BeanUtils.copyProperties(param, dto); return dto; }).collect(Collectors.toList())); } // 2. 查询物料投入 // 注意:成品检的时候可能没有具体单条报工记录ID,所以成品检详情可能需要按订单查询, // 但这里的processDetails是“过程检详情”,通常有具体报工记录。 // 根据报工记录 ID 查找对应的 ProductMainId Long routeItemId = processPageDto.getProductionProductRouteItemId(); if (routeItemId != null) { List inputList = productionProductInputService.list(Wrappers.lambdaQuery() .eq(ProductionProductInput::getRouteItemId, routeItemId)); if (inputList != null && !inputList.isEmpty()) { for (ProductionProductInput input : inputList) { ProductionProductRouteItemParamDto dto = new ProductionProductRouteItemParamDto(); dto.setProductId(input.getProductId()); dto.setBomId(input.getBomId()); dto.setQuantity(input.getQuantity()); dto.setProductValue(input.getQuantity()); dto.setUnit(input.getUnit()); // 填充物料信息 ProductMaterialSkuDto materialSkuDto = productMaterialService.selectProductByModelId(input.getProductId()); if (materialSkuDto != null) { dto.setParamName(materialSkuDto.getProductName()); dto.setProductName(materialSkuDto.getProductName()); dto.setModel(materialSkuDto.getModel()); dto.setMaterialCode(materialSkuDto.getMaterialCode()); } String strength = productBomService.strengthById(input.getBomId()); dto.setStrength(strength); resultList.add(dto); } } } return resultList; } @Override public IPage finishedPage(Page page, FinishedPageDto finishedPageDto) { return productOrderMapper.finishedPage(page,finishedPageDto); } @Override public List finishedRatio(FinishedPageDto finishedPageDto) { return productOrderMapper.finishedRatio(finishedPageDto.getProductOrderId()); } @Override public int updateQualityInspect(QualityInspectDto qualityInspectDto) { if (ObjectUtils.isNotNull(qualityInspectDto.getQualityInspectParams())) { qualityInspectParamService.remove(Wrappers.lambdaQuery().eq(QualityInspectParam::getInspectId, qualityInspectDto.getId())); for (QualityInspectParam qualityInspectParam : qualityInspectDto.getQualityInspectParams()) { qualityInspectParam.setInspectId(qualityInspectDto.getId()); } qualityInspectParamService.saveBatch(qualityInspectDto.getQualityInspectParams()); } QualityInspect qualityInspect = new QualityInspect(); BeanUtils.copyProperties(qualityInspectDto, qualityInspect); return qualityInspectMapper.updateById(qualityInspect); } @Override public IPage qualityInspectListPage(Page page, QualityInspect qualityInspect) { return qualityInspectMapper.qualityInspectListPage(page, qualityInspect); } @Override public void qualityInspectExport(HttpServletResponse response, QualityInspect qualityInspect) { List qualityInspects = qualityInspectMapper.qualityInspectExport(qualityInspect); ExcelUtil util = new ExcelUtil(QualityInspect.class); switch (qualityInspect.getInspectType()) { case 0: util.exportExcel(response, qualityInspects, "原材料检验导出"); break; case 1: util.exportExcel(response, qualityInspects, "过程检验导出"); break; case 2: util.exportExcel(response, qualityInspects, "出厂检验导出"); break; } } }