From 0711e14f71b860a2deb5d021d9eb1d516bb0048d Mon Sep 17 00:00:00 2001
From: zss <zss@example.com>
Date: 星期六, 25 四月 2026 15:47:32 +0800
Subject: [PATCH] refactor(production): 优化ProductionOrderBom实体和相关逻辑
---
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java | 519 ++++++++++++++++++++++++++++++++-------------------------
1 files changed, 292 insertions(+), 227 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 66270d4..c148955 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -11,12 +11,15 @@
import com.ruoyi.basic.mapper.ProductModelMapper;
import com.ruoyi.basic.pojo.Product;
import com.ruoyi.basic.pojo.ProductModel;
-import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockUnQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
+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.ProductionProductMainDto;
+import com.ruoyi.production.bean.dto.ProductStructureDto;
+import com.ruoyi.production.bean.dto.ProductionProductMainDto;
+import com.ruoyi.production.enums.ProductOrderStatusEnum;
import com.ruoyi.production.mapper.*;
import com.ruoyi.production.pojo.*;
import com.ruoyi.production.service.ProductionProductMainService;
@@ -24,59 +27,46 @@
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.quality.mapper.*;
import com.ruoyi.quality.pojo.*;
+import com.ruoyi.technology.mapper.TechnologyOperationMapper;
+import com.ruoyi.technology.mapper.TechnologyRoutingOperationMapper;
+import com.ruoyi.technology.pojo.TechnologyOperation;
+import com.ruoyi.technology.pojo.TechnologyRoutingOperation;
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;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+import java.util.stream.Collectors;
@Service
@AllArgsConstructor
@Transactional(rollbackFor = Exception.class)
public class ProductionProductMainServiceImpl extends ServiceImpl<ProductionProductMainMapper, ProductionProductMain> implements ProductionProductMainService {
- private ProductionProductMainMapper productionProductMainMapper;
-
-
- private ProductWorkOrderMapper productWorkOrderMapper;
-
- private ProductProcessRouteItemMapper productProcessRouteItemMapper;
- private SysUserMapper userMapper;
-
- private ProductionProductOutputMapper productionProductOutputMapper;
-
-
- private ProductModelMapper productModelMapper;
-
- private QualityInspectMapper qualityInspectMapper;
-
- private ProductProcessMapper productProcessMapper;
- private ProductProcessRouteMapper productProcessRouteMapper;
-
- private ProductMapper productMapper;
-
-
- private QualityTestStandardParamMapper qualityTestStandardParamMapper;
- private QualityTestStandardMapper qualityTestStandardMapper;
-
- private QualityInspectParamMapper qualityInspectParamMapper;
-
- private ProductStructureMapper productStructureMapper;
-
- private ProductionProductInputMapper productionProductInputMapper;
-
- private ProductOrderMapper productOrderMapper;
-
- private SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper;
-
- private StockUtils stockUtils;
-
+ private final ProductionProductMainMapper productionProductMainMapper;
+ private final SysUserMapper userMapper;
+ private final ProductionProductOutputMapper productionProductOutputMapper;
+ private final ProductModelMapper productModelMapper;
+ private final QualityInspectMapper qualityInspectMapper;
+ private final QualityUnqualifiedMapper qualityUnqualifiedMapper;
+ private final ProductMapper productMapper;
+ private final QualityTestStandardParamMapper qualityTestStandardParamMapper;
+ private final QualityTestStandardMapper qualityTestStandardMapper;
+ private final QualityInspectParamMapper qualityInspectParamMapper;
+ private final ProductionProductInputMapper productionProductInputMapper;
+ private final ProductionAccountMapper productionAccountMapper;
+ private final ProductionOperationTaskMapper productionOperationTaskMapper;
+ private final ProductionOrderMapper productionOrderMapper;
+ private final ProductionOrderRoutingOperationMapper productionOrderRoutingOperationMapper;
+ private final TechnologyRoutingOperationMapper technologyRoutingOperationMapper;
+ private final TechnologyOperationMapper technologyOperationMapper;
+ private final StockUtils stockUtils;
@Override
public IPage<ProductionProductMainDto> listPageProductionProductMainDto(Page page, ProductionProductMainDto productionProductMainDto) {
@@ -84,222 +74,297 @@
}
@Override
+ public IPage<ProductionProductMainDto> pageProductionProductMain(Page page, ProductionProductMainDto productionProductMainDto) {
+ return listPageProductionProductMainDto(page, productionProductMainDto);
+ }
+
+ @Override
+ public ProductionProductMainDto getProductionProductMainInfo(Long id) {
+ return productionProductMainMapper.listPageProductionProductMainDto(new Page<>(1, 1), new ProductionProductMainDto() {{
+ setId(id);
+ }}).getRecords().stream().findFirst().orElse(null);
+ }
+
+ @Override
public Boolean addProductMain(ProductionProductMainDto dto) {
+ if (dto.getProductionOperationTaskId() == null) {
+ throw new ServiceException("璇蜂紶鍏ョ敓浜у伐鍗旾D");
+ }
+ return addProductMainByProductionTask(dto);
+ }
+
+ @Override
+ public Boolean saveProductionProductMain(ProductionProductMainDto productionProductMainDto) {
+ return addProductMain(productionProductMainDto);
+ }
+
+ @Override
+ public Boolean removeProductMain(Long id) {
+ ProductionProductMain currentMain = productionProductMainMapper.selectById(id);
+ if (currentMain == null) {
+ return true;
+ }
+ return removeProductMainByProductionTask(currentMain);
+ }
+
+ private Boolean addProductMainByProductionTask(ProductionProductMainDto dto) {
+ // 鎶ュ伐浠ヨ鍗曞伐搴忓揩鐓т负鍑嗭紝閬垮厤宸ヨ壓涓绘暟鎹彉鏇村悗褰卞搷鍘嗗彶宸ュ崟鎵ц銆�
SysUser user = userMapper.selectUserById(dto.getUserId());
+ ProductionOperationTask productionOperationTask = productionOperationTaskMapper.selectById(dto.getProductionOperationTaskId());
+ if (productionOperationTask == null) {
+ throw new ServiceException("鐢熶骇宸ュ崟涓嶅瓨鍦�");
+ }
+ ProductionOrderRoutingOperation routingOperation = productionOrderRoutingOperationMapper.selectById(productionOperationTask.getTechnologyRoutingOperationId());
+ if (routingOperation == null) {
+ throw new ServiceException("璁㈠崟宸ヨ壓璺嚎宸ュ簭涓嶅瓨鍦�");
+ }
+ ProductionOrder productionOrder = productionOrderMapper.selectById(productionOperationTask.getProductionOrderId());
+ if (productionOrder == null) {
+ throw new ServiceException("鐢熶骇璁㈠崟涓嶅瓨鍦�");
+ }
+ TechnologyRoutingOperation technologyRoutingOperation = technologyRoutingOperationMapper.selectById(routingOperation.getTechnologyRoutingOperationId());
+ TechnologyOperation technologyOperation = technologyRoutingOperation == null ? null
+ : technologyOperationMapper.selectById(technologyRoutingOperation.getTechnologyOperationId());
+ ProductModel productModel = productModelMapper.selectById(
+ routingOperation.getProductModelId() != null ? routingOperation.getProductModelId() : productionOrder.getProductModelId());
+ if (productModel == null) {
+ throw new ServiceException("浜у搧瑙勬牸涓嶅瓨鍦�");
+ }
+
ProductionProductMain productionProductMain = new ProductionProductMain();
- //褰撳墠宸ヨ壓璺嚎瀵瑰簲鐨勫伐搴忚鎯�
- ProductProcessRouteItem productProcessRouteItem = productProcessRouteItemMapper.selectById(dto.getProductProcessRouteItemId());
- if (productProcessRouteItem == null) {
- throw new RuntimeException("宸ヨ壓璺嚎椤逛笉瀛樺湪");
- }
- //褰撳墠鍏蜂綋宸ュ簭
- ProductProcess productProcess = productProcessMapper.selectById(productProcessRouteItem.getProcessId());
- //宸ヨ壓璺嚎涓綋鍓嶅伐搴忓搴旂殑浜у嚭瑙勬牸鍨嬪彿
- ProductModel productModel = productModelMapper.selectById(productProcessRouteItem.getProductModelId());
- //鏌ヨ璇ョ敓浜ц鍗曞搴旂殑bom
- ProductProcessRoute productProcessRoute = productProcessRouteMapper.selectById(productProcessRouteItem.getProductRouteId());
- /*鏂板鎶ュ伐涓昏〃*/
- //鏌ヨ鏈�澶ф姤宸ョ紪鍙�
- String datePrefix = "BG" + LocalDate.now().format(DateTimeFormatter.ofPattern("yyMMdd"));
- QueryWrapper<ProductionProductMain> queryWrapper = new QueryWrapper<>();
- queryWrapper.select("MAX(product_no) as maxNo")
- .likeRight("product_no", datePrefix);
- List<Map<String, Object>> resultList = productionProductMainMapper.selectMaps(queryWrapper);
- int sequenceNumber = 1;
- if (resultList != null && !resultList.isEmpty()) {
- Map<String, Object> result = resultList.get(0);
- if (result != null) {
- 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());
- sequenceNumber = Integer.parseInt(seqStr) + 1;
- } catch (NumberFormatException e) {
- sequenceNumber = 1;
- }
- }
- }
- }
- }
- String productNo = String.format("%s%03d", datePrefix, sequenceNumber);
- productionProductMain.setProductNo(productNo);
+ productionProductMain.setProductNo(generateProductNo());
productionProductMain.setUserId(dto.getUserId());
productionProductMain.setUserName(dto.getUserName());
- productionProductMain.setProductProcessRouteItemId(dto.getProductProcessRouteItemId());
- productionProductMain.setWorkOrderId(dto.getWorkOrderId());
+ productionProductMain.setProductionOperationTaskId(productionOperationTask.getId());
+ productionProductMain.setWorkOrderId(productionOperationTask.getId());
productionProductMain.setStatus(0);
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) {
- ProductModel productModel1 = productModelMapper.selectById(productStructureDto.getProductModelId());
- Product product = productMapper.selectById(productModel1.getProductId());
- BigDecimal stockQuantity = stockUtils.getStockQuantity(productModel1.getId()).get("stockQuantity");
- if (!(stockQuantity.compareTo(BigDecimal.ZERO) > 0)) {
- throw new RuntimeException(product.getProductName()+"浜у搧鐨�"+productModel1.getModel() + "鐨勮鏍煎簱瀛樹负0");
- }
- if (stockQuantity.compareTo(productStructureDto.getUnitQuantity().multiply(dto.getQuantity())) < 0) {
- throw new RuntimeException(product.getProductName()+"浜у搧鐨�"+productModel1.getModel() + "鐨勮鏍煎簱瀛樹笉瓒�");
- }
- 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(), StockQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(), productionProductMain.getId());
+ List<ProductStructureDto> productStructureDtos = new ArrayList<>();
+ ProductStructureDto productStructureDto = new ProductStructureDto();
+ productStructureDto.setProductModelId(productModel.getId());
+ productStructureDto.setUnitQuantity(BigDecimal.ONE);
+ productStructureDtos.add(productStructureDto);
+ for (ProductStructureDto item : productStructureDtos) {
+ // 褰撳墠瀹炵幇鎸夊伐搴忔垚鍝佺洿鎺ヤ綔涓烘姇鍏ワ紝鍚庣画鑻ユ帴鍏ラ鏂欒褰曞彲鍦ㄨ繖閲屾浛鎹㈡潵婧愩��
+ ProductionProductInput productionProductInput = new ProductionProductInput();
+ productionProductInput.setProductionProductMainId(productionProductMain.getId());
+ productionProductInput.setProductMainId(productionProductMain.getId());
+ productionProductInput.setProductModelId(item.getProductModelId());
+ productionProductInput.setInputQuantity(item.getUnitQuantity().multiply(defaultDecimal(dto.getQuantity())));
+ productionProductInput.setQuantity(productionProductInput.getInputQuantity());
+ productionProductInputMapper.insert(productionProductInput);
+ stockUtils.substractStock(item.getProductModelId(), productionProductInput.getInputQuantity(),
+ StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(), productionProductMain.getId());
}
- /*鏂板鎶ュ伐浜у嚭琛�*/
+
ProductionProductOutput productionProductOutput = new ProductionProductOutput();
+ productionProductOutput.setProductionProductMainId(productionProductMain.getId());
productionProductOutput.setProductMainId(productionProductMain.getId());
- productionProductOutput.setProductModelId(productProcessRouteItem.getProductModelId());
- productionProductOutput.setQuantity(dto.getQuantity() != null ? dto.getQuantity() : BigDecimal.ZERO);
- productionProductOutput.setScrapQty(dto.getScrapQty() != null ? dto.getScrapQty() : BigDecimal.ZERO);
+ productionProductOutput.setProductModelId(productModel.getId());
+ productionProductOutput.setQuantity(defaultDecimal(dto.getQuantity()));
+ productionProductOutput.setScrapQty(defaultDecimal(dto.getScrapQty()));
productionProductOutputMapper.insert(productionProductOutput);
- //鍚堟牸鏁伴噺=鎶ュ伐鏁伴噺-鎶ュ簾鏁伴噺
BigDecimal productQty = productionProductOutput.getQuantity().subtract(productionProductOutput.getScrapQty());
- //鍙湁鍚堟牸鏁伴噺>0鎵嶈兘澧炲姞鐩稿簲鏁版嵁
- if (productQty.compareTo(BigDecimal.ZERO)>0) {
- /*鏂板璐ㄦ*/
- //瀵瑰簲鐨勮繃绋嬫鎴栬�呭嚭鍘傛
- List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()));
- int inspectType = 1;
- String process = productProcess.getName();//宸ュ簭
- if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) {
- //鏈�鍚庝竴閬撳伐搴忕敓鎴愬嚭鍘傛
- inspectType = 2;
- process = null;
+
+ List<ProductionOrderRoutingOperation> routingOperationList = productionOrderRoutingOperationMapper.selectList(
+ Wrappers.<ProductionOrderRoutingOperation>lambdaQuery()
+ .eq(ProductionOrderRoutingOperation::getOrderRoutingId, routingOperation.getOrderRoutingId())
+ .eq(ProductionOrderRoutingOperation::getProductionOrderId, routingOperation.getProductionOrderId()));
+ boolean isLastOperation = routingOperation.getDragSort() != null && routingOperation.getDragSort().equals(routingOperationList.size());
+ if (productQty.compareTo(BigDecimal.ZERO) > 0) {
+ if (Boolean.TRUE.equals(routingOperation.getIsQuality())) {
+ // 璐ㄦ宸ュ簭鍏堢敓鎴愭楠屽崟锛岄潪璐ㄦ宸ュ簭鐩存帴鍏ュ悎鏍煎搧搴撳瓨銆�
+ int inspectType = isLastOperation ? 2 : 1;
+ String process = isLastOperation ? null : technologyOperation == null ? null : technologyOperation.getName();
+ 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.setProcess(process);
+ qualityInspect.setInspectState(0);
+ qualityInspect.setInspectType(inspectType);
+ qualityInspect.setProductMainId(productionProductMain.getId());
+ qualityInspect.setProductModelId(productModel.getId());
+ qualityInspectMapper.insert(qualityInspect);
+ List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(product.getId(), inspectType, process);
+ if (qualityTestStandard.size() > 0) {
+ qualityInspect.setTestStandardId(qualityTestStandard.get(0).getId());
+ qualityInspectMapper.updateById(qualityInspect);
+ qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>lambdaQuery()
+ .eq(QualityTestStandardParam::getTestStandardId, qualityTestStandard.get(0).getId()))
+ .forEach(qualityTestStandardParam -> {
+ QualityInspectParam param = new QualityInspectParam();
+ BeanUtils.copyProperties(qualityTestStandardParam, param);
+ param.setId(null);
+ param.setInspectId(qualityInspect.getId());
+ qualityInspectParamMapper.insert(param);
+ });
+ }
+ } else {
+ stockUtils.addStock(productModel.getId(), productQty,
+ StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
}
- 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.setProcess(productProcess.getName());
- qualityInspect.setInspectState(0);
- qualityInspect.setInspectType(inspectType);
- qualityInspect.setProductMainId(productionProductMain.getId());
- qualityInspect.setProductModelId(productModel.getId());
- qualityInspectMapper.insert(qualityInspect);
- List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(product.getId(), inspectType, process);
- if (qualityTestStandard.size() > 0) {
- qualityInspect.setTestStandardId(qualityTestStandard.get(0).getId());
- qualityInspectMapper.updateById(qualityInspect);
- qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>lambdaQuery()
- .eq(QualityTestStandardParam::getTestStandardId, qualityTestStandard.get(0).getId()))//榛樿鑾峰彇鏈�鏂扮殑
- .forEach(qualityTestStandardParam -> {
- QualityInspectParam param = new QualityInspectParam();
- BeanUtils.copyProperties(qualityTestStandardParam, param);
- param.setId(null);
- param.setInspectId(qualityInspect.getId());
- qualityInspectParamMapper.insert(param);
- });
+
+ productionOperationTask.setCompleteQuantity(defaultDecimal(productionOperationTask.getCompleteQuantity()).add(productQty));
+ if (ObjectUtils.isNull(productionOperationTask.getActualStartTime())) {
+ productionOperationTask.setActualStartTime(LocalDate.now());
}
- /*鏇存柊宸ュ崟鍜岀敓浜ц鍗�*/
- ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
- productWorkOrder.setCompleteQuantity(productQty.add(dto.getQuantity()));
- if (ObjectUtils.isNull(productWorkOrder.getActualStartTime())) {
- productWorkOrder.setActualStartTime(LocalDate.now());//瀹為檯寮�濮嬫椂闂�
+ // 鎶ュ伐椹卞姩宸ュ崟鐘舵�佹祦杞細鏈変骇鍑哄嵆杩涜涓紝杈惧埌璁″垝閲忓嵆瀹屽伐銆�
+ productionOperationTask.setStatus(3);
+ if (productionOperationTask.getPlanQuantity() != null
+ && productionOperationTask.getCompleteQuantity().compareTo(productionOperationTask.getPlanQuantity()) >= 0) {
+ productionOperationTask.setActualEndTime(LocalDate.now());
+ productionOperationTask.setStatus(4);
}
- if (productWorkOrder.getCompleteQuantity().compareTo(productWorkOrder.getPlanQuantity()) == 0) {
- productWorkOrder.setActualEndTime(LocalDate.now());//瀹為檯缁撴潫鏃堕棿
+ productionOperationTaskMapper.updateById(productionOperationTask);
+
+ if (ObjectUtils.isNull(productionOrder.getStartTime())) {
+ productionOrder.setStartTime(LocalDateTime.now());
}
- productWorkOrderMapper.updateById(productWorkOrder);
- //鐢熶骇璁㈠崟
- ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
- if (ObjectUtils.isNull(productOrder.getStartTime())) {
- productOrder.setStartTime(LocalDateTime.now());//寮�濮嬫椂闂�
- }
- if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) {
- //濡傛灉鏄渶鍚庝竴閬撳伐搴忔姤宸ヤ箣鍚庣敓浜ц鍗曞畬鎴愭暟閲�+
- productOrder.setCompleteQuantity(productOrder.getCompleteQuantity().add(productQty));
- if (productOrder.getCompleteQuantity().compareTo(productOrder.getQuantity()) == 0) {
- productOrder.setEndTime(LocalDateTime.now());//缁撴潫鏃堕棿
+ // 璁㈠崟鐘舵�佺敱鏈�鍚庝竴閬撳伐搴忕殑鍚堟牸浜у嚭鎺ㄥ姩锛岄伩鍏嶄腑闂村伐搴忔彁鍓嶅畬宸ャ��
+ productionOrder.setStatus(ProductOrderStatusEnum.RUNNING.getCode());
+ if (isLastOperation) {
+ productionOrder.setCompleteQuantity(defaultDecimal(productionOrder.getCompleteQuantity()).add(productQty));
+ if (productionOrder.getQuantity() != null
+ && productionOrder.getCompleteQuantity().compareTo(productionOrder.getQuantity()) >= 0) {
+ productionOrder.setEndTime(LocalDateTime.now());
+ productionOrder.setStatus(ProductOrderStatusEnum.FINISHED.getCode());
}
}
- productOrderMapper.updateById(productOrder);
- /*娣诲姞鐢熶骇鏍哥畻*/
- SalesLedgerProductionAccounting salesLedgerProductionAccounting = SalesLedgerProductionAccounting.builder()
- .salesLedgerWorkId(productionProductMain.getId())
- .salesLedgerSchedulingId(0L)
- .salesLedgerId(productOrder.getSalesLedgerId())
- .salesLedgerProductId(productOrder.getProductModelId())
- .schedulingUserId(user.getUserId())
- .schedulingUserName(user.getNickName())
- .finishedNum(productQty)
- .workHours(productProcess.getSalaryQuota())
- .process(productProcess.getName())
- .schedulingDate(LocalDate.now())
- .tenantId(dto.getTenantId())
- .build();
- salesLedgerProductionAccountingMapper.insert(salesLedgerProductionAccounting);
+ productionOrderMapper.updateById(productionOrder);
+
+ BigDecimal workHours = BigDecimal.ZERO;
+ if (technologyOperation != null && technologyOperation.getSalaryQuota() != null) {
+ workHours = Integer.valueOf(1).equals(technologyOperation.getType())
+ ? technologyOperation.getSalaryQuota().multiply(productQty)
+ : technologyOperation.getSalaryQuota();
+ }
+ ProductionAccount productionAccount = new ProductionAccount();
+ productionAccount.setProductionProductMainId(productionProductMain.getId());
+// productionAccount.setSalesLedgerId(productionOrder.getSalesLedgerId());
+// productionAccount.setSalesLedgerProductId(productionOrder.getSalesLedgerProductId() == null ? null : productionOrder.getSalesLedgerProductId().longValue());
+ productionAccount.setSchedulingUserId(user == null ? null : user.getUserId());
+ productionAccount.setSchedulingUserName(user == null ? dto.getUserName() : user.getNickName());
+ productionAccount.setFinishedNum(productQty);
+ productionAccount.setWorkHours(workHours);
+ productionAccount.setTechnologyOperationName(technologyOperation == null ? null : technologyOperation.getName());
+ productionAccount.setSchedulingDate(LocalDateTime.now());
+ productionAccountMapper.insert(productionAccount);
}
- //濡傛灉鎶ュ簾鏁伴噺>0,闇�瑕佽繘鍏ユ姤搴熺殑搴撳瓨
- if (dto.getScrapQty().compareTo(BigDecimal.ZERO) > 0) {
- stockUtils.addUnStock(productModel.getId(), dto.getScrapQty(), StockUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId());
+ if (defaultDecimal(dto.getScrapQty()).compareTo(BigDecimal.ZERO) > 0) {
+ stockUtils.addUnStock(productModel.getId(), dto.getScrapQty(),
+ StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId());
}
return true;
}
- @Override
- public Boolean removeProductMain(ProductionProductMainDto dto) {
- ProductionProductMain productionProductMain = productionProductMainMapper.selectById(dto.getId());
- //璇ユ姤宸ュ搴旂殑宸ヨ壓璺嚎璇︽儏
- ProductProcessRouteItem productProcessRouteItem = productProcessRouteItemMapper.selectById(productionProductMain.getProductProcessRouteItemId());
- ProductionProductOutput productionProductOutput = productionProductOutputMapper.selectList(Wrappers.<ProductionProductOutput>lambdaQuery().eq(ProductionProductOutput::getProductMainId, productionProductMain.getId())).get(0);
- /*鍒犻櫎鏍哥畻*/
- salesLedgerProductionAccountingMapper.delete(
- new LambdaQueryWrapper<SalesLedgerProductionAccounting>()
- .eq(SalesLedgerProductionAccounting::getSalesLedgerWorkId, productionProductMain.getId())
- );
- /*鏇存柊宸ュ崟鍜岀敓浜ц鍗�*/
- ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(productionProductMain.getWorkOrderId());
- productWorkOrder.setCompleteQuantity(productWorkOrder.getCompleteQuantity().subtract(productionProductOutput.getQuantity()));
- productWorkOrder.setActualEndTime(null);
- productWorkOrderMapper.updateById(productWorkOrder);
- //鍒ゆ柇鏄惁鏄渶鍚庝竴閬撳伐搴�
- List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()));
- if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()){
- ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
- productOrder.setCompleteQuantity(productOrder.getCompleteQuantity().subtract(productionProductOutput.getQuantity()));
- productOrder.setEndTime(null);
- productOrderMapper.updateById(productOrder);
+ private Boolean removeProductMainByProductionTask(ProductionProductMain productionProductMain) {
+ // 鍒犻櫎鎶ュ伐闇�瑕佸悓姝ュ洖婊氳川妫�銆佸簱瀛樸�佸伐鏃舵牳绠楀拰璁㈠崟/宸ュ崟杩涘害銆�
+ List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(
+ Wrappers.<QualityInspect>lambdaQuery().eq(QualityInspect::getProductMainId, productionProductMain.getId()));
+ 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("璇ユ潯鎶ュ伐宸茬粡涓嶅悎鏍煎鐞嗕簡锛屼笉鍏佽鍒犻櫎");
+ }
}
- /*鍒犻櫎浜у嚭*/
- //鍒犻櫎璐ㄦ
- qualityInspectMapper.selectList(
- new LambdaQueryWrapper<QualityInspect>()
- .eq(QualityInspect::getProductMainId, productionProductMain.getId())
- ).forEach(q -> {
- qualityInspectParamMapper.delete(
- new LambdaQueryWrapper<QualityInspectParam>()
- .eq(QualityInspectParam::getInspectId, q.getId()));
+ ProductionProductOutput productionProductOutput = productionProductOutputMapper.selectList(
+ Wrappers.<ProductionProductOutput>lambdaQuery()
+ .eq(ProductionProductOutput::getProductionProductMainId, productionProductMain.getId()))
+ .stream().findFirst().orElse(null);
+ productionAccountMapper.delete(new LambdaQueryWrapper<ProductionAccount>()
+ .eq(ProductionAccount::getProductionProductMainId, productionProductMain.getId()));
+
+ ProductionOperationTask productionOperationTask = productionOperationTaskMapper.selectById(productionProductMain.getProductionOperationTaskId());
+ if (productionOperationTask != null && productionProductOutput != null) {
+ BigDecimal validQuantity = defaultDecimal(productionProductOutput.getQuantity()).subtract(defaultDecimal(productionProductOutput.getScrapQty()));
+ productionOperationTask.setCompleteQuantity(defaultDecimal(productionOperationTask.getCompleteQuantity()).subtract(validQuantity));
+ productionOperationTask.setActualEndTime(null);
+ if (defaultDecimal(productionOperationTask.getCompleteQuantity()).compareTo(BigDecimal.ZERO) <= 0) {
+ productionOperationTask.setCompleteQuantity(BigDecimal.ZERO);
+ productionOperationTask.setActualStartTime(null);
+ productionOperationTask.setStatus(2);
+ } else {
+ productionOperationTask.setStatus(3);
+ }
+ productionOperationTaskMapper.updateById(productionOperationTask);
+
+ ProductionOrder productionOrder = productionOrderMapper.selectById(productionOperationTask.getProductionOrderId());
+ ProductionOrderRoutingOperation routingOperation = productionOrderRoutingOperationMapper.selectById(productionOperationTask.getTechnologyRoutingOperationId());
+ if (productionOrder != null && routingOperation != null) {
+ // 鍙湁鏈�鍚庝竴閬撳伐搴忕殑鎶ュ伐鎵嶄細褰卞搷鐢熶骇璁㈠崟瀹屽伐鏁伴噺銆�
+ List<ProductionOrderRoutingOperation> routingOperationList = productionOrderRoutingOperationMapper.selectList(
+ Wrappers.<ProductionOrderRoutingOperation>lambdaQuery()
+ .eq(ProductionOrderRoutingOperation::getOrderRoutingId, routingOperation.getOrderRoutingId())
+ .eq(ProductionOrderRoutingOperation::getProductionOrderId, routingOperation.getProductionOrderId()));
+ boolean isLastOperation = routingOperation.getDragSort() != null && routingOperation.getDragSort().equals(routingOperationList.size());
+ if (isLastOperation) {
+ BigDecimal newCompleteQty = defaultDecimal(productionOrder.getCompleteQuantity()).subtract(validQuantity);
+ productionOrder.setCompleteQuantity(newCompleteQty.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : newCompleteQty);
+ productionOrder.setEndTime(null);
+ }
+ if (defaultDecimal(productionOrder.getCompleteQuantity()).compareTo(BigDecimal.ZERO) <= 0) {
+ productionOrder.setStartTime(null);
+ productionOrder.setStatus(ProductOrderStatusEnum.WAIT.getCode());
+ } else {
+ productionOrder.setStatus(ProductOrderStatusEnum.RUNNING.getCode());
+ }
+ productionOrderMapper.updateById(productionOrder);
+ }
+ }
+
+ qualityInspectMapper.selectList(new LambdaQueryWrapper<QualityInspect>()
+ .eq(QualityInspect::getProductMainId, productionProductMain.getId())).forEach(q -> {
+ qualityInspectParamMapper.delete(new LambdaQueryWrapper<QualityInspectParam>()
+ .eq(QualityInspectParam::getInspectId, q.getId()));
qualityInspectMapper.deleteById(q.getId());
+ stockUtils.deleteStockInRecord(q.getId(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode());
});
- // 鍒犻櫎浜у嚭璁板綍
productionProductOutputMapper.delete(new LambdaQueryWrapper<ProductionProductOutput>()
- .eq(ProductionProductOutput::getProductMainId, productionProductMain.getId()));
- //鍒犻櫎鍏ュ簱
+ .eq(ProductionProductOutput::getProductionProductMainId, productionProductMain.getId()));
productionProductInputMapper.delete(new LambdaQueryWrapper<ProductionProductInput>()
- .eq(ProductionProductInput::getProductMainId, productionProductMain.getId()));
- //鍒犻櫎鎶ュ簾鐨勫叆搴撹褰�
- stockUtils.deleteStockRecord(productionProductMain.getId(), StockUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
- //鍒犻櫎鎶曞叆瀵瑰簲鐨勫嚭搴撹褰�
- stockUtils.deleteStockRecord(productionProductMain.getId(), StockQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode());
- // 鍒犻櫎涓昏〃
+ .eq(ProductionProductInput::getProductionProductMainId, productionProductMain.getId()));
+ stockUtils.deleteStockInRecord(productionProductMain.getId(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
+ stockUtils.deleteStockInRecord(productionProductMain.getId(), StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode());
+ stockUtils.deleteStockOutRecord(productionProductMain.getId(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode());
productionProductMainMapper.deleteById(productionProductMain.getId());
return true;
}
+
+ private String generateProductNo() {
+ String datePrefix = "BG" + LocalDate.now().format(DateTimeFormatter.ofPattern("yyMMdd"));
+ QueryWrapper<ProductionProductMain> queryWrapper = new QueryWrapper<>();
+ queryWrapper.select("MAX(product_no) as maxNo").likeRight("product_no", datePrefix);
+ List<Map<String, Object>> resultList = productionProductMainMapper.selectMaps(queryWrapper);
+ int sequenceNumber = 1;
+ if (resultList != null && !resultList.isEmpty()) {
+ Map<String, Object> result = resultList.get(0);
+ if (result != null && result.get("maxNo") != null) {
+ String lastNo = result.get("maxNo").toString();
+ if (lastNo.startsWith(datePrefix)) {
+ try {
+ sequenceNumber = Integer.parseInt(lastNo.substring(datePrefix.length())) + 1;
+ } catch (NumberFormatException e) {
+ sequenceNumber = 1;
+ }
+ }
+ }
+ }
+ return String.format("%s%03d", datePrefix, sequenceNumber);
+ }
+
+ private BigDecimal defaultDecimal(BigDecimal value) {
+ return value == null ? BigDecimal.ZERO : value;
+ }
+
+ @Override
+ public ArrayList<Long> listMain(List<Long> idList) {
+ return productionProductMainMapper.listMain(idList);
+ }
}
--
Gitblit v1.9.3