src/main/java/com/ruoyi/common/config/IgnoreTableConfig.java
@@ -35,5 +35,6 @@ IGNORE_TABLES.add("sys_job_log"); IGNORE_TABLES.add("gen_table"); IGNORE_TABLES.add("gen_table_column"); IGNORE_TABLES.add("custom_storage_warning_record"); } } src/main/java/com/ruoyi/procurementrecord/aspect/CustomStorageWarningAspect.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,61 @@ package com.ruoyi.procurementrecord.aspect; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.procurementrecord.dto.ProcurementRecordOutAdd; import com.ruoyi.procurementrecord.mapper.CustomStorageMapper; import com.ruoyi.procurementrecord.pojo.CustomStorage; import com.ruoyi.procurementrecord.pojo.CustomStorageWarningRecord; import com.ruoyi.procurementrecord.service.CustomStorageWarningRecordService; import com.ruoyi.procurementrecord.service.ProcurementRecordService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Objects; /** * åºåé¢è¦åé¢ */ @Aspect @Slf4j @Component public class CustomStorageWarningAspect { @Autowired private ProcurementRecordService procurementRecordService; @Autowired private CustomStorageWarningRecordService customStorageWarningRecordService; @AfterReturning(value = "execution(* com.ruoyi.procurementrecord.service.impl.ProcurementRecordOutServiceImpl.stockout(*)) || execution(* com.ruoyi.procurementrecord.service.impl.ProcurementRecordServiceImpl.updateManagementByCustom(*))") @Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED) public void doAfterReturning(JoinPoint joinPoint) { Object[] args = joinPoint.getArgs(); if(Objects.nonNull(args) && args.length>0) { ProcurementRecordOutAdd procurementRecordOutAdd = new ProcurementRecordOutAdd(); BeanUtil.copyProperties(args[0],procurementRecordOutAdd); //æ¥è¯¢åºåæ°é List<CustomStorage> records = procurementRecordService.listPageCopyByCustom(new Page<>(-1, -1), new CustomStorage()).getRecords(); if(CollUtil.isNotEmpty(records)){ CustomStorage customStorage = records.stream().filter(f -> Objects.equals(f.getId(), procurementRecordOutAdd.getId())).findFirst().orElse(new CustomStorage()); //夿åºåæ¯å¦å°è¾¾é¢è¦å¼ if(ObjectUtils.anyNotNull(customStorage.getInboundNum0(),customStorage.getWarnNum())&&customStorage.getInboundNum0().compareTo(customStorage.getWarnNum())<0){ CustomStorageWarningRecord customStorageWarningRecord = new CustomStorageWarningRecord(); customStorageWarningRecord.setCustomStorageId(customStorage.getId()); customStorageWarningRecordService.saveRecord(customStorageWarningRecord); } } } } } src/main/java/com/ruoyi/procurementrecord/controller/CustomStorageWarningRecordController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,29 @@ package com.ruoyi.procurementrecord.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.procurementrecord.dto.ProcurementPageDto; import com.ruoyi.procurementrecord.service.CustomStorageWarningRecordService; import io.swagger.annotations.Api; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RequestMapping("/customStorageWarning") @RestController @Api(value = "ä»å¨ç©æµ-åºåé¢è¦") public class CustomStorageWarningRecordController { @Autowired private CustomStorageWarningRecordService customStorageWarningRecordService; @GetMapping("/pageList") @Log(title = "ä»å¨ç©æµ-åºåé¢è¦-å页æ¥è¯¢", businessType = BusinessType.OTHER) public AjaxResult pageList(Page page, ProcurementPageDto dto){ return AjaxResult.success(customStorageWarningRecordService.listPage(page,dto)); } } src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java
@@ -38,4 +38,6 @@ private Integer id; private Integer salesLedgerProductId; private BigDecimal warnNum; } src/main/java/com/ruoyi/procurementrecord/mapper/CustomStorageWarningRecordMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,27 @@ package com.ruoyi.procurementrecord.mapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.procurementrecord.dto.ProcurementDto; import com.ruoyi.procurementrecord.dto.ProcurementPageDto; import com.ruoyi.procurementrecord.pojo.CustomStorage; import com.ruoyi.procurementrecord.pojo.CustomStorageWarningRecord; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; import java.util.List; /** * @author 27233 * @description é对表ãcustom_storage_warning_record(åºåé¢è¦è¡¨)ãçæ°æ®åºæä½Mapper * @createDate 2026-01-19 17:29:31 * @Entity com.ruoyi.procurementrecord.pojo.CustomStorageWarningRecord */ public interface CustomStorageWarningRecordMapper extends BaseMapper<CustomStorageWarningRecord> { IPage<CustomStorage> selectCustomStorageWarning(@Param("page") Page page, @Param("req") ProcurementPageDto dto); } src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java
@@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.annotation.*; 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; @@ -125,4 +126,10 @@ @TableField(fill = FieldFill.INSERT) private Long tenantId; /** * é¢è¦æ°é */ @ApiModelProperty("é¢è¦æ°é") private BigDecimal warnNum; } src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorageWarningRecord.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,52 @@ package com.ruoyi.procurementrecord.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.time.LocalDateTime; import java.util.Date; import lombok.Data; /** * åºåé¢è¦è¡¨ * @TableName custom_storage_warning_record */ @TableName(value ="custom_storage_warning_record") @Data public class CustomStorageWarningRecord { /** * 主é®id */ @TableId(type = IdType.AUTO) private Long id; /** * åºåä¿¡æ¯å ³èid */ private Integer customStorageId; /** * é¢è¦çº§å« */ private String warningLevel; /** * é¢è¦ç¶æ */ private String warningStatus; /** * é¢è¦æ¶é´ */ private LocalDateTime warningTime; /** * é¢è®¡ç¼ºè´§æ¶é´ */ private LocalDateTime expectedshortagetime; private Long tenantId; } src/main/java/com/ruoyi/procurementrecord/service/CustomStorageWarningRecordService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package com.ruoyi.procurementrecord.service; 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.procurementrecord.dto.ProcurementPageDto; import com.ruoyi.procurementrecord.pojo.CustomStorage; import com.ruoyi.procurementrecord.pojo.CustomStorageWarningRecord; /** * @author 27233 * @description é对表ãcustom_storage_warning_record(åºåé¢è¦è¡¨)ãçæ°æ®åºæä½Service * @createDate 2026-01-19 17:29:31 */ public interface CustomStorageWarningRecordService extends IService<CustomStorageWarningRecord> { IPage<CustomStorage> listPage(Page page, ProcurementPageDto dto); boolean saveRecord(CustomStorageWarningRecord customStorageWarningRecord); } src/main/java/com/ruoyi/procurementrecord/service/impl/CustomStorageWarningRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,92 @@ package com.ruoyi.procurementrecord.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.procurementrecord.dto.ProcurementDto; import com.ruoyi.procurementrecord.dto.ProcurementPageDto; import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper; import com.ruoyi.procurementrecord.pojo.CustomStorage; import com.ruoyi.procurementrecord.pojo.CustomStorageWarningRecord; import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut; import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage; import com.ruoyi.procurementrecord.service.CustomStorageWarningRecordService; import com.ruoyi.procurementrecord.mapper.CustomStorageWarningRecordMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.util.List; import java.util.stream.Collectors; /** * @author 27233 * @description é对表ãcustom_storage_warning_record(åºåé¢è¦è¡¨)ãçæ°æ®åºæä½Serviceå®ç° * @createDate 2026-01-19 17:29:31 */ @Service public class CustomStorageWarningRecordServiceImpl extends ServiceImpl<CustomStorageWarningRecordMapper, CustomStorageWarningRecord> implements CustomStorageWarningRecordService{ @Autowired private ProcurementRecordOutMapper procurementRecordOutMapper; @Override public IPage<CustomStorage> listPage(Page page, ProcurementPageDto procurementPageDto) { IPage<CustomStorage> pageList = baseMapper.selectCustomStorageWarning(page, procurementPageDto); 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 boolean saveRecord(CustomStorageWarningRecord customStorageWarningRecord) { return baseMapper.insert(customStorageWarningRecord)>0; } } src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -635,6 +635,7 @@ CustomStorage one = new CustomStorage(); one.setTaxInclusiveUnitPrice(procurementDto.getTaxInclusiveUnitPrice()); one.setTaxInclusiveTotalPrice(procurementDto.getTaxInclusiveTotalPrice()); one.setWarnNum(procurementDto.getWarnNum()); return customStorageMapper.update(one,customStorageLambdaQueryWrapper); } src/main/resources/mapper/CustomStorageWarningRecordMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,47 @@ <?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.CustomStorageWarningRecordMapper"> <resultMap id="BaseResultMap" type="com.ruoyi.procurementrecord.pojo.CustomStorageWarningRecord"> <id property="id" column="id" jdbcType="BIGINT"/> <result property="customStorageId" column="custom_storage_id" jdbcType="INTEGER"/> <result property="warningLevel" column="warning_level" jdbcType="VARCHAR"/> <result property="warningStatus" column="warning_status" jdbcType="VARCHAR"/> <result property="warningTime" column="warning_time" jdbcType="TIMESTAMP"/> <result property="expectedshortagetime" column="expectedShortageTime" jdbcType="TIMESTAMP"/> </resultMap> <sql id="Base_Column_List"> id,custom_storage_id,warning_level, warning_status,warning_time,expectedShortageTime </sql> <select id="selectCustomStorageWarning" resultType="com.ruoyi.procurementrecord.pojo.CustomStorage"> select t1.*, sum(t1.tax_inclusive_total_price) as totalPrice, sum(t1.inbound_num) as inboundNum, sum(t1.inbound_num) as inboundNum0, 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 inner join custom_storage_warning_record cswr on t1.id = cswr.custom_storage_id <where> t2.type = 3 <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.specificationModel !=null and req.specificationModel != ''"> and t1.specification_model like concat('%',#{specificationModel},'%') </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 order by t1.inbound_date desc </select> </mapper>