package com.ruoyi.quality.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockUnQualifiedRecordTypeEnum; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.production.mapper.ProductProcessRouteItemMapper; import com.ruoyi.production.mapper.ProductProcessRouteMapper; import com.ruoyi.production.mapper.ProductWorkOrderMapper; import com.ruoyi.production.mapper.ProductionProductMainMapper; import com.ruoyi.production.pojo.*; import com.ruoyi.production.service.ProductOrderService; import com.ruoyi.quality.mapper.QualityUnqualifiedMapper; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.quality.pojo.QualityUnqualified; 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 javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.List; @AllArgsConstructor @Service public class QualityUnqualifiedServiceImpl extends ServiceImpl implements IQualityUnqualifiedService { private final StockUtils stockUtils; private QualityUnqualifiedMapper qualityUnqualifiedMapper; private IQualityInspectService qualityInspectService; private ProductOrderService productOrderService; private ProductionProductMainMapper productionProductMainMapper; private ProductProcessRouteMapper productProcessRouteMapper; private ProductProcessRouteItemMapper productProcessRouteItemMapper; private ProductWorkOrderMapper productWorkOrderMapper; private StockUninventoryService stockUninventoryService; @Override public IPage qualityUnqualifiedListPage(Page page, QualityUnqualified qualityUnqualified) { return qualityUnqualifiedMapper.qualityUnqualifiedListPage(page, qualityUnqualified); } @Override public void qualityUnqualifiedExport(HttpServletResponse response, QualityUnqualified qualityUnqualified) { List qualityUnqualifieds = qualityUnqualifiedMapper.qualityUnqualifiedExport(qualityUnqualified); ExcelUtil util = new ExcelUtil(QualityUnqualified.class); util.exportExcel(response, qualityUnqualifieds, "不合格管理导出"); } @Override public int deal(QualityUnqualified qualityUnqualified) { QualityUnqualified unqualified = qualityUnqualifiedMapper.selectById(qualityUnqualified.getId()); QualityInspect qualityInspect = qualityInspectService.getById(unqualified.getInspectId()); switch (qualityUnqualified.getDealResult()) { case "返修": case "返工": //判断质检表是否有相关的报工id,如果有报工id,那么返工需要重新创建生产订单重新生产 if (ObjectUtils.isNotNull(qualityInspect.getProductMainId())) { //返工需要重新创建生产订单重新生产 ProductOrder productOrder = productionProductMainMapper.getOrderByMainId(qualityInspect.getProductMainId()); ProductOrder order = new ProductOrder(); BeanUtils.copyProperties(productOrder, order); order.setId(null); order.setQuantity(unqualified.getQuantity()); order.setCompleteQuantity(BigDecimal.ZERO); order.setStartTime(null); order.setEndTime(null); productOrderService.save(order); //新增生产订单下的工艺路线主表 ProductProcessRoute productProcessRoute = productProcessRouteMapper.selectList(Wrappers.lambdaQuery().eq(ProductProcessRoute::getProductOrderId, productOrder.getId()).orderByDesc(ProductProcessRoute::getId)).get(0); ProductProcessRoute newProcessRoute = new ProductProcessRoute(); BeanUtils.copyProperties(productProcessRoute, newProcessRoute); newProcessRoute.setId(null); newProcessRoute.setProductOrderId(order.getId()); productProcessRouteMapper.insert(newProcessRoute); //新增生产订单下的工艺路线子表 List processRouteItems = productProcessRouteItemMapper.selectList(new QueryWrapper().lambda().eq(ProductProcessRouteItem::getProductRouteId, productProcessRoute.getId())); // 生成当前日期的前缀:年月日 String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); for (ProductProcessRouteItem processRouteItem : processRouteItems) { ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem(); BeanUtils.copyProperties(processRouteItem, productProcessRouteItem); productProcessRouteItem.setId(null); productProcessRouteItem.setProductRouteId(newProcessRoute.getId()); int insert = productProcessRouteItemMapper.insert(productProcessRouteItem); if (insert > 0) { // 查询今日已存在的最大工单号 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.likeRight("work_order_no", datePrefix) .orderByDesc("work_order_no") .last("LIMIT 1"); ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectOne(queryWrapper); int sequenceNumber = 1; // 默认序号 if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) { String lastNo = lastWorkOrder.getWorkOrderNo().toString(); if (lastNo.startsWith(datePrefix)) { String seqStr = lastNo.substring(datePrefix.length()); try { sequenceNumber = Integer.parseInt(seqStr) + 1; } catch (NumberFormatException e) { sequenceNumber = 1; } } } // 生成完整的工单号 String workOrderNoStr = String.format("%s%03d", datePrefix, sequenceNumber); ProductWorkOrder productWorkOrder = new ProductWorkOrder(); productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId()); productWorkOrder.setProductOrderId(order.getId()); productWorkOrder.setPlanQuantity(order.getQuantity()); productWorkOrder.setWorkOrderNo(workOrderNoStr); productWorkOrder.setStatus(1); productWorkOrderMapper.insert(productWorkOrder); } } } break; case "报废": //调用不合格库存接口 入不合格库 stockUtils.addUnStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockUnQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(),unqualified.getId()); break; case "让步放行": //调用提交合格的接口 stockUtils.addStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(),unqualified.getId()); qualityInspect.setCheckResult("合格"); qualityInspectService.submit(qualityInspect); break; default: break; } qualityUnqualified.setInspectState(1);//已处理 return qualityUnqualifiedMapper.updateById(qualityUnqualified); } }