| | |
| | | import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum; |
| | | import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; |
| | | import com.ruoyi.common.exception.ServiceException; |
| | | import com.ruoyi.common.utils.SecurityUtils; |
| | | import com.ruoyi.common.utils.bean.BeanUtils; |
| | | import com.ruoyi.procurementrecord.utils.StockUtils; |
| | | import com.ruoyi.production.dto.ProductStructureDto; |
| | |
| | | import com.ruoyi.quality.mapper.*; |
| | | import com.ruoyi.quality.pojo.*; |
| | | import com.ruoyi.quality.service.IQualityInspectService; |
| | | import com.ruoyi.stock.support.FinishedProductStockDimensionResolver; |
| | | import lombok.AllArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | 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.function.Function; |
| | | import java.util.stream.Collectors; |
| | | |
| | | @Service |
| | | @AllArgsConstructor |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public class ProductionProductMainServiceImpl extends ServiceImpl<ProductionProductMainMapper, ProductionProductMain> implements ProductionProductMainService { |
| | | |
| | | private static final String PROCESS_VOLTAGE_SORT = "电压分选"; |
| | | private static final String PROCESS_OPTICAL_INSPECTION = "光检外观"; |
| | | private static final String PROCESS_PACKAGING = "包装"; |
| | | |
| | | private IQualityInspectService qualityInspectService; |
| | | private ProductionProductMainMapper productionProductMainMapper; |
| | |
| | | |
| | | private StockUtils stockUtils; |
| | | |
| | | /** |
| | | * 解析生产报工对应的成品入库维度。 |
| | | */ |
| | | private FinishedProductStockDimensionResolver finishedProductStockDimensionResolver; |
| | | |
| | | private ISysNoticeService sysNoticeService; |
| | | |
| | | @Override |
| | |
| | | return productionProductMainMapper.listPageProductionProductMainDto(page, productionProductMainDto); |
| | | } |
| | | |
| | | /** |
| | | * 新增报工,并根据当前工序处理质检和入库逻辑。 |
| | | */ |
| | | @Override |
| | | public Boolean addProductMain(ProductionProductMainDto dto) { |
| | | SysUser user = userMapper.selectUserById(dto.getUserId()); |
| | |
| | | //当前工艺路线对应的工序详情 |
| | | ProductProcessRouteItem productProcessRouteItem = productProcessRouteItemMapper.selectById(dto.getProductProcessRouteItemId()); |
| | | if (productProcessRouteItem == null) { |
| | | throw new RuntimeException("工艺路线项不存在"); |
| | | throw new RuntimeException("工艺路线工序项不存在"); |
| | | } |
| | | // 是否能报工: 1. 第一个工序能报工 2. 上一个工序已报工 3. 之前的工序未被隔离 |
| | | //检查上一个工序是否已报工 |
| | | Integer currentDragSort = productProcessRouteItem.getDragSort(); |
| | | if (currentDragSort != null && currentDragSort > 1) { |
| | |
| | | currentDragSort |
| | | ); |
| | | if (!isPreviousReported) { |
| | | throw new RuntimeException("上一个工序尚未报工,不能进行当前工序报工"); |
| | | throw new RuntimeException("上一道工序尚未报工,当前工序不能报工"); |
| | | } |
| | | |
| | | // 查询所有之前的工序(排序号小于当前工序) |
| | |
| | | // 检查之前的工序是否有被隔离的不合格记录 |
| | | List<QualityUnqualified> unqualifiedList = qualityUnqualifiedMapper.selectUnqualifiedByProcessNames(previousProcessNames); |
| | | if (CollectionUtils.isNotEmpty(unqualifiedList)) { |
| | | throw new RuntimeException("之前的工序已被隔离,不能进行当前工序报工"); |
| | | throw new RuntimeException("前序工序存在隔离记录,当前工序不能报工"); |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | String productNo = String.format("%s%03d", datePrefix, sequenceNumber); |
| | | productionProductMain.setProductNo(productNo); |
| | | productionProductMain.setUserId(dto.getUserId()); |
| | | productionProductMain.setUserName(dto.getUserName()); |
| | | Long userId = dto.getUserId(); |
| | | String userName = dto.getUserName(); |
| | | if (userId == null) { |
| | | userId = SecurityUtils.getLoginUser().getUserId(); |
| | | userName = SecurityUtils.getLoginUser().getNickName(); |
| | | } |
| | | productionProductMain.setUserId(userId); |
| | | productionProductMain.setUserName(userName); |
| | | productionProductMain.setProductProcessRouteItemId(dto.getProductProcessRouteItemId()); |
| | | productionProductMain.setWorkOrderId(dto.getWorkOrderId()); |
| | | productionProductMain.setStatus(0); |
| | |
| | | productStructureDto.setUnitQuantity(BigDecimal.ONE); |
| | | productStructureDtos.add(productStructureDto); |
| | | } |
| | | Set<Long> parentIds = productStructureDtos.stream() |
| | | .map(ProductStructureDto::getParentId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | Map<Long, ProductStructureDto> parentMap = new HashMap<>(); |
| | | if (!parentIds.isEmpty()) { |
| | | parentMap = productStructureMapper.selectByIds(parentIds) |
| | | .stream() |
| | | .collect(Collectors.toMap( |
| | | ProductStructureDto::getId, |
| | | Function.identity() |
| | | )); |
| | | } |
| | | for (ProductStructureDto productStructureDto : productStructureDtos) { |
| | | ProductionProductInput productionProductInput = new ProductionProductInput(); |
| | | productionProductInput.setProductModelId(productStructureDto.getProductModelId()); |
| | | productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity())); |
| | | // productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity())); |
| | | BigDecimal childQty = productStructureDto.getUnitQuantity(); |
| | | BigDecimal parentQty = BigDecimal.ONE; |
| | | if (productStructureDto.getParentId() != null) { |
| | | ProductStructureDto parent = parentMap.get(productStructureDto.getParentId()); |
| | | if (parent != null) { |
| | | parentQty = parent.getUnitQuantity(); |
| | | } |
| | | } |
| | | |
| | | // 核心计算 |
| | | BigDecimal needQty = childQty.divide(parentQty, 6, RoundingMode.HALF_UP).multiply(dto.getQuantity()); |
| | | productionProductInput.setQuantity(needQty); |
| | | productionProductInput.setProductMainId(productionProductMain.getId()); |
| | | productionProductInputMapper.insert(productionProductInput); |
| | | stockUtils.substractStock(productStructureDto.getProductModelId(), productionProductInput.getQuantity(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(), productionProductMain.getId(), null); |
| | | stockUtils.substractStock(productStructureDto.getProductModelId(), productionProductInput.getQuantity(), |
| | | StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode(), productionProductMain.getId(), null); |
| | | } |
| | | /*新增报工产出表*/ |
| | | ProductionProductOutput productionProductOutput = new ProductionProductOutput(); |
| | |
| | | |
| | | //合格数量=报工数量-报废数量 |
| | | BigDecimal productQty = productionProductOutput.getQuantity().subtract(productionProductOutput.getScrapQty()); |
| | | List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId())); |
| | | //只有合格数量>0才能增加相应数据 |
| | | List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList( |
| | | Wrappers.<ProductProcessRouteItem>lambdaQuery() |
| | | .eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()) |
| | | ); |
| | | boolean isRouteLastProcess = productProcessRouteItem.getDragSort() == productProcessRouteItems.size(); |
| | | ReportStockRule reportStockRule = resolveReportStockRule(productProcessRouteItem, productProcess, productProcessRouteItems); |
| | | |
| | | String processCategory = null; |
| | | String voltage = null; |
| | | if (productQty.compareTo(BigDecimal.ZERO) > 0 && reportStockRule.isFinishedGoodsStockIn()) { |
| | | processCategory = finishedProductStockDimensionResolver.resolveProcessCategory(productionProductMain.getId()); |
| | | voltage = finishedProductStockDimensionResolver.resolveVoltage(productionProductMain.getId()); |
| | | } |
| | | |
| | | if (productQty.compareTo(BigDecimal.ZERO) > 0) { |
| | | /*新增质检*/ |
| | | if (productProcessRouteItem.getIsQuality()) { |
| | | //对应的过程检或者出厂检 |
| | | int inspectType = 1; |
| | | String process = productProcess.getName();//工序 |
| | | if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) { |
| | | //最后一道工序生成出厂检 |
| | | String process = productProcess.getName(); |
| | | if (reportStockRule.isFinishedGoodsStockIn()) { |
| | | inspectType = 2; |
| | | process = null; |
| | | } |
| | |
| | | qualityInspect.setProductName(product.getProductName()); |
| | | qualityInspect.setModel(productModel.getModel()); |
| | | qualityInspect.setUnit(productModel.getUnit()); |
| | | qualityInspect.setQuantity(productQty); |
| | | qualityInspect.setQuantity(productionProductOutput.getQuantity()); |
| | | qualityInspect.setProcess(process); |
| | | qualityInspect.setInspectState(0); |
| | | qualityInspect.setInspectType(inspectType); |
| | | qualityInspect.setDefectiveQuantity(BigDecimal.ZERO); |
| | | qualityInspect.setDefectiveQuantity(productionProductOutput.getScrapQty()); |
| | | qualityInspect.setProductMainId(productionProductMain.getId()); |
| | | qualityInspect.setProductModelId(productModel.getId()); |
| | | qualityInspectMapper.insert(qualityInspect); |
| | |
| | | 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()))//默认获取最新的 |
| | | qualityTestStandardParamMapper.selectList( |
| | | Wrappers.<QualityTestStandardParam>lambdaQuery() |
| | | .eq(QualityTestStandardParam::getTestStandardId, qualityTestStandard.get(0).getId()) |
| | | ) |
| | | .forEach(qualityTestStandardParam -> { |
| | | QualityInspectParam param = new QualityInspectParam(); |
| | | BeanUtils.copyProperties(qualityTestStandardParam, param); |
| | |
| | | qualityInspectParamMapper.insert(param); |
| | | }); |
| | | } |
| | | }else { |
| | | //直接入库 |
| | | //最后一道工序为成品 |
| | | 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()); |
| | | } else { |
| | | if (reportStockRule.shouldCreateStockIn()) { |
| | | if (reportStockRule.isFinishedGoodsStockIn()) { |
| | | stockUtils.addStock(productProcessRouteItem.getProductModelId(), productQty, |
| | | StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId(), |
| | | processCategory, voltage); |
| | | } else { |
| | | stockUtils.addStockNoReview(productProcessRouteItem.getProductModelId(), productQty, |
| | | StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId()); |
| | | } |
| | | } |
| | | if (productionProductOutput.getScrapQty().compareTo(BigDecimal.ZERO) > 0) { |
| | | stockUtils.addUnStockNoReview(productProcessRouteItem.getProductModelId(), productionProductOutput.getScrapQty(), |
| | | StockInUnQualifiedRecordTypeEnum.QUALITYINSPECT_UNSTOCK_IN.getCode(), productionProductMain.getId()); |
| | | } |
| | | } |
| | | /*更新工单和生产订单*/ |
| | | |
| | | productWorkOrder.setCompleteQuantity(productWorkOrder.getCompleteQuantity().add(productQty)); |
| | | if (ObjectUtils.isNull(productWorkOrder.getActualStartTime())) { |
| | | productWorkOrder.setActualStartTime(LocalDate.now());//实际开始时间 |
| | | productWorkOrder.setActualStartTime(LocalDate.now()); |
| | | } |
| | | if (productWorkOrder.getCompleteQuantity().compareTo(productWorkOrder.getPlanQuantity()) == 0) { |
| | | productWorkOrder.setActualEndTime(LocalDate.now());//实际结束时间 |
| | | productWorkOrder.setActualEndTime(LocalDate.now()); |
| | | } |
| | | productWorkOrderMapper.updateById(productWorkOrder); |
| | | //生产订单 |
| | | |
| | | if (ObjectUtils.isNull(productOrder.getStartTime())) { |
| | | productOrder.setStartTime(LocalDateTime.now());//开始时间 |
| | | productOrder.setStartTime(LocalDateTime.now()); |
| | | } |
| | | if (productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) { |
| | | //如果是最后一道工序报工之后生产订单完成数量+ |
| | | if (isRouteLastProcess) { |
| | | productOrder.setCompleteQuantity(productOrder.getCompleteQuantity().add(productQty)); |
| | | if (productOrder.getCompleteQuantity().compareTo(productOrder.getQuantity()) == 0) { |
| | | productOrder.setEndTime(LocalDateTime.now());//结束时间 |
| | | productOrder.setEndTime(LocalDateTime.now()); |
| | | } |
| | | } |
| | | productOrderMapper.updateById(productOrder); |
| | | /*添加生产核算*/ |
| | | |
| | | SalesLedgerProductionAccounting salesLedgerProductionAccounting = SalesLedgerProductionAccounting.builder() |
| | | .productMainId(productionProductMain.getId()) |
| | | .schedulingUserId(user.getUserId()) |
| | | .schedulingUserName(user.getNickName()) |
| | | .schedulingUserId(userId) |
| | | .schedulingUserName(userName) |
| | | .finishedNum(productQty) |
| | | .workHours(productProcess.getSalaryQuota()) |
| | | .process(productProcess.getName()) |
| | |
| | | .build(); |
| | | salesLedgerProductionAccountingMapper.insert(salesLedgerProductionAccounting); |
| | | } |
| | | //如果报废数量>0,需要进入报废的库存 |
| | | if (ObjectUtils.isNotEmpty(dto.getScrapQty())) { |
| | | if (dto.getScrapQty().compareTo(BigDecimal.ZERO) > 0) { |
| | | 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; |
| | | } |
| | | |
| | | /** |
| | | * 判断当前报工是否需要入库,以及是否按成品入库处理。 |
| | | */ |
| | | private ReportStockRule resolveReportStockRule(ProductProcessRouteItem currentRouteItem, |
| | | ProductProcess currentProcess, |
| | | List<ProductProcessRouteItem> routeItems) { |
| | | boolean isRouteLastProcess = currentRouteItem.getDragSort() != null |
| | | && CollectionUtils.isNotEmpty(routeItems) |
| | | && currentRouteItem.getDragSort().equals(routeItems.size()); |
| | | String currentProcessName = normalizeProcessName(currentProcess == null ? null : currentProcess.getName()); |
| | | if (PROCESS_VOLTAGE_SORT.equals(currentProcessName)) { |
| | | return new ReportStockRule(false, false); |
| | | } |
| | | |
| | | Map<Long, String> processNameMap = loadRouteProcessNameMap(routeItems); |
| | | boolean hasVoltageSort = containsProcess(routeItems, processNameMap, PROCESS_VOLTAGE_SORT); |
| | | boolean hasOpticalInspection = containsProcess(routeItems, processNameMap, PROCESS_OPTICAL_INSPECTION); |
| | | boolean hasPackaging = containsProcess(routeItems, processNameMap, PROCESS_PACKAGING); |
| | | |
| | | if (hasPackaging && PROCESS_PACKAGING.equals(currentProcessName)) { |
| | | return new ReportStockRule(true, true); |
| | | } |
| | | if (hasPackaging && PROCESS_OPTICAL_INSPECTION.equals(currentProcessName)) { |
| | | return new ReportStockRule(false, false); |
| | | } |
| | | if (!hasPackaging && hasVoltageSort && hasOpticalInspection && PROCESS_OPTICAL_INSPECTION.equals(currentProcessName)) { |
| | | return new ReportStockRule(true, true); |
| | | } |
| | | return new ReportStockRule(true, isRouteLastProcess); |
| | | } |
| | | |
| | | /** |
| | | * 批量加载工艺路线中的工序名称。 |
| | | */ |
| | | private Map<Long, String> loadRouteProcessNameMap(List<ProductProcessRouteItem> routeItems) { |
| | | if (CollectionUtils.isEmpty(routeItems)) { |
| | | return Collections.emptyMap(); |
| | | } |
| | | Set<Long> processIds = routeItems.stream() |
| | | .map(ProductProcessRouteItem::getProcessId) |
| | | .filter(Objects::nonNull) |
| | | .collect(Collectors.toSet()); |
| | | if (processIds.isEmpty()) { |
| | | return Collections.emptyMap(); |
| | | } |
| | | return productProcessMapper.selectBatchIds(processIds).stream() |
| | | .collect(Collectors.toMap(ProductProcess::getId, process -> normalizeProcessName(process.getName()))); |
| | | } |
| | | |
| | | /** |
| | | * 判断工艺路线中是否包含指定工序。 |
| | | */ |
| | | private boolean containsProcess(List<ProductProcessRouteItem> routeItems, Map<Long, String> processNameMap, String processName) { |
| | | return routeItems.stream() |
| | | .map(ProductProcessRouteItem::getProcessId) |
| | | .map(processNameMap::get) |
| | | .anyMatch(processName::equals); |
| | | } |
| | | |
| | | /** |
| | | * 统一工序名称格式,避免规则匹配时受空白字符影响。 |
| | | */ |
| | | private String normalizeProcessName(String processName) { |
| | | return processName == null ? "" : processName.trim(); |
| | | } |
| | | |
| | | /** |
| | | * 单次报工对应的入库规则。 |
| | | */ |
| | | private static final class ReportStockRule { |
| | | private final boolean createStockIn; |
| | | private final boolean finishedGoodsStockIn; |
| | | |
| | | private ReportStockRule(boolean createStockIn, boolean finishedGoodsStockIn) { |
| | | this.createStockIn = createStockIn; |
| | | this.finishedGoodsStockIn = finishedGoodsStockIn; |
| | | } |
| | | |
| | | private boolean shouldCreateStockIn() { |
| | | return createStockIn; |
| | | } |
| | | |
| | | private boolean isFinishedGoodsStockIn() { |
| | | return finishedGoodsStockIn; |
| | | } |
| | | } |
| | | |
| | | @Override |
| | | public Boolean removeProductMain(Long id) { |
| | | //判断该条报工是否不合格处理,如果不合格处理了,则不允许删除 |
| | | List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(Wrappers.<QualityInspect>lambdaQuery().eq(QualityInspect::getProductMainId, id)); |
| | | 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("该条报工已经不合格处理了,不允许删除"); |
| | | List<QualityInspect> qualityInspects = qualityInspectMapper.selectList( |
| | | Wrappers.<QualityInspect>lambdaQuery().eq(QualityInspect::getProductMainId, id) |
| | | ); |
| | | 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); |
| | | //该报工对应的工艺路线详情 |
| | | ProductProcessRouteItem productProcessRouteItem = productProcessRouteItemMapper.selectById(productionProductMain.getProductProcessRouteItemId()); |
| | | ProductionProductOutput productionProductOutput = productionProductOutputMapper.selectList(Wrappers.<ProductionProductOutput>lambdaQuery().eq(ProductionProductOutput::getProductMainId, productionProductMain.getId())).get(0); |
| | | /*删除核算*/ |
| | | ProductionProductOutput productionProductOutput = productionProductOutputMapper.selectList( |
| | | Wrappers.<ProductionProductOutput>lambdaQuery().eq(ProductionProductOutput::getProductMainId, productionProductMain.getId()) |
| | | ).get(0); |
| | | |
| | | salesLedgerProductionAccountingMapper.delete( |
| | | new LambdaQueryWrapper<SalesLedgerProductionAccounting>() |
| | | .eq(SalesLedgerProductionAccounting::getProductMainId, productionProductMain.getId()) |
| | | ); |
| | | /*更新工单和生产订单*/ |
| | | |
| | | ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(productionProductMain.getWorkOrderId()); |
| | | if (productWorkOrder != null && productionProductOutput != null) { |
| | | BigDecimal outputQty = productionProductOutput.getQuantity() == null ? BigDecimal.ZERO : productionProductOutput.getQuantity(); |
| | |
| | | BigDecimal completeQty = productWorkOrder.getCompleteQuantity() == null ? BigDecimal.ZERO : productWorkOrder.getCompleteQuantity(); |
| | | |
| | | BigDecimal validQuantity = outputQty.subtract(scrapQty); |
| | | |
| | | productWorkOrder.setCompleteQuantity(completeQty.subtract(validQuantity)); |
| | | productWorkOrder.setActualEndTime(null); |
| | | productWorkOrderMapper.updateById(productWorkOrder); |
| | | } else { |
| | | throw new ServiceException("操作失败:工单信息或产出记录不存在"); |
| | | } |
| | | //判断是否是最后一道工序 |
| | | List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId())); |
| | | if (productProcessRouteItem.getDragSort() != null && productProcessRouteItems != null && productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) { |
| | | |
| | | List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList( |
| | | Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()) |
| | | ); |
| | | if (productProcessRouteItem.getDragSort() != null |
| | | && productProcessRouteItems != null |
| | | && productProcessRouteItem.getDragSort() == productProcessRouteItems.size()) { |
| | | ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId()); |
| | | if (productOrder != null) { |
| | | BigDecimal orderCompleteQty = productOrder.getCompleteQuantity() == null ? BigDecimal.ZERO : productOrder.getCompleteQuantity(); |
| | |
| | | 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())); |
| | | .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()); |
| | | }); |
| | | |
| | | // 删除产出记录 |
| | | productionProductOutputMapper.delete(new LambdaQueryWrapper<ProductionProductOutput>() |
| | | .eq(ProductionProductOutput::getProductMainId, productionProductMain.getId())); |
| | | //删除投入记录 |
| | | productionProductInputMapper.delete(new LambdaQueryWrapper<ProductionProductInput>() |
| | | .eq(ProductionProductInput::getProductMainId, productionProductMain.getId())); |
| | | //删除报废的入库记录 |
| | | productionProductOutputMapper.delete( |
| | | new LambdaQueryWrapper<ProductionProductOutput>() |
| | | .eq(ProductionProductOutput::getProductMainId, productionProductMain.getId()) |
| | | ); |
| | | productionProductInputMapper.delete( |
| | | new LambdaQueryWrapper<ProductionProductInput>() |
| | | .eq(ProductionProductInput::getProductMainId, 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; |
| | | } |
| | |
| | | @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)); |
| | | |
| | | // 构建产品主ID到质检记录的映射 |
| | | |
| | | 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) { |
| | | // 不良数量 |
| | | p.setDefectiveQuantity( qualityInspect.getDefectiveQuantity()); |
| | | // 合格数量 = 报工数量-报废数量-不良数量 |
| | | p.setDefectiveQuantity(qualityInspect.getDefectiveQuantity()); |
| | | p.setQualifiedQty(p.getQuantity().subtract(p.getScrapQty()).subtract(p.getDefectiveQuantity())); |
| | | QualityUnqualified qualityUnqualified = inspectIdToUnqualifiedMap.get(qualityInspect.getId()); |
| | | if (qualityUnqualified != null) { |
| | |
| | | } |
| | | }); |
| | | } |
| | | |
| | | |
| | | return productionProductMainDtos; |
| | | } |
| | | } |