From 8790f1ea7960c2209f6c919c732d7b2184edc4af Mon Sep 17 00:00:00 2001
From: zouyu <2723363702@qq.com>
Date: 星期二, 20 一月 2026 11:20:38 +0800
Subject: [PATCH] 浪潮对接单点登录:财务系统调整

---
 src/main/java/com/ruoyi/procurementrecord/service/impl/CustomStorageWarningRecordServiceImpl.java |   92 +++++++++++++++
 src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java                                 |    7 +
 src/main/resources/mapper/CustomStorageWarningRecordMapper.xml                                    |   47 +++++++
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java                 |    2 
 src/main/java/com/ruoyi/procurementrecord/aspect/CustomStorageWarningAspect.java                  |   61 ++++++++++
 src/main/java/com/ruoyi/procurementrecord/controller/CustomStorageWarningRecordController.java    |   29 ++++
 src/main/java/com/ruoyi/procurementrecord/mapper/CustomStorageWarningRecordMapper.java            |   27 ++++
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java          |    1 
 src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorageWarningRecord.java                    |   52 ++++++++
 src/main/java/com/ruoyi/common/config/IgnoreTableConfig.java                                      |    1 
 src/main/java/com/ruoyi/procurementrecord/service/CustomStorageWarningRecordService.java          |   20 +++
 11 files changed, 339 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/ruoyi/common/config/IgnoreTableConfig.java b/src/main/java/com/ruoyi/common/config/IgnoreTableConfig.java
index 66f674a..b5354f2 100644
--- a/src/main/java/com/ruoyi/common/config/IgnoreTableConfig.java
+++ b/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");
     }
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/aspect/CustomStorageWarningAspect.java b/src/main/java/com/ruoyi/procurementrecord/aspect/CustomStorageWarningAspect.java
new file mode 100644
index 0000000..b015a3d
--- /dev/null
+++ b/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);
+                }
+            }
+        }
+
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/CustomStorageWarningRecordController.java b/src/main/java/com/ruoyi/procurementrecord/controller/CustomStorageWarningRecordController.java
new file mode 100644
index 0000000..5dabd7a
--- /dev/null
+++ b/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));
+    }
+
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java
index 0d97384..2b029dc 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java
@@ -38,4 +38,6 @@
 
     private Integer id;
     private Integer salesLedgerProductId;
+
+    private BigDecimal warnNum;
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/mapper/CustomStorageWarningRecordMapper.java b/src/main/java/com/ruoyi/procurementrecord/mapper/CustomStorageWarningRecordMapper.java
new file mode 100644
index 0000000..9b68935
--- /dev/null
+++ b/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 閽堝琛ㄣ�恈ustom_storage_warning_record(搴撳瓨棰勮琛�)銆戠殑鏁版嵁搴撴搷浣淢apper
+* @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);
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java b/src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java
index 5599500..a9a38a0 100644
--- a/src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java
+++ b/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;
+
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorageWarningRecord.java b/src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorageWarningRecord.java
new file mode 100644
index 0000000..9e05b01
--- /dev/null
+++ b/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;
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/CustomStorageWarningRecordService.java b/src/main/java/com/ruoyi/procurementrecord/service/CustomStorageWarningRecordService.java
new file mode 100644
index 0000000..d6a700f
--- /dev/null
+++ b/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 閽堝琛ㄣ�恈ustom_storage_warning_record(搴撳瓨棰勮琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice
+* @createDate 2026-01-19 17:29:31
+*/
+public interface CustomStorageWarningRecordService extends IService<CustomStorageWarningRecord> {
+
+    IPage<CustomStorage> listPage(Page page, ProcurementPageDto dto);
+
+    boolean saveRecord(CustomStorageWarningRecord customStorageWarningRecord);
+}
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/CustomStorageWarningRecordServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/CustomStorageWarningRecordServiceImpl.java
new file mode 100644
index 0000000..e11cc9a
--- /dev/null
+++ b/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 閽堝琛ㄣ�恈ustom_storage_warning_record(搴撳瓨棰勮琛�)銆戠殑鏁版嵁搴撴搷浣淪ervice瀹炵幇
+* @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;
+    }
+}
+
+
+
+
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
index f653427..9a141a4 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
+++ b/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);
     }
 
diff --git a/src/main/resources/mapper/CustomStorageWarningRecordMapper.xml b/src/main/resources/mapper/CustomStorageWarningRecordMapper.xml
new file mode 100644
index 0000000..6bfcb45
--- /dev/null
+++ b/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>

--
Gitblit v1.9.3