| | |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; |
| | | import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum; |
| | | import com.ruoyi.common.exception.ServiceException; |
| | | import com.ruoyi.common.utils.SecurityUtils; |
| | | import com.ruoyi.common.utils.bean.BeanUtils; |
| | | import com.ruoyi.common.utils.poi.ExcelUtil; |
| | | import com.ruoyi.procurementrecord.utils.StockUtils; |
| | |
| | | import com.ruoyi.quality.mapper.QualityUnqualifiedMapper; |
| | | import com.ruoyi.quality.pojo.QualityInspect; |
| | | import com.ruoyi.quality.pojo.QualityUnqualified; |
| | | import com.ruoyi.stock.pojo.StockInRecord; |
| | | import com.ruoyi.stock.service.StockInRecordService; |
| | | import com.ruoyi.quality.service.IQualityInspectService; |
| | | import com.ruoyi.quality.service.IQualityUnqualifiedService; |
| | | import com.ruoyi.stock.service.StockUninventoryService; |
| | | import lombok.AllArgsConstructor; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | 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.ArrayList; |
| | | import java.util.Arrays; |
| | | import java.util.Date; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | |
| | | private final ProductionOrderRoutingOperationMapper productionOrderRoutingOperationMapper; |
| | | private final ProductionOperationTaskMapper productionOperationTaskMapper; |
| | | private final StockUninventoryService stockUninventoryService; |
| | | private final StockInRecordService stockInRecordService; |
| | | |
| | | @Override |
| | | public IPage<QualityUnqualified> qualityUnqualifiedListPage(Page page, QualityUnqualified qualityUnqualified) { |
| | |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public int deal(QualityUnqualified qualityUnqualified) { |
| | | QualityUnqualified unqualified = qualityUnqualifiedMapper.selectById(qualityUnqualified.getId()); |
| | | if (unqualified == null) { |
| | | throw new ServiceException("不合格记录不存在"); |
| | | } |
| | | //幂等:已处理的不允许重复处理,防止重复入库/重复报工单 |
| | | if (Integer.valueOf(1).equals(unqualified.getInspectState())) { |
| | | throw new ServiceException("该不合格记录已处理,请勿重复操作"); |
| | | } |
| | | if (ObjectUtils.isNull(qualityUnqualified.getDealResult())) { |
| | | throw new ServiceException("请选择处理结果"); |
| | | } |
| | | QualityInspect qualityInspect = qualityInspectService.getById(unqualified.getInspectId()); |
| | | //处理结果枚举校验:原材料仅报废/让步放行;过程/出厂检额外支持返修/返工 |
| | | List<String> allowedResults = new ArrayList<>(Arrays.asList("报废", "让步放行")); |
| | | if (qualityInspect == null || qualityInspect.getInspectType() == null || qualityInspect.getInspectType() != 0) { |
| | | allowedResults.addAll(Arrays.asList("返修", "返工")); |
| | | } |
| | | if (!allowedResults.contains(qualityUnqualified.getDealResult())) { |
| | | throw new ServiceException("处理结果不合法,仅支持:" + String.join("/", allowedResults)); |
| | | } |
| | | String batchNo = qualityInspect == null ? null |
| | | : resolveProductionBatchNo(qualityInspect.getProductMainId(), qualityInspect.getId(), qualityInspect.getProductModelId()); |
| | | if (ObjectUtils.isNotNull(qualityInspect) && qualityInspect.getInspectType() != 0) { |
| | | switch (qualityUnqualified.getDealResult()) { |
| | | case "返修": |
| | |
| | | } |
| | | break; |
| | | case "报废": |
| | | stockUtils.addUnStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), |
| | | StockInUnQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId()); |
| | | stockUtils.addUnStockWithBatchNo(qualityInspect.getProductModelId(), unqualified.getQuantity(), |
| | | StockInQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId(), batchNo); |
| | | break; |
| | | case "让步放行": |
| | | stockUtils.addStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), |
| | | StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId()); |
| | | stockUtils.addStockWithBatchNo(qualityInspect.getProductModelId(), unqualified.getQuantity(), |
| | | StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId(), batchNo); |
| | | break; |
| | | default: |
| | | break; |
| | |
| | | switch (qualityUnqualified.getDealResult()) { |
| | | case "报废": |
| | | stockUtils.addUnStock(modelId, unqualified.getQuantity(), |
| | | StockInUnQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId()); |
| | | StockInQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId()); |
| | | break; |
| | | case "让步放行": |
| | | stockUtils.addStock(modelId, unqualified.getQuantity(), |
| | |
| | | break; |
| | | } |
| | | } |
| | | qualityUnqualified.setInspectState(1); |
| | | return qualityUnqualifiedMapper.updateById(qualityUnqualified); |
| | | //以库中记录为准回写,防止请求体篡改数量/状态等字段 |
| | | unqualified.setDealResult(qualityUnqualified.getDealResult()); |
| | | unqualified.setDealName(ObjectUtils.isNotNull(qualityUnqualified.getDealName()) |
| | | ? qualityUnqualified.getDealName() : SecurityUtils.getUsername()); |
| | | unqualified.setDealTime(qualityUnqualified.getDealTime() != null |
| | | ? qualityUnqualified.getDealTime() : new Date()); |
| | | unqualified.setInspectState(1); |
| | | return qualityUnqualifiedMapper.updateById(unqualified); |
| | | } |
| | | |
| | | @Override |
| | |
| | | BeanUtils.copyProperties(sourceOperation, newOperation); |
| | | newOperation.setId(null); |
| | | newOperation.setProductionOrderId(newOrder.getId()); |
| | | newOperation.setTechnologyRoutingId(routingIdMap.get(sourceOperation.getTechnologyRoutingId())); |
| | | newOperation.setOrderRoutingId(routingIdMap.get(sourceOperation.getOrderRoutingId())); |
| | | newOperation.setCreateTime(null); |
| | | newOperation.setUpdateTime(null); |
| | | productionOrderRoutingOperationMapper.insert(newOperation); |
| | | |
| | | ProductionOperationTask newTask = new ProductionOperationTask(); |
| | | newTask.setTechnologyRoutingOperationId(newOperation.getId()); |
| | | newTask.setProductionOrderRoutingOperationId(newOperation.getId()); |
| | | newTask.setProductionOrderId(newOrder.getId()); |
| | | newTask.setPlanQuantity(newOrder.getQuantity()); |
| | | newTask.setCompleteQuantity(BigDecimal.ZERO); |
| | |
| | | private BigDecimal defaultDecimal(BigDecimal value) { |
| | | return value == null ? BigDecimal.ZERO : value; |
| | | } |
| | | |
| | | private String resolveProductionBatchNo(Long productionProductMainId, |
| | | Long qualityInspectId, |
| | | Long productModelId) { |
| | | if (productModelId == null) { |
| | | return null; |
| | | } |
| | | if (productionProductMainId != null) { |
| | | StockInRecord productionRecord = stockInRecordService.getOne( |
| | | Wrappers.<StockInRecord>lambdaQuery() |
| | | .eq(StockInRecord::getRecordId, productionProductMainId) |
| | | .eq(StockInRecord::getProductModelId, productModelId) |
| | | .in(StockInRecord::getRecordType, Arrays.asList( |
| | | StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), |
| | | StockInQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode())) |
| | | .isNotNull(StockInRecord::getBatchNo) |
| | | .orderByDesc(StockInRecord::getId) |
| | | .last("limit 1"), |
| | | false); |
| | | if (productionRecord != null) { |
| | | return productionRecord.getBatchNo(); |
| | | } |
| | | } |
| | | if (qualityInspectId == null) { |
| | | return null; |
| | | } |
| | | StockInRecord inspectRecord = stockInRecordService.getOne( |
| | | Wrappers.<StockInRecord>lambdaQuery() |
| | | .eq(StockInRecord::getRecordId, qualityInspectId) |
| | | .eq(StockInRecord::getProductModelId, productModelId) |
| | | .eq(StockInRecord::getRecordType, StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode()) |
| | | .isNotNull(StockInRecord::getBatchNo) |
| | | .orderByDesc(StockInRecord::getId) |
| | | .last("limit 1"), |
| | | false); |
| | | return inspectRecord == null ? null : inspectRecord.getBatchNo(); |
| | | } |
| | | } |