maven
3 天以前 749418cd02075520e7c2e8afc7a8450db78c82f8
yys  移动仓储物流
已添加3个文件
已修改20个文件
972 ■■■■■ 文件已修改
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/Details.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementUpdateDto.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/mapper/CustomStorageMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordOutMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordOutService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java 369 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dev.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/procurementrecord/CustomStorageMapper.xml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
@@ -2,14 +2,18 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.procurementrecord.dto.*;
import com.ruoyi.procurementrecord.mapper.CustomStorageMapper;
import com.ruoyi.procurementrecord.pojo.CustomStorage;
import com.ruoyi.procurementrecord.service.ProcurementRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.ibatis.annotations.Delete;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
@@ -30,10 +34,11 @@
    @Autowired
    private ProcurementRecordService procurementRecordService;
    @GetMapping("/productlist")
    @Log(title = "采购入库-入库管理-新增入库查询", businessType = BusinessType.OTHER)
    public AjaxResult list(ProcurementDto procurementDto) {
        List<ProcurementDto> result =procurementRecordService.listProcurementBySalesLedgerId(procurementDto);
        List<ProcurementDto> result = procurementRecordService.listProcurementBySalesLedgerId(procurementDto);
        return AjaxResult.success(result);
    }
@@ -41,7 +46,30 @@
    @Log(title = "采购入库-入库管理-新增入库", businessType = BusinessType.INSERT)
    @Transactional
    public AjaxResult add(@RequestBody ProcurementAddDto procurementDto) {
        procurementDto.setType(1);
        procurementDto.setTypeName("采购入库");
        return AjaxResult.success(procurementRecordService.add(procurementDto));
    }
    @PostMapping("/addCustom")
    @Log(title = "自定义入库-入库管理-新增入库", businessType = BusinessType.INSERT)
    @Transactional
    public AjaxResult addCustom(@RequestBody List<CustomStorage> customStorage) {
        return procurementRecordService.addCustom(customStorage);
    }
    @PostMapping("/updateCustom")
    @Log(title = "自定义入库-入库管理-修改入库", businessType = BusinessType.UPDATE)
    @Transactional
    public AjaxResult updateCustom(@RequestBody CustomStorage customStorage) {
        return procurementRecordService.updateCustom(customStorage);
    }
    @Delete("/delteCustom")
    @Log(title = "自定义入库-入库管理-删除入库", businessType = BusinessType.DELETE)
    @Transactional
    public AjaxResult deleteCustom(@RequestBody List<Long> ids) {
        return procurementRecordService.deleteCustom(ids);
    }
    @PostMapping("/update")
@@ -52,10 +80,17 @@
    }
    @PostMapping("/updateManagement")
    @Log(title = "采购入库-库存台账-修改", businessType = BusinessType.UPDATE)
    @Log(title = "成品入库-库存台账-修改", businessType = BusinessType.UPDATE)
    @Transactional
    public AjaxResult updateManagement(@RequestBody ProcurementManagementUpdateDto procurementDto) {
        return AjaxResult.success(procurementRecordService.updateManagement(procurementDto));
    }
    @PostMapping("/updateManagementByCustom")
    @Log(title = "自定义入库-库存台账-修改", businessType = BusinessType.UPDATE)
    @Transactional
    public AjaxResult updateManagementByCustom(@RequestBody ProcurementManagementUpdateDto procurementDto) {
        return AjaxResult.success(procurementRecordService.updateManagementByCustom(procurementDto));
    }
    @PostMapping("/del")
