huminmin
2 天以前 32e4f30a848e159081986f93d189f0e80fa56a77
采购手动入库
已添加1个文件
已修改10个文件
217 ■■■■■ 文件已修改
doc/万通新型建材.sql 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/ApproveBusinessStatusService.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/dto/PurchaseStockInDto.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/pojo/StockInRecord.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
    }