lishenao
15 小时以前 fbc53e77f994f15c3ebcd4fa07dfd23671c0ce26
入库管理,出库管理,库存管理后端接口修改
已修改24个文件
已删除3个文件
668 ■■■■■ 文件已修改
src/main/java/com/ruoyi/inventory/controller/StockInController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inventory/controller/StockManagementController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inventory/controller/StockOutController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inventory/dto/StockManagementDto.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inventory/dto/StockinDto.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inventory/dto/StockoutDto.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inventory/mapper/StockProductMapper.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inventory/pojo/StockIn.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inventory/pojo/StockManagement.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inventory/pojo/StockOut.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inventory/pojo/StockProduct.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inventory/service/StockInService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inventory/service/StockManagementService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inventory/service/StockOutService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inventory/service/impl/StockInServiceImpl.java 127 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inventory/service/impl/StockManagementServiceImpl.java 72 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inventory/service/impl/StockOutServiceImpl.java 57 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/dto/ProductRecordDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/mapper/ProductRecordMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/IProductRecordService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/ProductRecordServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/inventory/StockInMapper.xml 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/inventory/StockManagementMapper.xml 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/inventory/StockOutMapper.xml 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/inventory/StockProductMapper.xml 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/purchase/ProductRecordMapper.xml 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/inventory/controller/StockInController.java
@@ -12,7 +12,10 @@
import com.ruoyi.inventory.excel.StockInExcelDto;
import com.ruoyi.inventory.service.StockInService;
import com.ruoyi.inventory.pojo.StockIn;
import com.ruoyi.purchase.dto.ProductRecordDto;
import com.ruoyi.purchase.dto.PurchaseLedgerDto;
import com.ruoyi.purchase.pojo.ProductRecord;
import com.ruoyi.purchase.service.IProductRecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
@@ -26,6 +29,12 @@
public class StockInController{
    @Autowired
    private StockInService stockInService;
    @Autowired
    private IProductRecordService productRecordService;
    @GetMapping("/productlist")
    public AjaxResult list(String purchaseContractNumber) {
        return AjaxResult.success(productRecordService.selectProductRecordListByPuechaserId(purchaseContractNumber));
    }
    @GetMapping("/listPage")
    public AjaxResult listPage(Page page, StockinDto stockinDto) {
src/main/java/com/ruoyi/inventory/controller/StockManagementController.java
@@ -22,6 +22,11 @@
public class StockManagementController {
    @Autowired
    private StockManagementService stockManagementService;
//    æ ¹æ®id查询
    @RequestMapping("/{id}")
    public AjaxResult getStockManageById(@PathVariable Long id) {
        return success(stockManagementService.getStockManageById(id));
    }
//    æ›´æ–°åº“å­˜
    @PutMapping("/update")
@@ -51,4 +56,5 @@
    public AjaxResult stockout(@RequestBody StockManagement stockManagement) {
        return success(stockManagementService.stockout(stockManagement));
    }
}
src/main/java/com/ruoyi/inventory/controller/StockOutController.java
@@ -27,11 +27,11 @@
    @Autowired
    private StockManagementMapper stockManagementMapper;
    @PostMapping("/add")
    public AjaxResult add(@RequestBody StockOut stockout) {
        stockOutService.saveStockout(stockout);
        return AjaxResult.success();
    }
//    @PostMapping("/add")
//    public AjaxResult add(@RequestBody StockOut stockout) {
//        stockOutService.saveStockout(stockout);
//        return AjaxResult.success();
//    }
    @RequestMapping("/{id}")
    public AjaxResult getStockOutById(@PathVariable Long id) {
src/main/java/com/ruoyi/inventory/dto/StockManagementDto.java
@@ -8,7 +8,7 @@
public class StockManagementDto extends StockManagement {
    private String supplierName;
    private String productCategory;
    private String productName;
    private String unit;
    /**
     * å«ç¨Žå•ä»·
@@ -32,9 +32,9 @@
    /**
     * è§„格型号
     */
    private String specificationModel;
    private String model;
    /**
     * å…¥åº“人
     */
    private String nickname;
    private String nickName;
}
src/main/java/com/ruoyi/inventory/dto/StockinDto.java
@@ -16,16 +16,16 @@
    /**
     * å…¥åº“人
     */
    private String nickname;
    private String nickName;
    @ApiModelProperty(value = "产品大类")
    private String productCategory;
    private String productName;
    /**
     * è§„格型号
     */
    @ApiModelProperty(value = "规格型号")
    private String specificationModel;
    private String model;
    @ApiModelProperty(value = "单位")
    private String unit;
    /**
src/main/java/com/ruoyi/inventory/dto/StockoutDto.java
@@ -10,7 +10,7 @@
    private String supplierName;
    private String unit;
    private String productCategory;
    private String productName;
    /**
     * å«ç¨Žå•ä»·
     */
@@ -34,9 +34,9 @@
    /**
     * è§„格型号
     */
    private String specificationModel;
    private String model;
    /**
     * å…¥åº“人
     */
    private String nickname;
    private String nickName;
}
src/main/java/com/ruoyi/inventory/mapper/StockProductMapper.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/inventory/pojo/StockIn.java
@@ -23,14 +23,9 @@
    private Integer id;
    /**
     * äº§å“id
     */
    private Integer productRecordid;
    /**
     * å…¥åº“æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date inboundTime;
    /**
@@ -53,6 +48,7 @@
     * å…¥åº“人
     */
    private Long userId;
    private Long productrecordId;
//    tenant_id
    /**
     * ç§Ÿæˆ·ID
src/main/java/com/ruoyi/inventory/pojo/StockManagement.java
@@ -22,10 +22,7 @@
     */
    private Integer id;
    /**
     * äº§å“id
     */
    private Integer productRecordid;
    private Long productrecordId;
    /**
     * å½“前库存量
@@ -35,9 +32,9 @@
    private String inboundBatch;
    private Integer supplierId;
    @JsonFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date boundTime;
    @JsonFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date inboundTime;
    /**
src/main/java/com/ruoyi/inventory/pojo/StockOut.java
@@ -7,6 +7,7 @@
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
/**
@@ -21,14 +22,12 @@
     */
    private Integer id;
    /**
     * äº§å“id
     */
    private Integer productRecordid;
    private Long productrecordId;
    /**
     * å‡ºåº“æ—¶é—´
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date inboundTime;
    /**
@@ -52,7 +51,7 @@
     * å‡ºåº“人
     */
    private Long userId;
    private Integer stockmanageId;
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
src/main/java/com/ruoyi/inventory/pojo/StockProduct.java
ÎļþÒÑɾ³ý
src/main/java/com/ruoyi/inventory/service/StockInService.java
@@ -19,7 +19,7 @@
    StockIn getStockInById(Long id);
    boolean updateStockIn(StockIn stockIn);
    void updateStockIn(StockIn stockIn);
    int delStockin(List<Integer> ids);
//    PageInfo<StockinProcuct> getStockInPage(Integer pageNum, Integer pageSize, StockInQueryDTO query);
src/main/java/com/ruoyi/inventory/service/StockManagementService.java
@@ -18,4 +18,6 @@
    void stockManageExport(HttpServletResponse response, StockManagementDto stockManagementdto);
    int stockout(StockManagement stockManagement);
    int addStockManage(StockManagement stockManagement);
//    æ ¹æ®id查询
    StockManagement getStockManageById(Long id);
}
src/main/java/com/ruoyi/inventory/service/StockOutService.java
@@ -15,7 +15,7 @@
    int delStockOut(List<Integer> ids);
    StockOut getStockOutById(Long id);
    void saveStockout(StockOut stockout);
//    void saveStockout(StockOut stockout);
    int updateStockOut(StockOut stockOut);
    IPage<StockoutDto> selectStockOutPage(Page page, StockoutDto stockoutDto);
    void stockoutExport(HttpServletResponse response, StockoutDto stockoutDto);
src/main/java/com/ruoyi/inventory/service/impl/StockInServiceImpl.java
@@ -14,6 +14,7 @@
import com.ruoyi.inventory.mapper.StockInMapper;
import com.ruoyi.inventory.pojo.StockManagement;
import com.ruoyi.inventory.service.StockInService;
import com.ruoyi.purchase.dto.ProductRecordDto;
import com.ruoyi.purchase.dto.PurchaseLedgerDto;
import com.ruoyi.purchase.mapper.ProductRecordMapper;
import com.ruoyi.purchase.pojo.ProductRecord;
@@ -46,41 +47,30 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveStockin(StockIn stockIn) {
//需要先判断产品记录表中是否有该产品
        ProductRecord productRecord = productRecordMapper.selectById(stockIn.getProductRecordid());
        if (productRecord == null) {
            throw new RuntimeException("产品记录表中没有该产品");
        }
//        éœ€è¦å…ˆåˆ¤æ–­ä¾›åº”商表中是否有该供应商
        SupplierManage supplierManage = supplierManageMapper.selectById(stockIn.getSupplierId());
        if (supplierManage == null) {
            throw new RuntimeException("供应商表中没有该供应商");
        }
//        éœ€è¦å…ˆåˆ¤æ–­åº“存管理表中是否有该产品
        LambdaQueryWrapper<StockManagement> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(StockManagement::getProductRecordid, stockIn.getProductRecordid());
        queryWrapper.eq(StockManagement::getSupplierId, stockIn.getSupplierId());
        queryWrapper.eq(StockManagement::getUserId, stockIn.getUserId());
        StockManagement stockManagement = stockManagementMapper.selectOne(queryWrapper);
        if (stockManagement == null) {
//            å¦‚果没有该产品,需要先新增库存管理表
            stockManagement = new StockManagement();
            stockManagement.setProductRecordid(stockIn.getProductRecordid());
            stockManagement.setSupplierId(stockIn.getSupplierId());
//需要先判断采购记录表中是否有该产品的采购记录
//        æ ¹æ®äº§å“id查询采购记录表
        ProductRecordDto productRecordDto = productRecordMapper.selectProductRecordById(stockIn.getProductrecordId());
        if (productRecordDto != null) {
//            æ·»åŠ å…¥åº“è®°å½•å’Œåº“å­˜ç®¡ç†è®°å½•
            stockIn.setInboundTime(new Date());
//            è‡ªåŠ¨ç”Ÿæˆæ‰¹æ¬¡ç 
            String batchCode = "RK" + System.currentTimeMillis();
            stockIn.setInboundBatch(batchCode);
            stockIn.setSupplierId(productRecordDto.getSupplierId());
            stockInMapper.insert(stockIn);
//          åœ¨åº“存管理表中添加库存管理记录
            StockManagement stockManagement = new StockManagement();
            stockManagement.setProductrecordId(productRecordDto.getId());
            stockManagement.setStockQuantity(stockIn.getInboundQuantity());
            stockManagement.setInboundTime(stockIn.getInboundTime());
            stockManagement.setBoundTime(new Date());
            stockManagement.setInboundBatch(stockIn.getInboundBatch());
            stockManagement.setUserId(stockIn.getUserId());
            stockManagement.setSupplierId(productRecordDto.getSupplierId());
            stockManagement.setBoundTime(stockIn.getInboundTime());
            stockManagementMapper.insert(stockManagement);
        }else {
            throw new RuntimeException("采购记录表中没有该产品的采购记录");
        }
//        å¦‚果有该产品,需要先更新库存管理表
            stockManagement.setStockQuantity(stockManagement.getStockQuantity() + stockIn.getInboundQuantity());
            stockManagement.setInboundTime(stockIn.getInboundTime());
            stockManagement.setBoundTime(new Date());
            stockManagement.setUserId(stockIn.getUserId());
            stockManagementMapper.updateById(stockManagement);
//            éœ€è¦å…ˆæ–°å¢žåº“存入库表
            stockInMapper.insert(stockIn);
    }
    @Override//根据id获取库存入库信息
@@ -88,75 +78,20 @@
        StockIn stockIn = stockInMapper.selectById(id);
        return stockIn;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean updateStockIn(StockIn stockIn) {
        // 1. å‚数校验
        if (stockIn == null || stockIn.getId() == null) {
            throw new IllegalArgumentException("入库记录ID不能为空");
    public void updateStockIn(StockIn stockIn) {
//        éœ€è¦å…ˆåˆ¤æ–­é‡‡è´­è®°å½•表中是否有该产品的采购记录
        LambdaQueryWrapper<ProductRecord> queryWrapper1 = new LambdaQueryWrapper<>();
        queryWrapper1.eq(ProductRecord::getId, stockIn.getProductrecordId());
        ProductRecord productRecord = productRecordMapper.selectOne(queryWrapper1);
        if (productRecord!= null) {
            stockIn.setInboundTime(stockIn.getInboundTime());
            stockInMapper.updateById(stockIn);
        }    else {
            throw new RuntimeException("采购记录表中没有该产品的采购记录");
        }
        // 2. èŽ·å–åŽŸå§‹è®°å½•
        StockIn original = stockInMapper.selectById(stockIn.getId());
        if (original == null) {
            throw new RuntimeException("要修改的入库记录不存在,ID: " + stockIn.getId());
        }
        // 3. æ£€æŸ¥å…³è”数据
        // 3.1 æ£€æŸ¥äº§å“
        if (stockIn.getProductRecordid() != null &&
                productRecordMapper.selectById(stockIn.getProductRecordid()) == null) {
            throw new RuntimeException("产品记录不存在,ID: " + stockIn.getProductRecordid());
        }
        // 3.2 æ£€æŸ¥ä¾›åº”商
        if (stockIn.getSupplierId() != null &&
                supplierManageMapper.selectById(stockIn.getSupplierId()) == null) {
            throw new RuntimeException("供应商不存在,ID: " + stockIn.getSupplierId());
        }
        // 4. ç¡®å®šæœ€ç»ˆä½¿ç”¨çš„各ID值
        Integer finalProductId = stockIn.getProductRecordid() != null ?
                stockIn.getProductRecordid() : original.getProductRecordid();
        Integer finalSupplierId = stockIn.getSupplierId() != null ?
                stockIn.getSupplierId() : original.getSupplierId();
        Long finalUserId = stockIn.getUserId() != null ?
                stockIn.getUserId() : original.getUserId();
        // 5. å¤„理库存记录(确保存在对应记录)
        LambdaQueryWrapper<StockManagement> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(StockManagement::getProductRecordid, finalProductId)
                .eq(StockManagement::getSupplierId, finalSupplierId)
                .eq(StockManagement::getUserId, finalUserId);
        StockManagement stock = stockManagementMapper.selectOne(wrapper);
        // è®¡ç®—数量变化(如果有修改)
        Integer quantityChange = stockIn.getInboundQuantity() != null ?
                stockIn.getInboundQuantity() - original.getInboundQuantity() : 0;
        if (stock == null) {
            // 5.1 ä¸å­˜åœ¨åˆ™åˆ›å»ºæ–°è®°å½•
            stock = new StockManagement();
            stock.setProductRecordid(finalProductId);
            stock.setSupplierId(finalSupplierId);
            stock.setUserId(finalUserId);
            // åˆå§‹åº“å­˜ = åŽŸå§‹åº“å­˜ + å˜åŒ–量(考虑修改后的值)
            stock.setStockQuantity(original.getInboundQuantity() + quantityChange);
            stockManagementMapper.insert(stock);
        } else if (quantityChange != 0) {
            // 5.2 å­˜åœ¨ä¸”数量有变化则更新
            stock.setStockQuantity(stock.getStockQuantity() + quantityChange);
            stockManagementMapper.updateById(stock);
        }
        // 6. æ›´æ–°å…¥åº“记录
        int updateResult = stockInMapper.updateById(stockIn);
        if (updateResult <= 0) {
            throw new RuntimeException("入库记录更新失败");
        }
        return updateResult > 0;
    }
src/main/java/com/ruoyi/inventory/service/impl/StockManagementServiceImpl.java
@@ -14,12 +14,14 @@
import com.ruoyi.inventory.pojo.StockManagement;
import com.ruoyi.inventory.pojo.StockOut;
import com.ruoyi.inventory.service.StockManagementService;
import com.ruoyi.purchase.dto.ProductRecordDto;
import com.ruoyi.purchase.mapper.ProductRecordMapper;
import com.ruoyi.purchase.pojo.ProductRecord;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.List;
@Service
@@ -60,51 +62,55 @@
    @Override
    public int stockout(StockManagement stockManagement) {
//        éœ€è¦è¿›è¡Œåˆ¤æ–­ï¼Œåº“存数量是否足够
        StockManagement stockManagement1 = stockManagementMapper.selectById(stockManagement.getId());
//        åœ¨å‰ç«¯å…¶å®žå°±ç©¿äº†3个数,数量,出库人,时间,只需要进行判断,库存数量是否足够即可,有三种情况
        StockOut stockOut = new StockOut();
        LambdaQueryWrapper<StockManagement> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(StockManagement::getId, stockManagement.getId());
        StockManagement stockManagement1 = stockManagementMapper.selectOne(queryWrapper);
        if (stockManagement1.getStockQuantity() < stockManagement.getStockQuantity()) {
            throw new RuntimeException("库存数量不足");
        }else if (stockManagement1.getStockQuantity().equals(stockManagement.getStockQuantity())){
//            å‡åŽ»çš„æ•°é‡è¦åœ¨å‡ºåº“è®°å½•è¡¨ä¸­åŠ ä¸€æ¡æ•°æ®
            StockOut stockOut = new StockOut();
            stockOut.setInboundQuantity(stockManagement.getStockQuantity());
            stockOut.setProductRecordid(stockManagement1.getProductRecordid());
            stockOut.setSupplierId(stockManagement1.getSupplierId());
            stockOut.setUserId(stockManagement.getUserId());
            stockOut.setInboundTime(stockManagement1.getBoundTime());
            stockOutMapper.insert(stockOut);
            return stockManagementMapper.deleteById(stockManagement.getId());
        } else if (stockManagement1.getStockQuantity() > stockManagement.getStockQuantity()) {
            stockManagement1.setStockQuantity(stockManagement1.getStockQuantity() - stockManagement.getStockQuantity());
            stockManagementMapper.updateById(stockManagement1);
        }
        else {
            stockManagement1.setStockQuantity(stockManagement1.getStockQuantity() - stockManagement.getStockQuantity());
            StockOut stockOut = new StockOut();
            stockOut.setInboundQuantity(stockManagement.getStockQuantity());
            stockOut.setProductRecordid(stockManagement1.getProductRecordid());
            stockOut.setSupplierId(stockManagement1.getSupplierId());
            stockOut.setUserId(stockManagement.getUserId());
            stockOut.setInboundTime(stockManagement1.getBoundTime());
            stockOutMapper.insert(stockOut);
            return stockManagementMapper.updateById(stockManagement1);
            stockManagementMapper.deleteById(stockManagement.getId());
        }
        stockOut.setProductrecordId(stockManagement1.getProductrecordId());
        stockOut.setInboundTime(stockManagement.getBoundTime());
//            å‡ºåº“批次自动生成
        String batchCode = "CK" + System.currentTimeMillis();
        stockOut.setInboundBatch(batchCode);
        stockOut.setSupplierId(stockManagement1.getSupplierId());
        stockOut.setInboundQuantity(stockManagement.getStockQuantity());
        stockOut.setUserId(stockManagement.getUserId());
        return stockOutMapper.insert(stockOut);
    }
//    æ·»åŠ åº“å­˜æ–¹æ³•
    @Override
    public int addStockManage(StockManagement stockManagement) {
//        éœ€è¦è¿›è¡Œåˆ¤æ–­
//        éœ€è¦å…ˆåˆ¤æ–­é‡‡è´­è®°å½•表中是否有该产品的采购记录
        LambdaQueryWrapper<ProductRecord> queryWrapper1 = new LambdaQueryWrapper<>();
        queryWrapper1.eq(ProductRecord::getProductId, stockManagement.getProductRecordid());
        queryWrapper1.eq(ProductRecord::getId, stockManagement.getProductrecordId());
        ProductRecord productRecord = productRecordMapper.selectOne(queryWrapper1);
        if (productRecord == null) {
            throw new RuntimeException("产品不存在");
        ProductRecordDto productRecordDto = productRecordMapper.selectProductRecordById(productRecord.getId());
        if (productRecordDto!= null) {
            stockManagement.setProductrecordId(productRecordDto.getId());
            stockManagement.setBoundTime(stockManagement.getBoundTime());
            stockManagement.setSupplierId(productRecordDto.getSupplierId());
            stockManagement.setStockQuantity(stockManagement.getStockQuantity());
            stockManagement.setUserId(stockManagement.getUserId());
            return stockManagementMapper.insert(stockManagement);
        }else {
            throw new RuntimeException("采购记录表中没有该产品的采购记录");
        }
        LambdaQueryWrapper<SupplierManage> queryWrapper2 = new LambdaQueryWrapper<>();
        queryWrapper2.eq(SupplierManage::getId, stockManagement.getSupplierId());
        SupplierManage supplierManage = supplierManageMapper.selectOne(queryWrapper2);
        System.out.println(supplierManage+"11");
        if (supplierManage == null) {
            throw new RuntimeException("供应商不存在");
        }
        return stockManagementMapper.insert(stockManagement);
    }
    @Override
    public StockManagement getStockManageById(Long id) {
        return stockManagementMapper.selectById(id);
    }
}
src/main/java/com/ruoyi/inventory/service/impl/StockOutServiceImpl.java
@@ -49,59 +49,16 @@
        return stockOut;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveStockout(StockOut stockOut) {
//    è¿›è¡Œåˆ¤æ–­æ˜¯å¦å­˜åœ¨ç›¸åŒçš„产品id和供应商id,要判断product_id在表product_record中是否存在,因为stock_out表中的product_id是product_record表中的product_id关联的
        LambdaQueryWrapper<ProductRecord> queryWrapper1 = new LambdaQueryWrapper<>();
        queryWrapper1.eq(ProductRecord::getProductId, stockOut.getProductRecordid());
        ProductRecord productRecord = productRecordMapper.selectOne(queryWrapper1);
        if (productRecord == null) {
            throw new RuntimeException("产品不存在");
        }
        LambdaQueryWrapper<SupplierManage> queryWrapper2 = new LambdaQueryWrapper<>();
        queryWrapper2.eq(SupplierManage::getId, stockOut.getSupplierId());
        SupplierManage supplierManage = supplierManageMapper.selectOne(queryWrapper2);
        if (supplierManage == null) {
            throw new RuntimeException("供应商不存在");
        }
        LambdaQueryWrapper<StockManagement> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(StockManagement::getProductRecordid, stockOut.getProductRecordid());
        queryWrapper.eq(StockManagement::getSupplierId, stockOut.getSupplierId());
        StockManagement stockManagement = stockManagementMapper.selectOne(queryWrapper);
        if (stockManagement != null) {
            stockOut.setStockmanageId(stockManagement.getId());
            stockOutMapper.insert(stockOut);
        }else {
            throw new RuntimeException("库存中不存在该产品和供应商");
        }
    }
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public void saveStockout(StockOut stockOut) {
//
//    }
    @Override
    public int updateStockOut(StockOut stockOut) {
//      ä¿®æ”¹çš„æ—¶å€™è¦åˆ¤æ–­æ˜¯å¦å­˜åœ¨ç›¸åŒçš„产品id和供应商id
        LambdaQueryWrapper<ProductRecord> queryWrapper1 = new LambdaQueryWrapper<>();
        queryWrapper1.eq(ProductRecord::getProductId, stockOut.getProductRecordid());
        ProductRecord productRecord = productRecordMapper.selectOne(queryWrapper1);
        if (productRecord == null) {
            throw new RuntimeException("产品不存在");
        }
        LambdaQueryWrapper<SupplierManage> queryWrapper2 = new LambdaQueryWrapper<>();
        queryWrapper2.eq(SupplierManage::getId, stockOut.getSupplierId());
        SupplierManage supplierManage = supplierManageMapper.selectOne(queryWrapper2);
        if (supplierManage == null) {
            throw new RuntimeException("供应商不存在");
        }
        LambdaQueryWrapper<StockManagement> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(StockManagement::getProductRecordid, stockOut.getProductRecordid());
        queryWrapper.eq(StockManagement::getSupplierId, stockOut.getSupplierId());
        StockManagement stockManagement = stockManagementMapper.selectOne(queryWrapper);
        if (stockManagement != null) {
            stockOut.setStockmanageId(stockManagement.getId());
            return stockOutMapper.updateById(stockOut);
        }else {
            throw new RuntimeException("库存中不存在该产品和供应商");
        }
//      ä¿®æ”¹å‡ºåº“记录表
        return stockOutMapper.updateById(stockOut);
    }
    @Override
src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java
@@ -2,6 +2,7 @@
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import com.ruoyi.project.system.domain.SysUser;
@@ -11,6 +12,7 @@
 * 
 * @author ruoyi
 */
@Mapper
public interface SysUserMapper
{
    /**
src/main/java/com/ruoyi/purchase/dto/ProductRecordDto.java
@@ -8,6 +8,8 @@
@Data
public class ProductRecordDto extends ProductRecord {
//    ä¾›åº”商ID
    private Integer supplierId;
    //销售合同号
    private String salesContractNo;
src/main/java/com/ruoyi/purchase/mapper/ProductRecordMapper.java
@@ -6,7 +6,10 @@
import com.ruoyi.purchase.dto.ProductRecordDto;
import com.ruoyi.purchase.dto.TicketRegistrationDto;
import com.ruoyi.purchase.pojo.ProductRecord;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * é‡‡è´­å°è´¦äº§å“å¼€ç¥¨è®°å½•Mapper接口
@@ -14,7 +17,11 @@
 * @author ruoyi
 * @date 2025-05-23
 */
@Mapper
public interface ProductRecordMapper extends BaseMapper<ProductRecord> {
    IPage<ProductRecordDto> productRecordPage(Page page, @Param("c") TicketRegistrationDto ticketRegistrationDto);
    List<ProductRecordDto> selectProductRecordListByPuechaserId(String purchaseContractNumber);
    ProductRecordDto selectProductRecordById(Long id);
}
src/main/java/com/ruoyi/purchase/service/IProductRecordService.java
@@ -20,4 +20,5 @@
    List<ProductRecord> selectProductRecordList(TicketRegistrationDto ticketRegistrationDto);
    IPage<ProductRecordDto> productRecordPage(Page page, TicketRegistrationDto ticketRegistrationDto);
    List<ProductRecordDto> selectProductRecordListByPuechaserId(String purchaseContractNumber);
}
src/main/java/com/ruoyi/purchase/service/impl/ProductRecordServiceImpl.java
@@ -8,7 +8,9 @@
import com.ruoyi.purchase.dto.ProductRecordDto;
import com.ruoyi.purchase.dto.TicketRegistrationDto;
import com.ruoyi.purchase.mapper.ProductRecordMapper;
import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
import com.ruoyi.purchase.pojo.ProductRecord;
import com.ruoyi.purchase.pojo.PurchaseLedger;
import com.ruoyi.purchase.service.IProductRecordService;
import com.ruoyi.sales.mapper.CommonFileMapper;
import com.ruoyi.sales.pojo.CommonFile;
@@ -34,6 +36,9 @@
    @Autowired
    private CommonFileMapper commonFileMapper;
    @Autowired
    private PurchaseLedgerMapper purchaseLedgerMapper;
@@ -59,4 +64,11 @@
        });
        return productRecordDtoIPage;
    }
    @Override
    public List<ProductRecordDto> selectProductRecordListByPuechaserId(String purchaseContractNumber) {
        return productRecordMapper.selectProductRecordListByPuechaserId(purchaseContractNumber);
    }
}
src/main/resources/mapper/inventory/StockInMapper.xml
@@ -5,41 +5,13 @@
<mapper namespace="com.ruoyi.inventory.mapper.StockInMapper">
<!--    <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultType="com.ruoyi.inventory.dto.StockinDto">-->
<!--        SELECT-->
<!--            T1.id,-->
<!--            T1.product_id,-->
<!--            T1.inbound_time,-->
<!--            T1.inbound_batch,-->
<!--            T1.supplier_id,-->
<!--            T1.inbound_quantity,-->
<!--            T1.tax_inclusive_price,-->
<!--            T1.tax_inclusive_total,-->
<!--            T1.tax_rate,-->
<!--            T1.tax_exclusive_total,-->
<!--            T1.inbound_person,-->
<!--            T1.tenant_id,-->
<!--            T2.product_category,-->
<!--            T2.specification_model,-->
<!--            T3.supplier_name-->
<!--        FROM-->
<!--            stock_in T1-->
<!--                INNER JOIN-->
<!--            product_record T2-->
<!--            ON-->
<!--                T1.product_id = T2.product_id-->
<!--                INNER JOIN-->
<!--            supplier_manage T3-->
<!--            ON-->
<!--                T1.supplier_id = T3.id-->
<!--        where  T1.id = #{id,jdbcType=INTEGER}-->
<!--    </select>-->
    <select id="selectStockInWithProductInfo" resultType="com.ruoyi.inventory.dto.StockinDto">
        SELECT
        T1.id,
        T1.product_recordid,
        T1.productrecord_id,
        T1.user_id,
        T1.tenant_id,
        T1.inbound_time,
        T1.inbound_batch,
        T1.supplier_id,
@@ -48,11 +20,9 @@
        T2.tax_inclusive_total_price,
        T2.tax_rate,
        T2.tax_exclusive_total_price,
        T1.user_id,
        T1.tenant_id,
        T2.product_category,
        T2.specification_model,
        T2.unit,
        T5.product_name,
        T6.model,
        T6.unit,
        T3.supplier_name,
        T4.nick_name
        FROM
@@ -60,7 +30,7 @@
        INNER JOIN
        product_record T2
        ON
        T1.product_recordid = T2.id
        T1.productrecord_id = T2.id
        INNER JOIN
        supplier_manage T3
        ON
@@ -68,7 +38,16 @@
        INNER JOIN sys_user T4
        ON
        T1.user_id = T4.user_id
        INNER JOIN
        product_model T6
        ON
        T2.product_model_id = T6.id
        INNER JOIN
        product T5
        ON
        T2.product_id = T5.id
        <where>
            T2.type = 2
            <if test="stockinDto.supplierName != null and stockinDto.supplierName != ''">
                AND T3.supplier_name LIKE CONCAT('%', #{stockinDto.supplierName}, '%')
            </if>
@@ -79,7 +58,9 @@
    <select id="stockinExportList" resultType="com.ruoyi.inventory.excel.StockInExcelDto">
        SELECT
        T1.id,
        T1.product_recordid,
        T1.productrecord_id,
        T1.user_id,
        T1.tenant_id,
        T1.inbound_time,
        T1.inbound_batch,
        T1.supplier_id,
@@ -88,11 +69,9 @@
        T2.tax_inclusive_total_price,
        T2.tax_rate,
        T2.tax_exclusive_total_price,
        T1.user_id,
        T1.tenant_id,
        T2.product_category,
        T2.specification_model,
        T2.unit,
        T5.product_name,
        T6.model,
        T6.unit,
        T3.supplier_name,
        T4.nick_name
        FROM
@@ -100,7 +79,7 @@
        INNER JOIN
        product_record T2
        ON
        T1.product_recordid = T2.id
        T1.productrecord_id = T2.id
        INNER JOIN
        supplier_manage T3
        ON
@@ -108,15 +87,18 @@
        INNER JOIN sys_user T4
        ON
        T1.user_id = T4.user_id
        INNER JOIN
        product_model T6
        ON
        T2.product_model_id = T6.id
        INNER JOIN
        product T5
        ON
        T2.product_id = T5.id
        <where>
            T2.type = 2
            <if test="stockinDto.supplierName != null and stockinDto.supplierName != ''">
                AND T3.supplier_name LIKE CONCAT('%', #{stockinDto.supplierName}, '%')
            </if>
            <if test="stockinDto.startTime != null and stockinDto.startTime != ''">
                AND T1.inbound_time &gt;= #{stockinDto.startTime}
            </if>
            <if test="stockinDto.endTime != null and stockinDto.endTime != ''">
                AND T1.inbound_time &lt;= #{stockinDto.endTime}
            </if>
        </where>
        ORDER BY T1.inbound_time DESC
src/main/resources/mapper/inventory/StockManagementMapper.xml
@@ -7,12 +7,12 @@
<!--    æ ¹æ®ä¾›åº”商模糊搜索-->
    <select id="selectStockManagementBypage" resultType="com.ruoyi.inventory.dto.StockManagementDto">
        SELECT
            T2.unit,
            T2.product_category,
            T2.specification_model,
            T5.unit,
            T5.model,
            T6.product_name,
            T3.supplier_name,
            T1.id,
            T1.product_recordid,
            T1.productrecord_id,
            T1.stock_quantity,
            T2.tax_inclusive_unit_price,
            T2.tax_inclusive_total_price,
@@ -30,7 +30,7 @@
                INNER JOIN
            product_record T2
            ON
                T1.product_recordid = T2.id
                T1.productrecord_id = T2.id
                INNER JOIN
            supplier_manage T3
            ON
@@ -39,6 +39,14 @@
            sys_user T4
            ON
                T1.user_id = T4.user_id
                INNER JOIN
            product_model T5
            ON
            T2.product_model_id = T5.id
            INNER JOIN
            product T6
            ON
            T2.product_id = T6.id
        <where>
            <if test="stockManagementDto.supplierName != null and stockManagementDto.supplierName != ''">
                AND T3.supplier_name LIKE CONCAT('%', #{stockManagementDto.supplierName}, '%')
@@ -48,12 +56,12 @@
    <select id="stockManageExportList" resultType="com.ruoyi.inventory.excel.StockManagementExcelDto">
        SELECT
        T2.unit,
        T2.product_category,
        T2.specification_model,
        T5.unit,
        T5.model,
        T6.product_name,
        T3.supplier_name,
        T1.id,
        T1.product_recordid,
        T1.productrecord_id,
        T1.stock_quantity,
        T2.tax_inclusive_unit_price,
        T2.tax_inclusive_total_price,
@@ -71,7 +79,7 @@
        INNER JOIN
        product_record T2
        ON
        T1.product_recordid = T2.id
        T1.productrecord_id = T2.id
        INNER JOIN
        supplier_manage T3
        ON
@@ -80,6 +88,14 @@
        sys_user T4
        ON
        T1.user_id = T4.user_id
        INNER JOIN
        product_model T5
        ON
        T2.product_model_id = T5.id
        INNER JOIN
        product T6
        ON
        T2.product_id = T6.id
        <where>
            <if test="stockManagementDto.supplierName != null and stockManagementDto.supplierName != ''">
                AND T3.supplier_name LIKE CONCAT('%', #{stockManagementDto.supplierName}, '%')
@@ -88,4 +104,5 @@
    </select>
</mapper>
src/main/resources/mapper/inventory/StockOutMapper.xml
@@ -7,7 +7,7 @@
    <select id="selectStockOutBypage" resultType="com.ruoyi.inventory.dto.StockoutDto">
        SELECT
        T1.id,
        T1.product_recordid,
        T1.productrecord_id,
        T1.inbound_time,
        T1.inbound_batch,
        T1.supplier_id,
@@ -18,9 +18,9 @@
        T2.tax_exclusive_total_price,
        T1.user_id,
        T1.tenant_id,
        T2.product_category,
        T2.specification_model,
        T2.unit,
        T6.product_name,
        T5.model,
        T5.unit,
        T3.supplier_name,
        T4.nick_name
        FROM
@@ -28,7 +28,7 @@
        INNER JOIN
        product_record T2
        ON
        T1.product_recordid = T2.id
        T1.productrecord_id = T2.id
        INNER JOIN
        supplier_manage T3
        ON
@@ -37,7 +37,16 @@
        sys_user T4
        ON
        T1.user_id = T4.user_id
        INNER JOIN
        product_model T5
        ON
        T2.product_model_id = T5.id
        INNER JOIN
        product T6
        ON
        T2.product_id = T6.id
        <where>
            T2.type = 1
            <if test="stockOutdto.supplierName != null and stockOutdto.supplierName != ''">
                AND T3.supplier_name LIKE CONCAT('%', #{stockOutdto.supplierName}, '%')
            </if>
@@ -58,9 +67,9 @@
        T2.tax_exclusive_total_price,
        T1.user_id,
        T1.tenant_id,
        T2.product_category,
        T2.specification_model,
        T2.unit,
        T6.product_name,
        T5.model,
        T5.unit,
        T3.supplier_name,
        T4.nick_name
        FROM
@@ -77,7 +86,16 @@
        sys_user T4
        ON
        T1.user_id = T4.user_id
        INNER JOIN
        product_model T5
        ON
        T2.product_model_id = T5.id
        INNER JOIN
        product T6
        ON
        T2.product_id = T6.id
        <where>
            T2.type = 1
            <if test="stockOutdto.supplierName != null and stockOutdto.supplierName != ''">
                AND T3.supplier_name LIKE CONCAT('%', #{stockOutdto.supplierName}, '%')
            </if>
src/main/resources/mapper/inventory/StockProductMapper.xml
ÎļþÒÑɾ³ý
src/main/resources/mapper/purchase/ProductRecordMapper.xml
@@ -36,4 +36,38 @@
            and pr.created_at &lt;= date_format(#{c.createdAtEnd},'%Y-%m-%d hh:mm:ss')
        </if>
    </select>
    <select id="selectProductRecordListByPuechaserId" resultType="com.ruoyi.purchase.dto.ProductRecordDto">
        SELECT
            P1.id,
            P1.product_category,
            P1.specification_model,
            P1.unit,
            P1.quantity,
            P1.tax_rate,
            P1.tax_inclusive_unit_price,
            P1.tax_inclusive_total_price,
            P1.tax_exclusive_total_price,
            P2.supplier_name,
            p2.supplier_id
            from product_record P1
            left join purchase_ledger P2 on P1.purchase_ledger_id = P2.id
            where p2.purchase_contract_number = #{purchaseContractNumber} and P1.type = 2
    </select>
    <select id="selectProductRecordById" resultType="com.ruoyi.purchase.dto.ProductRecordDto">
        SELECT
            P1.id,
            P1.product_category,
            P1.specification_model,
            P1.unit,
            P1.quantity,
            P1.tax_rate,
            P1.tax_inclusive_unit_price,
            P1.tax_inclusive_total_price,
            P1.tax_exclusive_total_price,
            P2.supplier_name,
            p2.supplier_id
        from product_record P1
                 left join purchase_ledger P2 on P1.purchase_ledger_id = P2.id
        where P1.id = #{id} and P1.type = 2
    </select>
</mapper>