From 17a63200983a8e154a1eb3549d1caffa050372c1 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期一, 30 三月 2026 17:14:45 +0800
Subject: [PATCH] feat:1.生产订单领用 2.报工领用(关联订单领用) 3.报工删除(关联报工领用) 4.不合格处理(返工生成返工附件并下载)
---
src/main/java/com/ruoyi/stock/service/StockInventoryService.java | 3
src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java | 3
src/main/java/com/ruoyi/basic/controller/ProductController.java | 2
src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java | 47 +-----
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java | 120 ++++++++++++++---
src/main/java/com/ruoyi/production/dto/DrawMaterialDto.java | 11 +
src/main/java/com/ruoyi/quality/service/IQualityUnqualifiedService.java | 4
src/main/resources/mapper/stock/StockInventoryMapper.xml | 26 +++
src/main/resources/static/return-record.docx | 0
src/main/java/com/ruoyi/production/service/ProductOrderService.java | 2
src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java | 9
src/main/java/com/ruoyi/stock/controller/StockInventoryController.java | 6
src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java | 4
src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java | 4
src/main/java/com/ruoyi/quality/controller/QualityUnqualifiedController.java | 28 ++-
src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java | 69 +++++++++
src/main/java/com/ruoyi/production/controller/ProductOrderController.java | 6
src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java | 1
src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java | 2
src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java | 21 ++-
20 files changed, 268 insertions(+), 100 deletions(-)
diff --git a/src/main/java/com/ruoyi/basic/controller/ProductController.java b/src/main/java/com/ruoyi/basic/controller/ProductController.java
index 252ab4d..fd14500 100644
--- a/src/main/java/com/ruoyi/basic/controller/ProductController.java
+++ b/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;
diff --git a/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java b/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
index 819ce65..26578a0 100644
--- a/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
+++ b/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);
diff --git a/src/main/java/com/ruoyi/production/controller/ProductOrderController.java b/src/main/java/com/ruoyi/production/controller/ProductOrderController.java
index 448892f..3a3bc0c 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductOrderController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductOrderController.java
@@ -91,12 +91,6 @@
return R.ok(productOrderService.getProductOrderBatchNo());
}
- @ApiOperation("鏌ヨ鐢熶骇璁㈠崟瀵瑰簲鐨凚OM鐨勫師鏉愭枡")
- @GetMapping("/getByBomId")
- public R getByBomId(Long bomId) {
- return R.ok(productOrderService.getByBomId(bomId));
- }
-
@ApiOperation("鐢熶骇璁㈠崟棰嗘枡鏇存柊")
@PostMapping("/drawMaterials")
public R drawMaterials(@RequestBody ProductOrderDto productOrderDto) {
diff --git a/src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java b/src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java
index 029e457..45b50aa 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java
+++ b/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.*;
diff --git a/src/main/java/com/ruoyi/production/dto/DrawMaterialDto.java b/src/main/java/com/ruoyi/production/dto/DrawMaterialDto.java
index d45c3a4..f53fe59 100644
--- a/src/main/java/com/ruoyi/production/dto/DrawMaterialDto.java
+++ b/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;
}
diff --git a/src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java b/src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
index 3fde6d7..3b292a0 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
+++ b/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;
}
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java b/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java
index 82bece9..404a09b 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java
+++ b/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;
}
diff --git a/src/main/java/com/ruoyi/production/service/ProductOrderService.java b/src/main/java/com/ruoyi/production/service/ProductOrderService.java
index 0519fd3..c415950 100644
--- a/src/main/java/com/ruoyi/production/service/ProductOrderService.java
+++ b/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);
}
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
index 0ed4db6..3d694ca 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
+++ b/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 {
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
index 4a68ce8..e3644de 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
+++ b/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;
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
index f499e2f..de4908d 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/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()) {
- //濡傛灉璇ュ伐搴忔病鏈変骇鍝佺粨鏋勭殑鎶曞叆鍝�,閭h繖涓姇鍏ュ搧鍜屼骇鍑哄搧鏄悓涓�涓�
- 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. 瑙f瀽骞舵瀯寤虹墿鏂橫ap
+ 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);
+
+ // 鎵归噺鏌ヨ骞舵瀯寤篗ap
+ 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()));
diff --git a/src/main/java/com/ruoyi/quality/controller/QualityUnqualifiedController.java b/src/main/java/com/ruoyi/quality/controller/QualityUnqualifiedController.java
index e558c30..14b7483 100644
--- a/src/main/java/com/ruoyi/quality/controller/QualityUnqualifiedController.java
+++ b/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);
+ }
}
diff --git a/src/main/java/com/ruoyi/quality/service/IQualityUnqualifiedService.java b/src/main/java/com/ruoyi/quality/service/IQualityUnqualifiedService.java
index ceff474..5579e9f 100644
--- a/src/main/java/com/ruoyi/quality/service/IQualityUnqualifiedService.java
+++ b/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;
}
diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
index 1650690..a3c199d 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
+++ b/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 "杩斿伐":
//鍒ゆ柇璐ㄦ琛ㄦ槸鍚︽湁鐩稿叧鐨勬姤宸d,濡傛灉鏈夋姤宸d,閭d箞杩斿伐闇�瑕侀噸鏂板垱寤虹敓浜ц鍗曢噸鏂扮敓浜�
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);
+ }
+ }
+ }
+ }
}
diff --git a/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java b/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
index f878bdb..5540404 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
+++ b/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());
+ }
}
diff --git a/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java b/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
index 3d520a0..2280374 100644
--- a/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
+++ b/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();
}
diff --git a/src/main/java/com/ruoyi/stock/service/StockInventoryService.java b/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
index 65dcca3..9b43570 100644
--- a/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
+++ b/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();
}
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
index 62e7236..3de9e50 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/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();
+ }
}
diff --git a/src/main/resources/mapper/stock/StockInventoryMapper.xml b/src/main/resources/mapper/stock/StockInventoryMapper.xml
index 7bcef36..da3f233 100644
--- a/src/main/resources/mapper/stock/StockInventoryMapper.xml
+++ b/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>
diff --git a/src/main/resources/static/return-record.docx b/src/main/resources/static/return-record.docx
new file mode 100644
index 0000000..f6ff374
--- /dev/null
+++ b/src/main/resources/static/return-record.docx
Binary files differ
--
Gitblit v1.9.3