@@ -69,16 +104,47 @@
    @Log(title = "采购入库-入库管理-入库查询", businessType = BusinessType.OTHER)
    @ApiOperation(value = "入库查询")
    public AjaxResult listPage(Page page, ProcurementPageDto procurementDto) {
        IPage<ProcurementPageDto> result =procurementRecordService.listPage(page, procurementDto);
        IPage<ProcurementPageDto> result = procurementRecordService.listPage(page, procurementDto);
        return AjaxResult.success(result);
    }
    @GetMapping("/listPageByProduction")
    @Log(title = "生产入库-入库管理-入库查询", businessType = BusinessType.OTHER)
    @ApiOperation(value = "入库查询")
    public AjaxResult listPageByProduction(Page page, ProcurementPageDto procurementDto) {
        IPage<ProcurementPageDto> result = procurementRecordService.listPageByProduction(page, procurementDto);
        return AjaxResult.success(result);
    }
    @GetMapping("/listPageByCustom")
    @Log(title = "自定义入库-入库管理-入库查询", businessType = BusinessType.OTHER)
    @ApiOperation(value = "入库查询")
    public AjaxResult listPageByCustom(Page page, CustomStorage customStorage) {
        IPage<CustomStorage> result = procurementRecordService.listPageByCustom(page, customStorage);
        return AjaxResult.success(result);
    }
    @GetMapping("/listPageCopy")
    @Log(title = "采购入库-入库管理-入库查询", businessType = BusinessType.OTHER)
    @Log(title = "采购入库-库存管理-分页查询", businessType = BusinessType.OTHER)
    public AjaxResult listPageCopy(Page page, ProcurementPageDto procurementDto) {
        IPage<ProcurementPageDtoCopy> result =procurementRecordService.listPageCopy(page, procurementDto);
        IPage<ProcurementPageDtoCopy> result = procurementRecordService.listPageCopy(page, procurementDto);
        return AjaxResult.success(result);
    }
    @GetMapping("/listPageCopyByProduction")
    @Log(title = "生产入库-库存管理-分页查询", businessType = BusinessType.OTHER)
    public AjaxResult listPageCopyByProduction(Page page, ProcurementPageDto procurementDto) {
        IPage<ProcurementPageDtoCopy> result = procurementRecordService.listPageCopyByProduction(page, procurementDto);
        return AjaxResult.success(result);
    }
    @GetMapping("/listPageCopyByCustom")
    @Log(title = "自定义入库-库存管理-分页查询", businessType = BusinessType.OTHER)
    public AjaxResult listPageCopyByCustom(Page page, CustomStorage customStorage) {
        IPage<CustomStorage> result = procurementRecordService.listPageCopyByCustom(page, customStorage);
        return AjaxResult.success(result);
    }
    @GetMapping("/getReportList")
    @Log(title = "库存报表查询", businessType = BusinessType.OTHER)
    public AjaxResult getReportList(Page page, ProcurementPageDto procurementDto) {
@@ -86,21 +152,62 @@
    }
    /**
     * å¯¼å‡º
     * åº“存管理采购导出
     * @param response
     */
    @PostMapping("/exportCopy")
    public void exportCopy(HttpServletResponse response) {
        procurementRecordService.exportCopy(response);
        procurementRecordService.exportCopy(response,1);
    }
    /**
     * å¯¼å‡º
     * åº“存管理生产导出
     * @param response
     */
    @PostMapping("/exportCopyOne")
    public void exportCopyOne(HttpServletResponse response) {
        procurementRecordService.exportCopy(response,2);
    }
    /**
     * åº“存管理自定义导出
     * @param response
     */
    @PostMapping("/exportCopyTwo")
    public void exportCopyTwo(HttpServletResponse response) {
        procurementRecordService.exportCopyTwo(response,3);
    }
    /**
     * å…¥åº“,出库管理采购导出
     * @param response
     */
    @PostMapping("/export")
    public void export(HttpServletResponse response) {
        procurementRecordService.export(response);
        procurementRecordService.export(response,1);
    }
    /**
     * å…¥åº“,出库管理生产导出
     * @param response
     */
    @PostMapping("/exportOne")
    public void exportOne(HttpServletResponse response) {
        procurementRecordService.export(response,2);
    }
    @Autowired
    private CustomStorageMapper customStorageMapper;
    /**
     * å…¥åº“,出库管理自定义导出
     * @param response
     */
    @PostMapping("/exportTwo")
    public void exportTwo(HttpServletResponse response) {
        List<CustomStorage> customStorages = customStorageMapper.selectList(null);
        ExcelUtil<CustomStorage> util = new ExcelUtil<CustomStorage>(CustomStorage.class);
        util.exportExcel(response, customStorages, "入库台账");
    }
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
@@ -10,12 +11,14 @@
import com.ruoyi.procurementrecord.dto.ProcurementRecordOutAdd;
import com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto;
import com.ruoyi.procurementrecord.dto.ProcurementUpdateDto;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
import com.ruoyi.procurementrecord.service.ProcurementRecordOutService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * @author :yys
@@ -30,26 +33,40 @@
    private ProcurementRecordOutService procurementRecordOutService;
    @PostMapping("/stockout")
    @Log(title = "采购入库-出库管理-出库", businessType = BusinessType.INSERT)
    @Log(title = "采购出库-出库管理-出库", businessType = BusinessType.INSERT)
    public AjaxResult stockout(@RequestBody ProcurementRecordOutAdd procurementRecordOutAdd) {
        return AjaxResult.success(procurementRecordOutService.stockout(procurementRecordOutAdd));
    }
    @GetMapping("/listPage")
    @Log(title = "采购入库-出库管理-出库查询", businessType = BusinessType.OTHER)
    @Log(title = "采购出库-出库台账-出库查询", businessType = BusinessType.OTHER)
    public AjaxResult listPage(Page page, ProcurementRecordOutPageDto procurementDto) {
        IPage<ProcurementRecordOutPageDto> result = procurementRecordOutService.listPage(page, procurementDto);
        return AjaxResult.success(result);
    }
    @GetMapping("/listPageByProduct")
    @Log(title = "生产出库-出库台账-出库查询", businessType = BusinessType.OTHER)
    public AjaxResult listPageByProduct(Page page, ProcurementRecordOutPageDto procurementDto) {
        IPage<ProcurementRecordOutPageDto> result = procurementRecordOutService.listPageByProduct(page, procurementDto);
        return AjaxResult.success(result);
    }
    @GetMapping("/listPageByCustom")
    @Log(title = "自定义出库-出库台账-出库查询", businessType = BusinessType.OTHER)
    public AjaxResult listPageByCustom(Page page, ProcurementRecordOutPageDto procurementDto) {
        IPage<ProcurementRecordOutPageDto> result = procurementRecordOutService.listPageByCustom(page, procurementDto);
        return AjaxResult.success(result);
    }
    @PostMapping("/del")
    @Log(title = "采购入库-出库管理-删除出库", businessType = BusinessType.DELETE)
    @Log(title = "采购出库-出库台账-删除出库", businessType = BusinessType.DELETE)
    public AjaxResult deletePro(@RequestBody ProcurementUpdateDto procurementDto) {
        return AjaxResult.success(procurementRecordOutService.deletePro(procurementDto));
    }
    /**
     * å¯¼å‡º
     * é‡‡è´­å‡ºåº“导出
     * @param response
     */
    @PostMapping("/export")
@@ -57,4 +74,29 @@
        procurementRecordOutService.export(response);
    }
    @Autowired
    public ProcurementRecordOutMapper procurementRecordOutMapper;
    /**
     * ç”Ÿäº§å‡ºåº“导出
     * @param response
     */
    @PostMapping("/exportOne")
    public void exportOne(HttpServletResponse response) {
        List<ProcurementRecordOutPageDto> list = procurementRecordOutMapper.listOne();
        ExcelUtil<ProcurementRecordOutPageDto> util = new ExcelUtil<>(ProcurementRecordOutPageDto.class);
        util.exportExcel(response, list, "生产出库台账");
    }
    /**
     * è‡ªå®šä¹‰å‡ºåº“导出
     * @param response
     */
    @PostMapping("/exportTwo")
    public void exportTwo(HttpServletResponse response) {
        List<ProcurementRecordOutPageDto> list = procurementRecordOutMapper.listTwo();
        ExcelUtil<ProcurementRecordOutPageDto> util = new ExcelUtil<>(ProcurementRecordOutPageDto.class);
        util.exportExcel(response, list, "生产出库台账");
    }
}
src/main/java/com/ruoyi/procurementrecord/dto/Details.java
@@ -10,7 +10,10 @@
 */
@Data
public class Details {
    private Integer id;
    private BigDecimal inboundQuantity;
    private BigDecimal warnNum;
    private Integer id;  // äº§å“id
    private BigDecimal inboundQuantity;  // å…¥åº“数量
    private BigDecimal warnNum;  // é¢„警数量(采购入库才有)
    //单价
    private BigDecimal unitPrice;
    private BigDecimal totalPrice;
}
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java
@@ -15,4 +15,11 @@
    private String nickName;
    /**
     * å…¥åº“类型 1-采购 2-生产 3-自定义
     */
    private Integer type;
    private String typeName;
}
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java
@@ -17,6 +17,22 @@
    private String createBy;
    private BigDecimal minStock;
    /**
     * å•ä»·
     */
    private BigDecimal unitPrice;
    /**
     * æ€»ä»·
     */
    private BigDecimal totalPrice;
    // å•ä»·
    private BigDecimal taxInclusiveUnitPrice;
    // æ€»ä»·
    private BigDecimal taxInclusiveTotalPrice;
    private Long createUser;
    private String createTime;
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
@@ -3,6 +3,7 @@
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
@@ -22,15 +23,36 @@
    private Long createUser;
    /**
     * å…¥åº“类型 1-采购 2-生产
     */
    private Integer type;
    /**
     * å…¥åº“批次
     */
    @Excel(name = "入库批次")
    private String inboundBatches;
    /**
     * åˆåŒå·
     * é‡‡è´­åˆåŒå·
     */
    private String purchaseContractNumber;
    /**
     * é”€å”®åˆåŒå·
     */
    private String salesContractNo;
    /**
     * å®¢æˆ·åˆåŒå·
     */
    private String customerContractNo;
    /**
     * å®¢æˆ·åç§°
     */
    @Excel(name = "客户名称")
    private String customerName;
    private String salesLedgerProductId;
