From 0047f8ce5986c577e6b887403dd24ea884c9ce4b Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期二, 10 三月 2026 13:15:19 +0800
Subject: [PATCH] 入库前需审批,审批后入库(消息通知)

---
 src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java |   55 ++--
 src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java |    1 
 src/main/java/com/ruoyi/stock/service/StockInventoryService.java            |    6 
 src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java                    |   33 ++
 src/main/java/com/ruoyi/stock/pojo/StockInRecord.java                       |   13 +
 src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java                    |   19 +
 src/main/resources/mapper/stock/StockInRecordMapper.xml                     |   14 +
 src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java             |    5 
 src/main/java/com/ruoyi/stock/service/StockInRecordService.java             |    4 
 src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java    |   42 +++
 src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java    |  106 +++++++---
 src/main/java/com/ruoyi/stock/controller/StockInRecordController.java       |   24 ++
 src/main/java/com/ruoyi/stock/mapper/StockInRecordMapper.java               |    2 
 src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java |   82 ++++++-
 src/main/java/com/ruoyi/approve/pojo/ApproveNode.java                       |   38 ++-
 src/main/java/com/ruoyi/stock/service/StockUninventoryService.java          |    3 
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java   |  119 +++++++++--
 17 files changed, 425 insertions(+), 141 deletions(-)

diff --git a/src/main/java/com/ruoyi/approve/pojo/ApproveNode.java b/src/main/java/com/ruoyi/approve/pojo/ApproveNode.java
index 2ea7dd5..462b961 100644
--- a/src/main/java/com/ruoyi/approve/pojo/ApproveNode.java
+++ b/src/main/java/com/ruoyi/approve/pojo/ApproveNode.java
@@ -1,18 +1,16 @@
 package com.ruoyi.approve.pojo;
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
 import java.io.Serializable;
 import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.List;
-
-import com.baomidou.mybatisplus.annotation.FieldFill;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.ruoyi.sales.pojo.CommonFile;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
 
 /**
  * 瀹℃壒鑺傜偣琛�
@@ -21,8 +19,9 @@
 @Data
 @TableName("approve_node")
 @ApiModel
-public class ApproveNode{
+public class ApproveNode implements Serializable {
 
+    private static final long serialVersionUID = 1L;
 
     @ApiModelProperty("闄勪欢id")
     @TableField(exist = false)
@@ -125,7 +124,24 @@
      */
     private String approveNodeRemark;
 
-    private static final long serialVersionUID = 1L;
+    /**
+     * 鍏ュ簱id
+     */
+    @TableField(exist = false)
+    private Long recordId;
 
+    /**
+     * 鏄惁鍏ュ簱瀹℃牳閫氳繃
+     */
+    @ApiModelProperty(value = "鏄惁鍏ュ簱瀹℃牳閫氳繃")
+    @TableField(exist = false)
+    private boolean inventoryReview;
+
+    /**
+     * 鍏ュ簱绫诲瀷锛堝悎鏍�/涓嶅悎鏍硷級
+     */
+    @ApiModelProperty(value = "鍏ュ簱绫诲瀷")
+    @TableField(exist = false)
+    private String storageType;
 
 }
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java b/src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java
index 808199f..44d89b8 100644
--- a/src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java
+++ b/src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java
@@ -1,12 +1,9 @@
 package com.ruoyi.approve.pojo;
 
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.time.LocalDateTime;
-import java.util.Date;
-import java.util.List;
-
-import com.baomidou.mybatisplus.annotation.*;
+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 com.fasterxml.jackson.annotation.JsonFormat;
 import com.ruoyi.framework.aspectj.lang.annotation.Excel;
 import com.ruoyi.sales.pojo.CommonFile;
@@ -14,6 +11,11 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.List;
 
 /**
  * 瀹℃壒娴佺▼琛�
@@ -127,7 +129,7 @@
     private Long tenantId;
 
     /**
-     * 瀹℃壒绫诲瀷 1-鍏嚭绠$悊 2-璇峰亣绠$悊 3-鍑哄樊绠$悊 4-鎶ラ攢绠$悊 5-閲囪喘瀹℃壒 6-鎶ヤ环瀹℃壒 7-鍙戣揣瀹℃壒 8-鍗遍櫓浣滀笟瀹℃壒
+     * 瀹℃壒绫诲瀷 1-鍏嚭绠$悊 2-璇峰亣绠$悊 3-鍑哄樊绠$悊 4-鎶ラ攢绠$悊 5-閲囪喘瀹℃壒 6-鎶ヤ环瀹℃壒 7-鍙戣揣瀹℃壒 8-鍗遍櫓浣滀笟瀹℃壒 9-鍏ュ簱瀹℃壒
      */
     private Integer approveType;
 
@@ -170,5 +172,20 @@
     private BigDecimal maintenancePrice;
     private static final long serialVersionUID = 1L;
 
+    /**
+     * 鏄惁鍏ュ簱瀹℃牳閫氳繃
+     */
+    @ApiModelProperty(value = "鏄惁鍏ュ簱瀹℃牳閫氳繃")
+    private boolean inventoryReview;
 
+    /**
+     * 鍏ュ簱绫诲瀷锛堝悎鏍�/涓嶅悎鏍硷級
+     */
+    @ApiModelProperty(value = "鍏ュ簱绫诲瀷")
+    private String storageType;
+
+    /**
+     * 鍏ュ簱id
+     */
+    private Long recordId;
 }
diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
index 00a53f5..9e70dfd 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -13,7 +13,6 @@
 import com.ruoyi.approve.service.IApproveNodeService;
 import com.ruoyi.common.enums.FileNameType;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.device.mapper.DeviceRepairMapper;
 import com.ruoyi.device.pojo.DeviceRepair;
@@ -25,12 +24,19 @@
 import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
 import com.ruoyi.purchase.pojo.PurchaseLedger;
 import com.ruoyi.purchase.service.impl.PurchaseLedgerServiceImpl;
-import com.ruoyi.sales.mapper.*;
+import com.ruoyi.sales.mapper.CommonFileMapper;
+import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
+import com.ruoyi.sales.mapper.SalesQuotationMapper;
+import com.ruoyi.sales.mapper.ShippingInfoMapper;
 import com.ruoyi.sales.pojo.CommonFile;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.sales.pojo.SalesQuotation;
 import com.ruoyi.sales.pojo.ShippingInfo;
 import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
