From 4ed6929b3c8e8d12b64dade132ffd8023cbb73b3 Mon Sep 17 00:00:00 2001
From: maven <2163098428@qq.com>
Date: 星期二, 27 一月 2026 17:29:05 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_New' into dev_New

---
 src/main/java/com/ruoyi/stock/pojo/StockInventory.java                                |   10 
 src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java              |   15 
 src/main/java/com/ruoyi/stock/service/StockInventoryService.java                      |    6 
 src/main/java/com/ruoyi/home/controller/HomeController.java                           |   46 ++
 src/main/java/com/ruoyi/home/dto/CustomerRevenueAnalysisDto.java                      |   19 +
 src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java              |    3 
 src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java                        |  445 ++++++++++++++++++++++++-
 src/main/java/com/ruoyi/stock/controller/StockInRecordController.java                 |    1 
 src/main/java/com/ruoyi/stock/execl/StockUnInventoryExportData.java                   |   36 ++
 src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java                |    2 
 src/main/java/com/ruoyi/home/dto/ProductCategoryDistributionDto.java                  |   49 ++
 src/main/resources/mapper/stock/StockUninventoryMapper.xml                            |   22 
 src/main/java/com/ruoyi/home/dto/HomeSummaryDto.java                                  |   31 +
 src/main/java/com/ruoyi/stock/service/StockUninventoryService.java                    |    7 
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java             |   38 ++
 src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java          |    2 
 src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java                              |    2 
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java |    6 
 src/main/java/com/ruoyi/home/dto/DeptStaffDistributionDto.java                        |   22 +
 src/main/resources/mapper/stock/StockInventoryMapper.xml                              |   48 +
 src/main/java/com/ruoyi/home/dto/CustomerContributionRankingDto.java                  |   21 +
 src/main/java/com/ruoyi/stock/dto/StockUninventoryDto.java                            |    4 
 src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java             |    2 
 src/main/java/com/ruoyi/stock/mapper/StockUninventoryMapper.java                      |    6 
 src/main/java/com/ruoyi/home/dto/SupplierPurchaseRankingDto.java                      |   21 +
 src/main/java/com/ruoyi/stock/controller/StockInventoryController.java                |   13 
 src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java              |   19 
 src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java                               |    1 
 src/main/java/com/ruoyi/stock/execl/StockInventoryExportData.java                     |   11 
 src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java                        |    2 
 src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java           |   36 +
 src/main/java/com/ruoyi/home/service/HomeService.java                                 |   12 
 src/main/java/com/ruoyi/stock/pojo/StockUninventory.java                              |   18 
 33 files changed, 862 insertions(+), 114 deletions(-)

diff --git a/src/main/java/com/ruoyi/home/controller/HomeController.java b/src/main/java/com/ruoyi/home/controller/HomeController.java
index edda887..d6fe834 100644
--- a/src/main/java/com/ruoyi/home/controller/HomeController.java
+++ b/src/main/java/com/ruoyi/home/controller/HomeController.java
@@ -1,7 +1,5 @@
 package com.ruoyi.home.controller;
 
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.approve.pojo.ApproveProcess;
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
@@ -9,9 +7,6 @@
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.home.dto.*;
 import com.ruoyi.home.service.HomeService;
-import com.ruoyi.production.dto.ProductOrderDto;
-import com.ruoyi.production.dto.ProductWorkOrderDto;
-import com.ruoyi.production.dto.SalesLedgerWorkDto;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -59,6 +54,47 @@
         return AjaxResult.success(count);
     }
 