@@ -40,6 +62,20 @@
    @Excel(name = "入库数量")
    private BigDecimal inboundNum;
    /**
     * å…¥åº“单价
     */
    @ApiModelProperty(value = "入库单价")
    @Excel(name = "入库单价")
    private BigDecimal unitPrice;
    /**
     * å…¥åº“总价
     */
    @ApiModelProperty(value = "入库总价")
    @Excel(name = "入库总价")
    private BigDecimal totalPrice;
    @Excel(name = "预警数量")
    private BigDecimal warnNum;
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java
@@ -2,6 +2,7 @@
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@@ -32,6 +33,22 @@
     */
    private String purchaseContractNumber;
    /**
     * é”€å”®åˆåŒå·
     */
    private String salesContractNo;
    /**
     * å®¢æˆ·åˆåŒå·
     */
    private String customerContractNo;
    /**
     * å®¢æˆ·åç§°
     */
    private String customerName;
    private String salesLedgerProductId;
    /**
@@ -39,6 +56,20 @@
     */
    @Excel(name = "入库数量")
    private BigDecimal inboundNum;
    /**
     * å…¥åº“单价
     */
    @ApiModelProperty(value = "入库单价")
    @Excel(name = "入库单价")
    private BigDecimal unitPrice;
    /**
     * å…¥åº“总价
     */
    @ApiModelProperty(value = "入库总价")
    @Excel(name = "入库总价")
    private BigDecimal totalPrice;
    /**
     * å¾…出库数量
@@ -49,7 +80,7 @@
     * å‡ºåº“数量
     */
    @Excel(name = "出库数量")
    private BigDecimal totalInboundNum;
    private BigDecimal totalInboundNum = BigDecimal.ZERO;
    /**
     * æœ€ä½Žåº“存数量
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java
@@ -19,4 +19,9 @@
    private Integer salesLedgerProductId;
    /**
     * å‡ºåº“类型 1-采购出库 2-销售出库 3-自定义
     */
    private Integer type;
}
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java
@@ -20,6 +20,22 @@
    private Integer id;
    private BigDecimal warnNum;
    /**
     * é”€å”®åˆåŒå·
     */
    private String salesContractNo;
    /**
     * å®¢æˆ·åˆåŒå·
     */
    private String customerContractNo;
    /**
     * å®¢æˆ·åç§°
     */
    @Excel(name = "客户名称")
    private String customerName;
    /**
     * å‡ºå…¥åº“数量
@@ -28,10 +44,22 @@
    private BigDecimal inboundNum;
    /**
     * å•ä»·
     */
    @Excel(name = "单价")
    private BigDecimal unitPrice;
    /**
     * æ€»ä»·
     */
    @Excel(name = "总价")
    private BigDecimal totalPrice;
    /**
     * å‡ºå…¥åº“æ—¶é—´
     */
//    @Excel(name = "出库时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDateTime createTime;
    private String timeStr;
@@ -50,6 +78,8 @@
     */
    @Excel(name = "供应商名称")
    private String supplierName;
    /**
@@ -94,4 +124,8 @@
    @Excel(name = "不含税总价")
    private BigDecimal taxExclusiveTotalPrice;
    /**
     * ç‰©å“ç±»åž‹
     */
    private String itemType;
}
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementUpdateDto.java
@@ -18,6 +18,15 @@
    private BigDecimal quantityStock;
    private BigDecimal unitPrice;
    private BigDecimal totalPrice;
    private List<Integer> ids;
    /**
     * å‡ºåº“类型 1-采购 2-销售 3-自定义
     */
    private Integer type;
}
src/main/java/com/ruoyi/procurementrecord/mapper/CustomStorageMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.procurementrecord.mapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.procurementrecord.pojo.CustomStorage;
import org.apache.ibatis.annotations.Param;
/**
 * @author :yys
 * @date : 2025/11/10 13:11
 */
public interface CustomStorageMapper extends BaseMapper<CustomStorage> {
    IPage<CustomStorage> listPageCopyByCustom(Page page,@Param("req") CustomStorage customStorageLambdaQueryWrapper);
}
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java
@@ -30,5 +30,13 @@
    List<ProcurementPageDtoCopy> listCopy();
    List<ProcurementPageDtoCopy> listCopyOne();
    List<ProcurementPageDto> list();
    List<ProcurementPageDto> listOne();
    IPage<ProcurementPageDto> listPageByProduction(Page page, @Param("req") ProcurementPageDto procurementDto);
    IPage<ProcurementPageDtoCopy> listPageCopyByProduction(Page page, @Param("req") ProcurementPageDto procurementDto);
}
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordOutMapper.java
@@ -18,4 +18,12 @@
    IPage<ProcurementRecordOutPageDto> listPage(Page page,@Param("req") ProcurementRecordOutPageDto procurementDto);
    List<ProcurementRecordOutPageDto> list();
    List<ProcurementRecordOutPageDto> listOne();
    List<ProcurementRecordOutPageDto> listTwo();
    IPage<ProcurementRecordOutPageDto> listPageByProduct(Page page,@Param("req") ProcurementRecordOutPageDto procurementDto);
    IPage<ProcurementRecordOutPageDto> listPageByCustom(Page page,@Param("req") ProcurementRecordOutPageDto procurementDto);
}
src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,119 @@
package com.ruoyi.procurementrecord.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
/**
 * @author :yys
 * @date : 2025/11/10 11:51
 */
