From e3b3fd13ae3afcfbe5c03ef7249a92a093bd1831 Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期三, 27 五月 2026 15:34:23 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_天津_阳光彩印' into dev_天津_阳光彩印
---
src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java | 42 ++-
src/main/resources/mapper/production/ProductWorkOrderMapper.xml | 5
src/main/java/com/ruoyi/quality/dto/QualityInspectExportVO.java | 90 ++++++++
src/main/java/com/ruoyi/production/dto/ProcessRouteAnticlockwiseDto.java | 3
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java | 2
src/main/java/com/ruoyi/quality/service/IQualityInspectService.java | 8
src/main/java/com/ruoyi/quality/mapper/QualityInspectMapper.java | 5
src/main/java/com/ruoyi/quality/service/impl/QualityInspectExportHandle.java | 277 +++++++++++++++++++++++++
src/main/resources/mapper/quality/QualityInspectMapper.xml | 46 ++++
src/main/java/com/ruoyi/quality/controller/QualityInspectController.java | 15 +
src/main/java/com/ruoyi/production/service/impl/ProductionPrintOrderServiceImpl.java | 12 +
src/main/java/com/ruoyi/quality/dto/QualityInspectExportDTO.java | 49 ++++
src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java | 75 ++++--
src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java | 11
14 files changed, 583 insertions(+), 57 deletions(-)
diff --git a/src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java
index fdf2dd3..946f610 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java
+++ b/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 鎸塸arentId鍒嗙粍鐨刴ap
+ * @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();
diff --git a/src/main/java/com/ruoyi/production/dto/ProcessRouteAnticlockwiseDto.java b/src/main/java/com/ruoyi/production/dto/ProcessRouteAnticlockwiseDto.java
index bae81b1..655d182 100644
--- a/src/main/java/com/ruoyi/production/dto/ProcessRouteAnticlockwiseDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProcessRouteAnticlockwiseDto.java
@@ -1,5 +1,6 @@
package com.ruoyi.production.dto;
+import com.ruoyi.production.pojo.ProductProcess;
import lombok.Data;
@Data
@@ -27,4 +28,6 @@
private Long deviceId;
private String uuid;
+
+ private ProductProcess productProcess;;
}
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
index ab8fae4..9c40694 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
@@ -113,7 +113,7 @@
ProductProcessRoute productProcessRoute = createProductProcessRoute(productModelId, productOrderId, productBom.getId(), processRoute.getProcessRouteCode());
// 6. 鏂板鐢熶骇宸ヨ壓璺嚎瀛愯〃
- buildProductProcessRouteItems(processRouteAnticlockwiseDtos, productProcessRoute.getId(), productModelId,productOrderId);
+ buildProductProcessRouteItems(processRouteAnticlockwiseDtos, productProcessRoute.getId(), productModelId, productOrderId);
return processRoute.getId();
}
@@ -163,7 +163,7 @@
processRoute.setDescription("");
this.save(processRoute);
- processRoute.setProcessRouteCode("GYLX." + String.format("%05d", processRoute.getId()));
+ processRoute.setProcessRouteCode("GYLX." + String.format("%09d", processRoute.getId()));
this.updateById(processRoute);
return processRoute;
@@ -208,20 +208,21 @@
/**
* 鏋勫缓鐢熶骇宸ヨ壓璺嚎瀛愰」鍒楄〃
*/
- private void buildProductProcessRouteItems(List<ProcessRouteAnticlockwiseDto> dtos, Long productRouteId, Long productModelId,Long productOrderId) {
+ private void buildProductProcessRouteItems(List<ProcessRouteAnticlockwiseDto> dtos, Long productRouteId, Long productModelId, Long productOrderId) {
ProductOrder byId = productOrderService.getById(productOrderId);
Integer num = 0;
for (ProcessRouteAnticlockwiseDto dto : dtos) {
ProductProcessRouteItem item = new ProductProcessRouteItem();
item.setProductRouteId(productRouteId);
item.setProcessId(dto.getProcessId());
- item.setProductModelId(dto.getProductModelId());
+ item.setProductModelId(productModelId);
item.setProcessRouteName(dto.getProcessRouteName());
item.setProcessRouteOpenNum(dto.getProcessRouteOpenNum());
item.setProcessRouteNum(dto.getProcessRouteNum());
item.setProcessRouteAddNum(dto.getProcessRouteAddNum());
item.setProcessRouteRequire(dto.getProcessRouteRequire());
item.setDragSort(num++);
+ item.setIsQuality(dto.getProductProcess().getIsQuality() != null && dto.getProductProcess().getIsQuality());
item.setUuid(dto.getUuid());
productProcessRouteItemService.save(item);
ProductProcess productProcess = productProcessService.getById(item.getProcessId());
@@ -233,7 +234,7 @@
productWorkOrder.setDeviceId(dto.getDeviceId());
productWorkOrder.setUserIds(dto.getUserIds());
productWorkOrder.setUserNames(dto.getUserNames());
- productWorkOrder.setWorkOrderNo(productWorkOrderService.generateProductWorkOrder( productProcess.getName(), byId.getNpsNo()));
+ productWorkOrder.setWorkOrderNo(productWorkOrderService.generateProductWorkOrder(productProcess.getName(), byId.getNpsNo()));
productWorkOrder.setStatus(1);
productWorkOrderService.save(productWorkOrder);
}
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionPrintOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionPrintOrderServiceImpl.java
index c97b22b..a859165 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionPrintOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionPrintOrderServiceImpl.java
@@ -20,6 +20,7 @@
import com.ruoyi.production.pojo.*;
import com.ruoyi.production.service.ProductBomService;
import com.ruoyi.production.service.ProductProcessRouteService;
+import com.ruoyi.production.service.ProductProcessService;
import com.ruoyi.production.service.ProductionPrintOrderService;
import lombok.RequiredArgsConstructor;
import org.jetbrains.annotations.Nullable;
@@ -29,6 +30,7 @@
import java.io.File;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
import java.util.stream.Collectors;
/**
@@ -51,11 +53,15 @@
private final ProductBomService productBomService;
private final CustomerFollowUpFileService customerFollowUpFileService;
+ private final ProductProcessMapper productProcessMapper;
+ private final ProductProcessService productProcessService;
+
@Override
@Transactional
public void save(SaveProductionPrintOrderDto dto) {
+ Assert.isFalse(CollUtil.isEmpty(dto.getProcessContent()),"鎯呰嚦灏戞坊鍔犱竴鏉″伐搴忎俊鎭�");
ProductionPrintOrder productionPrintOrder = BeanUtil.copyProperties(dto, ProductionPrintOrder.class);
- if(dto.getId() != null){
+ if(dto.getProductOrderId() != null){
// 鍏堝垹闄ょ敓浜у伐鍗曟暟鎹�
LambdaQueryWrapper<ProductWorkOrder> l1 = new LambdaQueryWrapper<>();
l1.eq(ProductWorkOrder::getProductOrderId,dto.getProductOrderId());
@@ -79,6 +85,9 @@
});
MaterialInfoDto materialInfoDtoFirst = dto.getMaterialInfo().get(0);
// 璋冪敤宸ュ簭鏂瑰 鍑芥暟
+ // 鏌ヨ宸ュ簭淇℃伅
+ List<Long> processIds = dto.getProcessContent().stream().map(ProcessContentDto::getProcessId).collect(Collectors.toList());
+ Map<Long, ProductProcess> productProcessMap = productProcessService.listByIds(processIds).stream().collect(Collectors.toMap(ProductProcess::getId, productProcess -> productProcess));
List<ProcessRouteAnticlockwiseDto> processRouteAnticlockwiseDtos = processContentDtoList.stream().map(it -> {
ProcessRouteAnticlockwiseDto pdto = new ProcessRouteAnticlockwiseDto();
pdto.setProcessId(it.getProcessId());
@@ -92,6 +101,7 @@
pdto.setUserNames(it.getReportWorkerList().stream().map(SimplePersonDto::getUserName).collect(Collectors.joining(",")));
pdto.setDeviceId(it.getDeviceId());
pdto.setUuid(it.getId());
+ pdto.setProductProcess(productProcessMap.get(it.getProcessId()));
return pdto;
}).collect(Collectors.toList());
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
index 96e4a2e..f5679d3 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -222,7 +222,7 @@
if (ObjectUtils.isNull(productOrder.getStartTime())) {
productOrder.setStartTime(now);//寮�濮嬫椂闂�
}
- if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) {
+ if (productProcessRouteItem.getDragSort() >= productProcessRouteItems.size() -1 ) {
//濡傛灉鏄渶鍚庝竴閬撳伐搴忔姤宸ヤ箣鍚庣敓浜ц鍗曞畬鎴愭暟閲�+
productOrder.setCompleteQuantity(productOrder.getCompleteQuantity().add(productQty));
if (productOrder.getCompleteQuantity().compareTo(productOrder.getQuantity()) >= 0) {
diff --git a/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java b/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
index dec3d1c..8be22da 100644
--- a/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
+++ b/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
diff --git a/src/main/java/com/ruoyi/quality/dto/QualityInspectExportDTO.java b/src/main/java/com/ruoyi/quality/dto/QualityInspectExportDTO.java
new file mode 100644
index 0000000..21266bb
--- /dev/null
+++ b/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;
+
+ /**
+ * 閫変腑鐨処D鍒楄〃锛堜负绌哄垯鍏ㄩ儴瀵煎嚭锛�
+ */
+ private List<Long> ids;
+
+ /**
+ * 渚涘簲鍟嗭紙鍘熸潗鏂欐楠岀瓫閫夛級
+ */
+ private String supplier;
+
+ /**
+ * 宸ュ簭锛堣繃绋嬫楠岀瓫閫夛級
+ */
+ private String process;
+
+ /**
+ * 浜у搧鍚嶇О锛堝嚭鍘傛楠岀瓫閫夛級
+ */
+ private String productName;
+
+ /**
+ * 妫�娴嬫棩鏈熷紑濮�
+ */
+ private String entryDateStart;
+
+ /**
+ * 妫�娴嬫棩鏈熺粨鏉�
+ */
+ private String entryDateEnd;
+}
diff --git a/src/main/java/com/ruoyi/quality/dto/QualityInspectExportVO.java b/src/main/java/com/ruoyi/quality/dto/QualityInspectExportVO.java
new file mode 100644
index 0000000..5a14cd8
--- /dev/null
+++ b/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;
+
+/**
+ * 璐ㄩ噺妫�楠屽鍑烘暟鎹甐O锛堟瘡涓楠屽弬鏁颁竴琛岋級
+ */
+@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;
+}
diff --git a/src/main/java/com/ruoyi/quality/mapper/QualityInspectMapper.java b/src/main/java/com/ruoyi/quality/mapper/QualityInspectMapper.java
index 388ebcc..9f53f6f 100644
--- a/src/main/java/com/ruoyi/quality/mapper/QualityInspectMapper.java
+++ b/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);
diff --git a/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java b/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
index 92bc88f..3078bd1 100644
--- a/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
+++ b/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);
diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectExportHandle.java b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectExportHandle.java
new file mode 100644
index 0000000..6b5a8fe
--- /dev/null
+++ b/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)
+ );
+
+ // 鎸塱nspectId鍒嗙粍
+ 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 "妫�楠屽鍑�";
+ }
+ }
+}
diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
index 45bf8eb..a1bdb1d 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
+++ b/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());
+ }
}
diff --git a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
index 6ed0d27..3a92a65 100644
--- a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -67,7 +67,8 @@
ROUND(pwo.complete_quantity / pwo.plan_quantity * 100, 2) AS completionStatus,
sum(ppo.scrap_qty) scrapQty,
pp.device_id,
- pp.device_name
+ pp.device_name,
+ t8.product_name as final_product_model
FROM
product_work_order pwo
LEFT JOIN product_process_route_item ppri ON ppri.id = pwo.product_process_route_item_id
@@ -77,6 +78,8 @@
LEFT JOIN product_process pp ON pp.id = ppri.process_id
LEFT JOIN product_model pm ON pm.id = ppri.product_model_id
LEFT JOIN product p ON p.id = pm.product_id
+ left join product_model t7 on t7.id = po.product_model_id
+ left join product as t8 on t7.product_id = t8.id
WHERE pwo.id = #{id}
GROUP BY pwo.id, pwo.product_process_route_item_id, pwo.create_time, pwo.update_time, pwo.work_order_no, pwo.plan_start_time, pwo.plan_end_time, pwo.actual_start_time, pwo.actual_end_time, pwo.status, pwo.tenant_id, pwo.plan_quantity, pwo.product_order_id, pwo.complete_quantity,
pp.device_id,
diff --git a/src/main/resources/mapper/quality/QualityInspectMapper.xml b/src/main/resources/mapper/quality/QualityInspectMapper.xml
index 48fb369..a9ebc19 100644
--- a/src/main/resources/mapper/quality/QualityInspectMapper.xml
+++ b/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 >= DATE_FORMAT(#{qualityInspect.entryDateStart},'%Y-%m-d')
+ </if>
+ <if test="qualityInspect.entryDateEnd != null and qualityInspect.entryDateEnd != '' ">
+ AND qi.check_time <= 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
--
Gitblit v1.9.3