src/main/java/com/ruoyi/basic/pojo/ProductModel.java
@@ -37,6 +37,10 @@ @Excel(name = "è§æ ¼åå·") private String model; @Excel(name = "产åç¼ç ") @TableField("product_code") private String productCode; /** * åä½ */ src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
@@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper; import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper; import com.ruoyi.stock.dto.StockInRecordDto; import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.dto.StockUninventoryDto; import com.ruoyi.stock.mapper.StockInventoryMapper; @@ -14,15 +13,11 @@ import com.ruoyi.stock.service.StockInventoryService; import com.ruoyi.stock.service.StockOutRecordService; import com.ruoyi.stock.service.StockUninventoryService; import com.ruoyi.stock.service.impl.StockInRecordServiceImpl; import com.ruoyi.stock.service.impl.StockOutRecordServiceImpl; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.util.Collections; import java.util.HashMap; import java.util.Map; @Component @RequiredArgsConstructor src/main/java/com/ruoyi/production/bean/vo/ProductionOrderVo.java
@@ -6,6 +6,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import java.math.BigDecimal; import java.util.List; @EqualsAndHashCode(callSuper = true) @@ -32,4 +33,7 @@ @Schema(description = "bomç¼å·") private String bomNo; @Schema(description = "宿è¿åº¦") private BigDecimal completionStatus; } src/main/java/com/ruoyi/production/bean/vo/ProductionOrderWorkOrderDetailVo.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,66 @@ package com.ruoyi.production.bean.vo; import com.ruoyi.production.pojo.ProductionOperationTask; import com.ruoyi.production.pojo.ProductionOrderRoutingOperationParam; import com.ruoyi.production.pojo.ProductionProductMain; import com.ruoyi.production.pojo.ProductionProductOutput; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.quality.pojo.QualityInspectFile; import com.ruoyi.quality.pojo.QualityInspectParam; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.util.List; @Data @Schema(name = "ProductionOrderWorkOrderDetailVo", description = "Production order work order/report/inspect detail") public class ProductionOrderWorkOrderDetailVo { @Schema(description = "Production order info") private ProductionOrderVo productionOrder; @Schema(description = "Work order list") private List<WorkOrderDetail> workOrderList; @Data @Schema(name = "WorkOrderDetail", description = "Work order detail") public static class WorkOrderDetail { @Schema(description = "Work order info") private ProductionOperationTask workOrder; @Schema(description = "Report list under current work order") private List<ReportDetail> reportList; } @Data @Schema(name = "ReportDetail", description = "Production report detail") public static class ReportDetail { @Schema(description = "Report main info") private ProductionProductMain reportMain; @Schema(description = "Report output list") private List<ProductionProductOutput> reportOutputList; @Schema(description = "Report process param list") private List<ProductionOrderRoutingOperationParam> reportParamList; @Schema(description = "Inspect list under current report") private List<InspectDetail> inspectList; } @Data @Schema(name = "InspectDetail", description = "Quality inspect detail") public static class InspectDetail { @Schema(description = "Inspect main info") private QualityInspect inspect; @Schema(description = "Inspect param list") private List<QualityInspectParam> inspectParamList; @Schema(description = "Inspect attachment list") private List<QualityInspectFile> inspectFileList; } } src/main/java/com/ruoyi/production/controller/ProductionOrderController.java
@@ -7,6 +7,7 @@ import com.ruoyi.production.bean.vo.ProductionOrderPickVo; import com.ruoyi.production.bean.vo.ProductionOrderVo; import com.ruoyi.production.bean.vo.ProductionPlanVo; import com.ruoyi.production.bean.vo.ProductionOrderWorkOrderDetailVo; import com.ruoyi.production.pojo.ProductionOrder; import com.ruoyi.production.service.ProductionOrderService; import io.swagger.v3.oas.annotations.Operation; @@ -82,4 +83,10 @@ public R<List<ProductionOrderPickVo>> pick(@PathVariable Long productionOrderId) { return R.ok(productionOrderService.pick(productionOrderId)); } @GetMapping("/workOrder/detail/{productionOrderId}") @Operation(summary = "Query work orders/reports/inspects by production order id") public R<ProductionOrderWorkOrderDetailVo> getWorkOrderReportInspectDetail(@PathVariable Long productionOrderId) { return R.ok(productionOrderService.getWorkOrderReportInspectDetail(productionOrderId)); } } src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java
@@ -9,6 +9,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -50,6 +51,7 @@ * @return */ @PostMapping("/addProductMain") @PreAuthorize("@ss.hasPermi('productionProductMain:add')") public R addProductMain(@RequestBody ProductionProductMainDto productionProductMainDto) { return R.ok(productionProductMainService.addProductMain(productionProductMainDto)); } src/main/java/com/ruoyi/production/service/ProductionOrderService.java
@@ -7,6 +7,7 @@ import com.ruoyi.production.bean.vo.ProductionOrderPickVo; import com.ruoyi.production.bean.vo.ProductionOrderVo; import com.ruoyi.production.bean.vo.ProductionPlanVo; import com.ruoyi.production.bean.vo.ProductionOrderWorkOrderDetailVo; import com.ruoyi.production.pojo.ProductionOrder; import java.util.List; @@ -30,4 +31,6 @@ List<ProductionPlanVo> getSource(Long id); List<ProductionOrderPickVo> pick(Long productionOrderId); ProductionOrderWorkOrderDetailVo getWorkOrderReportInspectDetail(Long productionOrderId); } src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
@@ -19,9 +19,16 @@ import com.ruoyi.production.bean.vo.ProductionOrderPickVo; import com.ruoyi.production.bean.vo.ProductionOrderVo; import com.ruoyi.production.bean.vo.ProductionPlanVo; import com.ruoyi.production.bean.vo.ProductionOrderWorkOrderDetailVo; import com.ruoyi.production.enums.ProductOrderStatusEnum; import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.*; import com.ruoyi.quality.mapper.QualityInspectFileMapper; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.mapper.QualityInspectParamMapper; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.quality.pojo.QualityInspectFile; import com.ruoyi.quality.pojo.QualityInspectParam; import com.ruoyi.production.service.ProductionOrderService; import com.ruoyi.sales.mapper.SalesLedgerMapper; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; @@ -51,8 +58,12 @@ private final ProductionOrderBomMapper productionOrderBomMapper; private final ProductionBomStructureMapper productionBomStructureMapper; private final ProductionProductMainMapper productionProductMainMapper; private final ProductionProductOutputMapper productionProductOutputMapper; private final ProductionOrderPickMapper productionOrderPickMapper; private final ProductionOrderPickRecordMapper productionOrderPickRecordMapper; private final QualityInspectMapper qualityInspectMapper; private final QualityInspectParamMapper qualityInspectParamMapper; private final QualityInspectFileMapper qualityInspectFileMapper; private final ProductionPlanMapper productionPlanMapper; private final StockInventoryMapper stockInventoryMapper; private final StorageAttachmentMapper storageAttachmentMapper; @@ -219,8 +230,8 @@ List<TechnologyRoutingOperation> routingOperations = technologyRoutingOperationMapper.selectList( Wrappers.<TechnologyRoutingOperation>lambdaQuery() .eq(TechnologyRoutingOperation::getTechnologyRoutingId, technologyRouting.getId()) .orderByAsc(TechnologyRoutingOperation::getDragSort) .orderByAsc(TechnologyRoutingOperation::getId)); .orderByDesc(TechnologyRoutingOperation::getDragSort) .orderByDesc(TechnologyRoutingOperation::getId)); Map<Long, String> operationNameMap = technologyOperationMapper.selectBatchIds( routingOperations.stream() .map(TechnologyRoutingOperation::getTechnologyOperationId) @@ -228,6 +239,11 @@ .collect(Collectors.toSet())) .stream() .collect(Collectors.toMap(TechnologyOperation::getId, TechnologyOperation::getName, (a, b) -> a)); Integer lastDragSort = routingOperations.stream() .map(TechnologyRoutingOperation::getDragSort) .filter(Objects::nonNull) .max(Integer::compareTo) .orElse(null); for (TechnologyRoutingOperation sourceOperation : routingOperations) { // 订åå·¥åºä¿åçæ¯å·¥èºå·¥åºå¿«ç §ï¼åç»æ¥å·¥åªä¾èµå¿«ç §ï¼ä¸åç´æ¥å¼ç¨å·¥èºä¸»æ°æ®ã ProductionOrderRoutingOperation targetOperation = new ProductionOrderRoutingOperation(); @@ -236,11 +252,14 @@ targetOperation.setOrderRoutingId(orderRouting.getId()); targetOperation.setProductModelId(sourceOperation.getProductModelId()); targetOperation.setDragSort(sourceOperation.getDragSort()); targetOperation.setIsProduction(sourceOperation.getIsProduction()); targetOperation.setIsQuality(sourceOperation.getIsQuality()); targetOperation.setOperationName(operationNameMap.get(sourceOperation.getTechnologyOperationId())); targetOperation.setTechnologyOperationId(sourceOperation.getTechnologyOperationId()); productionOrderRoutingOperationMapper.insert(targetOperation); boolean isLastOperation = lastDragSort != null && Objects.equals(sourceOperation.getDragSort(), lastDragSort); if (isLastOperation || Boolean.TRUE.equals(targetOperation.getIsProduction())) { ProductionOperationTask task = new ProductionOperationTask(); task.setProductionOrderRoutingOperationId(targetOperation.getId()); task.setProductionOrderId(productionOrder.getId()); @@ -249,6 +268,7 @@ task.setWorkOrderNo(generateNextTaskNo()); task.setStatus(2); productionOperationTaskMapper.insert(task); } List<TechnologyRoutingOperationParam> sourceParams = technologyRoutingOperationParamMapper.selectList( Wrappers.<TechnologyRoutingOperationParam>lambdaQuery() @@ -661,6 +681,168 @@ } @Override public ProductionOrderWorkOrderDetailVo getWorkOrderReportInspectDetail(Long productionOrderId) { if (productionOrderId == null) { throw new ServiceException("productionOrderId can not be null"); } ProductionOrderVo orderInfo = getProductionOrderInfo(productionOrderId); if (orderInfo == null) { throw new ServiceException("production order not found"); } ProductionOrderWorkOrderDetailVo detailVo = new ProductionOrderWorkOrderDetailVo(); detailVo.setProductionOrder(orderInfo); List<ProductionOperationTask> workOrderList = productionOperationTaskMapper.selectList( Wrappers.<ProductionOperationTask>lambdaQuery() .eq(ProductionOperationTask::getProductionOrderId, productionOrderId) .orderByAsc(ProductionOperationTask::getId)); if (workOrderList == null || workOrderList.isEmpty()) { detailVo.setWorkOrderList(Collections.emptyList()); return detailVo; } List<Long> workOrderIdList = workOrderList.stream() .map(ProductionOperationTask::getId) .filter(Objects::nonNull) .collect(Collectors.toList()); List<ProductionProductMain> reportMainList = workOrderIdList.isEmpty() ? Collections.emptyList() : productionProductMainMapper.selectList( Wrappers.<ProductionProductMain>lambdaQuery() .in(ProductionProductMain::getProductionOperationTaskId, workOrderIdList) .orderByAsc(ProductionProductMain::getId)); Map<Long, List<ProductionProductMain>> reportMainMap = new LinkedHashMap<>(); for (ProductionProductMain reportMain : reportMainList) { if (reportMain == null || reportMain.getProductionOperationTaskId() == null) { continue; } reportMainMap.computeIfAbsent(reportMain.getProductionOperationTaskId(), k -> new ArrayList<>()).add(reportMain); } List<Long> reportMainIdList = reportMainList.stream() .map(ProductionProductMain::getId) .filter(Objects::nonNull) .collect(Collectors.toList()); Map<Long, List<ProductionProductOutput>> reportOutputMap = new LinkedHashMap<>(); Map<Long, List<ProductionOrderRoutingOperationParam>> reportParamMap = new LinkedHashMap<>(); Map<Long, List<QualityInspect>> inspectMap = new LinkedHashMap<>(); Map<Long, List<QualityInspectParam>> inspectParamMap = new LinkedHashMap<>(); Map<Long, List<QualityInspectFile>> inspectFileMap = new LinkedHashMap<>(); if (!reportMainIdList.isEmpty()) { List<ProductionProductOutput> reportOutputList = productionProductOutputMapper.selectList( Wrappers.<ProductionProductOutput>lambdaQuery() .in(ProductionProductOutput::getProductionProductMainId, reportMainIdList) .orderByAsc(ProductionProductOutput::getId)); for (ProductionProductOutput reportOutput : reportOutputList) { if (reportOutput == null) { continue; } Long reportMainId = reportOutput.getProductionProductMainId() != null ? reportOutput.getProductionProductMainId() : reportOutput.getProductMainId(); if (reportMainId == null) { continue; } reportOutputMap.computeIfAbsent(reportMainId, k -> new ArrayList<>()).add(reportOutput); } List<ProductionOrderRoutingOperationParam> reportParamList = productionOrderRoutingOperationParamMapper.selectList( Wrappers.<ProductionOrderRoutingOperationParam>lambdaQuery() .in(ProductionOrderRoutingOperationParam::getProductionProductMainId, reportMainIdList) .orderByAsc(ProductionOrderRoutingOperationParam::getId)); for (ProductionOrderRoutingOperationParam reportParam : reportParamList) { if (reportParam == null || reportParam.getProductionProductMainId() == null) { continue; } reportParamMap.computeIfAbsent(reportParam.getProductionProductMainId(), k -> new ArrayList<>()).add(reportParam); } List<QualityInspect> inspectList = qualityInspectMapper.selectList( Wrappers.<QualityInspect>lambdaQuery() .in(QualityInspect::getProductMainId, reportMainIdList) .orderByAsc(QualityInspect::getId)); for (QualityInspect inspect : inspectList) { if (inspect == null || inspect.getProductMainId() == null) { continue; } inspectMap.computeIfAbsent(inspect.getProductMainId(), k -> new ArrayList<>()).add(inspect); } List<Long> inspectIdList = inspectList.stream() .map(QualityInspect::getId) .filter(Objects::nonNull) .collect(Collectors.toList()); if (!inspectIdList.isEmpty()) { List<QualityInspectParam> inspectParamList = qualityInspectParamMapper.selectList( Wrappers.<QualityInspectParam>lambdaQuery() .in(QualityInspectParam::getInspectId, inspectIdList) .orderByAsc(QualityInspectParam::getId)); for (QualityInspectParam inspectParam : inspectParamList) { if (inspectParam == null || inspectParam.getInspectId() == null) { continue; } inspectParamMap.computeIfAbsent(inspectParam.getInspectId(), k -> new ArrayList<>()).add(inspectParam); } List<QualityInspectFile> inspectFileList = qualityInspectFileMapper.selectList( Wrappers.<QualityInspectFile>lambdaQuery() .in(QualityInspectFile::getInspectId, inspectIdList) .orderByAsc(QualityInspectFile::getId)); for (QualityInspectFile inspectFile : inspectFileList) { if (inspectFile == null || inspectFile.getInspectId() == null) { continue; } inspectFileMap.computeIfAbsent(inspectFile.getInspectId(), k -> new ArrayList<>()).add(inspectFile); } } } List<ProductionOrderWorkOrderDetailVo.WorkOrderDetail> workOrderDetailList = new ArrayList<>(); for (ProductionOperationTask workOrder : workOrderList) { ProductionOrderWorkOrderDetailVo.WorkOrderDetail workOrderDetail = new ProductionOrderWorkOrderDetailVo.WorkOrderDetail(); workOrderDetail.setWorkOrder(workOrder); List<ProductionProductMain> workOrderReportMainList = reportMainMap.get(workOrder.getId()); if (workOrderReportMainList == null || workOrderReportMainList.isEmpty()) { workOrderDetail.setReportList(Collections.emptyList()); workOrderDetailList.add(workOrderDetail); continue; } List<ProductionOrderWorkOrderDetailVo.ReportDetail> reportDetailList = new ArrayList<>(); for (ProductionProductMain reportMain : workOrderReportMainList) { Long reportMainId = reportMain.getId(); ProductionOrderWorkOrderDetailVo.ReportDetail reportDetail = new ProductionOrderWorkOrderDetailVo.ReportDetail(); reportDetail.setReportMain(reportMain); reportDetail.setReportOutputList(reportOutputMap.getOrDefault(reportMainId, Collections.emptyList())); reportDetail.setReportParamList(reportParamMap.getOrDefault(reportMainId, Collections.emptyList())); List<QualityInspect> reportInspectList = inspectMap.get(reportMainId); if (reportInspectList == null || reportInspectList.isEmpty()) { reportDetail.setInspectList(Collections.emptyList()); } else { List<ProductionOrderWorkOrderDetailVo.InspectDetail> inspectDetailList = new ArrayList<>(); for (QualityInspect inspect : reportInspectList) { ProductionOrderWorkOrderDetailVo.InspectDetail inspectDetail = new ProductionOrderWorkOrderDetailVo.InspectDetail(); inspectDetail.setInspect(inspect); inspectDetail.setInspectParamList(inspectParamMap.getOrDefault(inspect.getId(), Collections.emptyList())); inspectDetail.setInspectFileList(inspectFileMap.getOrDefault(inspect.getId(), Collections.emptyList())); inspectDetailList.add(inspectDetail); } reportDetail.setInspectList(inspectDetailList); } reportDetailList.add(reportDetail); } workOrderDetail.setReportList(reportDetailList); workOrderDetailList.add(workOrderDetail); } detailVo.setWorkOrderList(workOrderDetailList); return detailVo; } @Override public List<ProductionOrderPickVo> pick(Long productionOrderId) { if (productionOrderId == null) { return Collections.emptyList(); src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -27,6 +27,8 @@ import com.ruoyi.project.system.mapper.SysUserMapper; import com.ruoyi.quality.mapper.*; import com.ruoyi.quality.pojo.*; import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.service.StockInventoryService; import com.ruoyi.technology.mapper.TechnologyOperationMapper; import com.ruoyi.technology.mapper.TechnologyRoutingOperationMapper; import com.ruoyi.technology.pojo.TechnologyOperation; @@ -76,6 +78,7 @@ private final TechnologyRoutingOperationMapper technologyRoutingOperationMapper; private final TechnologyOperationMapper technologyOperationMapper; private final StockUtils stockUtils; private final StockInventoryService stockInventoryService; @Override public IPage<ProductionProductMainDto> listPageProductionProductMainDto(Page page, ProductionProductMainDto productionProductMainDto) { @@ -334,8 +337,12 @@ }); } } else { stockUtils.addStock(productModel.getId(), productQty, StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId()); StockInventoryDto stockInventoryDto = new StockInventoryDto(); stockInventoryDto.setRecordId(productionProductMain.getId()); stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode())); stockInventoryDto.setQualitity(productQty); stockInventoryDto.setProductModelId(productModel.getId()); stockInventoryService.addStockInRecordOnly(stockInventoryDto); } productionOperationTask.setCompleteQuantity(defaultDecimal(productionOperationTask.getCompleteQuantity()).add(productQty)); @@ -384,10 +391,10 @@ productionAccount.setSchedulingDate(LocalDateTime.now()); productionAccountMapper.insert(productionAccount); } if (defaultDecimal(dto.getScrapQty()).compareTo(BigDecimal.ZERO) > 0) { stockUtils.addUnStock(productModel.getId(), dto.getScrapQty(), StockInUnQualifiedRecordTypeEnum.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; } src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -9,7 +9,6 @@ import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.common.utils.HackLoopTableRenderPolicy; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.procurementrecord.service.ProcurementRecordService; @@ -24,12 +23,14 @@ import com.ruoyi.quality.service.IQualityInspectParamService; import com.ruoyi.quality.service.IQualityInspectService; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.service.StockInventoryService; import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import jakarta.servlet.http.HttpServletResponse; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; @@ -43,6 +44,7 @@ public class QualityInspectServiceImpl extends ServiceImpl<QualityInspectMapper, QualityInspect> implements IQualityInspectService { private final StockUtils stockUtils; private final StockInventoryService stockInventoryService; private QualityInspectMapper qualityInspectMapper; private IQualityInspectParamService qualityInspectParamService; @@ -98,7 +100,14 @@ qualityUnqualifiedMapper.insert(qualityUnqualified); } else { //åæ ¼ç´æ¥å ¥åº stockUtils.addStock(qualityInspect.getProductModelId(), qualityInspect.getQuantity(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(), qualityInspect.getId()); // stockUtils.addStock(qualityInspect.getProductModelId(), qualityInspect.getQuantity(), StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode(), qualityInspect.getId()); //ä» æ·»å å ¥åºè®°å½ StockInventoryDto stockInventoryDto = new StockInventoryDto(); stockInventoryDto.setRecordType(String.valueOf(StockInQualifiedRecordTypeEnum.QUALITYINSPECT_STOCK_IN.getCode())); stockInventoryDto.setRecordId(qualityInspect.getId()); stockInventoryDto.setProductModelId(qualityInspect.getProductModelId()); stockInventoryDto.setQualitity(qualityInspect.getQuantity()); stockInventoryService.addStockInRecordOnly(stockInventoryDto); } qualityInspect.setInspectState(1);//å·²æäº¤ return qualityInspectMapper.updateById(qualityInspect); src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -4,12 +4,14 @@ 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.basic.mapper.ProductModelMapper; import com.ruoyi.basic.pojo.ProductModel; import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.web.domain.R; @@ -21,18 +23,21 @@ import com.ruoyi.stock.dto.StockUninventoryDto; import com.ruoyi.stock.execl.StockInventoryExportData; import com.ruoyi.stock.mapper.StockInventoryMapper; import com.ruoyi.stock.pojo.StockInRecord; import com.ruoyi.stock.pojo.StockInventory; import com.ruoyi.stock.service.StockInRecordService; import com.ruoyi.stock.service.StockInventoryService; import com.ruoyi.stock.service.StockOutRecordService; import com.ruoyi.stock.service.StockUninventoryService; import jakarta.servlet.http.HttpServletResponse; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; 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.HashMap; import java.util.List; @@ -55,6 +60,7 @@ private StockOutRecordService stockOutRecordService; private StockUninventoryService stockUninventoryService; private SalesLedgerProductMapper salesLedgerProductMapper; private ProductModelMapper productModelMapper; @Override public IPage<StockInventoryDto> pagestockInventory(Page page, StockInventoryDto stockInventoryDto) { return stockInventoryMapper.pagestockInventory(page, stockInventoryDto); @@ -69,14 +75,15 @@ @Override @Transactional(rollbackFor = Exception.class) public Boolean addstockInventory(StockInventoryDto stockInventoryDto) { String batchNo = StringUtils.trim(stockInventoryDto.getBatchNo()); if (StringUtils.isEmpty(batchNo)) { batchNo = generateAutoBatchNo(stockInventoryDto.getProductModelId()); } stockInventoryDto.setBatchNo(batchNo); LambdaQueryWrapper<StockInventory> eq = new QueryWrapper<StockInventory>().lambda() .eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId()); if (StringUtils.isEmpty(stockInventoryDto.getBatchNo())) { eq.isNull(StockInventory::getBatchNo); stockInventoryDto.setBatchNo(null); } else { eq.eq(StockInventory::getBatchNo, stockInventoryDto.getBatchNo()); } //æ°å¢å ¥åºè®°å½åæ·»å åºå StockInRecordDto stockInRecordDto = new StockInRecordDto(); stockInRecordDto.setRecordId(stockInventoryDto.getRecordId()); @@ -147,11 +154,17 @@ @Override @Transactional(rollbackFor = Exception.class) public Boolean addStockInRecordOnly(StockInventoryDto stockInventoryDto) { String batchNo = StringUtils.trim(stockInventoryDto.getBatchNo()); if (StringUtils.isEmpty(batchNo)) { batchNo = generateAutoBatchNo(stockInventoryDto.getProductModelId()); } stockInventoryDto.setBatchNo(batchNo); StockInRecordDto stockInRecordDto = new StockInRecordDto(); stockInRecordDto.setRecordId(stockInventoryDto.getRecordId()); stockInRecordDto.setRecordType(stockInventoryDto.getRecordType()); stockInRecordDto.setStockInNum(stockInventoryDto.getQualitity()); stockInRecordDto.setBatchNo(stockInventoryDto.getBatchNo()); stockInRecordDto.setBatchNo(batchNo); stockInRecordDto.setProductModelId(stockInventoryDto.getProductModelId()); stockInRecordDto.setType("0"); stockInRecordDto.setRemark(stockInventoryDto.getRemark()); @@ -159,6 +172,82 @@ return true; } //è§åçæï¼20260424-产åç¼å·-001 private String generateAutoBatchNo(Long productModelId) { if (productModelId == null) { throw new ServiceException("产åè§æ ¼IDä¸è½ä¸ºç©º"); } ProductModel productModel = productModelMapper.selectById(productModelId); if (productModel == null) { throw new ServiceException("产åè§æ ¼ä¸åå¨ï¼ID=" + productModelId); } String productCode = StringUtils.trim(productModel.getProductCode()); if (StringUtils.isEmpty(productCode)) { throw new ServiceException("产åè§æ ¼æªç»´æ¤äº§åç¼ç ï¼ID=" + productModelId); } String dateText = LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE); String prefix = dateText + "-" + productCode + "-"; int maxSequence = resolveMaxSequence(prefix); int sequence = maxSequence + 1; while (sequence < 1_000_000) { String batchNo = prefix + String.format("%03d", sequence); if (!isBatchNoExists(batchNo)) { return batchNo; } sequence++; } throw new ServiceException("æ¹å·åºå·è¶ åºèå´ï¼è¯·æ£æ¥æ¹å·æ°æ®"); } private int resolveMaxSequence(String prefix) { int maxSequence = 0; List<StockInventory> stockInventoryList = stockInventoryMapper.selectList( Wrappers.<StockInventory>lambdaQuery() .select(StockInventory::getBatchNo) .likeRight(StockInventory::getBatchNo, prefix)); for (StockInventory stockInventory : stockInventoryList) { maxSequence = Math.max(maxSequence, parseSequence(stockInventory.getBatchNo(), prefix)); } List<StockInRecord> stockInRecordList = stockInRecordService.list( Wrappers.<StockInRecord>lambdaQuery() .select(StockInRecord::getBatchNo) .likeRight(StockInRecord::getBatchNo, prefix)); for (StockInRecord stockInRecord : stockInRecordList) { maxSequence = Math.max(maxSequence, parseSequence(stockInRecord.getBatchNo(), prefix)); } return maxSequence; } private int parseSequence(String batchNo, String prefix) { if (StringUtils.isEmpty(batchNo) || StringUtils.isEmpty(prefix) || !batchNo.startsWith(prefix)) { return 0; } String sequenceText = batchNo.substring(prefix.length()); if (StringUtils.isEmpty(sequenceText) || !sequenceText.matches("\\d+")) { return 0; } try { return Integer.parseInt(sequenceText); } catch (NumberFormatException ignored) { return 0; } } private boolean isBatchNoExists(String batchNo) { if (StringUtils.isEmpty(batchNo)) { return false; } Long inventoryCount = stockInventoryMapper.selectCount( Wrappers.<StockInventory>lambdaQuery().eq(StockInventory::getBatchNo, batchNo)); if (inventoryCount != null && inventoryCount > 0) { return true; } return stockInRecordService.count( Wrappers.<StockInRecord>lambdaQuery().eq(StockInRecord::getBatchNo, batchNo)) > 0; } @Override @Transactional(rollbackFor = Exception.class) public Boolean addStockOutRecordOnly(StockInventoryDto stockInventoryDto) { src/main/java/com/ruoyi/technology/controller/TechnologyRoutingController.java
@@ -52,7 +52,7 @@ /** * ä¿®æ¹å·¥èºè·¯çº¿ã */ @PutMapping("editTechRoute") @PutMapping("/editTechRoute") @Operation(summary = "ä¿®æ¹å·¥èºè·¯çº¿") public R edit(@RequestBody TechnologyRouting technologyRouting) { return R.ok(technologyRoutingService.updateTechnologyRouting(technologyRouting)); src/main/java/com/ruoyi/technology/service/impl/TechnologyRoutingServiceImpl.java
@@ -116,7 +116,7 @@ Wrappers.<TechnologyBomStructure>lambdaQuery() .eq(TechnologyBomStructure::getBomId, technologyRouting.getBomId()) .isNotNull(TechnologyBomStructure::getOperationId) .orderByAsc(TechnologyBomStructure::getId) .orderByDesc(TechnologyBomStructure::getId) ); if (bomStructures.isEmpty()) { throw new ServiceException("bom产åç»æä¸ºç©ºï¼"); src/main/resources/mapper/production/ProductionOrderMapper.xml
@@ -50,6 +50,7 @@ p.product_name as productName, pm.model as model, tr.process_route_code as processRouteCode, ROUND(po.complete_quantity / po.quantity * 100, 2) AS completionStatus, tb.bom_no as bomNo </sql> src/main/resources/mapper/system/SysUserMapper.xml
@@ -155,10 +155,15 @@ </select> <select id="selectUserByIds" resultType="com.ruoyi.project.system.domain.SysUser"> <include refid="selectUserVo"/> where u.user_id in <foreach collection="userIds" item="item" open="(" separator="," close=")"> <where> <if test="userIds != null and userIds.size > 0"> and u.user_id in <foreach collection="userIds" item="item" open="(" separator="," close=")"> #{item} </foreach> </if> and u.del_flag = '0' </where> </select> <select id="selectRegistrantIds" resultType="com.ruoyi.project.system.domain.SysUser"> SELECT user_id, nick_name FROM sys_user