+    @GetMapping("/deptStaffDistribution")
+    @ApiOperation("鍚勯儴闂ㄤ汉鍛樺垎甯�")
+    public AjaxResult deptStaffDistribution() {
+        DeptStaffDistributionDto dto = homeService.deptStaffDistribution();
+        return AjaxResult.success(dto);
+    }
+
+    @GetMapping("/summaryStatistics")
+    @ApiOperation("鍛樺伐-瀹㈡埛-渚涘簲鍟嗘�绘暟")
+    public AjaxResult summaryStatistics() {
+        HomeSummaryDto homeSummaryDto = homeService.summaryStatistics();
+        return AjaxResult.success(homeSummaryDto);
+    }
+
+    @GetMapping("/supplierPurchaseRanking")
+    @ApiOperation("渚涘簲鍟嗛噰璐帓鍚�")
+    public AjaxResult supplierPurchaseRanking(@RequestParam(value = "type", defaultValue = "0") Integer type) {
+        List<SupplierPurchaseRankingDto> list = homeService.supplierPurchaseRanking(type);
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/customerRevenueAnalysis")
+    @ApiOperation("瀹㈡埛钀ユ敹璐$尞鏁板�煎垎鏋�")
+    public AjaxResult customerRevenueAnalysis(@RequestParam("customerId") Long customerId, @RequestParam(value = "type", defaultValue = "0") Integer type) {
+        CustomerRevenueAnalysisDto dto = homeService.customerRevenueAnalysis(customerId, type);
+        return AjaxResult.success(dto);
+    }
+
+    @GetMapping("/productCategoryDistribution")
+    @ApiOperation("浜у搧澶х被鍒嗗竷")
+    public AjaxResult productCategoryDistribution() {
+        ProductCategoryDistributionDto dto = homeService.productCategoryDistribution();
+        return AjaxResult.success(dto);
+    }
+
+    @GetMapping("/customerContributionRanking")
+    @ApiOperation("瀹㈡埛閲戦璐$尞鎺掑悕")
+    public AjaxResult customerContributionRanking(@RequestParam(value = "type", defaultValue = "1") Integer type) {
+        List<CustomerContributionRankingDto> list = homeService.customerContributionRanking(type);
+        return AjaxResult.success(list);
+    }
 
     /********************************************************钀ラ攢閲囪喘绫�**************************************************/
     @GetMapping("/business")
diff --git a/src/main/java/com/ruoyi/home/dto/CustomerContributionRankingDto.java b/src/main/java/com/ruoyi/home/dto/CustomerContributionRankingDto.java
new file mode 100644
index 0000000..2b6468d
--- /dev/null
+++ b/src/main/java/com/ruoyi/home/dto/CustomerContributionRankingDto.java
@@ -0,0 +1,21 @@
+package com.ruoyi.home.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 瀹㈡埛閲戦璐$尞鎺掑悕DTO
+ */
+@Data
+@ApiModel("瀹㈡埛閲戦璐$尞鎺掑悕")
+public class CustomerContributionRankingDto {
+
+    @ApiModelProperty("瀹㈡埛鍚嶇О")
+    private String customerName;
+
+    @ApiModelProperty("鍚堝悓鎬婚噾棰�")
+    private BigDecimal totalAmount;
+}
diff --git a/src/main/java/com/ruoyi/home/dto/CustomerRevenueAnalysisDto.java b/src/main/java/com/ruoyi/home/dto/CustomerRevenueAnalysisDto.java
new file mode 100644
index 0000000..1bad069
--- /dev/null
+++ b/src/main/java/com/ruoyi/home/dto/CustomerRevenueAnalysisDto.java
@@ -0,0 +1,19 @@
+package com.ruoyi.home.dto;
+
+import com.ruoyi.dto.MapDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 瀹㈡埛钀ユ敹璐$尞鏁板�煎垎鏋怐TO
+ */
+@Data
+@ApiModel("瀹㈡埛钀ユ敹璐$尞鏁板�煎垎鏋�")
+public class CustomerRevenueAnalysisDto {
+
+    @ApiModelProperty("鍒嗘瀽鏉$洰鍒楄〃")
+    private List<MapDto> items;
+}
diff --git a/src/main/java/com/ruoyi/home/dto/DeptStaffDistributionDto.java b/src/main/java/com/ruoyi/home/dto/DeptStaffDistributionDto.java
new file mode 100644
index 0000000..4ead293
--- /dev/null
+++ b/src/main/java/com/ruoyi/home/dto/DeptStaffDistributionDto.java
@@ -0,0 +1,22 @@
+package com.ruoyi.home.dto;
+
+import com.ruoyi.dto.MapDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 閮ㄩ棬浜哄憳鍒嗗竷缁熻DTO
+ */
+@Data
+@ApiModel("閮ㄩ棬浜哄憳鍒嗗竷缁熻")
+public class DeptStaffDistributionDto {
+
+    @ApiModelProperty("閮ㄩ棬鎬讳汉鏁�")
+    private Long total;
+
+    @ApiModelProperty("閮ㄩ棬鍒嗗竷鍒楄〃")
+    private List<MapDto> items;
+}
diff --git a/src/main/java/com/ruoyi/home/dto/HomeSummaryDto.java b/src/main/java/com/ruoyi/home/dto/HomeSummaryDto.java
new file mode 100644
index 0000000..9d8863b
--- /dev/null
+++ b/src/main/java/com/ruoyi/home/dto/HomeSummaryDto.java
@@ -0,0 +1,31 @@
+package com.ruoyi.home.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 棣栭〉姹囨�荤粺璁TO
+ */
+@Data
+@ApiModel("棣栭〉姹囨�荤粺璁�")
+public class HomeSummaryDto {
+
+    @ApiModelProperty("鎬诲伐浣滀汉鍛�")
+    private Long totalStaff;
+
+    @ApiModelProperty("鎬诲伐浣滀汉鍛樺悓姣斿闀跨巼")
+    private String staffGrowthRate;
+
+    @ApiModelProperty("鎬诲鎴锋暟")
+    private Long totalCustomer;
+
+    @ApiModelProperty("鎬诲鎴峰悓姣斿闀跨巼")
+    private String customerGrowthRate;
+
+    @ApiModelProperty("鎬讳緵搴斿晢鏁�")
+    private Long totalSupplier;
+
+    @ApiModelProperty("鎬讳緵搴斿晢鍚屾瘮澧為暱鐜�")
+    private String supplierGrowthRate;
+}
diff --git a/src/main/java/com/ruoyi/home/dto/ProductCategoryDistributionDto.java b/src/main/java/com/ruoyi/home/dto/ProductCategoryDistributionDto.java
new file mode 100644
index 0000000..5b11452
--- /dev/null
+++ b/src/main/java/com/ruoyi/home/dto/ProductCategoryDistributionDto.java
@@ -0,0 +1,49 @@
+package com.ruoyi.home.dto;
+
+import com.ruoyi.dto.MapDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 浜у搧澶х被鍒嗗竷缁熻DTO
+ */
+@Data
+@ApiModel("浜у搧澶х被鍒嗗竷缁熻")
+public class ProductCategoryDistributionDto {
+
+    @ApiModelProperty("澶х被鍒嗗竷鍒楄〃")
+    private List<MajorCategoryDto> items;
+
+    @Data
+    public static class MajorCategoryDto {
+        @ApiModelProperty("澶х被鍚嶇О")
+        private String name;
+
+        @ApiModelProperty("搴撳瓨鎬绘暟")
+        private String value;
+
+        @ApiModelProperty("鍗犳瘮")
+        private String rate;
+
+        @ApiModelProperty("灏忕被鍒嗗竷璇︽儏")
+        private List<MinorCategoryDto> children;
+    }
+
+    @Data
+    public static class MinorCategoryDto {
+        @ApiModelProperty("灏忕被鍚嶇О")
+        private String name;
+
+        @ApiModelProperty("搴撳瓨鏁伴噺")
+        private String value;
+
+        @ApiModelProperty("鍗犳瘮")
+        private String rate;
+
+        @ApiModelProperty("鍨嬪彿鍒嗗竷璇︽儏")
+        private List<MapDto> children;
+    }
+}
diff --git a/src/main/java/com/ruoyi/home/dto/SupplierPurchaseRankingDto.java b/src/main/java/com/ruoyi/home/dto/SupplierPurchaseRankingDto.java
new file mode 100644
index 0000000..db9c370
--- /dev/null
+++ b/src/main/java/com/ruoyi/home/dto/SupplierPurchaseRankingDto.java
@@ -0,0 +1,21 @@
+package com.ruoyi.home.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 渚涘簲鍟嗛噰璐帓鍚岲TO
+ */
+@Data
+@ApiModel("渚涘簲鍟嗛噰璐帓鍚�")
+public class SupplierPurchaseRankingDto {
+
+    @ApiModelProperty("渚涘簲鍟嗗悕绉�")
+    private String supplierName;
+
+    @ApiModelProperty("閲囪喘鎬婚噾棰�")
+    private BigDecimal totalAmount;
+}
diff --git a/src/main/java/com/ruoyi/home/service/HomeService.java b/src/main/java/com/ruoyi/home/service/HomeService.java
index 2dbab27..db43d86 100644
--- a/src/main/java/com/ruoyi/home/service/HomeService.java
+++ b/src/main/java/com/ruoyi/home/service/HomeService.java
@@ -33,4 +33,16 @@
 
     ProductionProgressDto productionProgress();
     ProductionTurnoverDto workInProcessTurnover();
+
+    DeptStaffDistributionDto deptStaffDistribution();
+
+    HomeSummaryDto summaryStatistics();
+
+    List<SupplierPurchaseRankingDto> supplierPurchaseRanking(Integer type);
+
+    CustomerRevenueAnalysisDto customerRevenueAnalysis(Long customerId, Integer type);
+
+    ProductCategoryDistributionDto productCategoryDistribution();
+
+    List<CustomerContributionRankingDto> customerContributionRanking(Integer type);
 }
diff --git a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
index 4ceed69..3b48ec4 100644
--- a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
+++ b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -1,45 +1,40 @@
 package com.ruoyi.home.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.approve.mapper.ApproveProcessMapper;
 import com.ruoyi.approve.pojo.ApproveProcess;
+import com.ruoyi.basic.mapper.CustomerMapper;
+import com.ruoyi.basic.mapper.ProductMapper;
 import com.ruoyi.basic.mapper.ProductModelMapper;
+import com.ruoyi.basic.mapper.SupplierManageMapper;
+import com.ruoyi.basic.pojo.Customer;
+import com.ruoyi.basic.pojo.Product;
 import com.ruoyi.basic.pojo.ProductModel;
+import com.ruoyi.basic.pojo.SupplierManage;
 import com.ruoyi.collaborativeApproval.mapper.NoticeMapper;
 import com.ruoyi.collaborativeApproval.pojo.Notice;
 import com.ruoyi.common.utils.SecurityUtils;
-import com.ruoyi.device.mapper.DeviceMaintenanceMapper;
 import com.ruoyi.device.mapper.DeviceRepairMapper;
-import com.ruoyi.device.pojo.DeviceMaintenance;
 import com.ruoyi.device.pojo.DeviceRepair;
 import com.ruoyi.dto.MapDto;
 import com.ruoyi.framework.security.LoginUser;
 import com.ruoyi.home.dto.*;
 import com.ruoyi.home.service.HomeService;
-import com.ruoyi.lavorissue.mapper.LavorIssueMapper;
-import com.ruoyi.lavorissue.pojo.LaborIssue;
-import com.ruoyi.procurementrecord.mapper.CustomStorageMapper;
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
-import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
-import com.ruoyi.procurementrecord.pojo.CustomStorage;
-import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
 import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.production.dto.ProductOrderDto;
 import com.ruoyi.production.dto.ProductWorkOrderDto;
-import com.ruoyi.production.dto.ProductionProductMainDto;
 import com.ruoyi.production.mapper.ProductOrderMapper;
-import com.ruoyi.production.mapper.ProductProcessMapper;
 import com.ruoyi.production.mapper.ProductWorkOrderMapper;
-import com.ruoyi.production.mapper.ProductionProductMainMapper;
-import com.ruoyi.production.pojo.ProductOrder;
-import com.ruoyi.production.pojo.ProductProcess;
 import com.ruoyi.production.pojo.ProductWorkOrder;
 import com.ruoyi.project.system.domain.SysDept;
+import com.ruoyi.project.system.domain.SysUserDept;
 import com.ruoyi.project.system.mapper.SysDeptMapper;
+import com.ruoyi.project.system.mapper.SysUserDeptMapper;
 import com.ruoyi.purchase.mapper.PaymentRegistrationMapper;
 import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
 import com.ruoyi.purchase.pojo.PaymentRegistration;
@@ -49,9 +44,13 @@
 import com.ruoyi.sales.mapper.ReceiptPaymentMapper;
 import com.ruoyi.sales.mapper.SalesLedgerMapper;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
+import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.mapper.SysUserMapper;
 import com.ruoyi.sales.pojo.ReceiptPayment;
 import com.ruoyi.sales.pojo.SalesLedger;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
+import com.ruoyi.staff.mapper.StaffOnJobMapper;
+import com.ruoyi.staff.pojo.StaffOnJob;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -60,13 +59,11 @@
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.ParseException;
-import java.text.SimpleDateFormat;
 import java.time.*;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
 import java.time.temporal.TemporalAdjusters;
 import java.util.*;