+import com.ruoyi.stock.pojo.StockInRecord;
+import com.ruoyi.stock.service.StockInRecordService;
+import com.ruoyi.stock.service.StockInventoryService;
+import com.ruoyi.stock.service.StockUninventoryService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
@@ -47,7 +53,7 @@
 public class ApproveNodeServiceImpl extends ServiceImpl<ApproveNodeMapper, ApproveNode> implements IApproveNodeService {
 
     @Autowired
-    private  ApproveNodeMapper approveNodeMapper;
+    private ApproveNodeMapper approveNodeMapper;
     @Autowired
     private ApproveProcessMapper approveProcessMapper;
     @Autowired
@@ -56,7 +62,7 @@
     @Autowired
     private TempFileServiceImpl tempFileService;
     @Autowired
-    private  ISysNoticeService sysNoticeService;
+    private ISysNoticeService sysNoticeService;
 
     @Autowired
     private CommonFileMapper fileMapper;
@@ -81,6 +87,13 @@
 
     @Autowired
     private PurchaseLedgerServiceImpl purchaseLedgerServiceImpl;
+    @Autowired
+    private StockUninventoryService stockUninventoryService;
+    @Autowired
+    private StockInRecordService stockInRecordService;
+    @Autowired
+    private StockInventoryService stockInventoryService;
+
 
 
     public ApproveProcess getApproveById(String id) {
@@ -94,7 +107,7 @@
     }
 
     @Override
-    public void initApproveNodes(String approveUserIds,String approveID,Long tenantId) {
+    public void initApproveNodes(String approveUserIds, String approveID, Long tenantId) {
         Long userId = SecurityUtils.getLoginUser().getUser().getUserId();
         String[] names = approveUserIds.split(",");
         for (int i = 0; i < names.length; i++) {
@@ -102,7 +115,7 @@
             if (sysUser == null) continue;
             ApproveNode approveNode = new ApproveNode();
             approveNode.setApproveProcessId(approveID);
-            approveNode.setApproveNodeOrder(i +1);
+            approveNode.setApproveNodeOrder(i + 1);
             approveNode.setApproveNodeUser(sysUser.getNickName());
             approveNode.setApproveNodeUserId(sysUser.getUserId());
             approveNode.setApproveNodeTime(new Date());
@@ -132,17 +145,17 @@
 //                .eq(ApproveProcess::getApproveStatus, 0)
                 .last("limit 1");
         ApproveProcess approveProcess = approveProcessMapper.selectOne(approveProcessLambdaQueryWrapper);
-        if(approveProcess != null && approveProcess.getApproveStatus() == 3){
+        if (approveProcess != null && approveProcess.getApproveStatus() == 3) {
             return list;
         }
         for (ApproveNode approveNode : list) {
             List<CommonFile> commonFiles = fileMapper.selectList(new LambdaQueryWrapper<CommonFile>()
                     .eq(CommonFile::getCommonId, approveNode.getId())
                     .eq(CommonFile::getType, FileNameType.ApproveNode.getValue()));
-            if(!CollectionUtils.isEmpty(commonFiles)){
+            if (!CollectionUtils.isEmpty(commonFiles)) {
                 approveNode.setUrl(commonFiles.get(0).getUrl());
             }
-            if(approveNode.getApproveNodeStatus() == 1){
+            if (approveNode.getApproveNodeStatus() == 1) {
                 continue;
             }
             approveNode.setIsShen(true);
@@ -151,13 +164,13 @@
         return list;
     }
 
-    public void updateApproveProcessStatus(ApproveNode approveNode,Integer status) throws IOException {
+    public void updateApproveProcessStatus(ApproveNode approveNode, Integer status) throws IOException {
         LambdaQueryWrapper<ApproveProcess> approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>();
         approveProcessLambdaQueryWrapper.eq(ApproveProcess::getApproveId, approveNode.getApproveProcessId())
                 .eq(ApproveProcess::getApproveDelete, 0)
                 .last("limit 1");
         ApproveProcess approveProcess = approveProcessMapper.selectOne(approveProcessLambdaQueryWrapper);
-        if(approveProcess == null) throw new RuntimeException("瀹℃壒涓嶅瓨鍦�");
+        if (approveProcess == null) throw new RuntimeException("瀹℃壒涓嶅瓨鍦�");
         LambdaQueryWrapper<ApproveNode> approveNodeLambdaQueryWrapper = new LambdaQueryWrapper<>();
         approveNodeLambdaQueryWrapper.eq(ApproveNode::getApproveProcessId, approveNode.getApproveProcessId())
                 .eq(ApproveNode::getApproveNodeOrder, approveNode.getApproveNodeOrder() + 1)
@@ -166,21 +179,21 @@
                 .last("limit 1");
         ApproveNode approveNode1 = approveNodeMapper.selectOne(approveNodeLambdaQueryWrapper);
         approveProcess.setApproveStatus(status);
-        if(approveNode1 != null){
+        if (approveNode1 != null) {
             approveProcess.setApproveUserCurrentId(approveNode1.getApproveNodeUserId());
             approveProcess.setApproveUserCurrentName(approveNode1.getApproveNodeUser());
         }
-        if(approveProcess.getApproveStatus().equals(2) || approveProcess.getApproveStatus().equals(3) || approveProcess.getApproveStatus().equals(4)){
+        if (approveProcess.getApproveStatus().equals(2) || approveProcess.getApproveStatus().equals(3) || approveProcess.getApproveStatus().equals(4)) {
             approveProcess.setApproveOverTime(new Date());
         }
         approveProcessMapper.updateById(approveProcess);
 
         DeviceRepair deviceRepair = deviceRepairMapper.selectById(approveProcess.getDeviceRepairId());
-        if(ObjectUtils.isNotNull(deviceRepair)) {
-            if(approveProcess.getApproveStatus().equals(2)){
+        if (ObjectUtils.isNotNull(deviceRepair)) {
+            if (approveProcess.getApproveStatus().equals(2)) {
                 // 鍚屾剰
                 deviceRepair.setStatus(1);
-            }else if(approveProcess.getApproveStatus().equals(3)){
+            } else if (approveProcess.getApproveStatus().equals(3)) {
                 // 鎷掔粷
                 deviceRepair.setStatus(2);
             }
@@ -188,11 +201,11 @@
         }
 
         //閲囪喘瀹℃牳
-        if(approveProcess.getApproveType().equals(5)){
+        if (approveProcess.getApproveType().equals(5)) {
             PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectOne(new LambdaQueryWrapper<PurchaseLedger>()
                     .eq(PurchaseLedger::getPurchaseContractNumber, approveProcess.getApproveReason())
                     .last("limit 1"));
-            if(purchaseLedger != null) {
+            if (purchaseLedger != null) {
                 if (status.equals(2)) {
                     // 鍚屾剰
                     purchaseLedger.setApprovalStatus(3);
@@ -202,7 +215,7 @@
                         // 璐ㄦ
                         if (salesLedgerProduct.getIsChecked()) {
                             purchaseLedgerServiceImpl.addQualityInspect(purchaseLedger, salesLedgerProduct);
-                        }else {
+                        } else {
                             //鐩存帴鍏ュ簱
                             stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId());
                         }
@@ -218,33 +231,33 @@
             }
         }
         // 閿�鍞姤浠风姸鎬佷慨鏀�
-        if(approveProcess.getApproveType().equals(6)){
+        if (approveProcess.getApproveType().equals(6)) {
             SalesQuotation salesQuote = salesQuotationMapper.selectOne(new LambdaQueryWrapper<SalesQuotation>()
                     .eq(SalesQuotation::getQuotationNo, approveProcess.getApproveReason())
                     .last("limit 1"));
             // 鍚屾剰
-            if(status.equals(2) && salesQuote != null){
+            if (status.equals(2) && salesQuote != null) {
                 salesQuote.setStatus("閫氳繃");
-            }else if(status.equals(3) && salesQuote != null){
+            } else if (status.equals(3) && salesQuote != null) {
                 salesQuote.setStatus("鎷掔粷");
-            }else if(status.equals(1) && salesQuote != null){
+            } else if (status.equals(1) && salesQuote != null) {
                 salesQuote.setStatus("瀹℃牳涓�");
             }
             salesQuotationMapper.updateById(salesQuote);
         }
         // 鍑哄簱瀹℃壒淇敼
-        if(approveProcess.getApproveType().equals(7)){
+        if (approveProcess.getApproveType().equals(7)) {
             String[] split = approveProcess.getApproveReason().split(":");
             ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>()
                     .eq(ShippingInfo::getShippingNo, split[1])
                     .orderByDesc(ShippingInfo::getCreateTime)
                     .last("limit 1"));
-            if(shippingInfo != null){
-                if(status.equals(2)){
+            if (shippingInfo != null) {
+                if (status.equals(2)) {
                     shippingInfo.setStatus("瀹℃牳閫氳繃");
-                }else if(status.equals(3)){
+                } else if (status.equals(3)) {
                     shippingInfo.setStatus("瀹℃牳鎷掔粷");
-                }else if(status.equals(1)){
+                } else if (status.equals(1)) {
                     shippingInfo.setStatus("瀹℃牳涓�");
                 }
                 shippingInfoMapper.updateById(shippingInfo);
@@ -252,7 +265,7 @@
 
         }
         // 缁戝畾闄勪欢
-        if(!CollectionUtils.isEmpty(approveNode.getTempFileIds()) && approveNode.getApproveNodeStatus() == 1){
+        if (!CollectionUtils.isEmpty(approveNode.getTempFileIds()) && approveNode.getApproveNodeStatus() == 1) {
             tempFileService.migrateTempFilesToFormal(approveNode.getId(), approveNode.getTempFileIds(), FileNameType.ApproveNode.getValue());
         }
     }
@@ -260,21 +273,42 @@
     @Override
     public void updateApproveNode(ApproveNode approveNode) throws IOException {
         // 瀹℃壒鑺傜偣鐘舵��:1鍚屾剰锛�2鎷掔粷锛�0灏氭湭瀹℃牳
-        switch (approveNode.getApproveNodeStatus()){
+        switch (approveNode.getApproveNodeStatus()) {
             case 1:
                 updateApproveProcessStatus(approveNode, Boolean.TRUE.equals(approveNode.getIsLast()) ? 2 : 1);
                 /*娑堟伅閫氱煡*/
                 Integer nodeOrder = approveNode.getApproveNodeOrder();
                 ApproveProcess approveProcess = approveProcessMapper.selectList(Wrappers.<ApproveProcess>lambdaQuery()
                         .eq(ApproveProcess::getApproveId, approveNode.getApproveProcessId())).get(0);
-                if (approveProcess.getApproveUserIds().split(",").length > nodeOrder){
+                if (approveProcess.getApproveUserIds().split(",").length > nodeOrder) {
                     String id = approveProcess.getApproveUserIds().split(",")[nodeOrder];
-                    if (approveProcess.getApproveType()==8){
+                    if (approveProcess.getApproveType() == 8) {
                         sysNoticeService.simpleNoticeByUser(approveProcessType(approveProcess.getApproveType()),
                                 approveProcess.getApproveId() + "娴佺▼缂栧彿鐨勫鎵归渶瑕佹偍瀹℃牳!!!!!",
                                 Arrays.asList(Long.valueOf(id)),
                                 "/safeProduction/safeWorkApproval?approveType=" + approveProcess.getApproveType() + "&approveId=" + approveProcess.getApproveId());
-                    }else {
+                    } else if (approveProcess.getApproveType() == 9) {
+                        StockInRecord stockInRecord = stockInRecordService.getById(approveNode.getRecordId());
+                        if (approveNode.isInventoryReview()) {
+                            if ("涓嶅悎鏍煎叆搴�".equals(approveNode.getStorageType())) {
+                                stockUninventoryService.updateOrCreateStockUninventory(stockInRecord);
+                            } else if ("鍚堟牸鍏ュ簱".equals(approveNode.getStorageType())) {
+                                stockInventoryService.updateOrCreateStockInventory(stockInRecord);
+                            }
+                            stockInRecord.setApproveStatus(2);
+                            stockInRecordService.updateById(stockInRecord);
+                            sysNoticeService.simpleNoticeByUser(
+                                    approveProcessType(approveProcess.getApproveType()),
+                                    approveProcess.getApproveId() + "娴佺▼缂栧彿鐨勫鎵归渶瑕佹偍瀹℃牳!!!!!",
+                                    Arrays.asList(Long.valueOf(id)),
+                                    "/collaborativeApproval/approvalProcess?approveType=" + approveProcess.getApproveType()
+                                            + "&approveId=" + approveProcess.getApproveId()
+                            );
+                        }else {
+                            stockInRecord.setApproveStatus(3);
+                            stockInRecordService.updateById(stockInRecord);
+                        }
+                    } else {
                         sysNoticeService.simpleNoticeByUser(approveProcessType(approveProcess.getApproveType()),
                                 approveProcess.getApproveId() + "娴佺▼缂栧彿鐨勫鎵归渶瑕佹偍瀹℃牳!!!!!",
                                 Arrays.asList(Long.valueOf(id)),
@@ -307,8 +341,8 @@
     }
 
     //瀹℃壒绫诲瀷鑾峰彇(涓庡墠绔〉闈㈠搴�)
-    private String approveProcessType(Integer approveType){
-        switch (approveType){
+    private String approveProcessType(Integer approveType) {
+        switch (approveType) {
             case 1:
                 return "鍏嚭绠$悊";
             case 2:
@@ -325,6 +359,8 @@
                 return "鍙戣揣瀹℃壒";
             case 8:
                 return "鍗遍櫓浣滀笟瀹℃壒";
+            case 9:
+                return "鍏ュ簱瀹℃壒";
         }
         return null;
     }
diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
index a624661..af8fe1d 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
@@ -16,8 +16,6 @@
 import com.ruoyi.approve.vo.ApproveGetAndUpdateVo;
 import com.ruoyi.approve.vo.ApproveProcessVO;
 import com.ruoyi.common.enums.FileNameType;
-import com.ruoyi.common.utils.OrderUtils;
-import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.other.service.impl.TempFileServiceImpl;
 import com.ruoyi.project.system.domain.SysDept;
 import com.ruoyi.project.system.domain.SysNotice;
@@ -32,25 +30,20 @@
 import com.ruoyi.sales.pojo.CommonFile;
 import com.ruoyi.sales.pojo.ShippingInfo;
 import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
-import lombok.AllArgsConstructor;
-import lombok.RequiredArgsConstructor;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Lazy;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
 import java.io.IOException;
-import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -60,25 +53,25 @@
     private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyyMMdd");
 
     @Autowired
-    private  StringRedisTemplate redisTemplate;
+    private StringRedisTemplate redisTemplate;
     @Autowired
-    private  DailyRedisCounter dailyRedisCounter;
+    private DailyRedisCounter dailyRedisCounter;
     @Autowired
-    private  SysDeptMapper sysDeptMapper;
+    private SysDeptMapper sysDeptMapper;
     @Autowired
-    private  IApproveNodeService approveNodeService;
+    private IApproveNodeService approveNodeService;
     @Autowired
-    private  SysUserMapper sysUserMapper;
+    private SysUserMapper sysUserMapper;
     @Autowired
-    private  ApproveProcessMapper approveProcessMapper;
+    private ApproveProcessMapper approveProcessMapper;
     @Autowired
-    private  TempFileServiceImpl tempFileService;
+    private TempFileServiceImpl tempFileService;
     @Autowired
-    private  CommonFileMapper commonFileMapper;
+    private CommonFileMapper commonFileMapper;
     @Autowired
-    private  CommonFileServiceImpl commonFileService;
+    private CommonFileServiceImpl commonFileService;
     @Autowired
-    private  ISysNoticeService sysNoticeService;
+    private ISysNoticeService sysNoticeService;
 
     @Override
     public void addApprove(ApproveProcessVO approveProcessVO) throws Exception {
@@ -125,6 +118,10 @@
                 .collect(Collectors.toList())
                 .get(0)
                 .getNickName());
+        approveProcess.setStorageType(approveProcessVO.getStorageType());
+        approveProcess.setInventoryReview(approveProcessVO.isInventoryReview());
+        approveProcess.setInventoryReview(approveProcessVO.isInventoryReview());
+        approveProcess.setRecordId(approveProcessVO.getRecordId());
         // 璁剧疆鐘舵�佷负閲嶆柊鎻愪氦
         if (approveProcessVO.getId() != null) {
             ApproveProcess approveProcess1 = approveProcessMapper.selectById(approveProcessVO.getId());
@@ -138,12 +135,12 @@
         tempFileService.migrateTempFilesToFormal(approveProcess.getId(), approveProcessVO.getTempFileIds(), FileNameType.ApproveProcess.getValue());
         /*娑堟伅閫氱煡*/
         String id = approveProcessVO.getApproveUserIds().split(",")[0];
-        if (approveProcess.getApproveType()==8){
+        if (approveProcess.getApproveType() == 8) {
             sysNoticeService.simpleNoticeByUser(approveProcessType(approveProcess.getApproveType()),
                     approveProcess.getApproveId() + "娴佺▼缂栧彿鐨勫鎵归渶瑕佹偍瀹℃牳!!!!!",
                     Arrays.asList(Long.valueOf(id)),
                     "/safeProduction/safeWorkApproval?approveType=" + approveProcess.getApproveType() + "&approveId=" + approveProcess.getApproveId());
-        }else {
+        } else {
             sysNoticeService.simpleNoticeByUser(approveProcessType(approveProcess.getApproveType()),
                     approveProcess.getApproveId() + "娴佺▼缂栧彿鐨勫鎵归渶瑕佹偍瀹℃牳!!!!!",
                     Arrays.asList(Long.valueOf(id)),
@@ -286,9 +283,9 @@
 
             //  鍒犻櫎瀵瑰簲鐨勬秷鎭�氱煡
             sysNoticeService.remove(new LambdaQueryWrapper<SysNotice>()
-                            .eq(SysNotice::getNoticeTitle, approveProcessType(latestProcess.getApproveType()))
-                            .eq(SysNotice::getSenderId, latestProcess.getApproveUser())
-                            .apply("CAST(notice_content AS CHAR) LIKE CONCAT('%', {0}, '%')", latestProcess.getApproveId()));
+                    .eq(SysNotice::getNoticeTitle, approveProcessType(latestProcess.getApproveType()))
+                    .eq(SysNotice::getSenderId, latestProcess.getApproveUser())
+                    .apply("CAST(notice_content AS CHAR) LIKE CONCAT('%', {0}, '%')", latestProcess.getApproveId()));
         }
 
     }
@@ -296,8 +293,8 @@
     @Override
     public ApproveProcess getApproveById(String id) {
         ApproveProcess one = approveProcessMapper.selectList(Wrappers.<ApproveProcess>lambdaQuery()
-                .eq(ApproveProcess::getApproveId,id)
-                .eq(ApproveProcess::getApproveDelete,0)).get(0);
+                .eq(ApproveProcess::getApproveId, id)
+                .eq(ApproveProcess::getApproveDelete, 0)).get(0);
         one.setCommonFileList(commonFileMapper.selectList(new LambdaQueryWrapper<CommonFile>()
                 .eq(CommonFile::getCommonId, one.getId())
                 .eq(CommonFile::getType, FileNameType.ApproveProcess.getValue())));
@@ -342,12 +339,12 @@
         approveNodeService.initApproveNodes(approveGetAndUpdateVo.getApproveUserIds(), approveProcess.getApproveId(), approveProcess.getTenantId());
         /*娑堟伅閫氱煡*/
         String id = approveProcess.getApproveUserIds().split(",")[0];
-        if (approveProcess.getApproveType()==8){
+        if (approveProcess.getApproveType() == 8) {
             sysNoticeService.simpleNoticeByUser(approveProcessType(approveProcess.getApproveType()),
                     approveProcess.getApproveId() + "娴佺▼缂栧彿鐨勫鎵归渶瑕佹偍瀹℃牳!!!!!",
                     Arrays.asList(Long.valueOf(id)),
                     "/safeProduction/safeWorkApproval?approveType=" + approveProcess.getApproveType() + "&approveId=" + approveProcess.getApproveId());
-        }else {
+        } else {
             sysNoticeService.simpleNoticeByUser(approveProcessType(approveProcess.getApproveType()),
                     approveProcess.getApproveId() + "娴佺▼缂栧彿鐨勫鎵归渶瑕佹偍瀹℃牳!!!!!",
                     Arrays.asList(Long.valueOf(id)),
@@ -407,12 +404,12 @@
         tempFileService.migrateTempFilesToFormal(approve.getId(), approveGetAndUpdateVo.getTempFileIds(), FileNameType.ApproveProcess.getValue());
         /*娑堟伅閫氱煡*/
         String id = approve.getApproveUserIds().split(",")[0];
-        if (approve.getApproveType()==8){
+        if (approve.getApproveType() == 8) {
             sysNoticeService.simpleNoticeByUser(approveProcessType(approve.getApproveType()),
                     approve.getApproveId() + "娴佺▼缂栧彿鐨勫鎵归渶瑕佹偍瀹℃牳!!!!!",
                     Arrays.asList(Long.valueOf(id)),
                     "/safeProduction/safeWorkApproval?approveType=" + approve.getApproveType() + "&approveId=" + approve.getApproveId());
-        }else {
+        } else {
             sysNoticeService.simpleNoticeByUser(approveProcessType(approve.getApproveType()),
                     approve.getApproveId() + "娴佺▼缂栧彿鐨勫鎵归渶瑕佹偍瀹℃牳!!!!!",
                     Arrays.asList(Long.valueOf(id)),
@@ -441,6 +438,8 @@
                 return "鍙戣揣瀹℃壒";
             case 8:
                 return "鍗遍櫓浣滀笟瀹℃壒";
+            case 9:
+                return "鍏ュ簱瀹℃壒";
         }
         return null;
     }
diff --git a/src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java b/src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java
index bf8edae..2d9ae4e 100644
--- a/src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java
+++ b/src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java
@@ -2,12 +2,10 @@
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ruoyi.framework.aspectj.lang.annotation.Excel;
-import com.ruoyi.sales.pojo.CommonFile;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
-import javax.validation.constraints.NotBlank;
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
@@ -75,4 +73,21 @@
      * 鎶ヤ慨閲戦
      */
     private BigDecimal maintenancePrice;
+    /**
+     * 鏄惁鍏ュ簱瀹℃牳閫氳繃
+     */
+    @ApiModelProperty(value = "鏄惁鍏ュ簱瀹℃牳閫氳繃")
+    private boolean inventoryReview;
+
+    /**
+     * 鍏ュ簱绫诲瀷锛堝悎鏍�/涓嶅悎鏍硷級
+     */
+    @ApiModelProperty(value = "鍏ュ簱绫诲瀷")
+    private String storageType;
+
+    /**
+     * 鍏ュ簱id
+     */
+    @ApiModelProperty(value = "鍏ュ簱id")
+    private Long recordId;
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java b/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
index 819ce65..3db55b2 100644
--- a/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
+++ b/src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
@@ -4,7 +4,6 @@
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
-import com.ruoyi.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.dto.StockUninventoryDto;
 import com.ruoyi.stock.pojo.StockInRecord;
@@ -13,15 +12,11 @@
 import com.ruoyi.stock.service.StockInventoryService;
 import com.ruoyi.stock.service.StockOutRecordService;
 import com.ruoyi.stock.service.StockUninventoryService;
-import com.ruoyi.stock.service.impl.StockInRecordServiceImpl;
-import com.ruoyi.stock.service.impl.StockOutRecordServiceImpl;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
 import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
 
 @Component
 @RequiredArgsConstructor
diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
index 8a1e066..ed6c4cf 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -9,7 +9,6 @@
 import com.deepoove.poi.XWPFTemplate;
 import com.deepoove.poi.config.Configure;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.HackLoopTableRenderPolicy;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.procurementrecord.service.ProcurementRecordService;
diff --git a/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java b/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java
index b12fc67..2b036e5 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java
@@ -5,6 +5,7 @@
 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.framework.web.domain.R;
 import com.ruoyi.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.service.StockInRecordService;
 import io.swagger.annotations.Api;
@@ -32,11 +33,30 @@
     }
 
 
+    @GetMapping("/getById")
+    @ApiOperation(value = "鏍规嵁ID鏌ヨ鍏ュ簱璁板綍")
+    public AjaxResult getById(@RequestParam("id") Long id) {
+        if (id == null || id <= 0) {
+            return AjaxResult.error("鍙傛暟id涓嶈兘涓虹┖");
+        }
+        StockInRecordDto stockInRecordDto = stockInRecordService.selectByRecord(id);
+        if (stockInRecordDto == null) {
+            return AjaxResult.error("璁板綍涓嶅瓨鍦�");
+        }
+        return AjaxResult.success(stockInRecordDto);
+    }
+
+    @PostMapping("/updateStockInRecord")
+    @ApiOperation("鍏ュ簱璁板綍瀹℃牳")
+    public R updateStockInRecord(@RequestBody StockInRecordDto stockInRecordDto) {
+        return R.ok(stockInRecordService.updateStockInRecord(stockInRecordDto));
+    }
+
 
     @DeleteMapping("")
     @Log(title = "鍏ュ簱绠$悊-鍒犻櫎鍏ュ簱", businessType = BusinessType.DELETE)
     public AjaxResult delete(@RequestBody List<Long> ids) {
-        if(CollectionUtils.isEmpty(ids)){
+        if (CollectionUtils.isEmpty(ids)) {
             return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
         }
         return AjaxResult.success(stockInRecordService.batchDelete(ids));
@@ -45,7 +65,7 @@
     @PostMapping("/exportStockInRecord")
     @ApiOperation("瀵煎嚭鍏ュ簱璁板綍")
     public void exportStockInRecord(HttpServletResponse response, StockInRecordDto stockInRecordDto) {
-        stockInRecordService.exportStockInRecord(response,stockInRecordDto);
+        stockInRecordService.exportStockInRecord(response, stockInRecordDto);
     }
 
 }
diff --git a/src/main/java/com/ruoyi/stock/mapper/StockInRecordMapper.java b/src/main/java/com/ruoyi/stock/mapper/StockInRecordMapper.java
index afc30ae..f9d52d2 100644
--- a/src/main/java/com/ruoyi/stock/mapper/StockInRecordMapper.java
+++ b/src/main/java/com/ruoyi/stock/mapper/StockInRecordMapper.java
@@ -14,4 +14,6 @@
     IPage<StockInRecordDto> listPage(Page page, @Param("params") StockInRecordDto stockInRecordDto);
 
     List<StockInRecordExportData> listStockInRecordExportData(@Param("params") StockInRecordDto stockInRecordDto);
+
+    StockInRecordDto selectByRecord(@Param("id")Long id);
 }
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java b/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
index 395d18f..5769540 100644
--- a/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
+++ b/src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.annotation.*;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -62,4 +63,16 @@
     @ApiModelProperty(value = "淇敼鐢ㄦ埛")
     @TableField(fill = FieldFill.INSERT_UPDATE)
     private Integer updateUser;
+
+    @ApiModelProperty("琚鍗曢攣瀹氭暟閲�")
+    private BigDecimal lockedQuantity;
+
+    @ApiModelProperty("棰勮鏁伴噺")
+    private BigDecimal warnNum;
+    /**
+     * 瀹℃壒鐘舵�侊細0寰呭鏍革紝1瀹℃牳涓紝2瀹℃牳瀹屾垚 3瀹℃牳鏈�氳繃 4宸查噸鏂版彁浜�
+     */
+    @ApiModelProperty(value = "瀹℃壒鐘舵�侊細0寰呭鏍革紝1瀹℃牳涓紝2瀹℃牳瀹屾垚 3瀹℃牳鏈�氳繃 4宸查噸鏂版彁浜�")
+    @Excel(name = "瀹℃壒鐘舵��", readConverterExp = "0=寰呭鏍�,1=瀹℃牳涓�,2=瀹℃牳瀹屾垚,3=瀹℃牳鏈�氳繃,4=宸查噸鏂版彁浜�")
+    private Integer approveStatus;
 }
diff --git a/src/main/java/com/ruoyi/stock/service/StockInRecordService.java b/src/main/java/com/ruoyi/stock/service/StockInRecordService.java
index 29ba7e5..7e56494 100644
--- a/src/main/java/com/ruoyi/stock/service/StockInRecordService.java
+++ b/src/main/java/com/ruoyi/stock/service/StockInRecordService.java
@@ -19,4 +19,8 @@
     int batchDelete(List<Long> ids);
 
     void exportStockInRecord(HttpServletResponse response, StockInRecordDto stockInRecordDto);
+
+    StockInRecordDto selectByRecord(Long id);
+
+    int updateStockInRecord(StockInRecordDto stockInRecordDto);
 }
diff --git a/src/main/java/com/ruoyi/stock/service/StockInventoryService.java b/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
index 65dcca3..24c7053 100644
--- a/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
+++ b/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
@@ -3,9 +3,11 @@
 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.security.LoginUser;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.dto.StockInventoryDto;
+import com.ruoyi.stock.pojo.StockInRecord;
 import com.ruoyi.stock.pojo.StockInventory;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -38,4 +40,8 @@
     Boolean frozenStock(StockInventoryDto stockInventoryDto);
 
     Boolean thawStock(StockInventoryDto stockInventoryDto);
+
+    void updateOrCreateStockInventory(StockInRecord stockInRecord);
+
+    void addApproveByPurchase(LoginUser loginUser, StockInRecordDto stockInRecordDto) throws Exception;
 }
diff --git a/src/main/java/com/ruoyi/stock/service/StockUninventoryService.java b/src/main/java/com/ruoyi/stock/service/StockUninventoryService.java
index 0d6ba6d..92fc0ab 100644
--- a/src/main/java/com/ruoyi/stock/service/StockUninventoryService.java
+++ b/src/main/java/com/ruoyi/stock/service/StockUninventoryService.java
@@ -5,6 +5,7 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.dto.StockUninventoryDto;
+import com.ruoyi.stock.pojo.StockInRecord;
 import com.ruoyi.stock.pojo.StockUninventory;
 
 import javax.servlet.http.HttpServletResponse;
@@ -30,4 +31,6 @@
     Boolean frozenStock(StockInventoryDto stockInventoryDto);
 
     Boolean thawStock(StockInventoryDto stockInventoryDto);
+
+    void updateOrCreateStockUninventory(StockInRecord stockInRecord);
 }
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
index 30e545f..73b3a42 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -4,13 +4,15 @@
 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.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.EnumUtil;
 import com.ruoyi.common.utils.OrderUtils;
+import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.security.LoginUser;
 import com.ruoyi.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.dto.StockUninventoryDto;
@@ -22,7 +24,8 @@
 import com.ruoyi.stock.pojo.StockInventory;
 import com.ruoyi.stock.pojo.StockUninventory;
 import com.ruoyi.stock.service.StockInRecordService;
-import lombok.AllArgsConstructor;
+import com.ruoyi.stock.service.StockInventoryService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -30,12 +33,16 @@
 import java.util.List;
 
 @Service
-@AllArgsConstructor
 public class StockInRecordServiceImpl extends ServiceImpl<StockInRecordMapper, StockInRecord> implements StockInRecordService {
 
+    @Autowired
     private StockInRecordMapper stockInRecordMapper;
+    @Autowired
     private StockInventoryMapper stockInventoryMapper;
+    @Autowired
     private StockUninventoryMapper stockUninventoryMapper;
+    @Autowired
+    private StockInventoryService stockInventoryService;
 
     @Override
     public IPage<StockInRecordDto> listPage(Page page, StockInRecordDto stockInRecordDto) {
@@ -58,7 +65,7 @@
     public int update(Long id, StockInRecordDto stockInRecordDto) {
         // 鍒ゆ柇瀵硅薄鏄惁瀛樺湪
         StockInRecord stockInRecord = stockInRecordMapper.selectById(id);
-        if (stockInRecord == null){
+        if (stockInRecord == null) {
             throw new BaseException("璇ュ叆搴撹褰曚笉瀛樺湪,鏃犳硶鏇存柊!!!");
         }
 
@@ -76,17 +83,17 @@
                 StockInventory stockInventory = stockInventoryMapper.selectOne(new LambdaQueryWrapper<StockInventory>().eq(StockInventory::getProductModelId, stockInRecord.getProductModelId()));
                 if (stockInventory == null) {
                     throw new BaseException("搴撳瓨璁板綍涓病鏈夊搴旂殑浜у搧,鏃犳硶鍒犻櫎!!!");
-                }else {
+                } else {
                     StockInventoryDto stockInRecordDto = new StockInventoryDto();
                     stockInRecordDto.setProductModelId(stockInventory.getProductModelId());
                     stockInRecordDto.setQualitity(stockInRecord.getStockInNum());
                     stockInventoryMapper.updateSubtractStockInventory(stockInRecordDto);
                 }
-            }else if (stockInRecord.getType().equals("1")) {
+            } else if (stockInRecord.getType().equals("1")) {
                 StockUninventory stockUninventory = stockUninventoryMapper.selectOne(new LambdaQueryWrapper<StockUninventory>().eq(StockUninventory::getProductModelId, stockInRecord.getProductModelId()));
                 if (stockUninventory == null) {
                     throw new BaseException("搴撳瓨璁板綍涓病鏈夊搴旂殑浜у搧,鏃犳硶鍒犻櫎!!!");
-                }else {
+                } else {
                     StockUninventoryDto stockUninventoryDto = new StockUninventoryDto();
                     stockUninventoryDto.setProductModelId(stockUninventory.getProductModelId());
                     stockUninventoryDto.setQualitity(stockInRecord.getStockInNum());
@@ -103,11 +110,28 @@
         for (StockInRecordExportData stockInRecordExportData : list) {
             if (stockInRecordExportData.getType().equals("0")) {
                 stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockOutQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue());
-            }else {
+            } else {
                 stockInRecordExportData.setRecordType(EnumUtil.fromCode(StockInUnQualifiedRecordTypeEnum.class, Integer.parseInt(stockInRecordExportData.getRecordType())).getValue());
             }
         }
         ExcelUtil<StockInRecordExportData> util = new ExcelUtil<>(StockInRecordExportData.class);
-        util.exportExcel(response,list, "鍏ュ簱璁板綍淇℃伅");
+        util.exportExcel(response, list, "鍏ュ簱璁板綍淇℃伅");
+    }
+
+    @Override
+    public StockInRecordDto selectByRecord(Long id) {
+        return stockInRecordMapper.selectByRecord(id);
+    }
+
+    @Override
+    public int updateStockInRecord(StockInRecordDto stockInRecordDto) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        try {
+            stockInventoryService.addApproveByPurchase(loginUser, stockInRecordDto);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        stockInRecordDto.setApproveStatus(2);
+        return stockInRecordMapper.updateById(stockInRecordDto);
     }
 }
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
index 5cb6dda..e6aa3c3 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -1,13 +1,17 @@
 package com.ruoyi.stock.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl;
+import com.ruoyi.approve.vo.ApproveProcessVO;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
+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.R;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
@@ -16,18 +20,21 @@
 import com.ruoyi.stock.dto.StockOutRecordDto;
 import com.ruoyi.stock.execl.StockInventoryExportData;
 import com.ruoyi.stock.mapper.StockInventoryMapper;
+import com.ruoyi.stock.pojo.StockInRecord;
 import com.ruoyi.stock.pojo.StockInventory;
 import com.ruoyi.stock.service.StockInRecordService;
 import com.ruoyi.stock.service.StockInventoryService;
 import com.ruoyi.stock.service.StockOutRecordService;
-import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -39,19 +46,25 @@
  * @since 2026-01-21 04:16:36
  */
 @Service
-@AllArgsConstructor
 public class StockInventoryServiceImpl extends ServiceImpl<StockInventoryMapper, StockInventory> implements StockInventoryService {
 
-    private  StockInventoryMapper stockInventoryMapper;
+    @Autowired
+    private StockInventoryMapper stockInventoryMapper;
+    @Autowired
     private StockInRecordService stockInRecordService;
+    @Autowired
     private StockOutRecordService stockOutRecordService;
+    @Autowired
     private SalesLedgerProductMapper salesLedgerProductMapper;
+    @Autowired
+    private ApproveProcessServiceImpl approveProcessService;
+
     @Override
     public IPage<StockInventoryDto> pagestockInventory(Page page, StockInventoryDto stockInventoryDto) {
         return stockInventoryMapper.pagestockInventory(page, stockInventoryDto);
     }
 
-    //鍏ュ簱璋冪敤
+    //鍏ュ簱璋冪敤-娣诲姞鍏ュ簱璁板綍
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean addstockInventory(StockInventoryDto stockInventoryDto) {
@@ -61,24 +74,76 @@
         stockInRecordDto.setRecordType(stockInventoryDto.getRecordType());
         stockInRecordDto.setStockInNum(stockInventoryDto.getQualitity());
         stockInRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
+        stockInRecordDto.setRemark(stockInventoryDto.getRemark());
+        stockInRecordDto.setWarnNum(stockInventoryDto.getWarnNum());
+        stockInRecordDto.setLockedQuantity(stockInventoryDto.getLockedQuantity());
         stockInRecordDto.setType("0");
-        stockInRecordService.add(stockInRecordDto);
-        //鍐嶈繘琛屾柊澧炲簱瀛樻暟閲忓簱瀛�
-        //鍏堟煡璇㈠簱瀛樿〃涓殑浜у搧鏄惁瀛樺湪锛屼笉瀛樺湪鏂板锛屽瓨鍦ㄦ洿鏂�
-        StockInventory oldStockInventory = stockInventoryMapper.selectOne(new QueryWrapper<StockInventory>().lambda().eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId()));
-        if (ObjectUtils.isEmpty(oldStockInventory)) {
-            StockInventory newStockInventory = new StockInventory();
-            newStockInventory.setProductModelId(stockInventoryDto.getProductModelId());
-            newStockInventory.setQualitity(stockInventoryDto.getQualitity());
-            newStockInventory.setVersion(1);
-            newStockInventory.setRemark(stockInventoryDto.getRemark());
-            newStockInventory.setLockedQuantity(stockInventoryDto.getLockedQuantity());
-            newStockInventory.setWarnNum(stockInventoryDto.getWarnNum());
-            stockInventoryMapper.insert(newStockInventory);
-        }else {
-             stockInventoryMapper.updateAddStockInventory(stockInventoryDto);
+        int add = stockInRecordService.add(stockInRecordDto);
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        if (add > 0) {
+            try {
+                addApproveByPurchase(loginUser, stockInRecordDto);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
         }
         return true;
+    }
+
+    public void addApproveByPurchase(LoginUser loginUser, StockInRecordDto stockInRecordDto) throws Exception {
+        ApproveProcessVO approveProcessVO = new ApproveProcessVO();
+        approveProcessVO.setApproveType(9);
+        approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId());
+        approveProcessVO.setApproveReason(stockInRecordDto.getInboundBatches());
+        approveProcessVO.setApproveUserIds(String.valueOf(1));
+        approveProcessVO.setApproveUser(loginUser.getUserId());
+        approveProcessVO.setApproveTime(LocalDate.now().toString());
+        approveProcessVO.setInventoryReview(false);
+        approveProcessVO.setStorageType("鍚堟牸鍏ュ簱");
+        approveProcessVO.setRecordId(stockInRecordDto.getId());
+        approveProcessService.addApprove(approveProcessVO);
+    }
+
+    /**
+     * 瀹為檯鍏ュ簱
+     *
+     * @param stockInRecord
+     */
+    public void updateOrCreateStockInventory(StockInRecord stockInRecord) {
+        // 鍏堟煡璇㈠簱瀛樿〃涓殑浜у搧鏄惁瀛樺湪
+        StockInventory oldStockInventory = stockInventoryMapper.selectOne(
+                new QueryWrapper<StockInventory>().lambda()
+                        .eq(StockInventory::getProductModelId, stockInRecord.getProductModelId())
+        );
+
+        if (ObjectUtils.isEmpty(oldStockInventory)) {
+            // 涓嶅瓨鍦ㄥ垯鏂板
+            StockInventory newStockInventory = new StockInventory();
+            newStockInventory.setProductModelId(stockInRecord.getProductModelId());
+            newStockInventory.setQualitity(stockInRecord.getStockInNum());
+            newStockInventory.setVersion(1);
+            newStockInventory.setRemark(stockInRecord.getRemark());
+            newStockInventory.setLockedQuantity(stockInRecord.getLockedQuantity());
+            newStockInventory.setWarnNum(stockInRecord.getWarnNum());
+            stockInventoryMapper.insert(newStockInventory);
+        } else {
+            // 瀛樺湪鍒欐洿鏂�
+            LambdaUpdateWrapper<StockInventory> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper
+                    .eq(StockInventory::getProductModelId, stockInRecord.getProductModelId())
+                    .setSql(stockInRecord.getStockInNum() != null,
+                            "qualitity = qualitity + " + stockInRecord.getStockInNum())
+                    .setSql(true, "version = version + 1")
+                    .set(stockInRecord.getRemark() != null && !stockInRecord.getRemark().isEmpty(),
+                            StockInventory::getRemark, stockInRecord.getRemark())
+                    .set(stockInRecord.getWarnNum() != null,
+                            StockInventory::getWarnNum, stockInRecord.getWarnNum())
+                    .setSql(stockInRecord.getLockedQuantity() != null,
+                            "locked_quantity = locked_quantity + " + stockInRecord.getLockedQuantity())
+                    .set(StockInventory::getUpdateTime, new Date());
+
+            stockInventoryMapper.update(null, updateWrapper);
+        }
     }
 
     //鍑哄簱璋冪敤
@@ -132,7 +197,7 @@
                         stockInventoryDto.setQualitity(dto.getQualitity());
                         stockInventoryDto.setRemark(dto.getRemark());
                         stockInventoryDto.setWarnNum(dto.getWarnNum());
-                        if (ObjectUtils.isNotEmpty(dto.getLockedQuantity())&&dto.getLockedQuantity().compareTo(dto.getQualitity())>0) {
+                        if (ObjectUtils.isNotEmpty(dto.getLockedQuantity()) && dto.getLockedQuantity().compareTo(dto.getQualitity()) > 0) {
                             throw new RuntimeException("鍐荤粨鏁伴噺涓嶈兘瓒呰繃鏈瀵煎叆鐨勫簱瀛樻暟閲�");
                         }
                         stockInventoryDto.setLockedQuantity(dto.getLockedQuantity());
@@ -171,28 +236,28 @@
 
         List<StockInventoryExportData> list = stockInventoryMapper.listStockInventoryExportData(stockInventoryDto);
         ExcelUtil<StockInventoryExportData> util = new ExcelUtil<>(StockInventoryExportData.class);
-        util.exportExcel(response,list, "搴撳瓨淇℃伅");
+        util.exportExcel(response, list, "搴撳瓨淇℃伅");
     }
 
     @Override
     public IPage<StockInRecordDto> stockInventoryPage(StockInventoryDto stockInventoryDto, Page page) {
-        return stockInventoryMapper.stockInventoryPage(stockInventoryDto,page);
+        return stockInventoryMapper.stockInventoryPage(stockInventoryDto, page);
     }
 
     @Override
     public IPage<StockInventoryDto> stockInAndOutRecord(StockInventoryDto stockInventoryDto, Page page) {
-        return stockInventoryMapper.stockInAndOutRecord(stockInventoryDto,page);
+        return stockInventoryMapper.stockInAndOutRecord(stockInventoryDto, page);
     }
 
     @Override
     public Boolean frozenStock(StockInventoryDto stockInventoryDto) {
         StockInventory stockInventory = stockInventoryMapper.selectById(stockInventoryDto.getId());
-        if (stockInventory.getQualitity().compareTo(stockInventoryDto.getLockedQuantity())<0) {
+        if (stockInventory.getQualitity().compareTo(stockInventoryDto.getLockedQuantity()) < 0) {
             throw new RuntimeException("鍐荤粨鏁伴噺涓嶈兘瓒呰繃搴撳瓨鏁伴噺");
         }
         if (ObjectUtils.isEmpty(stockInventory.getLockedQuantity())) {
             stockInventory.setLockedQuantity(stockInventoryDto.getLockedQuantity());
-        }else {
+        } else {
             stockInventory.setLockedQuantity(stockInventory.getLockedQuantity().add(stockInventoryDto.getLockedQuantity()));
         }
         return this.updateById(stockInventory);
@@ -201,7 +266,7 @@
     @Override
     public Boolean thawStock(StockInventoryDto stockInventoryDto) {
         StockInventory stockInventory = stockInventoryMapper.selectById(stockInventoryDto.getId());
-        if (stockInventory.getLockedQuantity().compareTo(stockInventoryDto.getLockedQuantity())<0) {
+        if (stockInventory.getLockedQuantity().compareTo(stockInventoryDto.getLockedQuantity()) < 0) {
             throw new RuntimeException("瑙e喕鏁伴噺涓嶈兘瓒呰繃鍐荤粨鏁伴噺");
         }
         stockInventory.setLockedQuantity(stockInventory.getLockedQuantity().subtract(stockInventoryDto.getLockedQuantity()));
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java
index 2d5b8f5..ab630bb 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java
@@ -1,17 +1,23 @@
 package com.ruoyi.stock.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl;
+import com.ruoyi.approve.vo.ApproveProcessVO;
+import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.security.LoginUser;
 import com.ruoyi.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.dto.StockOutRecordDto;
 import com.ruoyi.stock.dto.StockUninventoryDto;
 import com.ruoyi.stock.execl.StockUnInventoryExportData;
 import com.ruoyi.stock.mapper.StockUninventoryMapper;
+import com.ruoyi.stock.pojo.StockInRecord;
 import com.ruoyi.stock.pojo.StockUninventory;
 import com.ruoyi.stock.service.StockInRecordService;
 import com.ruoyi.stock.service.StockOutRecordService;
@@ -21,6 +27,8 @@
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.servlet.http.HttpServletResponse;
+import java.time.LocalDate;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -38,6 +46,7 @@
     private StockUninventoryMapper stockUninventoryMapper;
     private StockOutRecordService stockOutRecordService;
     private StockInRecordService stockInRecordService;
+    private ApproveProcessServiceImpl approveProcessService;
 
     @Override
     public IPage<StockUninventoryDto> pageStockUninventory(Page page, StockUninventoryDto stockUninventoryDto) {
@@ -53,24 +62,71 @@
         stockInRecordDto.setRecordType(stockUninventoryDto.getRecordType());
         stockInRecordDto.setStockInNum(stockUninventoryDto.getQualitity());
         stockInRecordDto.setProductModelId(stockUninventoryDto.getProductModelId());
+        stockInRecordDto.setRemark(stockUninventoryDto.getRemark());
         stockInRecordDto.setType("1");
-        stockInRecordService.add(stockInRecordDto);
-        //鍐嶈繘琛屾柊澧炲簱瀛樻暟閲忓簱瀛�
-        //鍏堟煡璇㈠簱瀛樿〃涓殑浜у搧鏄惁瀛樺湪锛屼笉瀛樺湪鏂板锛屽瓨鍦ㄦ洿鏂�
-        StockUninventory oldStockUnInventory = stockUninventoryMapper.selectOne(new QueryWrapper<StockUninventory>().lambda().eq(StockUninventory::getProductModelId, stockUninventoryDto.getProductModelId()));
-        if (ObjectUtils.isEmpty(oldStockUnInventory)) {
-            StockUninventory newStockUnInventory = new StockUninventory();
-            newStockUnInventory.setProductModelId(stockUninventoryDto.getProductModelId());
-            newStockUnInventory.setQualitity(stockUninventoryDto.getQualitity());
-            newStockUnInventory.setVersion(1);
-            newStockUnInventory.setRemark(stockUninventoryDto.getRemark());
-            stockUninventoryMapper.insert(newStockUnInventory);
-        }else {
-            stockUninventoryMapper.updateAddStockUnInventory(stockUninventoryDto);
+        int add = stockInRecordService.add(stockInRecordDto);
+
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        if (add > 0){
+            try {
+                addApproveByPurchase(loginUser,stockInRecordDto);
+            }catch (Exception e){
+                e.printStackTrace();
+            }
         }
+
         return 1;
     }
 
+    public void addApproveByPurchase(LoginUser loginUser, StockInRecordDto stockInRecordDto) throws Exception {
+        ApproveProcessVO approveProcessVO = new ApproveProcessVO();
+        approveProcessVO.setApproveType(9);
+        approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId());
+        approveProcessVO.setApproveReason(stockInRecordDto.getInboundBatches());
+        approveProcessVO.setApproveUserIds(String.valueOf(1));
+        approveProcessVO.setApproveUser(loginUser.getUserId());
+        approveProcessVO.setApproveTime(LocalDate.now().toString());
+        approveProcessVO.setInventoryReview(false);
+        approveProcessVO.setStorageType("涓嶅悎鏍煎叆搴�");
+        approveProcessVO.setRecordId(stockInRecordDto.getId());
+        approveProcessService.addApprove(approveProcessVO);
+    }
+
+    /**
+     * 鏇存柊鎴栧垱寤洪潪鑹搧搴撳瓨淇℃伅
+     * @param stockInRecord 闈炶壇鍝佸簱瀛楧TO瀵硅薄
+     */
+    public void updateOrCreateStockUninventory(StockInRecord stockInRecord) {
+        // 鍏堟煡璇㈠簱瀛樿〃涓殑浜у搧鏄惁瀛樺湪
+        StockUninventory oldStockUnInventory = stockUninventoryMapper.selectOne(
+                new QueryWrapper<StockUninventory>().lambda()
+                        .eq(StockUninventory::getProductModelId, stockInRecord.getProductModelId())
+        );
+
+        if (ObjectUtils.isEmpty(oldStockUnInventory)) {
+            // 涓嶅瓨鍦ㄥ垯鏂板
+            StockUninventory newStockUnInventory = new StockUninventory();
+            newStockUnInventory.setProductModelId(stockInRecord.getProductModelId());
+            newStockUnInventory.setQualitity(stockInRecord.getStockInNum());
+            newStockUnInventory.setVersion(1);
+            newStockUnInventory.setRemark(stockInRecord.getRemark());
+            stockUninventoryMapper.insert(newStockUnInventory);
+        } else {
+            LambdaUpdateWrapper<StockUninventory> updateWrapper = new LambdaUpdateWrapper<>();
+            if (stockInRecord.getStockInNum() != null) {
+                updateWrapper.setSql("qualitity = qualitity + " + stockInRecord.getStockInNum());
+            }
+            updateWrapper.setSql("version = version + 1");
+            String remark = stockInRecord.getRemark();
+            if (remark != null && !remark.isEmpty()) {
+                updateWrapper.set(StockUninventory::getRemark, remark);
+            }
+            updateWrapper.set(StockUninventory::getUpdateTime, new Date());
+            updateWrapper.eq(StockUninventory::getProductModelId, stockInRecord.getProductModelId());
+            stockUninventoryMapper.update(null, updateWrapper);
+        }
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Integer subtractStockUninventory(StockUninventoryDto stockUninventoryDto) {
diff --git a/src/main/resources/mapper/stock/StockInRecordMapper.xml b/src/main/resources/mapper/stock/StockInRecordMapper.xml
index d5c3f38..7dd8377 100644
--- a/src/main/resources/mapper/stock/StockInRecordMapper.xml
+++ b/src/main/resources/mapper/stock/StockInRecordMapper.xml
@@ -56,4 +56,18 @@
         </where>
         order by sir.id desc
     </select>
+    <select id="selectByRecord" resultType="com.ruoyi.stock.dto.StockInRecordDto">
+        SELECT
+            sir.*,
+            p.product_name as product_name,
+            pm.model,
+            pm.unit,
+            u.nick_name as createBy
+        FROM stock_in_record as sir
+                 LEFT JOIN product_model as pm on sir.product_model_id = pm.id
+                 LEFT JOIN product as p on pm.product_id = p.id
+                 LEFT JOIN sys_user as u on sir.create_user = u.user_id
+        WHERE sir.id= #{id}
+        order by sir.id desc
+    </select>
 </mapper>
\ No newline at end of file

--
Gitblit v1.9.3