From e529b1dd89b5f2927457a284e660d489b9aa8cc8 Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期三, 01 四月 2026 11:24:24 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_长治_健齿齿科器材' into dev_长治_健齿齿科器材
---
src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java | 31 +
src/main/java/com/ruoyi/stock/pojo/StockInventory.java | 6
src/main/java/com/ruoyi/stock/service/StockInventoryService.java | 7
src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java | 9
src/main/java/com/ruoyi/basic/dto/ProductTreeDto.java | 7
src/main/java/com/ruoyi/quality/service/IQualityUnqualifiedService.java | 4
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java | 40 +
src/main/java/com/ruoyi/production/service/ProductOrderService.java | 2
src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java | 3
src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java | 7
src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java | 26
src/main/resources/mapper/basic/ProductModelMapper.xml | 4
src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java | 4
src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java | 1
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java | 11
src/main/java/com/ruoyi/basic/pojo/ProductModel.java | 3
src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java | 286 ++++++++++++++++-
src/main/java/com/ruoyi/basic/controller/ProductController.java | 2
src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java | 59 +--
src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java | 3
src/main/java/com/ruoyi/stock/pojo/StockInRecord.java | 6
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java | 138 +++++++-
src/main/java/com/ruoyi/production/dto/DrawMaterialDto.java | 31 +
src/main/resources/mapper/stock/StockInventoryMapper.xml | 73 ++++
src/main/resources/static/return-record.docx | 0
src/main/java/com/ruoyi/stock/controller/StockInventoryController.java | 13
src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java | 4
src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java | 2
src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java | 9
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 | 81 ++++
src/main/java/com/ruoyi/production/controller/ProductOrderController.java | 6
src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java | 5
src/main/resources/static/sale-outbound.docx | 0
src/main/java/com/ruoyi/basic/pojo/Product.java | 4
src/main/java/com/ruoyi/stock/pojo/StockUninventory.java | 6
src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml | 4
38 files changed, 774 insertions(+), 155 deletions(-)
diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
index 00a53f5..22ba5ac 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -13,7 +13,6 @@
import com.ruoyi.approve.service.IApproveNodeService;
import com.ruoyi.common.enums.FileNameType;
import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.mapper.DeviceRepairMapper;
import com.ruoyi.device.pojo.DeviceRepair;
@@ -25,7 +24,10 @@
import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
import com.ruoyi.purchase.pojo.PurchaseLedger;
import com.ruoyi.purchase.service.impl.PurchaseLedgerServiceImpl;
-import com.ruoyi.sales.mapper.*;
+import com.ruoyi.sales.mapper.CommonFileMapper;
+import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
+import com.ruoyi.sales.mapper.SalesQuotationMapper;
+import com.ruoyi.sales.mapper.ShippingInfoMapper;
import com.ruoyi.sales.pojo.CommonFile;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.pojo.SalesQuotation;
@@ -204,7 +206,8 @@
purchaseLedgerServiceImpl.addQualityInspect(purchaseLedger, salesLedgerProduct);
}else {
//鐩存帴鍏ュ簱
- stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId());
+ stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(),
+ purchaseLedger.getId(),salesLedgerProduct.getBatchNo(),salesLedgerProduct.getCustomer());
}
}
} else if (status.equals(3)) {
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/basic/dto/ProductTreeDto.java b/src/main/java/com/ruoyi/basic/dto/ProductTreeDto.java
index 1fd8c81..0829aae 100644
--- a/src/main/java/com/ruoyi/basic/dto/ProductTreeDto.java
+++ b/src/main/java/com/ruoyi/basic/dto/ProductTreeDto.java
@@ -9,6 +9,13 @@
private Long id;
private Long parentId;
private String productName;
+ private String model;
+ private String batchNo;
+ private String customer;
+ private String uidNo;
+ private String unit;
+ private Long productModelId;
private String label; // 鐢ㄤ簬鏍戝舰缁撴瀯鐨勬樉绀哄悕绉�
private List<ProductTreeDto> children;
+ private String nodeType;
}
diff --git a/src/main/java/com/ruoyi/basic/pojo/Product.java b/src/main/java/com/ruoyi/basic/pojo/Product.java
index 6b4e14b..f5fba59 100644
--- a/src/main/java/com/ruoyi/basic/pojo/Product.java
+++ b/src/main/java/com/ruoyi/basic/pojo/Product.java
@@ -4,9 +4,11 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
+import java.io.Serializable;
+
@Data
@TableName("product")
-public class Product {
+public class Product implements Serializable {
private static final long serialVersionUID = 1L;
diff --git a/src/main/java/com/ruoyi/basic/pojo/ProductModel.java b/src/main/java/com/ruoyi/basic/pojo/ProductModel.java
index 8a765d6..ce92abf 100644
--- a/src/main/java/com/ruoyi/basic/pojo/ProductModel.java
+++ b/src/main/java/com/ruoyi/basic/pojo/ProductModel.java
@@ -83,4 +83,7 @@
*/
@Excel(name = "UID鐮�")
private String uidNo;
+
+ @TableField(exist = false)
+ private String parentName;
}
diff --git a/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java b/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
index 819ce65..4f20fb0 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
@@ -40,7 +35,7 @@
* @param recordType
* @param recordId
*/
- public void addUnStock(Long productModelId, BigDecimal quantity, String recordType,Long recordId) {
+ public void addUnStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId) {
StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
stockUninventoryDto.setRecordId(recordId);
stockUninventoryDto.setRecordType(String.valueOf(recordType));
@@ -56,7 +51,7 @@
* @param recordType
* @param recordId
*/
- public void subtractUnStock(Long productModelId, BigDecimal quantity, Integer recordType,Long recordId) {
+ public void subtractUnStock(Long productModelId, BigDecimal quantity, Integer recordType, Long recordId) {
StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
stockUninventoryDto.setRecordId(recordId);
stockUninventoryDto.setRecordType(String.valueOf(recordType));
@@ -72,12 +67,16 @@
* @param recordType
* @param recordId
*/
- public void addStock(Long productModelId, BigDecimal quantity, String recordType,Long recordId) {
+ public void addStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId,String batchNo,String customer) {
StockInventoryDto stockInventoryDto = new StockInventoryDto();
stockInventoryDto.setRecordId(recordId);
- stockInventoryDto.setRecordType(String.valueOf(recordType));
+ if (recordType != null) {
+ stockInventoryDto.setRecordType(recordType);
+ }
stockInventoryDto.setQualitity(quantity);
stockInventoryDto.setProductModelId(productModelId);
+ stockInventoryDto.setBatchNo(batchNo);
+ stockInventoryDto.setCustomer(customer);
stockInventoryService.addstockInventory(stockInventoryDto);
}
@@ -88,12 +87,16 @@
* @param recordType
* @param recordId
*/
- public void substractStock(Long productModelId, BigDecimal quantity, String recordType,Long recordId) {
+ public void substractStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId,String batchNo,String customer) {
StockInventoryDto stockInventoryDto = new StockInventoryDto();
stockInventoryDto.setRecordId(recordId);
- stockInventoryDto.setRecordType(String.valueOf(recordType));
+ if (recordType != null) {
+ stockInventoryDto.setRecordType(recordType);
+ }
stockInventoryDto.setQualitity(quantity);
stockInventoryDto.setProductModelId(productModelId);
+ stockInventoryDto.setBatchNo(batchNo);
+ stockInventoryDto.setCustomer(customer);
stockInventoryService.subtractStockInventory(stockInventoryDto);
}
@@ -106,6 +109,7 @@
stockInRecordService.batchDelete(Collections.singletonList(one.getId()));
}
}
+
public void deleteStockOutRecord(Long recordId, String recordType) {
StockOutRecord one = stockOutRecordService.getOne(new QueryWrapper<StockOutRecord>()
.lambda().eq(StockOutRecord::getRecordId, recordId)
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..7cab486 100644
--- a/src/main/java/com/ruoyi/production/dto/DrawMaterialDto.java
+++ b/src/main/java/com/ruoyi/production/dto/DrawMaterialDto.java
@@ -1,17 +1,44 @@
package com.ruoyi.production.dto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
-
import java.math.BigDecimal;
@Data
+@ApiModel("棰嗘枡鍗旸TO")
public class DrawMaterialDto {
+ @ApiModelProperty("璁㈠崟ID")
private Long id;
+
+ @ApiModelProperty("鍨嬪彿ID")
private Long productModelId;
+
+ @ApiModelProperty("搴撳瓨鏁伴噺")
private BigDecimal qualitity;
+
+ @ApiModelProperty("棰嗙敤鏁伴噺")
private BigDecimal requisitionQty;
+
+ @ApiModelProperty("浜у搧鍚嶇О")
private String productName;
+
+ @ApiModelProperty("浜у搧鍨嬪彿")
private String model;
+
+ @ApiModelProperty("浜у搧鍗曚綅")
private String unit;
-}
+
+ @ApiModelProperty("鎶ュ伐棰嗙敤鏁伴噺")
+ private BigDecimal reportQty;
+
+ @ApiModelProperty("澶囨敞")
+ private String remark;
+
+ @ApiModelProperty("鎵瑰彿")
+ private String batchNo;
+
+ @ApiModelProperty("渚涘簲鍟嗗悕绉�")
+ private String customer;
+}
\ No newline at end of file
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..13338c7 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionProductInput.java
@@ -30,4 +30,13 @@
@ApiModelProperty(value = "绉熸埛ID")
@TableField(fill = FieldFill.INSERT)
private Long tenantId;
+
+ @ApiModelProperty(value = "澶囨敞")
+ private String remark;
+
+ @ApiModelProperty("鎵瑰彿")
+ private String batchNo;
+
+ @ApiModelProperty("渚涘簲鍟嗗悕绉�")
+ private String customer;
}
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..f479a16 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -23,8 +23,8 @@
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 com.ruoyi.stock.pojo.StockInventory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -32,7 +32,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
@@ -247,43 +248,9 @@
@Override
public List<SelectOptionDTO<String>> getProductOrderBatchNo() {
- List<ProductOrder> productOrders = productOrderMapper.selectList(null);
- return productOrders.stream().map(productOrder -> new SelectOptionDTO<>(productOrder.getBatchNo(), productOrder.getBatchNo())).collect(Collectors.toList());
- }
-
- @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);
+ //鏌ヨ搴撳瓨鎵瑰彿
+ List<StockInventory> stockInventoryList = stockInventoryMapper.selectList(null);
+ return stockInventoryList.stream().map(stockInventory -> new SelectOptionDTO<>(stockInventory.getBatchNo(), stockInventory.getBatchNo())).collect(Collectors.toList());
}
@Override
@@ -308,6 +275,16 @@
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(),
+ drawMaterialDto.getBatchNo(), drawMaterialDto.getCustomer()
+ );
+ }
+ }
// 澶勭悊棰嗘枡锛堟墸鍑忓簱瀛橈級
try {
@@ -315,7 +292,9 @@
if (drawMaterialDto.getProductModelId() == null) {
throw new RuntimeException("浜у搧鍨嬪彿ID涓嶈兘涓虹┖");
}
- stockUtils.substractStock(drawMaterialDto.getProductModelId(), drawMaterialDto.getRequisitionQty(), StockOutQualifiedRecordTypeEnum.DRAW_MATERIALS_STOCK_OUT.getCode(), productOrderDto.getId());
+ stockUtils.substractStock(drawMaterialDto.getProductModelId(), drawMaterialDto.getRequisitionQty(),
+ StockOutQualifiedRecordTypeEnum.DRAW_MATERIALS_STOCK_OUT.getCode(), productOrderDto.getId(),
+ drawMaterialDto.getBatchNo(),drawMaterialDto.getCustomer());
}
} catch (Exception e) {
throw new RuntimeException("棰嗘枡澶辫触锛�" + e.getMessage());
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..7175825 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,80 @@
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);
+ /* 鏂板鎶ュ伐鎶曞叆琛� */
+ ProductWorkOrder WorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
+ if (WorkOrder == null) {
+ throw new RuntimeException("宸ュ崟涓嶅瓨鍦�");
}
- for (ProductStructureDto productStructureDto : productStructureDtos) {
- ProductionProductInput productionProductInput = new ProductionProductInput();
- productionProductInput.setProductModelId(productStructureDto.getProductModelId());
- productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity()));
- productionProductInput.setProductMainId(productionProductMain.getId());
- productionProductInputMapper.insert(productionProductInput);
+ ProductOrder order = productOrderMapper.selectById(WorkOrder.getProductOrderId());
+ if (order == null) {
+ throw new RuntimeException("浜у搧璁㈠崟涓嶅瓨鍦�");
+ }
+ List<DrawMaterialDto> drawMaterialList = dto.getDrawMaterialList();
+ if (!CollectionUtils.isEmpty(drawMaterialList)) {
+
+ // 鐗╂枡Map
+ List<DrawMaterialDto> existingMaterialList = JSON.parseArray(order.getDrawMaterials(), DrawMaterialDto.class);
+ if (CollectionUtils.isEmpty(existingMaterialList)) {
+ throw new RuntimeException("鍙鐢ㄧ墿鏂欏垪琛ㄤ负绌�");
+ }
+
+ Map<String, DrawMaterialDto> materialMap = existingMaterialList.stream()
+ .collect(Collectors.toMap(
+ materialDto -> materialDto.getProductModelId() + "_" +
+ (materialDto.getBatchNo() == null ? "" : materialDto.getBatchNo()) + "_" +
+ (materialDto.getCustomer() == null ? "" : materialDto.getCustomer()),
+ Function.identity(),
+ (existing, replacement) -> existing
+ ));
+
+ // 澶勭悊鎶ュ伐鐗╂枡
+ List<ProductionProductInput> inputList = new ArrayList<>();
+
+ for (DrawMaterialDto drawMaterial : drawMaterialList) {
+ Long modelId = drawMaterial.getProductModelId();
+ BigDecimal reportQty = drawMaterial.getReportQty();
+
+ String key = drawMaterial.getProductModelId() + "_" +
+ (drawMaterial.getBatchNo() == null ? "" : drawMaterial.getBatchNo()) + "_" +
+ (drawMaterial.getCustomer() == null ? "" : drawMaterial.getCustomer());
+
+ DrawMaterialDto material = materialMap.get(key);
+ if (material == null) {
+ throw new RuntimeException("鐗╂枡涓嶅瓨鍦�: 浜у搧鍨嬪彿ID=" + modelId +
+ ", 鎵规鍙�=" + drawMaterial.getBatchNo() +
+ ", 瀹㈡埛=" + drawMaterial.getCustomer());
+ }
+
+ // 楠岃瘉搴撳瓨
+ 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());
+ input.setBatchNo(drawMaterial.getBatchNo());
+ input.setCustomer(drawMaterial.getCustomer());
+ inputList.add(input);
+ }
+
+ if (!inputList.isEmpty()) {
+ for (ProductionProductInput productionProductInput : inputList) {
+ productionProductInputMapper.insert(productionProductInput);
+ }
+ order.setDrawMaterials(JSON.toJSONString(existingMaterialList));
+ productOrderMapper.updateById(order);
+ }
}
/*鏂板鎶ュ伐浜у嚭琛�*/
ProductionProductOutput productionProductOutput = new ProductionProductOutput();
@@ -193,14 +253,13 @@
qualityInspect.setProductName(product.getProductName());
qualityInspect.setModel(productModel.getModel());
qualityInspect.setUnit(productModel.getUnit());
- qualityInspect.setQuantity(productQty);
+ qualityInspect.setQuantity(productionProductOutput.getQuantity().subtract(productionProductOutput.getScrapQty()));
qualityInspect.setProcess(process);
qualityInspect.setInspectState(0);
qualityInspect.setInspectType(inspectType);
qualityInspect.setProductMainId(productionProductMain.getId());
qualityInspect.setProductModelId(productModel.getId());
qualityInspect.setBatchNo(productOrder.getBatchNo());
- qualityInspect.setInspectedQuantity(dto.getInspectedQuantity());
qualityInspect.setManufacturingTeam(productOrder.getManufacturingTeam());
qualityInspectMapper.insert(qualityInspect);
List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(product.getId(), inspectType, process);
@@ -217,9 +276,12 @@
qualityInspectParamMapper.insert(param);
});
}
- }else {
+ } else {
//鐩存帴鍏ュ簱
- stockUtils.addStock(productProcessRouteItem.getProductModelId(), productQty, StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
+ String customer = "闀挎不甯傝酱鎵垮埗閫犳湁闄愬叕鍙�";
+ stockUtils.addStock(productProcessRouteItem.getProductModelId(), productionProductOutput.getQuantity().subtract(productionProductOutput.getScrapQty()),
+ StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId(),order.getBatchNo(),customer
+ );
}
/*鏇存柊宸ュ崟鍜岀敓浜ц鍗�*/
ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
@@ -275,10 +337,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 +394,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/purchase/service/impl/PurchaseLedgerServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
index d71b3bb..17f1a29 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -1,29 +1,23 @@
package com.ruoyi.purchase.service.impl;
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.service.impl.ServiceImpl;
-import com.ruoyi.account.pojo.AccountExpense;
-import com.ruoyi.account.pojo.AccountIncome;
import com.ruoyi.account.service.AccountExpenseService;
-import com.ruoyi.account.service.AccountIncomeService;
import com.ruoyi.approve.pojo.ApproveProcess;
import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl;
import com.ruoyi.approve.vo.ApproveProcessVO;
import com.ruoyi.basic.mapper.ProductMapper;
import com.ruoyi.basic.mapper.ProductModelMapper;
import com.ruoyi.basic.mapper.SupplierManageMapper;
-import com.ruoyi.basic.pojo.Customer;
import com.ruoyi.basic.pojo.Product;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.basic.pojo.SupplierManage;
import com.ruoyi.common.enums.FileNameType;
import com.ruoyi.common.exception.base.BaseException;
-import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
@@ -39,19 +33,25 @@
import com.ruoyi.purchase.dto.PurchaseLedgerImportDto;
import com.ruoyi.purchase.dto.PurchaseLedgerProductImportDto;
import com.ruoyi.purchase.mapper.*;
-import com.ruoyi.purchase.pojo.*;
+import com.ruoyi.purchase.pojo.PaymentRegistration;
+import com.ruoyi.purchase.pojo.ProductRecord;
+import com.ruoyi.purchase.pojo.PurchaseLedger;
+import com.ruoyi.purchase.pojo.TicketRegistration;
import com.ruoyi.purchase.service.IPurchaseLedgerService;
import com.ruoyi.quality.mapper.*;
-import com.ruoyi.quality.pojo.*;
-import com.ruoyi.sales.dto.SalesLedgerImportDto;
-import com.ruoyi.sales.dto.SalesLedgerProductImportDto;
-import com.ruoyi.sales.mapper.*;
+import com.ruoyi.quality.pojo.QualityInspect;
+import com.ruoyi.quality.pojo.QualityInspectParam;
+import com.ruoyi.quality.pojo.QualityTestStandard;
+import com.ruoyi.quality.pojo.QualityTestStandardParam;
+import com.ruoyi.sales.mapper.CommonFileMapper;
+import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper;
+import com.ruoyi.sales.mapper.SalesLedgerMapper;
+import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.pojo.CommonFile;
import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
-import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.BeanUtils;
@@ -207,7 +207,7 @@
// 4. 澶勭悊瀛愯〃鏁版嵁
List<SalesLedgerProduct> productList = purchaseLedgerDto.getProductData();
if (productList != null && !productList.isEmpty()) {
- handleSalesLedgerProducts(purchaseLedger.getId(), productList, purchaseLedgerDto.getType());
+ handleSalesLedgerProducts(purchaseLedger.getId(), productList, purchaseLedgerDto.getType(),supplierManage);
}
//鏂板鍘熸潗鏂欐楠� 瀹℃壒涔嬪悗鎵嶇敓鎴愭楠�
// if (productList != null) {
@@ -230,6 +230,7 @@
QualityInspect qualityInspect = new QualityInspect();
qualityInspect.setInspectType(0);
qualityInspect.setSupplier(purchaseLedger.getSupplierName());
+ qualityInspect.setBatchNo(saleProduct.getBatchNo());
qualityInspect.setPurchaseLedgerId(purchaseLedger.getId());
qualityInspect.setProductId(saleProduct.getProductId());
qualityInspect.setProductName(saleProduct.getProductCategory());
@@ -254,7 +255,7 @@
}
}
- private void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, Integer type) {
+ private void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, Integer type,SupplierManage supplierManage) {
if (products == null || products.isEmpty()) {
throw new BaseException("浜у搧淇℃伅涓嶅瓨鍦�");
}
@@ -324,6 +325,8 @@
salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity());
salesLedgerProduct.setFutureTicketsAmount(salesLedgerProduct.getTaxInclusiveTotalPrice());
salesLedgerProduct.setPendingTicketsTotal(salesLedgerProduct.getTaxInclusiveTotalPrice());
+ salesLedgerProduct.setCustomer(supplierManage.getSupplierName());
+ salesLedgerProduct.setBatchNo(salesLedgerProduct.getBatchNo());
salesLedgerProductMapper.insert(salesLedgerProduct);
}
}
@@ -511,6 +514,15 @@
productWrapper.eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedger.getId())
.eq(SalesLedgerProduct::getType, purchaseLedgerDto.getType());
List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(productWrapper);
+ // 鏌ヨ鍏宠仈浜у搧鐨刄ID
+ for (SalesLedgerProduct product : products) {
+ if (product.getProductModelId() != null) {
+ ProductModel productModel = productModelMapper.selectById(product.getProductModelId());
+ if (productModel != null) {
+ product.setUidNo(productModel.getUidNo());
+ }
+ }
+ }
// 3.鏌ヨ涓婁紶鏂囦欢
LambdaQueryWrapper<CommonFile> salesLedgerFileWrapper = new LambdaQueryWrapper<>();
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/QualityInspectServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
index 5ba5685..52272ad 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -15,6 +15,12 @@
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.procurementrecord.service.ProcurementRecordService;
import com.ruoyi.procurementrecord.utils.StockUtils;
+import com.ruoyi.production.mapper.ProductOrderMapper;
+import com.ruoyi.production.mapper.ProductWorkOrderMapper;
+import com.ruoyi.production.mapper.ProductionProductMainMapper;
+import com.ruoyi.production.pojo.ProductOrder;
+import com.ruoyi.production.pojo.ProductWorkOrder;
+import com.ruoyi.production.pojo.ProductionProductMain;
import com.ruoyi.quality.dto.QualityInspectDto;
import com.ruoyi.quality.mapper.QualityInspectMapper;
import com.ruoyi.quality.mapper.QualityTestStandardMapper;
@@ -61,6 +67,13 @@
private ProductModelMapper productModelMapper;
+ private ProductionProductMainMapper productionProductMainMapper;
+
+ private ProductWorkOrderMapper productWorkOrderMapper;
+
+ private ProductOrderMapper productOrderMapper;
+
+
@Override
public int add(QualityInspectDto qualityInspectDto) {
QualityInspect qualityInspect = new QualityInspect();
@@ -88,6 +101,20 @@
@Override
public int submit(QualityInspect inspect) {
QualityInspect qualityInspect = qualityInspectMapper.selectById(inspect.getId());
+ ProductionProductMain productionProductMain = productionProductMainMapper.selectById(qualityInspect.getProductMainId());
+
+ String batchNo;
+ String customer;
+ if (productionProductMain != null) {
+ ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(productionProductMain.getWorkOrderId());
+ ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
+ batchNo = productOrder.getBatchNo();
+ customer = "闀挎不甯傝酱鎵垮埗閫犳湁闄愬叕鍙�";
+ } else {
+ batchNo = qualityInspect.getBatchNo();
+ customer = qualityInspect.getSupplier();
+ }
+
//鎻愪氦鍓嶅繀椤诲垽鏂槸鍚﹀悎鏍�
if (ObjectUtils.isNull(qualityInspect.getCheckResult())) {
throw new RuntimeException("璇峰厛鍒ゆ柇鏄惁鍚堟牸");
@@ -104,7 +131,9 @@
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(), batchNo, customer
+ );
}
qualityInspect.setInspectState(1);//宸叉彁浜�
return qualityInspectMapper.updateById(qualityInspect);
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..b8ac021 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
@@ -7,16 +7,13 @@
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;
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.mapper.*;
import com.ruoyi.production.pojo.*;
import com.ruoyi.production.service.ProductOrderService;
import com.ruoyi.quality.mapper.QualityUnqualifiedMapper;
@@ -29,10 +26,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
@@ -47,6 +48,7 @@
private ProductProcessRouteItemMapper productProcessRouteItemMapper;
private ProductWorkOrderMapper productWorkOrderMapper;
private StockUninventoryService stockUninventoryService;
+ private ProductOrderMapper productOrderMapper;
@Override
public IPage<QualityUnqualified> qualityUnqualifiedListPage(Page page, QualityUnqualified qualityUnqualified) {
@@ -64,10 +66,12 @@
public int deal(QualityUnqualified qualityUnqualified) {
QualityUnqualified unqualified = qualityUnqualifiedMapper.selectById(qualityUnqualified.getId());
QualityInspect qualityInspect = qualityInspectService.getById(unqualified.getInspectId());
+ ProductionProductMain productionProductMain = productionProductMainMapper.selectById(qualityInspect.getProductMainId());
+ ProductWorkOrder workOrder = productWorkOrderMapper.selectById(productionProductMain.getWorkOrderId());
+ ProductOrder orders = productOrderMapper.selectById(workOrder.getProductOrderId());
if (ObjectUtils.isNotNull(qualityInspect) && qualityInspect.getInspectType() != 0) {
switch (qualityUnqualified.getDealResult()) {
case "杩斾慨":
- case "杩斿伐":
//鍒ゆ柇璐ㄦ琛ㄦ槸鍚︽湁鐩稿叧鐨勬姤宸d,濡傛灉鏈夋姤宸d,閭d箞杩斿伐闇�瑕侀噸鏂板垱寤虹敓浜ц鍗曢噸鏂扮敓浜�
if (ObjectUtils.isNotNull(qualityInspect.getProductMainId())) {
//杩斿伐闇�瑕侀噸鏂板垱寤虹敓浜ц鍗曢噸鏂扮敓浜�
@@ -131,8 +135,12 @@
break;
case "璁╂鏀捐":
//璋冪敤鎻愪氦鍚堟牸鐨勬帴鍙�
- stockUtils.addStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId());
+ String customer = "闀挎不甯傝酱鎵垮埗閫犳湁闄愬叕鍙�";
+ stockUtils.addStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId(),
+ orders.getBatchNo(), customer
+ );
break;
+ case "杩斿伐":
default:
break;
}
@@ -146,7 +154,8 @@
break;
case "璁╂鏀捐":
//璋冪敤鎻愪氦鍚堟牸鐨勬帴鍙�
- stockUtils.addStock(modelId, unqualified.getQuantity(), StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId());
+ String customer = "闀挎不甯傝酱鎵垮埗閫犳湁闄愬叕鍙�";
+ stockUtils.addStock(modelId, unqualified.getQuantity(), StockInQualifiedRecordTypeEnum.DEFECTIVE_PASS.getCode(), unqualified.getId(), orders.getBatchNo(), customer);
break;
default:
break;
@@ -161,4 +170,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/sales/controller/ShipmentApprovalController.java b/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
index 49548e1..65e3230 100644
--- a/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
+++ b/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
@@ -87,7 +87,7 @@
//鍑哄簱
- stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId());
+ stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId(),null,null);
}
return AjaxResult.success();
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
index dff5d64..bc3e5fd 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -241,4 +241,7 @@
@ApiModelProperty(value = "鎵瑰彿")
private String batchNo;
+
+ @ApiModelProperty(value = "渚涘簲鍟�")
+ private String customer;
}
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
index eedc54f..bd71f54 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -194,6 +194,9 @@
product.setTempnoInvoiceAmount(product.getNoInvoiceAmount());
product.setTempNoInvoiceNum(product.getNoInvoiceNum());
product.setRegister(SecurityUtils.getLoginUser().getUser().getNickName());
+ product.setUidNo(product.getUidNo());
+ product.setUnit(product.getUnit());
+ product.setBatchNo(product.getBatchNo());
product.setRegisterDate(LocalDateTime.now());
// 鍙戣揣淇℃伅
ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>()
@@ -202,6 +205,13 @@
.last("limit 1"));
if (shippingInfo != null) {
product.setShippingStatus(shippingInfo.getStatus());
+ }
+ // 鏌ヨ鍏宠仈浜у搧鐨刄ID
+ if (product.getProductModelId() != null) {
+ ProductModel productModel = productModelMapper.selectById(product.getProductModelId());
+ if (productModel != null) {
+ product.setUidNo(productModel.getUidNo());
+ }
}
}
@@ -911,6 +921,7 @@
map.put("taxInclusiveUnitPrice", product.getTaxInclusiveUnitPrice().setScale(2, RoundingMode.HALF_UP).toString());
map.put("taxInclusiveTotalPrice", product.getTaxInclusiveTotalPrice().setScale(2, RoundingMode.HALF_UP).toString());
map.put("batchNo", product.getBatchNo());
+ map.put("uidNo", product.getUidNo());
// 鏌ヨ鍑瘉
ProductModel productModel = productModelMapper.selectById(product.getProductModelId());
if (productModel != null) {
diff --git a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
index c9651a7..625e765 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/ShippingInfoServiceImpl.java
@@ -67,7 +67,9 @@
//鎵e噺搴撳瓨
if(!"宸插彂璐�".equals(byId.getStatus())){
SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(byId.getSalesLedgerProductId());
- stockUtils.substractStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId());
+ stockUtils.substractStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(),
+ StockOutQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId(),null,null
+ );
}
byId.setExpressNumber(req.getExpressNumber());
byId.setExpressCompany(req.getExpressCompany());
diff --git a/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java b/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
index f878bdb..ed2092f 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.basic.dto.ProductDto;
import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.utils.poi.ExcelUtil;
@@ -105,4 +106,16 @@
public R thawStock(@RequestBody StockInventoryDto stockInventoryDto) {
return R.ok(stockInventoryService.thawStock(stockInventoryDto));
}
+
+ @ApiOperation("鏌ヨ搴撳瓨鍘熸潗鏂�")
+ @GetMapping("/getMaterials")
+ public R getMaterials(StockInventoryDto stockInventoryDto) {
+ return R.ok(stockInventoryService.getMaterials(stockInventoryDto));
+ }
+
+ @ApiOperation("鏌ヨ搴撳瓨浜у搧")
+ @GetMapping("/getStockInventoryAll")
+ public R getStockInventoryAll(ProductDto productDto) {
+ return R.ok(stockInventoryService.getStockInventoryAll(productDto));
+ }
}
diff --git a/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java b/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
index 1f00a00..f28c0eb 100644
--- a/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
+++ b/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
@@ -42,4 +42,7 @@
private BigDecimal currentStock;
private BigDecimal unLockedQuantity;
+ private Long productId; // 浜у搧ID
+ private Long parentId; // 鐖剁骇浜у搧ID
+ private Long productModelId; // 浜у搧鍨嬪彿ID
}
diff --git a/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java b/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
index 3d520a0..07fd0db 100644
--- a/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
+++ b/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.basic.dto.ProductDto;
import com.ruoyi.stock.dto.StockInRecordDto;
import com.ruoyi.stock.dto.StockInventoryDto;
import com.ruoyi.stock.execl.StockInventoryExportData;
@@ -51,4 +52,8 @@
BigDecimal selectTotalByDate(@Param("now") LocalDate now);
List<StockInventoryDto> getStockInventory(@Param("ids") List<Long> ids);
+
+ List<StockInventoryDto> getMaterials(@Param("ew")StockInventoryDto stockInventoryDto);
+
+ List<StockInventoryDto> getStockInventoryAll(@Param("ew") ProductDto productDto);
}
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java b/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
index c0b8a27..1d058af 100644
--- a/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
+++ b/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
@@ -63,4 +63,10 @@
@ApiModelProperty(value = "淇敼鐢ㄦ埛")
@TableField(fill = FieldFill.INSERT_UPDATE)
private Integer updateUser;
+
+ @ApiModelProperty("鎵瑰彿")
+ private String batchNo;
+
+ @ApiModelProperty("渚涘簲鍟嗗悕绉�")
+ private String customer;
}
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockInventory.java b/src/main/java/com/ruoyi/stock/pojo/StockInventory.java
index 36e7cf0..c0b379f 100644
--- a/src/main/java/com/ruoyi/stock/pojo/StockInventory.java
+++ b/src/main/java/com/ruoyi/stock/pojo/StockInventory.java
@@ -63,4 +63,10 @@
@ApiModelProperty("澶囨敞")
private String remark;
+
+ @ApiModelProperty("鎵瑰彿")
+ private String batchNo;
+
+ @ApiModelProperty("渚涘簲鍟嗗悕绉�")
+ private String customer;
}
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java b/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java
index e4e3b82..b14ae2e 100644
--- a/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java
+++ b/src/main/java/com/ruoyi/stock/pojo/StockOutRecord.java
@@ -71,4 +71,11 @@
@ApiModelProperty(value = "绫诲瀷 0鍚堟牸鍏ュ簱 1涓嶅悎鏍煎叆搴�")
private String type;
+
+ @ApiModelProperty("鎵瑰彿")
+ private String batchNo;
+
+ @ApiModelProperty("渚涘簲鍟嗗悕绉�")
+ private String customer;
+
}
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockUninventory.java b/src/main/java/com/ruoyi/stock/pojo/StockUninventory.java
index 6ed47de..0d6f83b 100644
--- a/src/main/java/com/ruoyi/stock/pojo/StockUninventory.java
+++ b/src/main/java/com/ruoyi/stock/pojo/StockUninventory.java
@@ -59,4 +59,10 @@
@ApiModelProperty("琚鍗曢攣瀹氭暟閲�")
private BigDecimal lockedQuantity;
+ @ApiModelProperty("鎵瑰彿")
+ private String batchNo;
+
+ @ApiModelProperty("渚涘簲鍟嗗悕绉�")
+ private String customer;
+
}
diff --git a/src/main/java/com/ruoyi/stock/service/StockInventoryService.java b/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
index 65dcca3..6a0e368 100644
--- a/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
+++ b/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
@@ -3,6 +3,8 @@
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.basic.dto.ProductDto;
+import com.ruoyi.basic.dto.ProductTreeDto;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.stock.dto.StockInRecordDto;
import com.ruoyi.stock.dto.StockInventoryDto;
@@ -10,6 +12,7 @@
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
+import java.util.List;
/**
* <p>
@@ -38,4 +41,8 @@
Boolean frozenStock(StockInventoryDto stockInventoryDto);
Boolean thawStock(StockInventoryDto stockInventoryDto);
+
+ List<StockInventoryDto> getMaterials(StockInventoryDto stockInventoryDto);
+
+ List<ProductTreeDto> getStockInventoryAll(ProductDto productDto);
}
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..97354b1 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -1,11 +1,19 @@
package com.ruoyi.stock.service.impl;
+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.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.dto.ProductDto;
+import com.ruoyi.basic.dto.ProductTreeDto;
+import com.ruoyi.basic.mapper.ProductMapper;
+import com.ruoyi.basic.mapper.ProductModelMapper;
+import com.ruoyi.basic.pojo.Product;
import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
+import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
@@ -19,15 +27,14 @@
import com.ruoyi.stock.service.StockInRecordService;
import com.ruoyi.stock.service.StockInventoryService;
import com.ruoyi.stock.service.StockOutRecordService;
-import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
/**
* <p>
@@ -38,13 +45,22 @@
* @since 2026-01-21 04:16:36
*/
@Service
-@AllArgsConstructor
public class StockInventoryServiceImpl extends ServiceImpl<StockInventoryMapper, StockInventory> implements StockInventoryService {
+ @Autowired
private StockInventoryMapper stockInventoryMapper;
+ @Autowired
private StockInRecordService stockInRecordService;
+ @Autowired
private StockOutRecordService stockOutRecordService;
+ @Autowired
private SalesLedgerProductMapper salesLedgerProductMapper;
+ @Autowired
+ private ProductMapper productMapper;
+ @Autowired
+ private ProductModelMapper productModelMapper;
+
+
@Override
public IPage<StockInventoryDto> pagestockInventory(Page page, StockInventoryDto stockInventoryDto) {
return stockInventoryMapper.pagestockInventory(page, stockInventoryDto);
@@ -55,16 +71,24 @@
@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");
+ stockInRecordDto.setBatchNo(stockInventoryDto.getBatchNo());
+ stockInRecordDto.setCustomer(stockInventoryDto.getCustomer());
+ stockInRecordService.add(stockInRecordDto);
+ }
//鍐嶈繘琛屾柊澧炲簱瀛樻暟閲忓簱瀛�
//鍏堟煡璇㈠簱瀛樿〃涓殑浜у搧鏄惁瀛樺湪锛屼笉瀛樺湪鏂板锛屽瓨鍦ㄦ洿鏂�
- StockInventory oldStockInventory = stockInventoryMapper.selectOne(new QueryWrapper<StockInventory>().lambda().eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId()));
+ StockInventory oldStockInventory = stockInventoryMapper.selectOne(new QueryWrapper<StockInventory>().lambda()
+ .eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId())
+ .eq(StockInventory::getBatchNo, stockInventoryDto.getBatchNo())
+ .eq(StockInventory::getCustomer, stockInventoryDto.getCustomer())
+ );
if (ObjectUtils.isEmpty(oldStockInventory)) {
StockInventory newStockInventory = new StockInventory();
newStockInventory.setProductModelId(stockInventoryDto.getProductModelId());
@@ -73,6 +97,8 @@
newStockInventory.setRemark(stockInventoryDto.getRemark());
newStockInventory.setLockedQuantity(stockInventoryDto.getLockedQuantity());
newStockInventory.setWarnNum(stockInventoryDto.getWarnNum());
+ newStockInventory.setBatchNo(stockInventoryDto.getBatchNo());
+ newStockInventory.setCustomer(stockInventoryDto.getCustomer());
stockInventoryMapper.insert(newStockInventory);
}else {
stockInventoryMapper.updateAddStockInventory(stockInventoryDto);
@@ -85,14 +111,22 @@
@Transactional(rollbackFor = Exception.class)
public Boolean subtractStockInventory(StockInventoryDto stockInventoryDto) {
// 鏂板鍑哄簱璁板綍
- StockOutRecordDto stockOutRecordDto = new StockOutRecordDto();
- stockOutRecordDto.setRecordId(stockInventoryDto.getRecordId());
- stockOutRecordDto.setRecordType(stockInventoryDto.getRecordType());
- stockOutRecordDto.setStockOutNum(stockInventoryDto.getQualitity());
- stockOutRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
- stockOutRecordDto.setType("0");
- stockOutRecordService.add(stockOutRecordDto);
- StockInventory oldStockInventory = stockInventoryMapper.selectOne(new QueryWrapper<StockInventory>().lambda().eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId()));
+ if (stockInventoryDto.getRecordType() != null) {
+ StockOutRecordDto stockOutRecordDto = new StockOutRecordDto();
+ stockOutRecordDto.setRecordId(stockInventoryDto.getRecordId());
+ stockOutRecordDto.setRecordType(stockInventoryDto.getRecordType());
+ stockOutRecordDto.setStockOutNum(stockInventoryDto.getQualitity());
+ stockOutRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
+ stockOutRecordDto.setBatchNo(stockInventoryDto.getBatchNo());
+ stockOutRecordDto.setCustomer(stockInventoryDto.getCustomer());
+ stockOutRecordDto.setType("0");
+ stockOutRecordService.add(stockOutRecordDto);
+ }
+ StockInventory oldStockInventory = stockInventoryMapper.selectOne(new QueryWrapper<StockInventory>().lambda()
+ .eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId())
+ .eq(StockInventory::getBatchNo, stockInventoryDto.getBatchNo())
+ .eq(StockInventory::getCustomer, stockInventoryDto.getCustomer())
+ );
if (ObjectUtils.isEmpty(oldStockInventory)) {
throw new RuntimeException("浜у搧搴撳瓨涓嶅瓨鍦�");
}
@@ -206,4 +240,216 @@
stockInventory.setLockedQuantity(stockInventory.getLockedQuantity().subtract(stockInventoryDto.getLockedQuantity()));
return this.updateById(stockInventory);
}
+
+ @Override
+ public List<StockInventoryDto> getMaterials(StockInventoryDto stockInventoryDto) {
+ return stockInventoryMapper.getMaterials(stockInventoryDto);
+ }
+
+ @Override
+ public List<ProductTreeDto> getStockInventoryAll(ProductDto productDto) {
+ // 鏌ヨ搴撳瓨鍒楄〃
+ List<StockInventoryDto> stockList = stockInventoryMapper.getStockInventoryAll(productDto);
+
+ if (CollectionUtils.isEmpty(stockList)) {
+ return new ArrayList<>();
+ }
+
+ // 鏋勫缓浜у搧鏍戯紙鍩轰簬浜у搧琛ㄧ殑鐖跺瓙鍏崇郴锛�
+ Map<Long, ProductTreeDto> productNodeMap = buildProductTree(stockList);
+
+ // 灏嗗簱瀛樻暟鎹紙鍨嬪彿->鎵规->瀹㈡埛锛夋寕杞藉埌瀵瑰簲鐨勪骇鍝佽妭鐐逛笅
+ attachStockDataToProduct(productNodeMap, stockList);
+
+ // 杩斿洖鏍硅妭鐐�
+ List<ProductTreeDto> tree = new ArrayList<>();
+ for (ProductTreeDto node : productNodeMap.values()) {
+ if (node.getParentId() == null || node.getParentId() == 0) {
+ tree.add(node);
+ }
+ }
+
+ return tree;
+ }
+
+ /**
+ * 鏋勫缓浜у搧鏍戯紙鑷姩閫掑綊鏌ヨ鎵�鏈夌埗绾э紝鍖呭惈鏍硅妭鐐癸級
+ */
+ private Map<Long, ProductTreeDto> buildProductTree(List<StockInventoryDto> stockList) {
+ // 1. 鏀堕泦鎵�鏈夐渶瑕佸姞杞界殑浜у搧ID
+ Set<Long> needQueryIds = new HashSet<>();
+ for (StockInventoryDto stock : stockList) {
+ if (stock.getProductId() != null) {
+ needQueryIds.add(stock.getProductId());
+ }
+ }
+
+ // 閫掑綊鏌ヨ鎵�鏈夎妭鐐癸紙鐩村埌鏍硅妭鐐癸級
+ Set<Long> allAncestors = getAllAncestorIds(needQueryIds);
+ needQueryIds.addAll(allAncestors);
+
+ // 鎵归噺鏌ヨ鎵�鏈変骇鍝侊紙鍖呭惈瀹屾暣灞傜骇锛�
+ LambdaQueryWrapper<Product> wrapper = new LambdaQueryWrapper<>();
+ wrapper.in(Product::getId, needQueryIds);
+ List<Product> products = productMapper.selectList(wrapper);
+
+ // 鏋勫缓鑺傜偣Map
+ Map<Long, ProductTreeDto> nodeMap = new HashMap<>();
+ for (Product product : products) {
+ ProductTreeDto node = new ProductTreeDto();
+ node.setId(product.getId());
+ node.setParentId(product.getParentId());
+ node.setProductName(product.getProductName());
+ node.setLabel(product.getProductName());
+ node.setNodeType("product");
+ node.setChildren(new ArrayList<>());
+ nodeMap.put(product.getId(), node);
+ }
+
+ // 鏋勫缓鐖跺瓙鍏崇郴
+ for (ProductTreeDto node : nodeMap.values()) {
+ Long parentId = node.getParentId();
+ if (parentId != null && parentId != 0 && nodeMap.containsKey(parentId)) {
+ nodeMap.get(parentId).getChildren().add(node);
+ }
+ }
+
+ return nodeMap;
+ }
+
+ /**
+ * 閫掑綊鏌ヨ鎵�鏈変骇鍝佺殑绁栧厛ID锛堢洿鍒版牴鑺傜偣锛�
+ */
+ private Set<Long> getAllAncestorIds(Set<Long> productIds) {
+ Set<Long> ancestorIds = new HashSet<>();
+ Queue<Long> queue = new LinkedList<>(productIds);
+
+ while (!queue.isEmpty()) {
+ Long currentId = queue.poll();
+ Product product = productMapper.selectById(currentId);
+ if (product == null) continue;
+
+ Long parentId = product.getParentId();
+ if (parentId != null && parentId != 0 && !ancestorIds.contains(parentId)) {
+ ancestorIds.add(parentId);
+ queue.add(parentId);
+ }
+ }
+ return ancestorIds;
+ }
+
+ /**
+ * 灏嗗簱瀛樻暟鎹紙鍨嬪彿->鎵规->瀹㈡埛锛夋寕杞藉埌浜у搧鑺傜偣涓�
+ */
+ private void attachStockDataToProduct(Map<Long, ProductTreeDto> productNodeMap,
+ List<StockInventoryDto> stockList) {
+ for (StockInventoryDto stock : stockList) {
+ Long productId = stock.getProductId();
+ if (productId == null || !productNodeMap.containsKey(productId)) {
+ continue;
+ }
+
+ ProductTreeDto productNode = productNodeMap.get(productId);
+
+ // 鏋勫缓璇ヤ骇鍝佺殑搴撳瓨鏍戯紙鍨嬪彿 -> 鎵规 -> 瀹㈡埛锛�
+ ProductTreeDto stockTree = buildStockTree(stock);
+
+ // 鍚堝苟鍒颁骇鍝佽妭鐐圭殑 children 涓�
+ mergeStockTree(productNode.getChildren(), stockTree);
+ }
+ }
+
+ /**
+ * 鏋勫缓鍗曚釜搴撳瓨鐨勬爲缁撴瀯锛堝瀷鍙� -> 鎵规 -> 瀹㈡埛锛�
+ */
+ private ProductTreeDto buildStockTree(StockInventoryDto stock) {
+ // 鍨嬪彿鑺傜偣
+ ProductTreeDto modelNode = new ProductTreeDto();
+ modelNode.setModel(stock.getModel());
+ modelNode.setUidNo(stock.getUidNo());
+ modelNode.setUnit(stock.getUnit());
+ modelNode.setProductModelId(stock.getProductModelId());
+ modelNode.setLabel(stock.getModel());
+ modelNode.setNodeType("model");
+ modelNode.setChildren(new ArrayList<>());
+
+ // 鎵规鑺傜偣
+ ProductTreeDto batchNode = new ProductTreeDto();
+ String batchNo = StringUtils.isBlank(stock.getBatchNo()) ? "鏃犳壒娆�" : stock.getBatchNo();
+ batchNode.setBatchNo(batchNo);
+ batchNode.setLabel("鎵规: " + batchNo);
+ batchNode.setNodeType("batch");
+ batchNode.setChildren(new ArrayList<>());
+
+ // 瀹㈡埛鑺傜偣
+ ProductTreeDto customerNode = new ProductTreeDto();
+ String customer = StringUtils.isBlank(stock.getCustomer()) ? "鏃犲鎴�" : stock.getCustomer();
+ customerNode.setCustomer(customer);
+ customerNode.setLabel(customer);
+ customerNode.setNodeType("customer");
+ customerNode.setChildren(new ArrayList<>());
+
+ batchNode.getChildren().add(customerNode);
+ modelNode.getChildren().add(batchNode);
+
+ return modelNode;
+ }
+
+ /**
+ * 鍚堝苟搴撳瓨鏍戝埌浜у搧鑺傜偣鐨� children 涓�
+ */
+ private void mergeStockTree(List<ProductTreeDto> children, ProductTreeDto newStockTree) {
+ if (children == null) {
+ return;
+ }
+
+ // 鏌ユ壘鏄惁宸叉湁鐩稿悓鍨嬪彿鐨勮妭鐐�
+ ProductTreeDto existingModelNode = null;
+ for (ProductTreeDto child : children) {
+ if (child.getNodeType().equals("model") &&
+ child.getModel() != null &&
+ child.getModel().equals(newStockTree.getModel())) {
+ existingModelNode = child;
+ break;
+ }
+ }
+
+ if (existingModelNode == null) {
+ // 娌℃湁鐩稿悓鍨嬪彿锛岀洿鎺ユ坊鍔�
+ children.add(newStockTree);
+ } else {
+ // 鏈夌浉鍚屽瀷鍙凤紝鍚堝苟鎵规鑺傜偣
+ ProductTreeDto newBatchNode = newStockTree.getChildren().get(0);
+
+ // 鏌ユ壘鏄惁宸叉湁鐩稿悓鎵规
+ ProductTreeDto existingBatchNode = null;
+ for (ProductTreeDto batchChild : existingModelNode.getChildren()) {
+ if (batchChild.getNodeType().equals("batch") &&
+ batchChild.getBatchNo() != null &&
+ batchChild.getBatchNo().equals(newBatchNode.getBatchNo())) {
+ existingBatchNode = batchChild;
+ break;
+ }
+ }
+
+ if (existingBatchNode == null) {
+ existingModelNode.getChildren().add(newBatchNode);
+ } else {
+ // 鍚堝苟瀹㈡埛鑺傜偣
+ ProductTreeDto newCustomerNode = newBatchNode.getChildren().get(0);
+ boolean customerExists = false;
+ for (ProductTreeDto customerChild : existingBatchNode.getChildren()) {
+ if (customerChild.getNodeType().equals("customer") &&
+ customerChild.getCustomer() != null &&
+ customerChild.getCustomer().equals(newCustomerNode.getCustomer())) {
+ customerExists = true;
+ break;
+ }
+ }
+ if (!customerExists) {
+ existingBatchNode.getChildren().add(newCustomerNode);
+ }
+ }
+ }
+ }
}
diff --git a/src/main/resources/mapper/basic/ProductModelMapper.xml b/src/main/resources/mapper/basic/ProductModelMapper.xml
index e4bbefa..530d2f3 100644
--- a/src/main/resources/mapper/basic/ProductModelMapper.xml
+++ b/src/main/resources/mapper/basic/ProductModelMapper.xml
@@ -16,11 +16,13 @@
<result column="validity_period" property="validityPeriod" />
<result column="filing_certificate_no" property="filingCertificateNo" />
<result column="uid_no" property="uidNo" />
+ <result column="parent_name" property="parentName" />
</resultMap>
<select id="listPageProductModel" resultType="com.ruoyi.basic.pojo.ProductModel">
- select pm.*,p.product_name
+ select pm.*,p.product_name, parent_p.product_name as parent_name
from product_model pm
left join product p on pm.product_id = p.id
+ left join product parent_p on p.parent_id = parent_p.id
<where>
<if test="c.model != null and c.model != ''">
and pm.model like concat('%',#{c.model},'%')
diff --git a/src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml b/src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml
index c5c007e..1446ab6 100644
--- a/src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml
+++ b/src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml
@@ -189,7 +189,7 @@
T1.supplier_name,
SUM(contract_amount) AS invoiceAmount,
IFNULL( SUM(T2.current_payment_amount) , 0 ) AS paymentAmount,
- IFNULL((IFNULL(SUM(contract_amount),0) - IFNULL(SUM(T2.current_payment_amount),0)),0) AS payableAmount
+ IFNULL((IFNULL(SUM(contract_amount),0) - IFNULL(SUM(T2.current_payment_amount),0)),0) AS payableAmount
FROM purchase_ledger T1
LEFT JOIN payment_registration T2 ON T1.id = T2.purchase_ledger_id
<where>
@@ -197,7 +197,7 @@
T1.supplier_name LIKE CONCAT ('%',#{req.supplierName},'%')
</if>
</where>
- GROUP BY T1.supplier_name
+ GROUP BY T1.supplier_id, T1.supplier_name
</select>
<select id="supplierNameListPageDetails" resultType="com.ruoyi.purchase.dto.PaymentRegistrationDto">
diff --git a/src/main/resources/mapper/stock/StockInventoryMapper.xml b/src/main/resources/mapper/stock/StockInventoryMapper.xml
index 7bcef36..21bc11e 100644
--- a/src/main/resources/mapper/stock/StockInventoryMapper.xml
+++ b/src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -65,7 +65,9 @@
si.remark,
pm.unit,
pm.uid_no as uidNo,
- p.product_name
+ p.product_name,
+ si.batch_no,
+ si.customer
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
@@ -257,4 +259,73 @@
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,
+ si.batch_no,
+ si.customer
+ 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 = '鍘熸潗鏂�';
+ <if test="ew.batchNo != null and ew.batchNo !=''">
+ and si.batch_no like concat('%',#{ew.batchNo},'%')
+ </if>
+ <if test="ew.customer != null and ew.customer !=''">
+ and si.customer like concat('%',#{ew.customer},'%')
+ </if>
+ </select>
+
+ <select id="getStockInventoryAll" 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.id as productModelId,
+ pm.model,
+ si.remark,
+ pm.unit,
+ pm.uid_no AS uidNo,
+ p.id AS product_id,
+ p.product_name,
+ p.parent_id AS parent_id,
+ p1.product_name AS parentName,
+ si.batch_no,
+ si.customer
+ 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>
+ <if test="ew.productName != null and ew.productName != ''">
+ AND p.product_name LIKE CONCAT('%', #{ew.productName}, '%')
+ </if>
+ </where>
+ </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
diff --git a/src/main/resources/static/sale-outbound.docx b/src/main/resources/static/sale-outbound.docx
index 781a210..6b348a9 100644
--- a/src/main/resources/static/sale-outbound.docx
+++ b/src/main/resources/static/sale-outbound.docx
Binary files differ
--
Gitblit v1.9.3