From f5fec3e27510969ee9f2fc89d2e1e2868d25f1f1 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 22 四月 2026 09:36:14 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_New_pro' into dev_New_pro
---
src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java | 267 ++++++++++++++++++++++++++++++++++-------------------
1 files changed, 171 insertions(+), 96 deletions(-)
diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
index f2e615d..876d68e 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
@@ -1,53 +1,56 @@
package com.ruoyi.quality.service.impl;
-
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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.ruoyi.common.enums.StockRecordTypeEnum;
+import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
+import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.procurementrecord.utils.StockUtils;
-import com.ruoyi.production.mapper.ProductProcessRouteItemMapper;
-import com.ruoyi.production.mapper.ProductProcessRouteMapper;
-import com.ruoyi.production.mapper.ProductWorkOrderMapper;
+import com.ruoyi.production.mapper.ProductionOperationTaskMapper;
+import com.ruoyi.production.mapper.ProductionOrderMapper;
+import com.ruoyi.production.mapper.ProductionOrderRoutingMapper;
+import com.ruoyi.production.mapper.ProductionOrderRoutingOperationMapper;
import com.ruoyi.production.mapper.ProductionProductMainMapper;
-import com.ruoyi.production.pojo.*;
-import com.ruoyi.production.service.ProductOrderService;
-import com.ruoyi.quality.mapper.QualityInspectMapper;
+import com.ruoyi.production.pojo.ProductionOperationTask;
+import com.ruoyi.production.pojo.ProductionOrder;
+import com.ruoyi.production.pojo.ProductionOrderRouting;
+import com.ruoyi.production.pojo.ProductionOrderRoutingOperation;
+import com.ruoyi.production.pojo.ProductionProductMain;
import com.ruoyi.quality.mapper.QualityUnqualifiedMapper;
import com.ruoyi.quality.pojo.QualityInspect;
-import com.ruoyi.quality.pojo.QualityTestStandard;
import com.ruoyi.quality.pojo.QualityUnqualified;
import com.ruoyi.quality.service.IQualityInspectService;
import com.ruoyi.quality.service.IQualityUnqualifiedService;
-import com.ruoyi.stock.dto.StockUninventoryDto;
import com.ruoyi.stock.service.StockUninventoryService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
@AllArgsConstructor
@Service
public class QualityUnqualifiedServiceImpl extends ServiceImpl<QualityUnqualifiedMapper, QualityUnqualified> implements IQualityUnqualifiedService {
private final StockUtils stockUtils;
- private QualityUnqualifiedMapper qualityUnqualifiedMapper;
- private IQualityInspectService qualityInspectService;
- private ProductOrderService productOrderService;
- private ProductionProductMainMapper productionProductMainMapper;
- private ProductProcessRouteMapper productProcessRouteMapper;
- private ProductProcessRouteItemMapper productProcessRouteItemMapper;
- private ProductWorkOrderMapper productWorkOrderMapper;
- private StockUninventoryService stockUninventoryService;
+ private final QualityUnqualifiedMapper qualityUnqualifiedMapper;
+ private final IQualityInspectService qualityInspectService;
+ private final ProductionProductMainMapper productionProductMainMapper;
+ private final ProductionOrderMapper productionOrderMapper;
+ private final ProductionOrderRoutingMapper productionOrderRoutingMapper;
+ private final ProductionOrderRoutingOperationMapper productionOrderRoutingOperationMapper;
+ private final ProductionOperationTaskMapper productionOperationTaskMapper;
+ private final StockUninventoryService stockUninventoryService;
@Override
public IPage<QualityUnqualified> qualityUnqualifiedListPage(Page page, QualityUnqualified qualityUnqualified) {
@@ -57,7 +60,7 @@
@Override
public void qualityUnqualifiedExport(HttpServletResponse response, QualityUnqualified qualityUnqualified) {
List<QualityUnqualified> qualityUnqualifieds = qualityUnqualifiedMapper.qualityUnqualifiedExport(qualityUnqualified);
- ExcelUtil<QualityUnqualified> util = new ExcelUtil<QualityUnqualified>(QualityUnqualified.class);
+ ExcelUtil<QualityUnqualified> util = new ExcelUtil<>(QualityUnqualified.class);
util.exportExcel(response, qualityUnqualifieds, "涓嶅悎鏍肩鐞嗗鍑�");
}
@@ -65,84 +68,156 @@
public int deal(QualityUnqualified qualityUnqualified) {
QualityUnqualified unqualified = qualityUnqualifiedMapper.selectById(qualityUnqualified.getId());
QualityInspect qualityInspect = qualityInspectService.getById(unqualified.getInspectId());
- switch (qualityUnqualified.getDealResult()) {
- case "杩斾慨":
- case "杩斿伐":
- //鍒ゆ柇璐ㄦ琛ㄦ槸鍚︽湁鐩稿叧鐨勬姤宸d,濡傛灉鏈夋姤宸d,閭d箞杩斿伐闇�瑕侀噸鏂板垱寤虹敓浜ц鍗曢噸鏂扮敓浜�
- if (ObjectUtils.isNotNull(qualityInspect.getProductMainId())) {
- //杩斿伐闇�瑕侀噸鏂板垱寤虹敓浜ц鍗曢噸鏂扮敓浜�
- ProductOrder productOrder = productionProductMainMapper.getOrderByMainId(qualityInspect.getProductMainId());
- ProductOrder order = new ProductOrder();
- BeanUtils.copyProperties(productOrder, order);
- order.setId(null);
- order.setQuantity(unqualified.getQuantity());
- order.setCompleteQuantity(BigDecimal.ZERO);
- order.setStartTime(null);
- order.setEndTime(null);
- productOrderService.save(order);
- //鏂板鐢熶骇璁㈠崟涓嬬殑宸ヨ壓璺嚎涓昏〃
- ProductProcessRoute productProcessRoute = productProcessRouteMapper.selectList(Wrappers.<ProductProcessRoute>lambdaQuery().eq(ProductProcessRoute::getProductOrderId, productOrder.getId()).orderByDesc(ProductProcessRoute::getId)).get(0);
- ProductProcessRoute newProcessRoute = new ProductProcessRoute();
- BeanUtils.copyProperties(productProcessRoute, newProcessRoute);
- newProcessRoute.setId(null);
- newProcessRoute.setProductOrderId(order.getId());
- productProcessRouteMapper.insert(newProcessRoute);
- //鏂板鐢熶骇璁㈠崟涓嬬殑宸ヨ壓璺嚎瀛愯〃
- List<ProductProcessRouteItem> processRouteItems = productProcessRouteItemMapper.selectList(new QueryWrapper<ProductProcessRouteItem>().lambda().eq(ProductProcessRouteItem::getProductRouteId, productProcessRoute.getId()));
- // 鐢熸垚褰撳墠鏃ユ湡鐨勫墠缂�锛氬勾鏈堟棩
- String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
- for (ProductProcessRouteItem processRouteItem : processRouteItems) {
- ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
- BeanUtils.copyProperties(processRouteItem, productProcessRouteItem);
- productProcessRouteItem.setId(null);
- productProcessRouteItem.setProductRouteId(newProcessRoute.getId());
- int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
- if (insert > 0) {
- // 鏌ヨ浠婃棩宸插瓨鍦ㄧ殑鏈�澶у伐鍗曞彿
- QueryWrapper<ProductWorkOrder> queryWrapper = new QueryWrapper<>();
- queryWrapper.likeRight("work_order_no", datePrefix)
- .orderByDesc("work_order_no")
- .last("LIMIT 1");
- ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectOne(queryWrapper);
- int sequenceNumber = 1; // 榛樿搴忓彿
- if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
- String lastNo = lastWorkOrder.getWorkOrderNo().toString();
- if (lastNo.startsWith(datePrefix)) {
- String seqStr = lastNo.substring(datePrefix.length());
- try {
- sequenceNumber = Integer.parseInt(seqStr) + 1;
- } catch (NumberFormatException e) {
- sequenceNumber = 1;
- }
- }
- }
- // 鐢熸垚瀹屾暣鐨勫伐鍗曞彿
- String workOrderNoStr = String.format("%s%03d", datePrefix, sequenceNumber);
- ProductWorkOrder productWorkOrder = new ProductWorkOrder();
- productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
- productWorkOrder.setProductOrderId(order.getId());
- productWorkOrder.setPlanQuantity(order.getQuantity());
- productWorkOrder.setWorkOrderNo(workOrderNoStr);
- productWorkOrder.setStatus(1);
- productWorkOrderMapper.insert(productWorkOrder);
+ if (ObjectUtils.isNotNull(qualityInspect) && qualityInspect.getInspectType() != 0) {
+ switch (qualityUnqualified.getDealResult()) {
+ case "杩斾慨":
+ case "杩斿伐":
+ if (ObjectUtils.isNotNull(qualityInspect.getProductMainId())) {
+ ProductionProductMain sourceMain = productionProductMainMapper.selectById(qualityInspect.getProductMainId());
+ if (sourceMain == null || sourceMain.getProductionOperationTaskId() == null) {
+ throw new ServiceException("鍘嗗彶鎶ュ伐鏈粦瀹氱敓浜у伐鍗曪紝鏃犳硶鎸夋柊妯″瀷杩斾慨/杩斿伐");
}
+ createReworkProductionByNewModel(sourceMain, unqualified.getQuantity());
}
- }
- break;
- case "鎶ュ簾":
- //璋冪敤涓嶅悎鏍煎簱瀛樻帴鍙� 鍏ヤ笉鍚堟牸搴�
- stockUtils.addUnStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockRecordTypeEnum.DEFECTIVE_SCRAP.getCode(),unqualified.getId());
- break;
- case "璁╂鏀捐":
- //璋冪敤鎻愪氦鍚堟牸鐨勬帴鍙�
- stockUtils.addStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockRecordTypeEnum.DEFECTIVE_PASS.getCode(),unqualified.getId());
- qualityInspect.setCheckResult("鍚堟牸");
- qualityInspectService.submit(qualityInspect);
- break;
- default:
- break;
+ break;
+ case "鎶ュ簾":
+ stockUtils.addUnStock(qualityInspect.getProductModelId(), unqualified.getQuantity(),
+ StockInUnQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId());
+ break;
+ case "璁╂鏀捐":
+ stockUtils.addStock(qualityInspect.getProductModelId(), unqualified.getQuantity(),
+ StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId());
+ break;
+ default:
+ break;
+ }
+ } else {
+ Long modelId = qualityUnqualifiedMapper.getModelId(qualityUnqualified.getProductName(), qualityUnqualified.getModel());
+ switch (qualityUnqualified.getDealResult()) {
+ case "鎶ュ簾":
+ stockUtils.addUnStock(modelId, unqualified.getQuantity(),
+ StockInUnQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId());
+ break;
+ case "璁╂鏀捐":
+ stockUtils.addStock(modelId, unqualified.getQuantity(),
+ StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId());
+ break;
+ default:
+ break;
+ }
}
- qualityUnqualified.setInspectState(1);//宸插鐞�
+ qualityUnqualified.setInspectState(1);
return qualityUnqualifiedMapper.updateById(qualityUnqualified);
}
+
+ @Override
+ public QualityUnqualified getUnqualified(Integer id) {
+ return qualityUnqualifiedMapper.getUnqualified(id);
+ }
+
+ private void createReworkProductionByNewModel(ProductionProductMain sourceMain, BigDecimal quantity) {
+ ProductionOperationTask sourceTask = productionOperationTaskMapper.selectById(sourceMain.getProductionOperationTaskId());
+ if (sourceTask == null) {
+ throw new ServiceException("鍏宠仈鐨勭敓浜у伐鍗曚笉瀛樺湪");
+ }
+ ProductionOrder sourceOrder = productionOrderMapper.selectById(sourceTask.getProductionOrderId());
+ if (sourceOrder == null) {
+ throw new ServiceException("鍏宠仈鐨勭敓浜ц鍗曚笉瀛樺湪");
+ }
+
+ ProductionOrder newOrder = new ProductionOrder();
+ BeanUtils.copyProperties(sourceOrder, newOrder);
+ newOrder.setId(null);
+ newOrder.setNpsNo(generateNextProductionOrderNo("FG"));
+ newOrder.setQuantity(defaultDecimal(quantity));
+ newOrder.setCompleteQuantity(BigDecimal.ZERO);
+ newOrder.setStartTime(null);
+ newOrder.setEndTime(null);
+ newOrder.setCreateTime(null);
+ newOrder.setUpdateTime(null);
+ productionOrderMapper.insert(newOrder);
+
+ Map<Long, Long> routingIdMap = new HashMap<>();
+ List<ProductionOrderRouting> sourceRoutings = productionOrderRoutingMapper.selectList(
+ Wrappers.<ProductionOrderRouting>lambdaQuery()
+ .eq(ProductionOrderRouting::getProductionOrderId, sourceOrder.getId())
+ .orderByAsc(ProductionOrderRouting::getId));
+ for (ProductionOrderRouting sourceRouting : sourceRoutings) {
+ ProductionOrderRouting newRouting = new ProductionOrderRouting();
+ BeanUtils.copyProperties(sourceRouting, newRouting);
+ newRouting.setId(null);
+ newRouting.setProductionOrderId(newOrder.getId());
+ newRouting.setCreateTime(null);
+ newRouting.setUpdateTime(null);
+ productionOrderRoutingMapper.insert(newRouting);
+ routingIdMap.put(sourceRouting.getId(), newRouting.getId());
+ }
+
+ List<ProductionOrderRoutingOperation> sourceOperations = productionOrderRoutingOperationMapper.selectList(
+ Wrappers.<ProductionOrderRoutingOperation>lambdaQuery()
+ .eq(ProductionOrderRoutingOperation::getProductionOrderId, sourceOrder.getId())
+ .orderByAsc(ProductionOrderRoutingOperation::getDragSort)
+ .orderByAsc(ProductionOrderRoutingOperation::getId));
+ for (ProductionOrderRoutingOperation sourceOperation : sourceOperations) {
+ ProductionOrderRoutingOperation newOperation = new ProductionOrderRoutingOperation();
+ BeanUtils.copyProperties(sourceOperation, newOperation);
+ newOperation.setId(null);
+ newOperation.setProductionOrderId(newOrder.getId());
+ newOperation.setTechnologyRoutingId(routingIdMap.get(sourceOperation.getTechnologyRoutingId()));
+ newOperation.setCreateTime(null);
+ newOperation.setUpdateTime(null);
+ productionOrderRoutingOperationMapper.insert(newOperation);
+
+ ProductionOperationTask newTask = new ProductionOperationTask();
+ newTask.setTechnologyRoutingOperationId(newOperation.getId());
+ newTask.setProductionOrderId(newOrder.getId());
+ newTask.setPlanQuantity(newOrder.getQuantity());
+ newTask.setCompleteQuantity(BigDecimal.ZERO);
+ newTask.setWorkOrderNo(generateNextTaskNo("FG"));
+ newTask.setStatus(1);
+ productionOperationTaskMapper.insert(newTask);
+ }
+ }
+
+ private String generateNextProductionOrderNo(String prefix) {
+ String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+ String orderPrefix = prefix + datePrefix;
+ ProductionOrder latestOrder = productionOrderMapper.selectOne(
+ Wrappers.<ProductionOrder>lambdaQuery()
+ .likeRight(ProductionOrder::getNpsNo, orderPrefix)
+ .orderByDesc(ProductionOrder::getNpsNo)
+ .last("limit 1"));
+ int sequence = 1;
+ if (latestOrder != null && latestOrder.getNpsNo() != null && latestOrder.getNpsNo().startsWith(orderPrefix)) {
+ try {
+ sequence = Integer.parseInt(latestOrder.getNpsNo().substring(orderPrefix.length())) + 1;
+ } catch (NumberFormatException ignored) {
+ sequence = 1;
+ }
+ }
+ return orderPrefix + String.format("%04d", sequence);
+ }
+
+ private String generateNextTaskNo(String prefix) {
+ String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+ String taskPrefix = prefix + datePrefix;
+ ProductionOperationTask latestTask = productionOperationTaskMapper.selectOne(
+ Wrappers.<ProductionOperationTask>lambdaQuery()
+ .likeRight(ProductionOperationTask::getWorkOrderNo, taskPrefix)
+ .orderByDesc(ProductionOperationTask::getWorkOrderNo)
+ .last("limit 1"));
+ int sequence = 1;
+ if (latestTask != null && latestTask.getWorkOrderNo() != null && latestTask.getWorkOrderNo().startsWith(taskPrefix)) {
+ try {
+ sequence = Integer.parseInt(latestTask.getWorkOrderNo().substring(taskPrefix.length())) + 1;
+ } catch (NumberFormatException ignored) {
+ sequence = 1;
+ }
+ }
+ return taskPrefix + String.format("%03d", sequence);
+ }
+
+ private BigDecimal defaultDecimal(BigDecimal value) {
+ return value == null ? BigDecimal.ZERO : value;
+ }
}
--
Gitblit v1.9.3