-import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
 /**
@@ -87,13 +84,7 @@
     private SalesLedgerProductMapper salesLedgerProductMapper;
 
     @Autowired
-    private ProcurementRecordOutMapper procurementRecordOutMapper;
-
-    @Autowired
     private ProcurementRecordMapper procurementRecordStorageMapper;
-
-    @Autowired
-    private CustomStorageMapper customStorageMapper;
 
     @Autowired
     private QualityInspectMapper qualityStatisticsMapper;
@@ -108,9 +99,6 @@
     private PaymentRegistrationMapper paymentRegistrationMapper;
 
     @Autowired
-    private LavorIssueMapper lavorIssueMapper;
-
-    @Autowired
     private SysDeptMapper sysDeptMapper;
 
     @Autowired
@@ -118,13 +106,24 @@
     @Autowired
     private ProductOrderMapper productOrderMapper;
     @Autowired
-    private ProductProcessMapper productProcessMapper;
-    @Autowired
     private ProductWorkOrderMapper productWorkOrderMapper;
     @Autowired
     private ProductModelMapper productModelMapper;
     @Autowired
+    private ProductMapper productMapper;
+    @Autowired
     private StockUtils stockUtils;
+    @Autowired
+    private StaffOnJobMapper staffOnJobMapper;
+    @Autowired
+    private CustomerMapper customerMapper;
+    @Autowired
+    private SupplierManageMapper supplierManageMapper;
+    @Autowired
+    private SysUserMapper sysUserMapper;
+    @Autowired
+    private SysUserDeptMapper sysUserDeptMapper;
+
     @Override
     public HomeBusinessDto business() {
         // 鏋勫缓缁撴灉
@@ -581,6 +580,398 @@
         productionTurnoverDto.setProcessDetails(strings);
         productionTurnoverDto.setProcessQuantityDetails(processQuantityDetails);
         return productionTurnoverDto;
+    }
 
+    @Override
+    public DeptStaffDistributionDto deptStaffDistribution() {
+        DeptStaffDistributionDto dto = new DeptStaffDistributionDto();
+        List<MapDto> items = new ArrayList<>();
+
+        // 鏌ヨ鎵�鏈夋甯镐笖鏈垹闄ょ殑閮ㄩ棬
+        List<SysDept> depts = sysDeptMapper.selectDeptList(new SysDept());
+        if (CollectionUtils.isEmpty(depts)) {
+            dto.setItems(items);
+            return dto;
+        }
+
+        long totalUsers = 0;
+        List<Map<String, Object>> countsByDept = new ArrayList<>();
+
+        for (SysDept dept : depts) {
+            if ("0".equals(dept.getStatus()) && "0".equals(dept.getDelFlag())) {
+                Long count = sysUserDeptMapper.selectCount(new LambdaQueryWrapper<SysUserDept>()
+                        .eq(SysUserDept::getDeptId, dept.getDeptId()));
+                if (count > 0) {
+                    Map<String, Object> map = new HashMap<>();
+                    map.put("name", dept.getDeptName());
+                    map.put("count", count);
+                    countsByDept.add(map);
+                    totalUsers += count;
+                }
+            }
+        }
+
+        if (totalUsers > 0) {
+            BigDecimal total = BigDecimal.valueOf(totalUsers);
+            for (Map<String, Object> map : countsByDept) {
+                MapDto mapDto = new MapDto();
+                mapDto.setName((String) map.get("name"));
+                Long count = (Long) map.get("count");
+                mapDto.setValue(count.toString());
+                mapDto.setRate(BigDecimal.valueOf(count).multiply(new BigDecimal("100"))
+                        .divide(total, 2, RoundingMode.HALF_UP).toString());
+                items.add(mapDto);
+            }
+        }
+
+        dto.setTotal(totalUsers);
+        dto.setItems(items);
+        return dto;
+    }
+
+    @Override
+    public HomeSummaryDto summaryStatistics() {
+        HomeSummaryDto dto = new HomeSummaryDto();
+        LocalDate now = LocalDate.now();
+        YearMonth currentMonth = YearMonth.from(now);
+        YearMonth prevMonth = currentMonth.minusMonths(1);
+
+        LocalDateTime currentMonthEnd = currentMonth.atEndOfMonth().atTime(23, 59, 59);
+        LocalDateTime prevMonthEnd = prevMonth.atEndOfMonth().atTime(23, 59, 59);
+
+        //  鎬诲伐浣滀汉鍛�
+        Long currentStaff = countStaff(currentMonthEnd);
+        Long prevStaff = countStaff(prevMonthEnd);
+        dto.setTotalStaff(currentStaff);
+        dto.setStaffGrowthRate(calculateMoM(currentStaff, prevStaff));
+
+        //  鎬诲鎴锋暟
+        Long currentCustomers = countCustomers(currentMonthEnd);
+        Long prevCustomers = countCustomers(prevMonthEnd);
+        dto.setTotalCustomer(currentCustomers);
+        dto.setCustomerGrowthRate(calculateMoM(currentCustomers, prevCustomers));
+
+        //  鎬讳緵搴斿晢鏁�
+        Long currentSuppliers = countSuppliers(currentMonthEnd);
+        Long prevSuppliers = countSuppliers(prevMonthEnd);
+        dto.setTotalSupplier(currentSuppliers);
+        dto.setSupplierGrowthRate(calculateMoM(currentSuppliers, prevSuppliers));
+
+        return dto;
+    }
+
+    private Long countStaff(LocalDateTime dateTime) {
+        Long sysUserCount = sysUserMapper.selectCount(new LambdaQueryWrapper<SysUser>()
+                .eq(SysUser::getDelFlag, "0")
+                .le(SysUser::getCreateTime, dateTime));
+        Long staffCountItem = staffOnJobMapper.selectCount(new LambdaQueryWrapper<StaffOnJob>()
+                .le(StaffOnJob::getCreateTime, dateTime));
+        return sysUserCount + staffCountItem;
+    }
+
+
+    private Long countCustomers(LocalDateTime dateTime) {
+        return customerMapper.selectCount(new LambdaQueryWrapper<Customer>()
+                .le(Customer::getMaintenanceTime, dateTime.toLocalDate()));
+    }
+
+    private Long countSuppliers(LocalDateTime dateTime) {
+        return supplierManageMapper.selectCount(new LambdaQueryWrapper<SupplierManage>()
+                .le(SupplierManage::getCreateTime, dateTime));
+    }
+
+    private String calculateMoM(Number current, Number prev) {
+        BigDecimal curVal = new BigDecimal(current.toString());
+        BigDecimal prevVal = new BigDecimal(prev.toString());
+        if (prevVal.compareTo(BigDecimal.ZERO) == 0) {
+            return curVal.compareTo(BigDecimal.ZERO) > 0 ? "100.00" : "0.00";
+        }
+        return curVal.subtract(prevVal)
+                .divide(prevVal, 4, RoundingMode.HALF_UP)
+                .multiply(new BigDecimal("100"))
+                .setScale(2, RoundingMode.HALF_UP)
+                .toString();
+    }
+
+    @Override
+    public List<SupplierPurchaseRankingDto> supplierPurchaseRanking(Integer type) {
+        LocalDate today = LocalDate.now();
+        LocalDate startDate;
+        LocalDate endDate;
+        switch (type) {
+            case 0: // 鍛�
+                startDate = today.with(DayOfWeek.MONDAY);
+                endDate = today.with(DayOfWeek.SUNDAY);
+                break;
+            case 1: // 鏈�
+                startDate = today.with(TemporalAdjusters.firstDayOfMonth());
+                endDate = today.with(TemporalAdjusters.lastDayOfMonth());
+                break;
+            case 2: // 瀛e害
+                Month currentMonth = today.getMonth();
+                Month firstMonthOfQuarter = currentMonth.firstMonthOfQuarter();
+                Month lastMonthOfQuarter = Month.of(firstMonthOfQuarter.getValue() + 2);
+
+                startDate = today.withMonth(firstMonthOfQuarter.getValue()).with(TemporalAdjusters.firstDayOfMonth());
+                endDate = today.withMonth(lastMonthOfQuarter.getValue()).with(TemporalAdjusters.lastDayOfMonth());
+                break;
+            default:
+                return new ArrayList<>();
+        }
+
+        QueryWrapper<PurchaseLedger> queryWrapper = new QueryWrapper<>();
+        queryWrapper.select("supplier_name", "SUM(contract_amount) as total_amount")
+                .ge("entry_date", startDate)
+                .le("entry_date", endDate)
+//                .ne("approval_status", 3)
+                .groupBy("supplier_name")
+                .orderByDesc("total_amount")
+                .last("LIMIT 5");
+
+        List<Map<String, Object>> maps = purchaseLedgerMapper.selectMaps(queryWrapper);
+        return maps.stream().map(map -> {
+            SupplierPurchaseRankingDto dto = new SupplierPurchaseRankingDto();
+            dto.setSupplierName(map.get("supplier_name") != null ? map.get("supplier_name").toString() : "");
+            Object amount = map.get("total_amount");
+            dto.setTotalAmount(amount != null ? new BigDecimal(amount.toString()) : BigDecimal.ZERO);
+            return dto;
+        }).collect(Collectors.toList());
+    }
+
+    @Override
+    public CustomerRevenueAnalysisDto customerRevenueAnalysis(Long customerId, Integer type) {
+        CustomerRevenueAnalysisDto dto = new CustomerRevenueAnalysisDto();
+        List<MapDto> items = new ArrayList<>();
+        LocalDate today = LocalDate.now();
+
+        LocalDate start;
+        LocalDate end;
+        boolean groupByMonth = false;
+
+        switch (type) {
+            case 0: // 鍛�
+                start = today.with(DayOfWeek.MONDAY);
+                end = today.with(DayOfWeek.SUNDAY);
+                break;
+            case 1: // 鏈�
+                start = today.with(TemporalAdjusters.firstDayOfMonth());
+                end = today.with(TemporalAdjusters.lastDayOfMonth());
+                break;
+            case 2: // 瀛e害
+                Month firstMonthOfQuarter = today.getMonth().firstMonthOfQuarter();
+                start = today.withMonth(firstMonthOfQuarter.getValue()).with(TemporalAdjusters.firstDayOfMonth());
+                end = today.withMonth(firstMonthOfQuarter.plus(2).getValue()).with(TemporalAdjusters.lastDayOfMonth());
+                groupByMonth = true;
+                break;
+            default:
+                dto.setItems(items);
+                return dto;
+        }
+
+        List<SalesLedger> list = salesLedgerMapper.selectList(new LambdaQueryWrapper<SalesLedger>()
+                .eq(SalesLedger::getCustomerId, customerId)
+                .ge(SalesLedger::getEntryDate, start)
+                .le(SalesLedger::getEntryDate, end));
+
+        if (groupByMonth) {
+            for (int i = 0; i < 3; i++) {
+                LocalDate m = start.plusMonths(i);
+                String monthName = m.getMonthValue() + "鏈�";
+                BigDecimal sum = list.stream()
+                        .filter(l -> l.getEntryDate() != null)
+                        .filter(l -> {
+                            LocalDate ld = l.getEntryDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+                            return ld.getMonth() == m.getMonth() && ld.getYear() == m.getYear();
+                        })
+                        .map(SalesLedger::getContractAmount)
+                        .filter(Objects::nonNull)
+                        .reduce(BigDecimal.ZERO, BigDecimal::add);
+                MapDto mapDto = new MapDto();
+                mapDto.setName(monthName);
+                mapDto.setValue(sum.setScale(2, RoundingMode.HALF_UP).toString());
+                items.add(mapDto);
+            }
+        } else {
+            long days = ChronoUnit.DAYS.between(start, end) + 1;
+            for (int i = 0; i < days; i++) {
+                LocalDate d = start.plusDays(i);
+                String dayName = d.getMonthValue() + "/" + d.getDayOfMonth();
+                BigDecimal sum = list.stream()
+                        .filter(l -> l.getEntryDate() != null)
+                        .filter(l -> l.getEntryDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate().equals(d))
+                        .map(SalesLedger::getContractAmount)
+                        .filter(Objects::nonNull)
+                        .reduce(BigDecimal.ZERO, BigDecimal::add);
+                MapDto mapDto = new MapDto();
+                mapDto.setName(dayName);
+                mapDto.setValue(sum.setScale(2, RoundingMode.HALF_UP).toString());
+                items.add(mapDto);
+            }
+        }
+
+        dto.setItems(items);
+        return dto;
+    }
+
+    @Override
+    public ProductCategoryDistributionDto productCategoryDistribution() {
+        ProductCategoryDistributionDto dto = new ProductCategoryDistributionDto();
+        List<ProductCategoryDistributionDto.MajorCategoryDto> majorItems = new ArrayList<>();
+
+        //  鎵�鏈夌殑浜у搧澶х被鍜屽皬绫�
+        List<Product> allProducts = productMapper.selectList(new LambdaQueryWrapper<Product>());
+        if (CollectionUtils.isEmpty(allProducts)) {
+            dto.setItems(majorItems);
+            return dto;
+        }
+
+        List<Product> majorCategories = allProducts.stream().filter(p -> p.getParentId() == null).collect(Collectors.toList());
+        List<Product> minorCategories = allProducts.stream().filter(p -> p.getParentId() != null).collect(Collectors.toList());
+
+        //  浠� sales_ledger_product 鎷垮埌姣忎釜浜у搧鐨勫瀷鍙峰簱瀛�
+        // 闇�鍖呭惈瑙勬牸鍨嬪彿浠ユ敮鎸佷笁绾у垎甯�
+        List<Map<String, Object>> quantityMaps = salesLedgerProductMapper.selectMaps(new QueryWrapper<SalesLedgerProduct>()
+                .select("product_id", "specification_model", "type", "SUM(quantity) as sum_qty")
+                .isNotNull("product_id")
+                .groupBy("product_id", "specification_model", "type"));
+
+        Map<Long, Map<String, Map<Integer, BigDecimal>>> modelStockGroups = new HashMap<>();
+        for (Map<String, Object> map : quantityMaps) {
+            Long productId = Long.parseLong(map.get("product_id").toString());
+            String model = map.get("specification_model") != null ? map.get("specification_model").toString() : "鏈煡鍨嬪彿";
+            Integer type = Integer.parseInt(map.get("type").toString());
+            BigDecimal sum = map.get("sum_qty") != null ? new BigDecimal(map.get("sum_qty").toString()) : BigDecimal.ZERO;
+
+            modelStockGroups.computeIfAbsent(productId, k -> new HashMap<>())
+                    .computeIfAbsent(model, k -> new HashMap<>())
+                    .put(type, sum);
+        }
+
+        //  搴撳瓨骞舵眹鎬�
+        Map<Long, List<MapDto>> productModelsMap = new HashMap<>();
+        Map<Long, BigDecimal> productTotalStockMap = new HashMap<>();
+
+        for (Long pid : modelStockGroups.keySet()) {
+            Map<String, Map<Integer, BigDecimal>> models = modelStockGroups.get(pid);
+            BigDecimal productStock = BigDecimal.ZERO;
+            List<MapDto> modelDtos = new ArrayList<>();
+
+            for (String modelName : models.keySet()) {
+                Map<Integer, BigDecimal> types = models.get(modelName);
+                BigDecimal procurement = types.getOrDefault(2, BigDecimal.ZERO);
+                BigDecimal sales = types.getOrDefault(1, BigDecimal.ZERO);
+                BigDecimal stock = procurement.subtract(sales);
+                if (stock.compareTo(BigDecimal.ZERO) < 0) stock = BigDecimal.ZERO;
+
+                MapDto modelDto = new MapDto();
+                modelDto.setName(modelName);
+                modelDto.setValue(stock.stripTrailingZeros().toPlainString());
+                modelDtos.add(modelDto);
+                productStock = productStock.add(stock);
+            }
+            productModelsMap.put(pid, modelDtos);
+            productTotalStockMap.put(pid, productStock);
+        }
+
+        BigDecimal totalInventory = productTotalStockMap.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        //  鍨嬪彿鍗犳瘮
+        if (totalInventory.compareTo(BigDecimal.ZERO) > 0) {
+            for (List<MapDto> dtos : productModelsMap.values()) {
+                for (MapDto m : dtos) {
+                    BigDecimal val = new BigDecimal(m.getValue());
+                    m.setRate(val.multiply(new BigDecimal("100"))
+                            .divide(totalInventory, 2, RoundingMode.HALF_UP).toString());
+                }
+            }
+        }
+
+        //  鍒嗗眰鏁版嵁
+        for (Product major : majorCategories) {
+            ProductCategoryDistributionDto.MajorCategoryDto majorDto = new ProductCategoryDistributionDto.MajorCategoryDto();
+            majorDto.setName(major.getProductName());
+
+            List<ProductCategoryDistributionDto.MinorCategoryDto> minorDtos = new ArrayList<>();
+            BigDecimal majorStock = BigDecimal.ZERO;
+
+            for (Product minor : minorCategories) {
+                if (major.getId().equals(minor.getParentId())) {
+                    BigDecimal stock = productTotalStockMap.getOrDefault(minor.getId(), BigDecimal.ZERO);
+                    ProductCategoryDistributionDto.MinorCategoryDto minorDto = new ProductCategoryDistributionDto.MinorCategoryDto();
+                    minorDto.setName(minor.getProductName());
+                    minorDto.setValue(stock.stripTrailingZeros().toPlainString());
+
+                    if (totalInventory.compareTo(BigDecimal.ZERO) > 0) {
+                        minorDto.setRate(stock.multiply(new BigDecimal("100"))
+                                .divide(totalInventory, 2, RoundingMode.HALF_UP).toString());
+                    } else {
+                        minorDto.setRate("0.00");
+                    }
+
+                    minorDto.setChildren(productModelsMap.getOrDefault(minor.getId(), new ArrayList<>()));
+                    minorDtos.add(minorDto);
+                    majorStock = majorStock.add(stock);
+                }
+            }
+
+            majorDto.setValue(majorStock.stripTrailingZeros().toPlainString());
+
+            if (totalInventory.compareTo(BigDecimal.ZERO) > 0) {
+                majorDto.setRate(majorStock.multiply(new BigDecimal("100"))
+                        .divide(totalInventory, 2, RoundingMode.HALF_UP).toString());
+            } else {
+                majorDto.setRate("0.00");
+            }
+            majorDto.setChildren(minorDtos);
+            majorItems.add(majorDto);
+        }
+
+        dto.setItems(majorItems);
+        return dto;
+    }
+
+    @Override
+    public List<CustomerContributionRankingDto> customerContributionRanking(Integer type) {
+        LocalDate today = LocalDate.now();
+        LocalDate startDate = null;
+        LocalDate endDate = null;
+        switch (type) {
+            case 0:
+                startDate = today.with(DayOfWeek.MONDAY);
+                endDate = today.with(DayOfWeek.SUNDAY);
+                break;
+            case 1:
+                startDate = today.with(TemporalAdjusters.firstDayOfMonth());
+                endDate = today.with(TemporalAdjusters.lastDayOfMonth());
+                break;
+            case 2:
+                Month currentMonth = today.getMonth();
+                Month firstMonthOfQuarter = currentMonth.firstMonthOfQuarter();
+                Month lastMonthOfQuarter = Month.of(firstMonthOfQuarter.getValue() + 2);
+                startDate = today.withMonth(firstMonthOfQuarter.getValue()).with(TemporalAdjusters.firstDayOfMonth());
+                endDate = today.withMonth(lastMonthOfQuarter.getValue()).with(TemporalAdjusters.lastDayOfMonth());
+                break;
+        }
+
+        QueryWrapper<SalesLedger> queryWrapper = new QueryWrapper<>();
+        queryWrapper.select("customer_name", "SUM(contract_amount) as total_amount")
+                .isNotNull("customer_name")
+                .groupBy("customer_name")
+                .orderByDesc("total_amount")
+                .last("LIMIT 5");
+
+        if (startDate != null && endDate != null) {
+            queryWrapper.between("entry_date", startDate, endDate);
+        }
+
+        List<Map<String, Object>> maps = salesLedgerMapper.selectMaps(queryWrapper);
+        List<CustomerContributionRankingDto> result = new ArrayList<>();
+        for (Map<String, Object> map : maps) {
+            CustomerContributionRankingDto rankingDto = new CustomerContributionRankingDto();
+            rankingDto.setCustomerName(map.get("customer_name").toString());
+            rankingDto.setTotalAmount(map.get("total_amount") != null ? new BigDecimal(map.get("total_amount").toString()) : BigDecimal.ZERO);
+            result.add(rankingDto);
+        }
+        return result;
     }
 }
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
index 93119de..3dc98a1 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -91,7 +91,7 @@
                 ProductWorkOrder productWorkOrder = new ProductWorkOrder();
                 productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
                 productWorkOrder.setProductOrderId(productOrder.getId());
-                ProductOrder order = productOrderMapper.selectById(productOrder);
+                ProductOrder order = productOrderMapper.selectById(productOrder.getId());
                 productWorkOrder.setPlanQuantity(order.getQuantity());
                 productWorkOrder.setWorkOrderNo(workOrderNoStr);
                 productWorkOrder.setStatus(1);
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
index 66270d4..804c630 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -187,7 +187,7 @@
             qualityInspect.setModel(productModel.getModel());
             qualityInspect.setUnit(productModel.getUnit());
             qualityInspect.setQuantity(productQty);
-            qualityInspect.setProcess(productProcess.getName());
+            qualityInspect.setProcess(process);
             qualityInspect.setInspectState(0);
             qualityInspect.setInspectType(inspectType);
             qualityInspect.setProductMainId(productionProductMain.getId());
@@ -209,7 +209,7 @@
             }
             /*鏇存柊宸ュ崟鍜岀敓浜ц鍗�*/
             ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