@TableName("custom_storage")
@Data
public class CustomStorage {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    // å…¥åº“æ—¶é—´
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "入库时间", width = 30, dateFormat = "yyyy-MM-dd")
    private Date inboundDate;
    @TableField(exist = false)
    private String timeStr;
    /**
     * å¾…出库数量
     */
    @Excel(name = "待出库数量")
    @TableField(exist = false)
    private BigDecimal inboundNum0;
    /**
     * å‡ºåº“数量
     */
    @Excel(name = "出库数量")
    @TableField(exist = false)
    private BigDecimal totalInboundNum = BigDecimal.ZERO;
    // ç‰©å“ç±»åž‹
    @Excel(name = "物品类型")
    private String itemType;
    // å…¥åº“批次
    @Excel(name = "入库批次")
    private String inboundBatches;
    // å…¥åº“数量
    @Excel(name = "入库数量")
    private BigDecimal inboundNum;
    // ä¾›åº”商名称
    @Excel(name = "供应商名称")
    private String supplierName;
    // äº§å“å¤§ç±»
    @Excel(name = "产品大类")
    private String productCategory;
    // è§„格型号
    @Excel(name = "规格型号")
    private String specificationModel;
    // å•位
    @Excel(name = "单位")
    private String unit;
    // å«ç¨Žå•ä»·
    @Excel(name = "含税单价")
    private BigDecimal taxInclusiveUnitPrice;
    // å«ç¨Žæ€»ä»·
    @Excel(name = "含税总价")
    private BigDecimal taxInclusiveTotalPrice;
    // ç¨Žçއ(%)
    @Excel(name = "税率(%)")
    private BigDecimal taxRate;
    // ä¸å«ç¨Žæ€»ä»·
    @Excel(name = "不含税总价")
    private BigDecimal taxExclusiveTotalPrice;
    /**
     * å…¥åº“用户
     */
    @Excel(name = "入库用户")
    private String createBy;
    /**
     * å…¥åº“用户id
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * å…¥åº“æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDateTime createTime;
    /**
     * ä¿®æ”¹è€…
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
@@ -1,6 +1,8 @@
package com.ruoyi.procurementrecord.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;
@@ -22,7 +24,7 @@
    private Integer id;
    /**
     * äº§å“ä¿¡æ¯è¡¨id
     * äº§å“ä¿¡æ¯è¡¨id(自定义入库时为0)
     */
    private Integer salesLedgerProductId;
@@ -43,32 +45,42 @@
    private String inboundBatches;
    /**
     * å‡ºå‡ºåº“数量
     * å‡ºåº“数量
     */
    private BigDecimal inboundNum;
    /**
     * å‡ºå‡ºåº“用户
     * å‡ºåº“类型 1-采购 2-销售 3-自定义
     */
    private Integer type;
    /**
     * å‡ºåº“用户
     */
    private String createBy;
    /**
     * å…¥åº“用户id
     */
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;
    /**
     * å…¥åº“æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * ä¿®æ”¹è€…
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
@@ -37,9 +37,24 @@
    private BigDecimal inboundNum;
    /**
     * å•ä»·
     */
    private BigDecimal unitPrice;
    /**
     * æ€»ä»·
     */
    private BigDecimal totalPrice;
    /**
     * é¢„警数量
     */
    private BigDecimal warnNum;
    /**
     * å…¥åº“类型 1-采购入库 2-生产入库
     */
    private Integer type;
