From b584d2d89076149ad0e60cb67a3efcacda33b5e1 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期二, 24 三月 2026 14:05:59 +0800
Subject: [PATCH] 实际合格率低于【合格率】时,每个【生产工单】、【生产报工】台账需要标红显示。并发送消息到管理员,内容为:【xxx生产订单,xx工序合格率xx%低于标准xx%】
---
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java | 132 +++++++++++++++++++++++++++++++++++++++----
1 files changed, 118 insertions(+), 14 deletions(-)
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 8138ec2..7a0a9c6 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -24,6 +24,7 @@
import com.ruoyi.production.service.ProductionProductMainService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
+import com.ruoyi.project.system.service.ISysNoticeService;
import com.ruoyi.quality.mapper.*;
import com.ruoyi.quality.pojo.*;
import com.ruoyi.quality.service.IQualityInspectService;
@@ -33,12 +34,11 @@
import com.ruoyi.production.mapper.ProductionProductMainMapper;
import java.math.BigDecimal;
+import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.stream.Collectors;
@Service
@@ -84,6 +84,7 @@
private StockUtils stockUtils;
+ private ISysNoticeService sysNoticeService;
@Override
public IPage<ProductionProductMainDto> listPageProductionProductMainDto(Page page, ProductionProductMainDto productionProductMainDto) {
@@ -98,6 +99,27 @@
ProductProcessRouteItem productProcessRouteItem = productProcessRouteItemMapper.selectById(dto.getProductProcessRouteItemId());
if (productProcessRouteItem == null) {
throw new RuntimeException("宸ヨ壓璺嚎椤逛笉瀛樺湪");
+ }
+ //妫�鏌ヤ笂涓�涓伐搴忔槸鍚﹀凡鎶ュ伐
+ Integer currentDragSort = productProcessRouteItem.getDragSort();
+ if (currentDragSort != null && currentDragSort > 1) {
+ ProductProcessRouteItem previousItem = productProcessRouteItemMapper.selectOne(
+ Wrappers.<ProductProcessRouteItem>lambdaQuery()
+ .eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId())
+ .eq(ProductProcessRouteItem::getDragSort, currentDragSort - 1)
+ );
+
+ if (previousItem != null) {
+ //妫�鏌ヤ笂涓�涓伐搴忔槸鍚︽湁鎶ュ伐璁板綍
+ Long count = productionProductMainMapper.selectCount(
+ Wrappers.<ProductionProductMain>lambdaQuery()
+ .eq(ProductionProductMain::getProductProcessRouteItemId, previousItem.getId())
+ );
+
+ if (count == 0) {
+ throw new RuntimeException("涓婁竴涓伐搴忓皻鏈姤宸ワ紝涓嶈兘杩涜褰撳墠宸ュ簭鎶ュ伐");
+ }
+ }
}
//褰撳墠鍏蜂綋宸ュ簭
ProductProcess productProcess = productProcessMapper.selectById(productProcessRouteItem.getProcessId());
@@ -119,7 +141,6 @@
Object maxNoObj = result.get("maxNo");
if (maxNoObj != null) {
String lastNo = maxNoObj.toString();
- System.out.println("lastNo: " + lastNo);
if (lastNo.startsWith(datePrefix)) {
try {
String seqStr = lastNo.substring(datePrefix.length());
@@ -164,13 +185,30 @@
productionProductOutput.setProductModelId(productProcessRouteItem.getProductModelId());
productionProductOutput.setQuantity(dto.getQuantity() != null ? dto.getQuantity() : BigDecimal.ZERO);
productionProductOutput.setScrapQty(dto.getScrapQty() != null ? dto.getScrapQty() : BigDecimal.ZERO);
+ productionProductOutput.setOtherData(dto.getOtherData() != null ? dto.getOtherData() : "");
productionProductOutputMapper.insert(productionProductOutput);
+
+ ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
+ ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
+
//鍚堟牸鏁伴噺=鎶ュ伐鏁伴噺-鎶ュ簾鏁伴噺
BigDecimal productQty = productionProductOutput.getQuantity().subtract(productionProductOutput.getScrapQty());
+ // 鍚堟牸鐜�=鍚堟牸鏁伴噺/鎶ュ伐鏁伴噺
+ BigDecimal productQtyRate = productQty.divide(productionProductOutput.getQuantity(), 2, RoundingMode.HALF_UP)
+ .multiply(new BigDecimal("100"));
+ // 璇ュ伐搴忕殑鍚堟牸鐜� < 鍚堟牸鐜�
+ if (productQtyRate.compareTo(productProcess.getQualifiedRate()) < 0) {
+ // 鍙戦�侀�氱煡缁欑鐞嗗憳
+ sysNoticeService.simpleNoticeByUser("鎶ュ伐鎻愮ず",
+ String.format("%s鐢熶骇璁㈠崟锛�%s宸ュ簭鍚堟牸鐜�%.2f%%浣庝簬鏍囧噯%.2f%%", productOrder.getNpsNo(), productProcess.getName(), productQtyRate, productProcess.getQualifiedRate()),
+ Arrays.asList(Long.valueOf(1L)),
+ "/productionManagement/productionReporting");
+ }
+
+ List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()));
//鍙湁鍚堟牸鏁伴噺>0鎵嶈兘澧炲姞鐩稿簲鏁版嵁
if (productQty.compareTo(BigDecimal.ZERO) > 0) {
/*鏂板璐ㄦ*/
- List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()));
if (productProcessRouteItem.getIsQuality()) {
//瀵瑰簲鐨勮繃绋嬫鎴栬�呭嚭鍘傛
int inspectType = 1;
@@ -190,6 +228,7 @@
qualityInspect.setProcess(process);
qualityInspect.setInspectState(0);
qualityInspect.setInspectType(inspectType);
+ qualityInspect.setDefectiveQuantity(productionProductOutput.getScrapQty());
qualityInspect.setProductMainId(productionProductMain.getId());
qualityInspect.setProductModelId(productModel.getId());
qualityInspectMapper.insert(qualityInspect);
@@ -209,10 +248,16 @@
}
}else {
//鐩存帴鍏ュ簱
- stockUtils.addStock(productProcessRouteItem.getProductModelId(), productQty, StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
+ //鏈�鍚庝竴閬撳伐搴忎负鎴愬搧
+ if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) {
+ //鎴愬搧瀹℃牳
+ stockUtils.addStock(productProcessRouteItem.getProductModelId(), productQty, StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
+ }else {
+ //鍗婃垚鍝佷笉瀹℃牳
+ stockUtils.addStockNoReview(productProcessRouteItem.getProductModelId(), productQty, StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
+ }
}
/*鏇存柊宸ュ崟鍜岀敓浜ц鍗�*/
- ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
productWorkOrder.setCompleteQuantity(productWorkOrder.getCompleteQuantity().add(productQty));
if (ObjectUtils.isNull(productWorkOrder.getActualStartTime())) {
productWorkOrder.setActualStartTime(LocalDate.now());//瀹為檯寮�濮嬫椂闂�
@@ -222,7 +267,6 @@
}
productWorkOrderMapper.updateById(productWorkOrder);
//鐢熶骇璁㈠崟
- ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
if (ObjectUtils.isNull(productOrder.getStartTime())) {
productOrder.setStartTime(LocalDateTime.now());//寮�濮嬫椂闂�
}
@@ -250,7 +294,11 @@
//濡傛灉鎶ュ簾鏁伴噺>0,闇�瑕佽繘鍏ユ姤搴熺殑搴撳瓨
if (ObjectUtils.isNotEmpty(dto.getScrapQty())) {
if (dto.getScrapQty().compareTo(BigDecimal.ZERO) > 0) {
- stockUtils.addUnStock(productModel.getId(), dto.getScrapQty(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId());
+ if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()){
+ stockUtils.addUnStock(productModel.getId(), dto.getScrapQty(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId());
+ }else {
+ stockUtils.addUnStockNoReview(productModel.getId(), dto.getScrapQty(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId());
+ }
}
}
return true;
@@ -260,10 +308,12 @@
public Boolean removeProductMain(Long id) {
//鍒ゆ柇璇ユ潯鎶ュ伐鏄惁涓嶅悎鏍煎鐞�,濡傛灉涓嶅悎鏍煎鐞嗕簡锛屽垯涓嶅厑璁稿垹闄�
List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(Wrappers.<QualityInspect>lambdaQuery().eq(QualityInspect::getProductMainId, id));
- List<QualityUnqualified> qualityUnqualifieds = qualityUnqualifiedMapper.selectList(Wrappers.<QualityUnqualified>lambdaQuery()
- .in(QualityUnqualified::getInspectId, qualityInspects.stream().map(QualityInspect::getId).collect(Collectors.toList())));
- if (qualityUnqualifieds.size() > 0 && qualityUnqualifieds.get(0).getInspectState()==1) {
- throw new ServiceException("璇ユ潯鎶ュ伐宸茬粡涓嶅悎鏍煎鐞嗕簡锛屼笉鍏佽鍒犻櫎");
+ if (qualityInspects.size() > 0){
+ List<QualityUnqualified> qualityUnqualifieds = qualityUnqualifiedMapper.selectList(Wrappers.<QualityUnqualified>lambdaQuery()
+ .in(QualityUnqualified::getInspectId, qualityInspects.stream().map(QualityInspect::getId).collect(Collectors.toList())));
+ if (qualityUnqualifieds.size() > 0 && qualityUnqualifieds.get(0).getInspectState()==1) {
+ throw new ServiceException("璇ユ潯鎶ュ伐宸茬粡涓嶅悎鏍煎鐞嗕簡锛屼笉鍏佽鍒犻櫎");
+ }
}
ProductionProductMain productionProductMain = productionProductMainMapper.selectById(id);
//璇ユ姤宸ュ搴旂殑宸ヨ壓璺嚎璇︽儏
@@ -339,4 +389,58 @@
public ArrayList<Long> listMain(List<Long> idList) {
return productionProductMainMapper.listMain(idList);
}
-}
+
+ @Override
+ public List<ProductionProductMainDto> getByProductWorkOrderId(Long productWorkOrderId) {
+ List<ProductionProductMainDto> productionProductMainDtos = productionProductMainMapper.getByProductWorkOrderId(productWorkOrderId);
+
+ if (productionProductMainDtos == null || productionProductMainDtos.isEmpty()) {
+ return productionProductMainDtos;
+ }
+
+ // 鏀堕泦鎵�鏈変骇鍝佷富璁板綍ID
+ List<Long> productMainIds = productionProductMainDtos.stream()
+ .map(ProductionProductMainDto::getId)
+ .collect(Collectors.toList());
+
+ // 鎵归噺鏌ヨ鎵�鏈夌浉鍏崇殑璐ㄦ璁板綍
+ List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(
+ Wrappers.<QualityInspect>lambdaQuery()
+ .in(QualityInspect::getProductMainId, productMainIds)
+ );
+
+ if (!qualityInspects.isEmpty()) {
+ // 鏀堕泦鎵�鏈夎川妫�璁板綍ID
+ List<Long> inspectIds = qualityInspects.stream()
+ .map(QualityInspect::getId)
+ .collect(Collectors.toList());
+
+ // 鎵归噺鏌ヨ鎵�鏈夌浉鍏崇殑涓嶅悎鏍煎鐞嗚褰�
+ List<QualityUnqualified> qualityUnqualifieds = qualityUnqualifiedMapper.selectList(
+ Wrappers.<QualityUnqualified>lambdaQuery()
+ .in(QualityUnqualified::getInspectId, inspectIds)
+ );
+
+ // 鏋勫缓璐ㄦID鍒颁笉鍚堟牸澶勭悊璁板綍鐨勬槧灏�
+ Map<Long, QualityUnqualified> inspectIdToUnqualifiedMap = qualityUnqualifieds.stream()
+ .collect(Collectors.toMap(QualityUnqualified::getInspectId, q -> q, (q1, q2) -> q1));
+
+ // 鏋勫缓浜у搧涓籌D鍒拌川妫�璁板綍鐨勬槧灏�
+ Map<Long, QualityInspect> productMainIdToInspectMap = qualityInspects.stream()
+ .collect(Collectors.toMap(QualityInspect::getProductMainId, q -> q, (q1, q2) -> q1));
+
+ // 鍏宠仈澶勭悊缁撴灉鍒颁骇鍝佷富璁板綍
+ productionProductMainDtos.forEach(p -> {
+ QualityInspect qualityInspect = productMainIdToInspectMap.get(p.getId());
+ if (qualityInspect != null) {
+ QualityUnqualified qualityUnqualified = inspectIdToUnqualifiedMap.get(qualityInspect.getId());
+ if (qualityUnqualified != null) {
+ p.setDealResult(qualityUnqualified.getDealResult() == null ? "" : qualityUnqualified.getDealResult());
+ }
+ }
+ });
+ }
+
+ return productionProductMainDtos;
+ }
+}
\ No newline at end of file
--
Gitblit v1.9.3