-            productWorkOrder.setCompleteQuantity(productQty.add(dto.getQuantity()));
+            productWorkOrder.setCompleteQuantity(productWorkOrder.getCompleteQuantity().add(productQty));
             if (ObjectUtils.isNull(productWorkOrder.getActualStartTime())) {
                 productWorkOrder.setActualStartTime(LocalDate.now());//瀹為檯寮�濮嬫椂闂�
             }
@@ -291,7 +291,7 @@
         // 鍒犻櫎浜у嚭璁板綍
         productionProductOutputMapper.delete(new LambdaQueryWrapper<ProductionProductOutput>()
                 .eq(ProductionProductOutput::getProductMainId, productionProductMain.getId()));
-        //鍒犻櫎鍏ュ簱
+        //鍒犻櫎鎶曞叆璁板綍
         productionProductInputMapper.delete(new LambdaQueryWrapper<ProductionProductInput>()
                 .eq(ProductionProductInput::getProductMainId, productionProductMain.getId()));
         //鍒犻櫎鎶ュ簾鐨勫叆搴撹褰�
diff --git a/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java b/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
index 63f417b..39bdbf2 100644
--- a/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
+++ b/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.common.math.LongMath;
+import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.web.controller.BaseController;
@@ -14,6 +15,7 @@
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
 import com.ruoyi.procurementrecord.service.ProcurementRecordOutService;
 import com.ruoyi.procurementrecord.service.ProcurementRecordService;