//    /**
//     * æœ€ä½Žåº“存数量
//     */
@@ -54,21 +69,25 @@
    /**
     * å…¥åº“用户id
     */
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;
    /**
     * å…¥åº“æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * ä¿®æ”¹è€…
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordOutService.java
@@ -23,4 +23,8 @@
    int deletePro(ProcurementUpdateDto procurementDto);
    void export(HttpServletResponse response);
    IPage<ProcurementRecordOutPageDto> listPageByProduct(Page page, ProcurementRecordOutPageDto procurementDto);
    IPage<ProcurementRecordOutPageDto> listPageByCustom(Page page, ProcurementRecordOutPageDto procurementDto);
}
src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
@@ -3,7 +3,9 @@
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.framework.web.domain.AjaxResult;
import com.ruoyi.procurementrecord.dto.*;
import com.ruoyi.procurementrecord.pojo.CustomStorage;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
import javax.servlet.http.HttpServletResponse;
@@ -27,11 +29,29 @@
    int deletePro(ProcurementUpdateDto procurementDto);
    void export(HttpServletResponse response);
    void export(HttpServletResponse response,Integer type);
    int updateManagement(ProcurementManagementUpdateDto procurementDto);
    void exportCopy(HttpServletResponse response);
    void exportCopy(HttpServletResponse response,Integer type);
    void exportCopyTwo(HttpServletResponse response,Integer type);
    Map<String, Object> getReportList(Page page, ProcurementPageDto procurementDto);
    IPage<ProcurementPageDto> listPageByProduction(Page page, ProcurementPageDto procurementDto);
    AjaxResult addCustom(List<CustomStorage> customStorage);
    IPage<CustomStorage> listPageByCustom(Page page, CustomStorage customStorage);
    IPage<ProcurementPageDtoCopy> listPageCopyByProduction(Page page, ProcurementPageDto procurementDto);
    IPage<CustomStorage> listPageCopyByCustom(Page page, CustomStorage customStorage);
    AjaxResult updateCustom(CustomStorage customStorage);
    AjaxResult deleteCustom(List<Long> ids);
    int updateManagementByCustom(ProcurementManagementUpdateDto procurementDto);
}
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
@@ -16,6 +16,7 @@
import com.ruoyi.project.system.mapper.SysUserMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@@ -24,6 +25,7 @@
import java.text.DateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.Collectors;
@@ -54,7 +56,15 @@
        procurementRecordOutLambdaQueryWrapper.ge(ProcurementRecordOut::getCreateTime, now)  // å¤§äºŽç­‰äºŽå½“天
                .lt(ProcurementRecordOut::getCreateTime, now.plusDays(1)); // å°äºŽæ˜Žå¤©
        Long aLong1 = procurementRecordOutMapper.selectCount(procurementRecordOutLambdaQueryWrapper);
        // 2. å®šä¹‰æ—¥æœŸæ ¼å¼ï¼ˆå¿…须与字符串格式完全匹配)
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDateTime localDateTime = null;
        // 3. è½¬æ¢ï¼šString â†’ LocalDate â†’ LocalDateTime(补充0点时间)
        if(StringUtils.isNotEmpty(procurementRecordOutAdd.getTime())){
            LocalDate localDate = LocalDate.parse(procurementRecordOutAdd.getTime(), formatter);
            // èŽ·å–å½“å‰æ—¶åˆ†ç§’
            LocalTime localTime = LocalTime.now();
            localDateTime = localDate.atTime(localTime);}
        // æŸ¥è¯¢é‡‡è´­å‡ºåº“数量
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getProcurementRecordStorageId, procurementRecordOutAdd.getId());
@@ -65,7 +75,8 @@
                .salesLedgerProductId(procurementRecordOutAdd.getSalesLedgerProductId())
                .inboundBatches(aLong.equals(0L) ? "第1批次" : "第"+ (aLong + 1) + "批次")
                .inboundNum(new BigDecimal(procurementRecordOutAdd.getQuantity()))
                .createTime(LocalDateTime.now())
                .type(procurementRecordOutAdd.getType())
                .createTime(localDateTime == null ? LocalDateTime.now() : localDateTime)
                .createUser(Long.valueOf(procurementRecordOutAdd.getUserId()))
                .createBy(sysUser.getNickName())
                .updateUser(Long.valueOf(procurementRecordOutAdd.getUserId()))
@@ -95,8 +106,18 @@
    @Override
    public void export(HttpServletResponse response) {
        List<ProcurementRecordOutPageDto> list =procurementRecordOutMapper.list();
        List<ProcurementRecordOutPageDto> list = procurementRecordOutMapper.list();
        ExcelUtil<ProcurementRecordOutPageDto> util = new ExcelUtil<>(ProcurementRecordOutPageDto.class);
        util.exportExcel(response, list, "出库台账");
    }
    @Override
    public IPage<ProcurementRecordOutPageDto> listPageByProduct(Page page, ProcurementRecordOutPageDto procurementDto) {
        return procurementRecordOutMapper.listPageByProduct(page, procurementDto);
    }
    @Override
    public IPage<ProcurementRecordOutPageDto> listPageByCustom(Page page, ProcurementRecordOutPageDto procurementDto) {
        return procurementRecordOutMapper.listPageByCustom(page, procurementDto);
    }
}
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -7,9 +7,12 @@
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.procurementrecord.dto.*;
import com.ruoyi.procurementrecord.mapper.CustomStorageMapper;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
import com.ruoyi.procurementrecord.pojo.CustomStorage;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
import com.ruoyi.procurementrecord.service.ProcurementRecordService;
@@ -21,6 +24,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
@@ -106,6 +110,8 @@
        procurementRecordStorageById.setWarnNum(procurementDto.getWarnNum());
        procurementRecordStorageById.setUpdateUser(SecurityUtils.getLoginUser().getUserId());
        procurementRecordStorageById.setUpdateTime(LocalDateTime.now());
        procurementRecordStorageById.setUnitPrice(procurementDto.getUnitPrice());
        procurementRecordStorageById.setTotalPrice(procurementDto.getTotalPrice());
        return procurementRecordMapper.updateById(procurementRecordStorageById);
    }
@@ -115,7 +121,8 @@
        procurementRecordMapper.deleteBatchIds(procurementRecordStorageById.stream().map(ProcurementRecordStorage::getId).collect(Collectors.toList()));
        // åˆ é™¤æ‰€æœ‰å¯¹åº”的出库记录
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordOutLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordOutLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, procurementDto.getIds());
        procurementRecordOutLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, procurementDto.getIds())
                .eq(ProcurementRecordOut::getType,procurementDto.getType());
        List<ProcurementRecordOut> procurementRecordOuts = procurementRecordOutMapper.selectList(procurementRecordOutLambdaQueryWrapper);
        if(!CollectionUtils.isEmpty(procurementRecordOuts)){
            procurementRecordOutMapper.deleteBatchIds(procurementRecordOuts.stream().map(ProcurementRecordOut::getId).collect(Collectors.toList()));
@@ -124,8 +131,13 @@
    }
    @Override
    public void export(HttpServletResponse response) {
        List<ProcurementPageDto> list =procurementRecordMapper.list();
    public void export(HttpServletResponse response,Integer type) {
        List<ProcurementPageDto> list = new ArrayList<>();
        if(type == 1){
            list = procurementRecordMapper.list();
        }else{
            list = procurementRecordMapper.listOne();
        }
        // è®¡ç®—待入库数量
        // æŸ¥è¯¢é‡‡è´­è®°å½•已入库数量
        List<Integer> collect = list.stream().map(ProcurementPageDto::getId).collect(Collectors.toList());
@@ -136,6 +148,7 @@
        }
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType, type);
        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
        if(CollectionUtils.isEmpty( procurementRecords)){
            ExcelUtil<ProcurementPageDto> util = new ExcelUtil<ProcurementPageDto>(ProcurementPageDto.class);
@@ -182,21 +195,39 @@
        if(salesLedgerProduct == null){
            throw new RuntimeException("销售台账产品不存在");
        }
        // æ ¹æ®å¤§ç±»ï¼Œè§„格查询所有产品id
        LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductLambdaQueryWrapper = new LambdaQueryWrapper<>();
        salesLedgerProductLambdaQueryWrapper.eq(SalesLedgerProduct::getProductCategory, salesLedgerProduct.getProductCategory())
                .eq(SalesLedgerProduct::getSpecificationModel, salesLedgerProduct.getSpecificationModel())
                .eq(SalesLedgerProduct::getType, 1);
        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(salesLedgerProductLambdaQueryWrapper);
        if(CollectionUtils.isEmpty(salesLedgerProducts)){
            throw new RuntimeException("没有找到对应的产品");
        }
        salesLedgerProduct.setMinStock(procurementDto.getMinStock());
        salesLedgerProductMapper.updateById(salesLedgerProduct);
        ProcurementRecordStorage procurementRecordStorageById = getProcurementRecordById(procurementDto.getId());
        procurementRecordStorageById.setCreateBy(sysUser.getNickName());
        procurementRecordStorageById.setCreateUser(sysUser.getUserId());
        procurementRecordStorageById.setUpdateTime(LocalDateTime.parse(entryDateStr,df));
        procurementRecordStorageById.setUpdateUser(loginUser.getUserId());
        procurementRecordStorageById.setCreateTime(LocalDateTime.parse(createTimeStr,df));
        procurementRecordMapper.updateById(procurementRecordStorageById);
        LambdaQueryWrapper<ProcurementRecordStorage> procurementRecordStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordStorageLambdaQueryWrapper.in(ProcurementRecordStorage::getSalesLedgerProductId, salesLedgerProducts.stream().map(SalesLedgerProduct::getId).collect(Collectors.toList()));
        ProcurementRecordStorage procurementRecordStorage = ProcurementRecordStorage.builder().build();
        procurementRecordStorage.setUnitPrice(procurementDto.getUnitPrice());
        procurementRecordStorage.setTotalPrice(procurementDto.getTotalPrice());
        procurementRecordStorage.setCreateBy(sysUser.getNickName());
        procurementRecordStorage.setCreateUser(sysUser.getUserId());
        procurementRecordStorage.setUpdateTime(LocalDateTime.parse(entryDateStr,df));
        procurementRecordStorage.setUpdateUser(loginUser.getUserId());
        procurementRecordStorage.setCreateTime(LocalDateTime.parse(createTimeStr,df));
        procurementRecordMapper.update(procurementRecordStorage,procurementRecordStorageLambdaQueryWrapper);
        return 0;
    }
    @Override
    public void exportCopy(HttpServletResponse response) {
        List<ProcurementPageDtoCopy> list =procurementRecordMapper.listCopy();
    public void exportCopy(HttpServletResponse response,Integer type) {
        List<ProcurementPageDtoCopy> list = new ArrayList<>();
        if(type == 1){
            list = procurementRecordMapper.listCopy();
        }else{
            list = procurementRecordMapper.listCopyOne();
        }
        // è®¡ç®—待入库数量
        // æŸ¥è¯¢é‡‡è´­è®°å½•已入库数量
        List<Integer> collect = list.stream().map(ProcurementPageDtoCopy::getId).collect(Collectors.toList());
@@ -207,6 +238,7 @@
        }
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType, type);
        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
        if(CollectionUtils.isEmpty( procurementRecords)){
            ExcelUtil<ProcurementPageDtoCopy> util = new ExcelUtil<ProcurementPageDtoCopy>(ProcurementPageDtoCopy.class);
@@ -234,6 +266,53 @@
            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
        }
        ExcelUtil<ProcurementPageDtoCopy> util = new ExcelUtil<ProcurementPageDtoCopy>(ProcurementPageDtoCopy.class);
        util.exportExcel(response, list, "库存管理");
    }
    @Override
    public void exportCopyTwo(HttpServletResponse response,Integer type) {
        LambdaQueryWrapper<CustomStorage> customStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
        customStorageLambdaQueryWrapper.groupBy(CustomStorage::getSupplierName, CustomStorage::getProductCategory, CustomStorage::getSpecificationModel);
        List<CustomStorage> list = customStorageMapper.selectList(customStorageLambdaQueryWrapper);
        // è®¡ç®—待入库数量
        // æŸ¥è¯¢é‡‡è´­è®°å½•已入库数量
        List<Integer> collect = list.stream().map(CustomStorage::getId).collect(Collectors.toList());
        if(CollectionUtils.isEmpty( collect)){
            ExcelUtil<CustomStorage> util = new ExcelUtil<CustomStorage>(CustomStorage.class);
            util.exportExcel(response, list, "库存管理");
            return;
        }
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType, type);
        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType, type);
        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
        if(CollectionUtils.isEmpty( procurementRecords)){
            ExcelUtil<CustomStorage> util = new ExcelUtil<CustomStorage>(CustomStorage.class);
            util.exportExcel(response, list, "库存管理");
            return;
        }
        for (CustomStorage dto : list) {
            // æ ¹æ®é‡‡è´­å°è´¦ID筛选对应的出库记录
            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
                    .collect(Collectors.toList());
            // å¦‚果没有相关的出库记录,跳过该条数据
            if(CollectionUtils.isEmpty(collect1)){
                dto.setInboundNum0(dto.getInboundNum());
                continue;
            }
            // è®¡ç®—已出库数量总和,并设置待出库数量
            BigDecimal totalInboundNum = collect1.stream()
                    .map(ProcurementRecordOut::getInboundNum)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            // å¾…出库数量 = æ€»æ•°é‡ - å·²å‡ºåº“数量
            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
        }
        ExcelUtil<CustomStorage> util = new ExcelUtil<CustomStorage>(CustomStorage.class);
        util.exportExcel(response, list, "库存管理");
    }
@@ -336,20 +415,271 @@
    }
    @Override
    public IPage<ProcurementPageDto> listPageByProduction(Page page, ProcurementPageDto procurementDto) {
        IPage<ProcurementPageDto> procurementPageDtoIPage = procurementRecordMapper.listPageByProduction(page, procurementDto);
        List<ProcurementPageDto> procurementPageDtos = procurementPageDtoIPage.getRecords();
        // è®¡ç®—待入库数量
        // æŸ¥è¯¢é‡‡è´­è®°å½•已入库数量
        List<Integer> collect = procurementPageDtos.stream().map(ProcurementPageDto::getId).collect(Collectors.toList());
        if(CollectionUtils.isEmpty( collect)){
            return procurementPageDtoIPage;
        }
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect)
                .eq(ProcurementRecordOut::getType,2);
        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
        if(CollectionUtils.isEmpty( procurementRecords)){
            return procurementPageDtoIPage;
        }
        for (ProcurementPageDto dto : procurementPageDtos) {
            // æ ¹æ®é‡‡è´­å°è´¦ID筛选对应的出库记录
            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
                    .collect(Collectors.toList());
            // å¦‚果没有相关的出库记录,跳过该条数据
            if(CollectionUtils.isEmpty(collect1)){
                dto.setInboundNum0(dto.getInboundNum());
                continue;
            }
            // è®¡ç®—已出库数量总和,并设置待出库数量
            BigDecimal totalInboundNum = collect1.stream()
                    .map(ProcurementRecordOut::getInboundNum)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            // å¾…出库数量 = æ€»æ•°é‡ - å·²å‡ºåº“数量
            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
        }
        return procurementPageDtoIPage;
    }
    private final CustomStorageMapper customStorageMapper;
    @Override
    public AjaxResult addCustom(List<CustomStorage> customStorage) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if(CollectionUtils.isEmpty(customStorage)){
            return AjaxResult.error("数据不能为空");
        }
        customStorage.forEach(item -> {
            // æŸ¥è¯¢é‡‡è´­å…¥åº“数量
            Long aLong = customStorageMapper.selectCount(null);
            item.setInboundBatches(aLong.equals(0L) ? "第1批次(自定义入库)" : "第"+ (aLong + 1) + "批次(自定义入库)" );
            item.setCreateBy(loginUser.getNickName());
            customStorageMapper.insert(item);
        });
        return AjaxResult.success("自定义入库成功");
    }
    @Override
    public IPage<CustomStorage> listPageByCustom(Page page, CustomStorage customStorage) {
        LambdaQueryWrapper<CustomStorage> customStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
        if(customStorage != null){
            if(!StringUtils.isEmpty(customStorage.getSupplierName())){
                customStorageLambdaQueryWrapper.like(CustomStorage::getSupplierName, customStorage.getSupplierName());
            }
            // ç­›é€‰å…¥åº“æ—¶é—´
            if(customStorage.getTimeStr() != null){
                customStorageLambdaQueryWrapper.eq(CustomStorage::getInboundDate, customStorage.getTimeStr());
            }
            if(!StringUtils.isEmpty(customStorage.getProductCategory())){
                customStorageLambdaQueryWrapper.like(CustomStorage::getProductCategory, customStorage.getProductCategory());
            }
        }
        customStorageLambdaQueryWrapper.orderByDesc(CustomStorage::getInboundDate);
        IPage<CustomStorage> procurementPageDtoIPage = customStorageMapper.selectPage(page, customStorageLambdaQueryWrapper);
        procurementPageDtoIPage.getRecords().forEach(item -> item.setInboundNum0(item.getInboundNum()));
        List<CustomStorage> procurementPageDtos = procurementPageDtoIPage.getRecords();
        // è®¡ç®—待入库数量
        // æŸ¥è¯¢é‡‡è´­è®°å½•已入库数量
        List<Integer> collect = procurementPageDtos.stream().map(CustomStorage::getId).collect(Collectors.toList());
        if(CollectionUtils.isEmpty( collect)){
            return procurementPageDtoIPage;
        }
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect)
                .eq(ProcurementRecordOut::getType, 3);
        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
        if(CollectionUtils.isEmpty( procurementRecords)){
            return procurementPageDtoIPage;
        }
        for (CustomStorage dto : procurementPageDtos) {
            // æ ¹æ®é‡‡è´­å°è´¦ID筛选对应的出库记录
            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
                    .collect(Collectors.toList());
            // å¦‚果没有相关的出库记录,跳过该条数据
            if(CollectionUtils.isEmpty(collect1)){
                dto.setInboundNum0(dto.getInboundNum());
                continue;
            }
            // è®¡ç®—已出库数量总和,并设置待出库数量
            BigDecimal totalInboundNum = collect1.stream()
                    .map(ProcurementRecordOut::getInboundNum)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            // å¾…出库数量 = æ€»æ•°é‡ - å·²å‡ºåº“数量
            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
        }
        return procurementPageDtoIPage;
    }
    @Override
    public IPage<ProcurementPageDtoCopy> listPageCopyByProduction(Page page, ProcurementPageDto procurementDto) {
        IPage<ProcurementPageDtoCopy> procurementPageDtoCopyIPage = procurementRecordMapper.listPageCopyByProduction(page, procurementDto);
        List<ProcurementPageDtoCopy> procurementPageDtoCopyList = procurementPageDtoCopyIPage.getRecords();
        // è®¡ç®—待入库数量
        // æŸ¥è¯¢é‡‡è´­è®°å½•已入库数量
        List<Integer> collect = procurementPageDtoCopyList.stream().map(ProcurementPageDtoCopy::getId).collect(Collectors.toList());
        if(CollectionUtils.isEmpty( collect)){
            return procurementPageDtoCopyIPage;
        }
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType, 2);
        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
        if(CollectionUtils.isEmpty( procurementRecords)){
            return procurementPageDtoCopyIPage;
        }
        for (ProcurementPageDtoCopy dto : procurementPageDtoCopyList) {
            // æ ¹æ®é‡‡è´­å°è´¦ID筛选对应的出库记录
            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
                    .collect(Collectors.toList());
            // å¦‚果没有相关的出库记录,跳过该条数据
            if(CollectionUtils.isEmpty(collect1)){
                dto.setInboundNum0(dto.getInboundNum());
                dto.setTotalInboundNum(BigDecimal.ZERO);
                continue;
            }
            // è®¡ç®—已出库数量总和,并设置待出库数量
            BigDecimal totalInboundNum = collect1.stream()
                    .map(ProcurementRecordOut::getInboundNum)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            // å‡ºåº“数量 = æ€»æ•°é‡ - å¾…出库数量
            dto.setTotalInboundNum(totalInboundNum);
            // å¾…出库数量 = æ€»æ•°é‡ - å·²å‡ºåº“数量
            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
            // åº“存价值
            if(dto.getUnitPrice() != null){
                dto.setTotalPrice(dto.getTotalInboundNum().multiply(dto.getUnitPrice()));
            }
        }
        return procurementPageDtoCopyIPage;
    }
    @Override
    public IPage<CustomStorage> listPageCopyByCustom(Page page, CustomStorage customStorage) {
//        LambdaQueryWrapper<CustomStorage> customStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
//        customStorageLambdaQueryWrapper.groupBy(CustomStorage::getProductCategory, CustomStorage::getSpecificationModel,CustomStorage::getTaxInclusiveUnitPrice);
//        if(customStorage != null){
//            if(!StringUtils.isEmpty(customStorage.getSupplierName())){
//                customStorageLambdaQueryWrapper.like(CustomStorage::getSupplierName, customStorage.getSupplierName());
//            }
//            // ç­›é€‰å…¥åº“æ—¶é—´
//            if(customStorage.getInboundDate() != null){
//                customStorageLambdaQueryWrapper.eq(CustomStorage::getInboundDate, customStorage.getInboundDate());
//            }
//            if(!StringUtils.isEmpty(customStorage.getProductCategory())){
//                customStorageLambdaQueryWrapper.like(CustomStorage::getProductCategory, customStorage.getProductCategory());
//            }
//        }
//        customStorageLambdaQueryWrapper.orderByDesc(CustomStorage::getInboundDate);
        IPage<CustomStorage> pageList = customStorageMapper.listPageCopyByCustom(page, customStorage);
        List<CustomStorage> procurementPageDtoCopyList = pageList.getRecords();
        // è®¡ç®—待入库数量
        // æŸ¥è¯¢é‡‡è´­è®°å½•已入库数量
        List<Integer> collect = procurementPageDtoCopyList.stream().map(CustomStorage::getId).collect(Collectors.toList());
        if(CollectionUtils.isEmpty( collect)){
            return pageList;
        }
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType, 3);
        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
        if(CollectionUtils.isEmpty( procurementRecords)){
            return pageList;
        }
        for (CustomStorage dto : procurementPageDtoCopyList) {
            // æ ¹æ®é‡‡è´­å°è´¦ID筛选对应的出库记录
            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
                    .collect(Collectors.toList());
            // å¦‚果没有相关的出库记录,跳过该条数据
            if(CollectionUtils.isEmpty(collect1)){
                dto.setInboundNum0(dto.getInboundNum());
                dto.setTotalInboundNum(BigDecimal.ZERO);
                continue;
            }
            // è®¡ç®—已出库数量总和,并设置待出库数量
            BigDecimal totalInboundNum = collect1.stream()
                    .map(ProcurementRecordOut::getInboundNum)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            // å‡ºåº“数量 = æ€»æ•°é‡ - å¾…出库数量
            dto.setTotalInboundNum(totalInboundNum);
            // å¾…出库数量 = æ€»æ•°é‡ - å·²å‡ºåº“数量
            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
            // åº“存价值
            if(dto.getTaxInclusiveUnitPrice() != null){
                dto.setTaxInclusiveTotalPrice(dto.getInboundNum0().multiply(dto.getTaxInclusiveUnitPrice()));
            }
        }
        pageList.setRecords(procurementPageDtoCopyList);
        return pageList;
    }
    @Override
    public AjaxResult updateCustom(CustomStorage customStorage) {
        return AjaxResult.success(customStorageMapper.updateById(customStorage));
    }
    @Override
    public AjaxResult deleteCustom(List<Long> ids) {
        return AjaxResult.success(customStorageMapper.deleteBatchIds(ids));
    }
    @Override
    public int updateManagementByCustom(ProcurementManagementUpdateDto procurementDto) {
        CustomStorage customStorage = customStorageMapper.selectById(procurementDto.getId());
        if(customStorage == null){
            throw new RuntimeException("材料库存不存在");
        }
        LambdaQueryWrapper<CustomStorage> customStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
        customStorageLambdaQueryWrapper.eq(CustomStorage::getProductCategory, customStorage.getProductCategory())
                .eq(CustomStorage::getSpecificationModel, customStorage.getSpecificationModel());
        CustomStorage one = new CustomStorage();
        one.setTaxInclusiveUnitPrice(procurementDto.getTaxInclusiveUnitPrice());
        one.setTaxInclusiveTotalPrice(procurementDto.getTaxInclusiveTotalPrice());
        return customStorageMapper.update(one,customStorageLambdaQueryWrapper);
    }
    @Override
    public int add(ProcurementAddDto procurementDto) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        // æ‰¹é‡æ–°å¢ž
        for (Details detail : procurementDto.getDetails()) {
            // æŸ¥è¯¢é‡‡è´­å…¥åº“数量
            LambdaQueryWrapper<ProcurementRecordStorage> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
            procurementRecordLambdaQueryWrapper.eq(ProcurementRecordStorage::getSalesLedgerProductId, detail.getId());
            procurementRecordLambdaQueryWrapper.eq(ProcurementRecordStorage::getSalesLedgerProductId, detail.getId())
                    .eq(ProcurementRecordStorage::getType, procurementDto.getType());
            Long aLong = procurementRecordMapper.selectCount(procurementRecordLambdaQueryWrapper);
            ProcurementRecordStorage.ProcurementRecordStorageBuilder procurementRecordBuilder = ProcurementRecordStorage.builder()
                    .salesLedgerProductId(detail.getId())
                    .inboundBatches(aLong.equals(0L) ? "第1批次" : "第"+ (aLong + 1) + "批次")
                    .inboundBatches(aLong.equals(0L) ? "第1批次("+ procurementDto.getTypeName() +")" : "第"+ (aLong + 1) + "批次(" + procurementDto.getTypeName() + ")" )
                    .inboundNum(detail.getInboundQuantity())
                    .type(procurementDto.getType())
                    .warnNum(detail.getWarnNum())
                    .unitPrice(detail.getUnitPrice())
                    .totalPrice(detail.getInboundQuantity().multiply(detail.getUnitPrice()))
                    .createTime(LocalDateTime.now())
                    .createUser(loginUser.getUserId())
                    .updateTime(LocalDateTime.now())
@@ -380,7 +710,8 @@
            return procurementPageDtoIPage;
        }
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect)
                .eq(ProcurementRecordOut::getType, 1);
        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
        if(CollectionUtils.isEmpty( procurementRecords)){
            return procurementPageDtoIPage;
@@ -420,6 +751,7 @@
        }
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType,1);
        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
        if(CollectionUtils.isEmpty( procurementRecords)){
            return procurementPageDtoCopyIPage;
@@ -427,12 +759,13 @@
        for (ProcurementPageDtoCopy dto : procurementPageDtoCopyList) {
            // æ ¹æ®é‡‡è´­å°è´¦ID筛选对应的出库记录
            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()) && ProcurementRecordOut.getType().equals(1))
                    .collect(Collectors.toList());
            // å¦‚果没有相关的出库记录,跳过该条数据
            if(CollectionUtils.isEmpty(collect1)){
                dto.setInboundNum0(dto.getInboundNum());
                dto.setTotalInboundNum(BigDecimal.ZERO);
                continue;
            }
@@ -444,6 +777,10 @@
            dto.setTotalInboundNum(totalInboundNum);
            // å¾…出库数量 = æ€»æ•°é‡ - å·²å‡ºåº“数量
            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
            // åº“存价值
            if(dto.getUnitPrice() != null){
                dto.setTotalPrice(dto.getInboundNum0().multiply(dto.getUnitPrice()));
            }
        }
        return procurementPageDtoCopyIPage;
    }
src/main/resources/application-dev.yml
@@ -62,7 +62,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://localhost:3306/product-inventory-management?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://localhost:3306/product-inventory-management-sqd?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: 123456
      # ä»Žåº“数据源
src/main/resources/application.yml
@@ -1,4 +1,4 @@
# Spring配置
spring:
  profiles:
    active: sqd
    active: dev
src/main/resources/mapper/procurementrecord/CustomStorageMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.procurementrecord.mapper.CustomStorageMapper">
    <select id="listPageCopyByCustom" resultType="com.ruoyi.procurementrecord.pojo.CustomStorage">
        select t1.*,
               sum(t1.inbound_num) as inboundNum,
               sum(t1.inbound_num) as inboundNum0,
               sum(t1.tax_inclusive_total_price) as taxInclusiveTotalPrice,
               SUM(t1.inbound_num) - COALESCE(SUM(t2.inbound_num), 0) AS availableStock
               from custom_storage t1
               left join procurement_record_out t2 on t1.id = t2.procurement_record_storage_id and t2.type = 3
        <where>
            <if test="req.productCategory != null and req.productCategory != ''">
                and t1.product_category like  concat('%',#{req.productCategory},'%')
            </if>
            <if test="req.supplierName !=null and req.supplierName != ''">
                and t1.supplier_name like concat('%',#{req.supplierName},'%')
            </if>
            <if test="req.timeStr != null and req.timeStr != ''">
                and t1.inbound_date like concat('%',#{req.timeStr},'%')
            </if>
        </where>
        group by t1.product_category, t1.specification_model, t1.tax_inclusive_unit_price
        HAVING availableStock > 0
        order by t1.inbound_date desc
    </select>
</mapper>