doc/ÍòͨÐÂÐͽ¨²Ä.sql
@@ -50,3 +50,8 @@ alter table stock_uninventory add manufacturer_id bigint not null default 0 comment 'åå®¶id', add source varchar(255) not null default '' comment 'æ¥æº'; alter table stock_in_record add is_contains_water boolean default false comment 'æ¯å¦å«æ°´', add water_content decimal(16, 4) default 0 comment '嫿°´é', add theory_stock_in_num decimal(16, 4) default 0 comment 'çè®ºå ¥åºæ°é'; src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
@@ -523,16 +523,10 @@ ); for (SalesLedgerProduct salesLedgerProduct : salesLedgerProducts) { if (salesLedgerProduct.getIsChecked()) { // éè¦è´¨æ£ç产å -> çæè´¨æ£å qualityInspectHelper.addQualityInspect(purchaseLedger, salesLedgerProduct); } else { stockUtils.addStockWithBatchNo( salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId(), purchaseLedger.getPurchaseContractNumber() + "-" + salesLedgerProduct.getId() ); } // ä¸éè¦è´¨æ£ç产åï¼ä¸åèªå¨å ¥åºï¼æ¹ä¸ºæå¨å ¥åºæé®è§¦å } } else if ("REJECTED".equals(status)) { purchaseLedger.setApprovalStatus(ApprovalStatusEnum.REJECTED.getCode()); src/main/java/com/ruoyi/approve/service/impl/ApproveBusinessStatusService.java
@@ -82,12 +82,13 @@ if (Boolean.TRUE.equals(salesLedgerProduct.getIsChecked())) { addQualityInspect(purchaseLedger, salesLedgerProduct); } else { stockUtils.addStockWithBatchNo( salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId(), purchaseLedger.getPurchaseContractNumber() + "-" + salesLedgerProduct.getId()); // ä¸åèªå¨å ¥åºï¼æ¹ä¸ºæå¨å ¥åºæé®è§¦å // stockUtils.addStockWithBatchNo( // salesLedgerProduct.getProductModelId(), // salesLedgerProduct.getQuantity(), // StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), // purchaseLedger.getId(), // purchaseLedger.getPurchaseContractNumber() + "-" + salesLedgerProduct.getId()); } } } else if (status.equals(3)) { src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
@@ -114,6 +114,31 @@ } /** * åæ ¼å ¥åºå¸¦æ¹æ¬¡å·å嫿°´éä¿¡æ¯ * @param productModelId 产åè§æ ¼ID * @param actualStockInNum å®é å ¥åºæ°é * @param recordType è®°å½ç±»å * @param recordId è®°å½ID * @param batchNo æ¹æ¬¡å· * @param isContainsWater æ¯å¦å«æ°´ * @param waterContent 嫿°´é * @param theoryStockInNum çè®ºå ¥åºæ°é */ public void addStockWithBatchNo(Long productModelId, BigDecimal actualStockInNum, String recordType, Long recordId, String batchNo, Boolean isContainsWater, BigDecimal waterContent, BigDecimal theoryStockInNum) { StockInventoryDto stockInventoryDto = new StockInventoryDto(); stockInventoryDto.setRecordId(recordId); stockInventoryDto.setRecordType(String.valueOf(recordType)); stockInventoryDto.setQualitity(actualStockInNum); stockInventoryDto.setProductModelId(productModelId); stockInventoryDto.setBatchNo(batchNo); stockInventoryDto.setIsContainsWater(isContainsWater); stockInventoryDto.setWaterContent(waterContent); stockInventoryDto.setTheoryStockInNum(theoryStockInNum); stockInventoryService.addStockInRecordOnly(stockInventoryDto); } /** * åæ ¼åºåº * * @param productModelId src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
@@ -9,6 +9,7 @@ import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.framework.web.page.TableDataInfo; import com.ruoyi.purchase.dto.PurchaseLedgerDto; import com.ruoyi.purchase.dto.PurchaseStockInDto; import com.ruoyi.purchase.mapper.PurchaseLedgerTemplateMapper; import com.ruoyi.purchase.mapper.SalesLedgerProductTemplateMapper; import com.ruoyi.purchase.pojo.PurchaseLedger; @@ -250,4 +251,9 @@ public AjaxResult createPurchaseNo(@RequestParam Date entryDate) { return AjaxResult.success("çææå",purchaseLedgerService.getPurchaseNo(entryDate)); } @PostMapping("/manualStockIn") public AjaxResult manualStockIn(@RequestBody PurchaseStockInDto purchaseStockInDto) { return toAjax(purchaseLedgerService.manualStockIn(purchaseStockInDto)); } } src/main/java/com/ruoyi/purchase/dto/PurchaseStockInDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,41 @@ package com.ruoyi.purchase.dto; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.math.BigDecimal; import java.util.List; /** * éè´æå¨å ¥åºè¯·æ±DTO */ @Data @Schema(description = "éè´æå¨å ¥åºè¯·æ±DTO") public class PurchaseStockInDto { @Schema(description = "éè´å°è´¦ID") private Long purchaseLedgerId; @Schema(description = "产åå ¥åºæç»") private List<StockInProductItem> details; @Data @Schema(description = "产åå ¥åºæç»é¡¹") public static class StockInProductItem { @Schema(description = "éè´äº§åID(sales_ledger_product.id)") private Long id; @Schema(description = "å ¥åºæ°é(ç论æ°é)") private BigDecimal inboundQuantity; @Schema(description = "æ¯å¦å«æ°´") private Boolean isContainsWater; @Schema(description = "嫿°´é(%)") private BigDecimal waterContent; @Schema(description = "å®é å ¥åºæ°é") private BigDecimal actualInboundQuantity; } } src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.purchase.dto.PurchaseLedgerDto; import com.ruoyi.purchase.dto.PurchaseStockInDto; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.sales.pojo.SalesLedgerProduct; import org.springframework.web.multipart.MultipartFile; @@ -45,4 +46,11 @@ AjaxResult importData(MultipartFile file); PurchaseLedgerDto getPurchaseByCode(PurchaseLedgerDto purchaseLedgerDto); /** * æå¨å ¥åº * @param purchaseStockInDto å ¥åºè¯·æ±DTO * @return å ¥åºç»æ */ int manualStockIn(PurchaseStockInDto purchaseStockInDto); } src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -21,6 +21,7 @@ import com.ruoyi.basic.pojo.ProductModel; import com.ruoyi.basic.pojo.SupplierManage; import com.ruoyi.basic.utils.FileUtil; import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; @@ -30,11 +31,13 @@ import com.ruoyi.other.mapper.TempFileMapper; import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper; import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysUserMapper; import com.ruoyi.purchase.dto.PurchaseLedgerDto; import com.ruoyi.purchase.dto.PurchaseLedgerImportDto; import com.ruoyi.purchase.dto.PurchaseLedgerProductImportDto; import com.ruoyi.purchase.dto.PurchaseStockInDto; import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.purchase.service.IPurchaseLedgerService; @@ -103,6 +106,7 @@ private final FileUtil fileUtil; private final ApprovalInstanceService approvalInstanceService; private final ApprovalTemplateMapper approvalTemplateMapper; private final StockUtils stockUtils; @Override public List<PurchaseLedger> selectPurchaseLedgerList(PurchaseLedger purchaseLedger) { @@ -634,6 +638,87 @@ } @Override @Transactional(rollbackFor = Exception.class) public int manualStockIn(PurchaseStockInDto purchaseStockInDto) { if (purchaseStockInDto == null || purchaseStockInDto.getPurchaseLedgerId() == null) { throw new BaseException("éè´å°è´¦IDä¸è½ä¸ºç©º"); } if (CollectionUtils.isEmpty(purchaseStockInDto.getDetails())) { throw new BaseException("è¯·éæ©è³å°ä¸ä¸ªäº§åè¿è¡å ¥åº"); } // æ¥è¯¢éè´å°è´¦ PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(purchaseStockInDto.getPurchaseLedgerId()); if (purchaseLedger == null) { throw new BaseException("éè´å°è´¦ä¸åå¨"); } // éªè¯éè´å°è´¦ç¶ææ¯å¦ä¸ºå·²å®¡æ¹ if (!"3".equals(String.valueOf(purchaseLedger.getApprovalStatus()))) { throw new BaseException("åªæå·²å®¡æ¹éè¿çéè´å°è´¦æè½å ¥åº"); } int count = 0; for (PurchaseStockInDto.StockInProductItem item : purchaseStockInDto.getDetails()) { if (item.getId() == null) { continue; } // æ¥è¯¢éè´äº§å SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(item.getId()); if (salesLedgerProduct == null) { throw new BaseException("éè´äº§åä¸åå¨"); } // è·åçè®ºå ¥åºæ°éï¼åç«¯ä¼ å ¥çinboundQuantityï¼ BigDecimal theoryStockInNum = item.getInboundQuantity(); if (theoryStockInNum == null) { theoryStockInNum = salesLedgerProduct.getQuantity(); } // 空å¼åéæ£æ°æ ¡éª if (theoryStockInNum == null || theoryStockInNum.compareTo(BigDecimal.ZERO) <= 0) { throw new BaseException("çè®ºå ¥åºæ°éå¿ é¡»å¤§äº0"); } // è·åå®é å ¥åºæ°éï¼åç«¯ä¼ å ¥çactualInboundQuantityï¼ BigDecimal actualStockInNum = item.getActualInboundQuantity(); if (actualStockInNum == null) { actualStockInNum = theoryStockInNum; } // éæ£æ°æ ¡éª if (actualStockInNum.compareTo(BigDecimal.ZERO) <= 0) { throw new BaseException("å®é å ¥åºæ°éå¿ é¡»å¤§äº0"); } // è·åæ¯å¦å«æ°´å嫿°´é Boolean isContainsWater = item.getIsContainsWater(); BigDecimal waterContent = item.getWaterContent(); if (waterContent == null) { waterContent = BigDecimal.ZERO; } // 计ç®å·®é¢ BigDecimal difference = theoryStockInNum.subtract(actualStockInNum); // è°ç¨StockUtilsè¿è¡å ¥åºï¼å¸¦å«æ°´éä¿¡æ¯ï¼ stockUtils.addStockWithBatchNo( salesLedgerProduct.getProductModelId(), actualStockInNum, StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId(), purchaseLedger.getPurchaseContractNumber() + "-" + salesLedgerProduct.getId(), isContainsWater, waterContent, theoryStockInNum ); count++; } return count; } /** * ä¸å线å½å转驼峰å½å */ src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
@@ -91,5 +91,14 @@ private String unQualifiedSource; @Schema(description = "ä¸åæ ¼åºåæ¥æºææ¬") private String unQualifiedSourceText; private String unQualifiedSourceText; @Schema(description = "æ¯å¦å«æ°´") private Boolean isContainsWater; @Schema(description = "嫿°´é") private BigDecimal waterContent; @Schema(description = "çè®ºå ¥åºæ°é") private BigDecimal theoryStockInNum; } src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
@@ -79,4 +79,13 @@ @Schema(description = "æ¥æº") private String source; @Schema(description = "æ¯å¦å«æ°´") private Boolean isContainsWater; @Schema(description = "嫿°´é") private BigDecimal waterContent; @Schema(description = "çè®ºå ¥åºæ°é") private BigDecimal theoryStockInNum; } src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -190,6 +190,10 @@ stockInRecordDto.setWarnNum(stockInventoryDto.getWarnNum()); stockInRecordDto.setManufacturerId(stockInventoryDto.getManufacturerId()); stockInRecordDto.setSource(stockInventoryDto.getSource()); // è®¾ç½®å«æ°´éç¸å ³ä¿¡æ¯ stockInRecordDto.setIsContainsWater(stockInventoryDto.getIsContainsWater()); stockInRecordDto.setWaterContent(stockInventoryDto.getWaterContent()); stockInRecordDto.setTheoryStockInNum(stockInventoryDto.getTheoryStockInNum()); stockInRecordService.add(stockInRecordDto); return true; }