+import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.sales.mapper.ShipmentApprovalMapper;
 import com.ruoyi.sales.mapper.ShippingInfoMapper;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
@@ -47,9 +49,7 @@
     @Autowired
     private ISalesLedgerProductService salesLedgerProductService;
     @Autowired
-    private ProcurementRecordOutService procurementRecordOutService;
-    @Autowired
-    private ProcurementRecordService procurementRecordStorageService;
+    private StockUtils stockUtils;
 
     @GetMapping("/listPage")
     @ApiOperation("鍙戣揣瀹℃壒鍒楄〃")
@@ -99,18 +99,9 @@
 //                throw new ServiceException("閲囪喘璁板綍涓嶅瓨鍦紝瀹℃壒鍥炴粴");
 //            }
 
-            //  鐢熸垚鍑哄簱璁板綍
-            ProcurementRecordOutAdd procurementRecordOutAdd = new ProcurementRecordOutAdd();
-//            procurementRecordOutAdd.setId(procurementRecordStorage.getId());
-            procurementRecordOutAdd.setId(0);
-            procurementRecordOutAdd.setProductModelId(salesLedgerProduct.getProductModelId());
-            procurementRecordOutAdd.setSalesLedgerProductId((long) Math.toIntExact(salesLedgerProduct.getId()));
-            procurementRecordOutAdd.setType(2);
-            procurementRecordOutAdd.setUserId(Math.toIntExact(getUserId()));
-            procurementRecordOutAdd.setQuantity(salesLedgerProduct.getQuantity().toPlainString());
-            procurementRecordOutAdd.setTime(LocalDate.now().toString());
 
