From 29c0f2e4bb55bf486b7a5cf95e2ad4b215d4d281 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期一, 30 三月 2026 17:14:50 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_长治_健齿齿科器材' into dev_长治_健齿齿科器材
---
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java | 140 +++++++++++++++++++++++++++++++++++++---------
1 files changed, 113 insertions(+), 27 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 fa34114..578ea2d 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -1,8 +1,10 @@
package com.ruoyi.production.service.impl;
+import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -12,12 +14,12 @@
import com.ruoyi.basic.pojo.Product;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.procurementrecord.utils.StockUtils;
-import com.ruoyi.production.dto.ProductStructureDto;
+import com.ruoyi.production.dto.DrawMaterialDto;
import com.ruoyi.production.dto.ProductionProductMainDto;
import com.ruoyi.production.mapper.*;
import com.ruoyi.production.pojo.*;
@@ -30,7 +32,6 @@
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-import com.ruoyi.production.mapper.ProductionProductMainMapper;
import java.math.BigDecimal;
import java.time.LocalDate;
@@ -39,6 +40,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+import java.util.function.Function;
import java.util.stream.Collectors;
@Service
@@ -138,25 +140,70 @@
productionProductMain.setProductProcessRouteItemId(dto.getProductProcessRouteItemId());
productionProductMain.setWorkOrderId(dto.getWorkOrderId());
productionProductMain.setStatus(0);
+ productionProductMain.setDeviceId(dto.getDeviceId());
productionProductMainMapper.insert(productionProductMain);
- /*鏂板鎶ュ伐鎶曞叆琛�*/
- List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomAndProcess(productProcessRoute.getBomId(), productProcess.getId());
- if (productStructureDtos.size() == 0) {
- //濡傛灉璇ュ伐搴忔病鏈変骇鍝佺粨鏋勭殑鎶曞叆鍝�,閭h繖涓姇鍏ュ搧鍜屼骇鍑哄搧鏄悓涓�涓�
- ProductStructureDto productStructureDto = new ProductStructureDto();
- productStructureDto.setProductModelId(productProcessRouteItem.getProductModelId());
- productStructureDto.setUnitQuantity(BigDecimal.ONE);
- productStructureDtos.add(productStructureDto);
- }
- for (ProductStructureDto productStructureDto : productStructureDtos) {
+ /* 鏂板鎶ュ伐鎶曞叆琛� */
+ List<DrawMaterialDto> drawMaterialList = dto.getDrawMaterialList();
+ if (!CollectionUtils.isEmpty(drawMaterialList)) {
+ // 1. 鎵归噺鏌ヨ鏁版嵁
+ ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
+ if (productWorkOrder == null) {
+ throw new RuntimeException("宸ュ崟涓嶅瓨鍦�");
+ }
- ProductionProductInput productionProductInput = new ProductionProductInput();
- productionProductInput.setProductModelId(productStructureDto.getProductModelId());
- productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity()));
- productionProductInput.setProductMainId(productionProductMain.getId());
- productionProductInputMapper.insert(productionProductInput);
- stockUtils.substractStock(productStructureDto.getProductModelId(), productionProductInput.getQuantity(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(), productionProductMain.getId());
+ ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
+ if (productOrder == null) {
+ throw new RuntimeException("浜у搧璁㈠崟涓嶅瓨鍦�");
+ }
+ // 2. 瑙f瀽骞舵瀯寤虹墿鏂橫ap
+ List<DrawMaterialDto> existingMaterialList = JSON.parseArray(productOrder.getDrawMaterials(), DrawMaterialDto.class);
+ if (CollectionUtils.isEmpty(existingMaterialList)) {
+ throw new RuntimeException("鍙鐢ㄧ墿鏂欏垪琛ㄤ负绌�");
+ }
+
+ Map<Long, DrawMaterialDto> materialMap = existingMaterialList.stream()
+ .collect(Collectors.toMap(DrawMaterialDto::getProductModelId,
+ Function.identity()));
+
+ // 澶勭悊鎶ュ伐鐗╂枡
+ List<ProductionProductInput> inputList = new ArrayList<>();
+
+ for (DrawMaterialDto drawMaterial : drawMaterialList) {
+ Long modelId = drawMaterial.getProductModelId();
+ BigDecimal reportQty = drawMaterial.getReportQty();
+
+ DrawMaterialDto material = materialMap.get(modelId);
+ if (material == null) {
+ throw new RuntimeException("鐗╂枡涓嶅瓨鍦�: " + modelId);
+ }
+
+ // 楠岃瘉搴撳瓨
+ BigDecimal availableQty = material.getRequisitionQty().subtract(reportQty);
+ if (availableQty.compareTo(BigDecimal.valueOf(0)) < 0) {
+ throw new RuntimeException(String.format("鐗╂枡%s搴撳瓨涓嶈冻锛屽彲鐢�:%s锛岄渶棰�:%s",
+ modelId, availableQty, reportQty));
+ }
+
+ // 鏇存柊鍙鐢�
+ material.setRequisitionQty(availableQty);
+
+ // 鏋勫缓鎶曞叆璁板綍
+ ProductionProductInput input = new ProductionProductInput();
+ input.setProductModelId(modelId);
+ input.setQuantity(reportQty);
+ input.setProductMainId(productionProductMain.getId());
+ input.setRemark(drawMaterial.getRemark());
+ inputList.add(input);
+ }
+
+ if (!inputList.isEmpty()) {
+ for (ProductionProductInput productionProductInput : inputList) {
+ productionProductInputMapper.insert(productionProductInput);
+ }
+ productOrder.setDrawMaterials(JSON.toJSONString(existingMaterialList));
+ productOrderMapper.updateById(productOrder);
+ }
}
/*鏂板鎶ュ伐浜у嚭琛�*/
ProductionProductOutput productionProductOutput = new ProductionProductOutput();
@@ -164,9 +211,10 @@
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);
- //鍚堟牸鏁伴噺=鎶ュ伐鏁伴噺-鎶ュ簾鏁伴噺
- BigDecimal productQty = productionProductOutput.getQuantity().subtract(productionProductOutput.getScrapQty());
+ //鍚堟牸鏁伴噺=鎶ュ伐鏁伴噺
+ BigDecimal productQty = productionProductOutput.getQuantity();
//鍙湁鍚堟牸鏁伴噺>0鎵嶈兘澧炲姞鐩稿簲鏁版嵁
if (productQty.compareTo(BigDecimal.ZERO) > 0) {
/*鏂板璐ㄦ*/
@@ -180,18 +228,27 @@
inspectType = 2;
process = null;
}
+ ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(productionProductMain.getWorkOrderId());
+ ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
+ if (productOrder == null) {
+ throw new RuntimeException("鐢熶骇璁㈠崟涓嶅瓨鍦�");
+ }
+
+
Product product = productMapper.selectById(productModel.getProductId());
QualityInspect qualityInspect = new QualityInspect();
qualityInspect.setProductId(product.getId());
qualityInspect.setProductName(product.getProductName());
qualityInspect.setModel(productModel.getModel());
qualityInspect.setUnit(productModel.getUnit());
- qualityInspect.setQuantity(productQty);
+ qualityInspect.setQuantity(productionProductOutput.getQuantity().subtract(productionProductOutput.getScrapQty()));
qualityInspect.setProcess(process);
qualityInspect.setInspectState(0);
qualityInspect.setInspectType(inspectType);
qualityInspect.setProductMainId(productionProductMain.getId());
qualityInspect.setProductModelId(productModel.getId());
+ qualityInspect.setBatchNo(productOrder.getBatchNo());
+ qualityInspect.setManufacturingTeam(productOrder.getManufacturingTeam());
qualityInspectMapper.insert(qualityInspect);
List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(product.getId(), inspectType, process);
if (qualityTestStandard.size() > 0) {
@@ -207,9 +264,9 @@
qualityInspectParamMapper.insert(param);
});
}
- }else {
+ } else {
//鐩存帴鍏ュ簱
- stockUtils.addStock(productProcessRouteItem.getProductModelId(), productQty, StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
+ stockUtils.addStock(productProcessRouteItem.getProductModelId(), productionProductOutput.getQuantity().subtract(productionProductOutput.getScrapQty()), StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
}
/*鏇存柊宸ュ崟鍜岀敓浜ц鍗�*/
ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
@@ -220,6 +277,7 @@
if (productWorkOrder.getCompleteQuantity().compareTo(productWorkOrder.getPlanQuantity()) == 0) {
productWorkOrder.setActualEndTime(LocalDate.now());//瀹為檯缁撴潫鏃堕棿
}
+ productWorkOrder.setTotalInvestment(dto.getTotalInvestment());
productWorkOrderMapper.updateById(productWorkOrder);
//鐢熶骇璁㈠崟
ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
@@ -264,10 +322,10 @@
public Boolean removeProductMain(Long id) {
//鍒ゆ柇璇ユ潯鎶ュ伐鏄惁涓嶅悎鏍煎鐞�,濡傛灉涓嶅悎鏍煎鐞嗕簡锛屽垯涓嶅厑璁稿垹闄�
List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(Wrappers.<QualityInspect>lambdaQuery().eq(QualityInspect::getProductMainId, id));
- if (qualityInspects.size() > 0){
+ 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) {
+ if (qualityUnqualifieds.size() > 0 && qualityUnqualifieds.get(0).getInspectState() == 1) {
throw new ServiceException("璇ユ潯鎶ュ伐宸茬粡涓嶅悎鏍煎鐞嗕簡锛屼笉鍏佽鍒犻櫎");
}
}
@@ -321,9 +379,37 @@
new LambdaQueryWrapper<QualityInspectParam>()
.eq(QualityInspectParam::getInspectId, q.getId()));
qualityInspectMapper.deleteById(q.getId());
- stockUtils.deleteStockInRecord(q.getId(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode());
+ stockUtils.deleteStockInRecord(q.getId(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode());
});
+ ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
+
+ List<DrawMaterialDto> materialDtoList = JSON.parseArray(productOrder.getDrawMaterials(), DrawMaterialDto.class);
+
+ // 鎵归噺鏌ヨ骞舵瀯寤篗ap
+ Map<Long, BigDecimal> usedQuantityMap = productionProductInputMapper.selectList(
+ new LambdaQueryWrapper<ProductionProductInput>()
+ .eq(ProductionProductInput::getProductMainId, productionProductMain.getId())
+ .in(ProductionProductInput::getProductModelId,
+ materialDtoList.stream()
+ .map(DrawMaterialDto::getProductModelId)
+ .collect(Collectors.toList()))
+ ).stream()
+ .collect(Collectors.groupingBy(
+ ProductionProductInput::getProductModelId,
+ Collectors.reducing(BigDecimal.ZERO, ProductionProductInput::getQuantity, BigDecimal::add)
+ ));
+
+ // 鏇存柊鎵�鏈夌墿鏂�
+ materialDtoList.forEach(dto -> {
+ BigDecimal usedQty = usedQuantityMap.getOrDefault(dto.getProductModelId(), BigDecimal.ZERO);
+ dto.setRequisitionQty(dto.getRequisitionQty().add(usedQty));
+ });
+
+ // 鏇存柊璁㈠崟
+ productOrder.setDrawMaterials(JSON.toJSONString(materialDtoList));
+ productOrderMapper.updateById(productOrder);
+
// 鍒犻櫎浜у嚭璁板綍
productionProductOutputMapper.delete(new LambdaQueryWrapper<ProductionProductOutput>()
.eq(ProductionProductOutput::getProductMainId, productionProductMain.getId()));
--
Gitblit v1.9.3