src/main/java/com/ruoyi/basic/controller/ProductController.java
@@ -17,8 +17,6 @@ import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.service.ISalesLedgerProductService; import com.ruoyi.sales.service.ISalesLedgerService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; 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.pojo.StockInRecord; @@ -13,15 +12,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 @@ -75,7 +70,9 @@ public void addStock(Long productModelId, BigDecimal quantity, String recordType,Long recordId) { StockInventoryDto stockInventoryDto = new StockInventoryDto(); stockInventoryDto.setRecordId(recordId); stockInventoryDto.setRecordType(String.valueOf(recordType)); if (recordType != null) { stockInventoryDto.setRecordType(recordType); } stockInventoryDto.setQualitity(quantity); stockInventoryDto.setProductModelId(productModelId); stockInventoryService.addstockInventory(stockInventoryDto); src/main/java/com/ruoyi/production/controller/ProductOrderController.java
@@ -91,12 +91,6 @@ return R.ok(productOrderService.getProductOrderBatchNo()); } @ApiOperation("查询生产订单对应的BOM的原材料") @GetMapping("/getByBomId") public R getByBomId(Long bomId) { return R.ok(productOrderService.getByBomId(bomId)); } @ApiOperation("生产订单领料更新") @PostMapping("/drawMaterials") public R drawMaterials(@RequestBody ProductOrderDto productOrderDto) { src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java
@@ -5,7 +5,6 @@ import com.ruoyi.production.dto.ProductWorkOrderDto; import com.ruoyi.production.pojo.ProductWorkOrder; import com.ruoyi.production.service.ProductWorkOrderService; import com.ruoyi.quality.pojo.QualityInspect; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.*; src/main/java/com/ruoyi/production/dto/DrawMaterialDto.java
@@ -7,11 +7,22 @@ @Data public class DrawMaterialDto { //订单id private Long id; //型号id private Long productModelId; //库存数量 private BigDecimal qualitity; //领用数量 private BigDecimal requisitionQty; //产品名称 private String productName; //产品型号 private String model; //产品单位 private String unit; //报工领用数量 private BigDecimal reportQty; //产品单位 private String remark; } src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
@@ -10,6 +10,7 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.util.List; @Data @ExcelIgnoreUnannotated @@ -72,4 +73,7 @@ private String otherData; // 工序id private Long processId; //原料 private List<DrawMaterialDto> drawMaterialList; } src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java
@@ -30,4 +30,7 @@ @ApiModelProperty(value = "租户ID") @TableField(fill = FieldFill.INSERT) private Long tenantId; @ApiModelProperty(value = "备注") private String remark; } src/main/java/com/ruoyi/production/service/ProductOrderService.java
@@ -33,7 +33,5 @@ List<SelectOptionDTO<String>> getProductOrderBatchNo(); List getByBomId(Long bomId); int drawMaterials(ProductOrderDto productOrderDto); } src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -23,7 +23,6 @@ import com.ruoyi.production.pojo.*; import com.ruoyi.production.service.ProductOrderService; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.mapper.StockInventoryMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -32,7 +31,8 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Service @@ -252,41 +252,6 @@ } @Override public List<StockInventoryDto> getByBomId(Long bomId) { List<ProductStructureDto> structureList = productStructureMapper.listBybomId(bomId); if (CollectionUtils.isEmpty(structureList)) { return Collections.emptyList(); } Set<Long> allNodeIds = structureList.stream() .map(ProductStructureDto::getId) .collect(Collectors.toSet()); Set<Long> parentIds = structureList.stream() .filter(node -> node.getParentId() != null && node.getParentId() != 0) .map(ProductStructureDto::getParentId) .collect(Collectors.toSet()); Set<Long> leafNodeIds = new HashSet<>(allNodeIds); leafNodeIds.removeAll(parentIds); // 获取叶子节点的 productModelId List<Long> productModelIds = structureList.stream() .filter(node -> leafNodeIds.contains(node.getId())) .map(ProductStructureDto::getProductModelId) .filter(Objects::nonNull) .distinct() .collect(Collectors.toList()); if (productModelIds.isEmpty()) { return Collections.emptyList(); } return stockInventoryMapper.getStockInventory(productModelIds); } @Override @Transactional(rollbackFor = Exception.class) public int drawMaterials(ProductOrderDto productOrderDto) { if (productOrderDto == null || productOrderDto.getId() == null) { @@ -308,6 +273,14 @@ if (CollectionUtils.isEmpty(drawMaterialsList)) { throw new RuntimeException("领料明细不能为空"); } // 如果有数据先加库存 ProductOrder productOrder = productOrderMapper.selectById(productOrderDto.getId()); if (productOrder != null) { List<DrawMaterialDto> materialDtoList = JSON.parseArray(productOrder.getDrawMaterials(), DrawMaterialDto.class); for (DrawMaterialDto drawMaterialDto : materialDtoList) { stockUtils.addStock(drawMaterialDto.getProductModelId(), drawMaterialDto.getRequisitionQty(), null, productOrderDto.getId()); } } // 处理领料(扣减库存) try { src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
@@ -7,10 +7,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.data.PictureRenderData; import com.deepoove.poi.data.Pictures; import com.ruoyi.common.utils.HackLoopTableRenderPolicy; import com.ruoyi.common.utils.MatrixToImageWriter; import com.ruoyi.production.dto.ProductWorkOrderDto; import com.ruoyi.production.mapper.ProductWorkOrderFileMapper; @@ -18,8 +16,6 @@ import com.ruoyi.production.pojo.ProductWorkOrder; import com.ruoyi.production.pojo.ProductWorkOrderFile; import com.ruoyi.production.service.ProductWorkOrderService; import com.ruoyi.quality.pojo.QualityInspectParam; import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -1,8 +1,10 @@ package com.ruoyi.production.service.impl; import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -12,12 +14,12 @@ import com.ruoyi.basic.pojo.Product; import com.ruoyi.basic.pojo.ProductModel; import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; 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.DrawMaterialDto; import com.ruoyi.production.dto.ProductionProductMainDto; import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.*; @@ -30,7 +32,6 @@ 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; @@ -39,6 +40,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; @Service @@ -140,22 +142,68 @@ productionProductMain.setStatus(0); productionProductMain.setDeviceId(dto.getDeviceId()); productionProductMainMapper.insert(productionProductMain); /*新增报工投入表*/ List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomAndProcess(productProcessRoute.getBomId(), productProcess.getId()); if (productStructureDtos.isEmpty()) { //如果该工序没有产品结构的投入品,那这个投入品和产出品是同一个 ProductStructureDto productStructureDto = new ProductStructureDto(); productStructureDto.setProductModelId(productProcessRouteItem.getProductModelId()); productStructureDto.setUnitQuantity(BigDecimal.ONE); productStructureDtos.add(productStructureDto); } for (ProductStructureDto productStructureDto : productStructureDtos) { /* 新增报工投入表 */ List<DrawMaterialDto> drawMaterialList = dto.getDrawMaterialList(); if (!CollectionUtils.isEmpty(drawMaterialList)) { // 1. 批量查询数据 ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId()); if (productWorkOrder == null) { throw new RuntimeException("工单不存在"); } ProductionProductInput productionProductInput = new ProductionProductInput(); productionProductInput.setProductModelId(productStructureDto.getProductModelId()); productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity())); productionProductInput.setProductMainId(productionProductMain.getId()); productionProductInputMapper.insert(productionProductInput); ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId()); if (productOrder == null) { throw new RuntimeException("产品订单不存在"); } // 2. 解析并构建物料Map List<DrawMaterialDto> existingMaterialList = JSON.parseArray(productOrder.getDrawMaterials(), DrawMaterialDto.class); if (CollectionUtils.isEmpty(existingMaterialList)) { throw new RuntimeException("可领用物料列表为空"); } Map<Long, DrawMaterialDto> materialMap = existingMaterialList.stream() .collect(Collectors.toMap(DrawMaterialDto::getProductModelId, Function.identity())); // 处理报工物料 List<ProductionProductInput> inputList = new ArrayList<>(); for (DrawMaterialDto drawMaterial : drawMaterialList) { Long modelId = drawMaterial.getProductModelId(); BigDecimal reportQty = drawMaterial.getReportQty(); DrawMaterialDto material = materialMap.get(modelId); if (material == null) { throw new RuntimeException("物料不存在: " + modelId); } // 验证库存 BigDecimal availableQty = material.getRequisitionQty().subtract(reportQty); if (availableQty.compareTo(BigDecimal.valueOf(0)) < 0) { throw new RuntimeException(String.format("物料%s库存不足,可用:%s,需领:%s", modelId, availableQty, reportQty)); } // 更新可领用 material.setRequisitionQty(availableQty); // 构建投入记录 ProductionProductInput input = new ProductionProductInput(); input.setProductModelId(modelId); input.setQuantity(reportQty); input.setProductMainId(productionProductMain.getId()); input.setRemark(drawMaterial.getRemark()); inputList.add(input); } if (!inputList.isEmpty()) { for (ProductionProductInput productionProductInput : inputList) { productionProductInputMapper.insert(productionProductInput); } productOrder.setDrawMaterials(JSON.toJSONString(existingMaterialList)); productOrderMapper.updateById(productOrder); } } /*新增报工产出表*/ ProductionProductOutput productionProductOutput = new ProductionProductOutput(); @@ -217,7 +265,7 @@ qualityInspectParamMapper.insert(param); }); } }else { } else { //直接入库 stockUtils.addStock(productProcessRouteItem.getProductModelId(), productQty, StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId()); } @@ -275,10 +323,10 @@ public Boolean removeProductMain(Long id) { //判断该条报工是否不合格处理,如果不合格处理了,则不允许删除 List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(Wrappers.<QualityInspect>lambdaQuery().eq(QualityInspect::getProductMainId, id)); if (qualityInspects.size() > 0){ 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) { if (qualityUnqualifieds.size() > 0 && qualityUnqualifieds.get(0).getInspectState() == 1) { throw new ServiceException("该条报工已经不合格处理了,不允许删除"); } } @@ -332,9 +380,37 @@ new LambdaQueryWrapper<QualityInspectParam>() .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()); }); ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId()); List<DrawMaterialDto> materialDtoList = JSON.parseArray(productOrder.getDrawMaterials(), DrawMaterialDto.class); // 批量查询并构建Map Map<Long, BigDecimal> usedQuantityMap = productionProductInputMapper.selectList( new LambdaQueryWrapper<ProductionProductInput>() .eq(ProductionProductInput::getProductMainId, productionProductMain.getId()) .in(ProductionProductInput::getProductModelId, materialDtoList.stream() .map(DrawMaterialDto::getProductModelId) .collect(Collectors.toList())) ).stream() .collect(Collectors.groupingBy( ProductionProductInput::getProductModelId, Collectors.reducing(BigDecimal.ZERO, ProductionProductInput::getQuantity, BigDecimal::add) )); // 更新所有物料 materialDtoList.forEach(dto -> { BigDecimal usedQty = usedQuantityMap.getOrDefault(dto.getProductModelId(), BigDecimal.ZERO); dto.setRequisitionQty(dto.getRequisitionQty().add(usedQty)); }); // 更新订单 productOrder.setDrawMaterials(JSON.toJSONString(materialDtoList)); productOrderMapper.updateById(productOrder); // 删除产出记录 productionProductOutputMapper.delete(new LambdaQueryWrapper<ProductionProductOutput>() .eq(ProductionProductOutput::getProductMainId, productionProductMain.getId())); src/main/java/com/ruoyi/quality/controller/QualityUnqualifiedController.java
@@ -4,11 +4,11 @@ import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.quality.pojo.QualityUnqualified; import com.ruoyi.quality.service.IQualityUnqualifiedService; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; /** @@ -24,6 +24,7 @@ /** * 新增不合格管理 * * @param qualityUnqualified * @return */ @@ -35,21 +36,23 @@ /** * 删除不合格管理 * * @param ids * @return */ @DeleteMapping("/del") public AjaxResult delQualityUnqualified(@RequestBody List<Integer> ids) { qualityUnqualifiedService.listByIds(ids).stream().forEach(qualityUnqualified -> { if (qualityUnqualified.getInspectState()==1){ throw new RuntimeException("该不合格数据已经处理无法删除!"); } }); qualityUnqualifiedService.listByIds(ids).stream().forEach(qualityUnqualified -> { if (qualityUnqualified.getInspectState() == 1) { throw new RuntimeException("该不合格数据已经处理无法删除!"); } }); return AjaxResult.success(qualityUnqualifiedService.removeBatchByIds(ids)); } /** * 不合格管理详情 * * @param id * @return */ @@ -60,6 +63,7 @@ /** * 不合格管理修改 * * @param qualityUnqualified * @return */ @@ -69,7 +73,8 @@ } /** *不合格管理分页查询 * 不合格管理分页查询 * * @param page * @param qualityUnqualified * @return @@ -81,16 +86,18 @@ /** * 不合格管理导出 * * @param response * @param qualityUnqualified */ @PostMapping("/export") public void qualityUnqualifiedExport(HttpServletResponse response,QualityUnqualified qualityUnqualified) { public void qualityUnqualifiedExport(HttpServletResponse response, QualityUnqualified qualityUnqualified) { qualityUnqualifiedService.qualityUnqualifiedExport(response, qualityUnqualified); } /** * 不合格管理处理 * * @param qualityUnqualified * @return */ @@ -99,5 +106,8 @@ return AjaxResult.success(qualityUnqualifiedService.deal(qualityUnqualified)); } @GetMapping("/downloadReturnRecord") public void downloadReturnRecord(@RequestParam("id") Long id,HttpServletResponse response) throws IOException { qualityUnqualifiedService.downloadReturnRecord(id,response); } } src/main/java/com/ruoyi/quality/service/IQualityUnqualifiedService.java
@@ -3,10 +3,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.quality.pojo.QualityUnqualified; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public interface IQualityUnqualifiedService extends IService<QualityUnqualified> { @@ -18,4 +18,6 @@ int deal(QualityUnqualified qualityUnqualified); QualityUnqualified getUnqualified(Integer id); void downloadReturnRecord(Long id, HttpServletResponse response) throws IOException; } src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
@@ -7,8 +7,8 @@ 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.deepoove.poi.XWPFTemplate; import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.common.utils.poi.ExcelUtil; @@ -17,7 +17,10 @@ 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.pojo.ProductOrder; import com.ruoyi.production.pojo.ProductProcessRoute; import com.ruoyi.production.pojo.ProductProcessRouteItem; import com.ruoyi.production.pojo.ProductWorkOrder; import com.ruoyi.production.service.ProductOrderService; import com.ruoyi.quality.mapper.QualityUnqualifiedMapper; import com.ruoyi.quality.pojo.QualityInspect; @@ -29,10 +32,14 @@ import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletResponse; import java.io.InputStream; import java.io.OutputStream; import java.math.BigDecimal; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.List; import java.util.Map; @AllArgsConstructor @Service @@ -67,7 +74,6 @@ if (ObjectUtils.isNotNull(qualityInspect) && qualityInspect.getInspectType() != 0) { switch (qualityUnqualified.getDealResult()) { case "返修": case "返工": //判断质检表是否有相关的报工id,如果有报工id,那么返工需要重新创建生产订单重新生产 if (ObjectUtils.isNotNull(qualityInspect.getProductMainId())) { //返工需要重新创建生产订单重新生产 @@ -133,6 +139,7 @@ //调用提交合格的接口 stockUtils.addStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId()); break; case "返工": default: break; } @@ -161,4 +168,60 @@ public QualityUnqualified getUnqualified(Integer id) { return qualityUnqualifiedMapper.getUnqualified(id); } @Override public void downloadReturnRecord(Long id, HttpServletResponse response) { XWPFTemplate template = null; InputStream inputStream = null; OutputStream out = null; try { // 1. 查询数据 QualityUnqualified info = qualityUnqualifiedMapper.selectById(id); Map<String, Object> data = new HashMap<>(); data.put("productName", info.getProductName()); data.put("model", info.getModel()); // 加载模板 inputStream = getClass().getResourceAsStream("/static/return-record.docx"); if (inputStream == null) { throw new RuntimeException("模板文件不存在,请检查路径:/static/return-record.docx"); } // 渲染模板 template = XWPFTemplate.compile(inputStream).render(data); // 设置响应头 response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); response.setHeader("Content-Disposition", "attachment; filename=rework_record_" + id + ".docx"); response.setContentLengthLong(-1); out = response.getOutputStream(); template.write(out); out.flush(); } catch (Exception e) { throw new RuntimeException("下载失败", e); } finally { if (template != null) { try { template.close(); } catch (Exception e) { log.error("关闭模板失败", e); } } if (inputStream != null) { try { inputStream.close(); } catch (Exception e) { log.error("关闭输入流失败", e); } } if (out != null) { try { out.close(); } catch (Exception e) { log.error("关闭输出流失败", e); } } } } } src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
@@ -105,4 +105,10 @@ public R thawStock(@RequestBody StockInventoryDto stockInventoryDto) { return R.ok(stockInventoryService.thawStock(stockInventoryDto)); } @ApiOperation("查询库存原材料") @GetMapping("/getMaterials") public R getMaterials() { return R.ok(stockInventoryService.getMaterials()); } } src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
@@ -51,4 +51,6 @@ BigDecimal selectTotalByDate(@Param("now") LocalDate now); List<StockInventoryDto> getStockInventory(@Param("ids") List<Long> ids); List<StockInventoryDto> getMaterials(); } src/main/java/com/ruoyi/stock/service/StockInventoryService.java
@@ -10,6 +10,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.util.List; /** * <p> @@ -38,4 +39,6 @@ Boolean frozenStock(StockInventoryDto stockInventoryDto); Boolean thawStock(StockInventoryDto stockInventoryDto); List<StockInventoryDto> getMaterials(); } src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -55,13 +55,15 @@ @Transactional(rollbackFor = Exception.class) public Boolean addstockInventory(StockInventoryDto stockInventoryDto) { //新增入库记录再添加库存 StockInRecordDto stockInRecordDto = new StockInRecordDto(); stockInRecordDto.setRecordId(stockInventoryDto.getRecordId()); stockInRecordDto.setRecordType(stockInventoryDto.getRecordType()); stockInRecordDto.setStockInNum(stockInventoryDto.getQualitity()); stockInRecordDto.setProductModelId(stockInventoryDto.getProductModelId()); stockInRecordDto.setType("0"); stockInRecordService.add(stockInRecordDto); if (stockInventoryDto.getRecordType() != null) { StockInRecordDto stockInRecordDto = new StockInRecordDto(); stockInRecordDto.setRecordId(stockInventoryDto.getRecordId()); stockInRecordDto.setRecordType(stockInventoryDto.getRecordType()); stockInRecordDto.setStockInNum(stockInventoryDto.getQualitity()); stockInRecordDto.setProductModelId(stockInventoryDto.getProductModelId()); stockInRecordDto.setType("0"); stockInRecordService.add(stockInRecordDto); } //再进行新增库存数量库存 //先查询库存表中的产品是否存在,不存在新增,存在更新 StockInventory oldStockInventory = stockInventoryMapper.selectOne(new QueryWrapper<StockInventory>().lambda().eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId())); @@ -206,4 +208,9 @@ stockInventory.setLockedQuantity(stockInventory.getLockedQuantity().subtract(stockInventoryDto.getLockedQuantity())); return this.updateById(stockInventory); } @Override public List<StockInventoryDto> getMaterials() { return stockInventoryMapper.getMaterials(); } } src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -257,4 +257,30 @@ ORDER BY pm.id </select> <select id="getMaterials" resultType="com.ruoyi.stock.dto.StockInventoryDto"> SELECT si.id, si.qualitity, COALESCE(si.locked_quantity, 0) AS locked_quantity, si.product_model_id, si.create_time, si.update_time, COALESCE(si.warn_num, 0) AS warn_num, si.version, (si.qualitity - COALESCE(si.locked_quantity, 0)) AS un_locked_quantity, pm.model, si.remark, pm.unit, pm.uid_no AS uidNo, p.product_name, p1.product_name AS parentName FROM stock_inventory si LEFT JOIN product_model pm ON si.product_model_id = pm.id LEFT JOIN product p ON pm.product_id = p.id LEFT JOIN product p1 ON p1.id = p.parent_id WHERE p1.product_name = '原材料'; </select> </mapper> src/main/resources/static/return-record.docxBinary files differ