-            procurementRecordOutService.stockout(procurementRecordOutAdd);
+            //鍑哄簱
+            stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId());
         }
 
         return AjaxResult.success();
diff --git a/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java b/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java
index 94e4669..b12fc67 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java
@@ -6,7 +6,6 @@
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.stock.dto.StockInRecordDto;
-import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.service.StockInRecordService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
diff --git a/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java b/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
index a1d1210..f4bd009 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
@@ -4,7 +4,6 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.compensationperformance.pojo.CompensationPerformance;
 import com.ruoyi.framework.aspectj.lang.annotation.Log;
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.R;
@@ -93,4 +92,16 @@
     public R stockInAndOutRecord(StockInventoryDto stockInventoryDto,Page page) {
         return R.ok(stockInventoryService.stockInAndOutRecord(stockInventoryDto,page));
     }
+
+    @PostMapping("/frozenStock")
+    @ApiOperation("鍐荤粨搴撳瓨")
+    public R frozenStock(@RequestBody StockInventoryDto stockInventoryDto) {
+        return R.ok(stockInventoryService.frozenStock(stockInventoryDto));
+    }
+
+    @PostMapping("/thawStock")
+    @ApiOperation("瑙e喕搴撳瓨")
+    public R thawStock(@RequestBody StockInventoryDto stockInventoryDto) {
+        return R.ok(stockInventoryService.thawStock(stockInventoryDto));
+    }
 }
diff --git a/src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java b/src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java
index 755084c..bd98859 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java
@@ -5,9 +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.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.dto.StockOutRecordDto;
-import com.ruoyi.stock.pojo.StockOutRecord;
 import com.ruoyi.stock.service.StockOutRecordService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
diff --git a/src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java b/src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java
index b2950db..43714ca 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java
@@ -2,9 +2,9 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum;
 import com.ruoyi.common.enums.StockUnQualifiedRecordTypeEnum;
 import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.dto.StockUninventoryDto;
 import com.ruoyi.stock.service.StockUninventoryService;
 import io.swagger.annotations.ApiOperation;
@@ -57,4 +57,17 @@
         stockUninventoryService.exportStockUninventory(response,stockUninventoryDto);
     }
 
+
+    @PostMapping("/frozenStock")
+    @ApiOperation("鍐荤粨搴撳瓨")
+    public R frozenStock(@RequestBody StockInventoryDto stockInventoryDto) {
+        return R.ok(stockUninventoryService.frozenStock(stockInventoryDto));
+    }
+
+    @PostMapping("/thawStock")
+    @ApiOperation("瑙e喕搴撳瓨")
+    public R thawStock(@RequestBody StockInventoryDto stockInventoryDto) {
+        return R.ok(stockUninventoryService.thawStock(stockInventoryDto));
+    }
+
 }
diff --git a/src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java b/src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java
index 5c58f53..1aed75c 100644
--- a/src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java
+++ b/src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java
@@ -1,6 +1,5 @@
 package com.ruoyi.stock.dto;
 
-import com.ruoyi.framework.aspectj.lang.annotation.Excel;
 import com.ruoyi.stock.pojo.StockInRecord;
 import lombok.Data;
 
diff --git a/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java b/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
index 37b5efe..125b52b 100644
--- a/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
+++ b/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
@@ -37,4 +37,6 @@
     private BigDecimal totalStockIn;
     private BigDecimal totalStockOut;
     private BigDecimal currentStock;
+
+    private BigDecimal  unLockedQuantity;
 }
diff --git a/src/main/java/com/ruoyi/stock/dto/StockUninventoryDto.java b/src/main/java/com/ruoyi/stock/dto/StockUninventoryDto.java
index e496352..404c58a 100644
--- a/src/main/java/com/ruoyi/stock/dto/StockUninventoryDto.java
+++ b/src/main/java/com/ruoyi/stock/dto/StockUninventoryDto.java
@@ -3,6 +3,8 @@
 import com.ruoyi.stock.pojo.StockUninventory;
 import lombok.Data;
 
+import java.math.BigDecimal;
+
 @Data
 public class StockUninventoryDto  extends StockUninventory {
     private String productName;
@@ -15,4 +17,6 @@
 
     //鍏ュ簱绫诲瀷瀵瑰簲鐨刬d
     private Long recordId;
+
+    private BigDecimal unLockedQuantity;
 }
diff --git a/src/main/java/com/ruoyi/stock/execl/StockInventoryExportData.java b/src/main/java/com/ruoyi/stock/execl/StockInventoryExportData.java
index 3daa2a8..4b7553f 100644
--- a/src/main/java/com/ruoyi/stock/execl/StockInventoryExportData.java
+++ b/src/main/java/com/ruoyi/stock/execl/StockInventoryExportData.java
@@ -1,14 +1,9 @@
 package com.ruoyi.stock.execl;
 
-import com.alibaba.excel.annotation.ExcelProperty;
-import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ruoyi.framework.aspectj.lang.annotation.Excel;
 import lombok.Data;
-import org.springframework.format.annotation.DateTimeFormat;
 
 import java.math.BigDecimal;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
 
 @Data
 public class StockInventoryExportData {
@@ -27,6 +22,12 @@
     @Excel(name = "搴撳瓨鏁伴噺")
     private BigDecimal qualitity;
 
+    @Excel(name = "棰勮鏁伴噺")
+    private BigDecimal warnNum;
+
+    @Excel(name = "鍐荤粨鏁伴噺")
+    private BigDecimal lockedQuantity;
+
     @Excel(name = "澶囨敞")
     private String remark;
 //
diff --git a/src/main/java/com/ruoyi/stock/execl/StockUnInventoryExportData.java b/src/main/java/com/ruoyi/stock/execl/StockUnInventoryExportData.java
new file mode 100644
index 0000000..7fd6e36
--- /dev/null
+++ b/src/main/java/com/ruoyi/stock/execl/StockUnInventoryExportData.java
@@ -0,0 +1,36 @@
+package com.ruoyi.stock.execl;
+
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class StockUnInventoryExportData {
+
+
+
+    @Excel(name = "浜у搧鍚嶇О")
+    private String productName;
+
+    @Excel(name = "瑙勬牸")
+    private String model;
+
+    @Excel(name = "鍗曚綅")
+    private String unit;
+
+    @Excel(name = "搴撳瓨鏁伴噺")
+    private BigDecimal qualitity;
+
+    @Excel(name = "鍐荤粨鏁伴噺")
+    private BigDecimal lockedQuantity;
+
+    @Excel(name = "澶囨敞")
+    private String remark;
+//
+//    @Excel(name = "鏈�鏂版洿鏂版椂闂�")
+//    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+//    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+//    private LocalDateTime updateTime;
+
+}
diff --git a/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java b/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
index 16b0519..d37e367 100644
--- a/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
+++ b/src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
@@ -1,12 +1,12 @@
 package com.ruoyi.stock.mapper;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.execl.StockInventoryExportData;
 import com.ruoyi.stock.pojo.StockInventory;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
diff --git a/src/main/java/com/ruoyi/stock/mapper/StockUninventoryMapper.java b/src/main/java/com/ruoyi/stock/mapper/StockUninventoryMapper.java
index 9c058ed..89e9b17 100644
--- a/src/main/java/com/ruoyi/stock/mapper/StockUninventoryMapper.java
+++ b/src/main/java/com/ruoyi/stock/mapper/StockUninventoryMapper.java
@@ -1,11 +1,11 @@
 package com.ruoyi.stock.mapper;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.stock.dto.StockUninventoryDto;
-import com.ruoyi.stock.execl.StockInventoryExportData;
+import com.ruoyi.stock.execl.StockUnInventoryExportData;
 import com.ruoyi.stock.pojo.StockUninventory;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -28,5 +28,5 @@
 
     int updateAddStockUnInventory(@Param("ew") StockUninventoryDto stockUninventoryDto);
 
-    List<StockInventoryExportData> listStockInventoryExportData(@Param("ew") StockUninventoryDto stockUninventoryDto);
+    List<StockUnInventoryExportData> listStockInventoryExportData(@Param("ew") StockUninventoryDto stockUninventoryDto);
 }
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockInventory.java b/src/main/java/com/ruoyi/stock/pojo/StockInventory.java
index 4568dcc..36e7cf0 100644
--- a/src/main/java/com/ruoyi/stock/pojo/StockInventory.java
+++ b/src/main/java/com/ruoyi/stock/pojo/StockInventory.java
@@ -3,19 +3,17 @@
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.time.LocalDateTime;
-
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Getter;
 import lombok.Setter;
 import org.springframework.format.annotation.DateTimeFormat;
-import org.springframework.lang.Nullable;
 
 import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
 
 /**
  * <p>
@@ -61,7 +59,7 @@
     private BigDecimal lockedQuantity;
 
     @ApiModelProperty("棰勮鏁伴噺")
-    private Integer warnNum;
+    private BigDecimal warnNum;
 
     @ApiModelProperty("澶囨敞")
     private String remark;
diff --git a/src/main/java/com/ruoyi/stock/pojo/StockUninventory.java b/src/main/java/com/ruoyi/stock/pojo/StockUninventory.java
index 6403dba..6ed47de 100644
--- a/src/main/java/com/ruoyi/stock/pojo/StockUninventory.java
+++ b/src/main/java/com/ruoyi/stock/pojo/StockUninventory.java
@@ -3,13 +3,16 @@
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.time.LocalDateTime;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Getter;
 import lombok.Setter;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
 
 /**
  * <p>
@@ -37,11 +40,15 @@
     private BigDecimal qualitity;
 
     @TableField(fill = FieldFill.INSERT)
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime createTime;
 
     @ApiModelProperty("鏇存柊鏃堕棿")
     @TableField(fill = FieldFill.INSERT_UPDATE)
-    private Integer updateTime;
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime updateTime;
 
     @ApiModelProperty("鐗堟湰鍙�")
     private Integer version;
@@ -49,4 +56,7 @@
     @ApiModelProperty("澶囨敞")
     private String remark;
 
+    @ApiModelProperty("琚鍗曢攣瀹氭暟閲�")
+    private BigDecimal lockedQuantity;
+
 }
diff --git a/src/main/java/com/ruoyi/stock/service/StockInventoryService.java b/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
index d4b5171..65dcca3 100644
--- a/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
+++ b/src/main/java/com/ruoyi/stock/service/StockInventoryService.java
@@ -2,15 +2,14 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.pojo.StockInventory;
-import com.baomidou.mybatisplus.extension.service.IService;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
-import java.util.List;
 
 /**
  * <p>
@@ -36,4 +35,7 @@
 
     IPage<StockInventoryDto> stockInAndOutRecord(StockInventoryDto stockInventoryDto,Page page);
 
+    Boolean frozenStock(StockInventoryDto stockInventoryDto);
+
+    Boolean thawStock(StockInventoryDto stockInventoryDto);
 }
diff --git a/src/main/java/com/ruoyi/stock/service/StockUninventoryService.java b/src/main/java/com/ruoyi/stock/service/StockUninventoryService.java
index 7f435fa..0d6ba6d 100644
--- a/src/main/java/com/ruoyi/stock/service/StockUninventoryService.java
+++ b/src/main/java/com/ruoyi/stock/service/StockUninventoryService.java
@@ -2,9 +2,10 @@
 
 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.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.dto.StockUninventoryDto;
 import com.ruoyi.stock.pojo.StockUninventory;
-import com.baomidou.mybatisplus.extension.service.IService;
 
 import javax.servlet.http.HttpServletResponse;
 
@@ -25,4 +26,8 @@
     Integer subtractStockUninventory(StockUninventoryDto stockUninventoryDto);
 
     void exportStockUninventory(HttpServletResponse response, StockUninventoryDto stockUninventoryDto);
+
+    Boolean frozenStock(StockInventoryDto stockInventoryDto);
+
+    Boolean thawStock(StockInventoryDto stockInventoryDto);
 }
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 e622dd7..bf64268 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -11,12 +11,10 @@
 import com.ruoyi.common.utils.OrderUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.staff.pojo.StaffOnJob;
 import com.ruoyi.stock.dto.StockInRecordDto;
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.dto.StockUninventoryDto;
 import com.ruoyi.stock.execl.StockInRecordExportData;
-import com.ruoyi.stock.execl.StockInventoryExportData;
 import com.ruoyi.stock.mapper.StockInRecordMapper;
 import com.ruoyi.stock.mapper.StockInventoryMapper;
 import com.ruoyi.stock.mapper.StockUninventoryMapper;
@@ -25,7 +23,6 @@
 import com.ruoyi.stock.pojo.StockUninventory;
 import com.ruoyi.stock.service.StockInRecordService;
 import lombok.AllArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
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 e103f75..99c4544 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -4,6 +4,7 @@
 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.common.enums.StockQualifiedRecordTypeEnum;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.web.domain.R;
@@ -13,11 +14,10 @@
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.dto.StockOutRecordDto;
 import com.ruoyi.stock.execl.StockInventoryExportData;
-import com.ruoyi.stock.pojo.StockInventory;
 import com.ruoyi.stock.mapper.StockInventoryMapper;
+import com.ruoyi.stock.pojo.StockInventory;
 import com.ruoyi.stock.service.StockInRecordService;
 import com.ruoyi.stock.service.StockInventoryService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.stock.service.StockOutRecordService;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
@@ -70,6 +70,8 @@
             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);
@@ -90,6 +92,9 @@
         stockOutRecordDto.setType("0");
         stockOutRecordService.add(stockOutRecordDto);
         StockInventory oldStockInventory = stockInventoryMapper.selectOne(new QueryWrapper<StockInventory>().lambda().eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId()));
+        if (stockInventoryDto.getQualitity().compareTo( oldStockInventory.getQualitity().subtract(oldStockInventory.getLockedQuantity()))>0) {
+            throw new RuntimeException("搴撳瓨涓嶈冻鏃犳硶鍑哄簱");
+        }
         if (ObjectUtils.isEmpty(oldStockInventory)) {
             throw new RuntimeException("浜у搧搴撳瓨涓嶅瓨鍦�");
         }else {
@@ -120,6 +125,11 @@
                         stockInventoryDto.setRecordType(StockQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_IN.getCode());
                         stockInventoryDto.setQualitity(dto.getQualitity());
                         stockInventoryDto.setRemark(dto.getRemark());
+                        stockInventoryDto.setWarnNum(dto.getWarnNum());
+                        if (ObjectUtils.isNotEmpty(dto.getLockedQuantity())&&dto.getLockedQuantity().compareTo(dto.getQualitity())>0) {
+                            throw new RuntimeException("鍐荤粨鏁伴噺涓嶈兘瓒呰繃鏈瀵煎叆鐨勫簱瀛樻暟閲�");
+                        }
+                        stockInventoryDto.setLockedQuantity(dto.getLockedQuantity());
                         stockInventoryDto.setProductModelId(item.getProductModelId());
                         this.addstockInventory(stockInventoryDto);
                         matched = true;
@@ -167,4 +177,28 @@
     public IPage<StockInventoryDto> stockInAndOutRecord(StockInventoryDto stockInventoryDto, Page 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) {
+            throw new RuntimeException("鍐荤粨鏁伴噺涓嶈兘瓒呰繃搴撳瓨鏁伴噺");
+        }
+        if (ObjectUtils.isEmpty(stockInventory.getLockedQuantity())) {
+            stockInventory.setLockedQuantity(stockInventoryDto.getLockedQuantity());
+        }else {
+            stockInventory.setLockedQuantity(stockInventory.getLockedQuantity().add(stockInventoryDto.getLockedQuantity()));
+        }
+        return this.updateById(stockInventory);
+    }
+
+    @Override
+    public Boolean thawStock(StockInventoryDto stockInventoryDto) {
+        StockInventory stockInventory = stockInventoryMapper.selectById(stockInventoryDto.getId());
+        if (stockInventory.getLockedQuantity().compareTo(stockInventoryDto.getLockedQuantity())<0) {
+            throw new RuntimeException("瑙e喕鏁伴噺涓嶈兘瓒呰繃鍐荤粨鏁伴噺");
+        }
+        stockInventory.setLockedQuantity(stockInventory.getLockedQuantity().subtract(stockInventoryDto.getLockedQuantity()));
+        return this.updateById(stockInventory);
+    }
 }
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
index 76dc175..f46f4c0 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
@@ -14,7 +14,6 @@
 import com.ruoyi.stock.dto.StockInventoryDto;
 import com.ruoyi.stock.dto.StockOutRecordDto;
 import com.ruoyi.stock.dto.StockUninventoryDto;
-import com.ruoyi.stock.execl.StockInRecordExportData;
 import com.ruoyi.stock.execl.StockOutRecordExportData;
 import com.ruoyi.stock.mapper.StockInventoryMapper;
 import com.ruoyi.stock.mapper.StockOutRecordMapper;
@@ -25,7 +24,6 @@
 import com.ruoyi.stock.pojo.StockUninventory;
 import com.ruoyi.stock.service.StockOutRecordService;
 import lombok.AllArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.servlet.http.HttpServletResponse;
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 fae9248..2d5b8f5 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java
@@ -4,18 +4,18 @@
 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.common.utils.poi.ExcelUtil;
 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.StockInventoryExportData;
-import com.ruoyi.stock.pojo.StockInventory;
-import com.ruoyi.stock.pojo.StockUninventory;
+import com.ruoyi.stock.execl.StockUnInventoryExportData;
 import com.ruoyi.stock.mapper.StockUninventoryMapper;
+import com.ruoyi.stock.pojo.StockUninventory;
 import com.ruoyi.stock.service.StockInRecordService;
 import com.ruoyi.stock.service.StockOutRecordService;
 import com.ruoyi.stock.service.StockUninventoryService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -94,8 +94,32 @@
 
     @Override
     public void exportStockUninventory(HttpServletResponse response, StockUninventoryDto stockUninventoryDto) {
-        List<StockInventoryExportData> list = stockUninventoryMapper.listStockInventoryExportData(stockUninventoryDto);
-        ExcelUtil<StockInventoryExportData> util = new ExcelUtil<>(StockInventoryExportData.class);
+        List<StockUnInventoryExportData> list = stockUninventoryMapper.listStockInventoryExportData(stockUninventoryDto);
+        ExcelUtil<StockUnInventoryExportData> util = new ExcelUtil<>(StockUnInventoryExportData.class);
         util.exportExcel(response,list, "涓嶅悎鏍煎簱瀛樹俊鎭�");
     }
+
+    @Override
+    public Boolean frozenStock(StockInventoryDto stockInventoryDto) {
+        StockUninventory stockUninventory = stockUninventoryMapper.selectById(stockInventoryDto.getId());
+        if (stockUninventory.getQualitity().compareTo(stockInventoryDto.getLockedQuantity())<0) {
+            throw new RuntimeException("鍐荤粨鏁伴噺涓嶈兘瓒呰繃搴撳瓨鏁伴噺");
+        }
+        if (ObjectUtils.isEmpty(stockUninventory.getLockedQuantity())) {
+            stockUninventory.setLockedQuantity(stockInventoryDto.getLockedQuantity());
+        }else {
+            stockUninventory.setLockedQuantity(stockUninventory.getLockedQuantity().add(stockInventoryDto.getLockedQuantity()));
+        }
+        return this.updateById(stockUninventory);
+    }
+
+    @Override
+    public Boolean thawStock(StockInventoryDto stockInventoryDto) {
+        StockUninventory stockUninventory = stockUninventoryMapper.selectById(stockInventoryDto.getId());
+        if (stockUninventory.getLockedQuantity().compareTo(stockInventoryDto.getLockedQuantity())<0) {
+            throw new RuntimeException("瑙e喕鏁伴噺涓嶈兘瓒呰繃鍐荤粨鏁伴噺");
+        }
+        stockUninventory.setLockedQuantity(stockUninventory.getLockedQuantity().subtract(stockInventoryDto.getLockedQuantity()));
+        return this.updateById(stockUninventory);
+    }
 }
diff --git a/src/main/resources/mapper/stock/StockInventoryMapper.xml b/src/main/resources/mapper/stock/StockInventoryMapper.xml
index b3f54ee..3cf81dc 100644
--- a/src/main/resources/mapper/stock/StockInventoryMapper.xml
+++ b/src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -4,14 +4,14 @@
 
     <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
     <resultMap id="BaseResultMap" type="com.ruoyi.stock.pojo.StockInventory">
-        <result column="id" property="id" />
-        <result column="product_model_id" property="productModelId" />
-        <result column="qualitity" property="qualitity" />
-        <result column="create_time" property="createTime" />
-        <result column="update_time" property="updateTime" />
-        <result column="version" property="version" />
-        <result column="locked_quantity" property="lockedQuantity" />
-        <result column="warn_num" property="warnNum" />
+        <result column="id" property="id"/>
+        <result column="product_model_id" property="productModelId"/>
+        <result column="qualitity" property="qualitity"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="version" property="version"/>
+        <result column="locked_quantity" property="lockedQuantity"/>
+        <result column="warn_num" property="warnNum"/>
     </resultMap>
     <update id="updateAddStockInventory">
         update stock_inventory
@@ -19,11 +19,17 @@
             <if test="ew.qualitity != null">
                 qualitity = qualitity + #{ew.qualitity},
             </if>
-           <if test="ew.version != null">
-               version = version + 1,
+            <if test="ew.version != null">
+                version = version + 1,
             </if>
             <if test="ew.remark != null and ew.remark !=''">
                 remark = #{ew.remark},
+            </if>
+            <if test="ew.warnNum != null and ew.warnNum !=''">
+                warn_num = #{ew.warnNum},
+            </if>
+            <if test="ew.lockedQuantity != null and ew.lockedQuantity !=''">
+                locked_quantity = locked_quantity + #{ew.lockedQuantity},
             </if>
             update_time = now()
         </set>
@@ -46,13 +52,21 @@
         where product_model_id = #{ew.productModelId} and qualitity >= #{ew.qualitity}
     </update>
     <select id="pagestockInventory" resultType="com.ruoyi.stock.dto.StockInventoryDto">
-        select si.*,
-               pm.model,
-               pm.unit,
-               p.product_name
+        select si.id,
+        si.qualitity,
+        COALESCE(si.locked_quantity, 0) as locked_quantity,
+        si.product_model_id,
+        si.create_time,
+        si.update_time,
+        COALESCE(si.warn_num, 0) as warn_num,
+        si.version,
+        (si.qualitity - COALESCE(si.locked_quantity, 0)) as un_locked_quantity,
+        pm.model,
+        pm.unit,
+        p.product_name
         from stock_inventory si
-                 left join product_model pm on si.product_model_id = pm.id
-                 left join product p on pm.product_id = p.id
+        left join product_model pm on si.product_model_id = pm.id
+        left join product p on pm.product_id = p.id
         where 1 = 1
         <if test="ew.productName != null and ew.productName !=''">
             and p.product_name like concat('%',#{ew.productName},'%')
@@ -63,6 +77,8 @@
         pm.model,
         pm.unit,
         p.product_name,
+        coalesce(si.warn_num, 0) as warn_num,
+        coalesce(si.locked_quantity, 0) as locked_quantity,
         si.remark,
         si.update_time
         from stock_inventory si
diff --git a/src/main/resources/mapper/stock/StockUninventoryMapper.xml b/src/main/resources/mapper/stock/StockUninventoryMapper.xml
index 39b16b3..b171ae2 100644
--- a/src/main/resources/mapper/stock/StockUninventoryMapper.xml
+++ b/src/main/resources/mapper/stock/StockUninventoryMapper.xml
@@ -44,19 +44,27 @@
         where product_model_id = #{ew.productModelId}
     </update>
     <select id="pageStockUninventory" resultType="com.ruoyi.stock.dto.StockUninventoryDto">
-        select su.*,
-               pm.model,
-               pm.unit,
-               p.product_name
+        select su.id,
+        su.qualitity,
+        COALESCE(su.locked_quantity, 0) as locked_quantity,
+        su.product_model_id,
+        su.create_time,
+        su.update_time,
+        su.version,
+        su.update_time,
+        (su.qualitity - COALESCE(su.locked_quantity, 0)) as un_locked_quantity,
+        pm.model,
+        pm.unit,
+        p.product_name
         from stock_uninventory su
-                 left join product_model pm on su.product_model_id = pm.id
-                 left join product p on pm.product_id = p.id
+        left join product_model pm on su.product_model_id = pm.id
+        left join product p on pm.product_id = p.id
         where 1 = 1
         <if test="ew.productName != null and ew.productName !=''">
             and p.product_name like concat('%',#{ew.productName},'%')
         </if>
     </select>
-    <select id="listStockInventoryExportData" resultType="com.ruoyi.stock.execl.StockInventoryExportData">
+    <select id="listStockInventoryExportData" resultType="com.ruoyi.stock.execl.StockUnInventoryExportData">
         select su.*,
         pm.model,
         pm.unit,

--
Gitblit v1.9.3