From 1f1ef0f62c4953e3ff9c610cda8f3c4f8a45c025 Mon Sep 17 00:00:00 2001
From: maven <2163098428@qq.com>
Date: 星期二, 20 一月 2026 14:34:52 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_New' into hsxny-new

---
 src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java              |   20 -
 src/main/java/com/ruoyi/staff/dto/StaffOnJobDto.java                                     |    4 
 src/main/resources/mapper/production/ProductWorkOrderMapper.xml                          |    8 
 src/main/java/com/ruoyi/home/controller/HomeController.java                              |    4 
 src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java                    |   50 +++
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java             |   16 +
 src/main/java/com/ruoyi/collaborativeApproval/service/impl/MeetingServiceImpl.java       |    9 
 src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java             |    2 
 src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java                           |  134 ++++++---
 src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java                    |    1 
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java            |    4 
 src/main/java/com/ruoyi/staff/controller/StaffLeaveController.java                       |    1 
 src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java    |    4 
 src/main/java/com/ruoyi/staff/service/impl/StaffLeaveServiceImpl.java                    |    4 
 src/main/resources/mapper/basic/ProductModelMapper.xml                                   |   64 ++++
 src/main/resources/mapper/production/ProductOrderMapper.xml                              |    3 
 src/main/java/com/ruoyi/home/dto/ProductionProgressDto.java                              |   10 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java                    |    2 
 src/main/java/com/ruoyi/basic/pojo/ProductModel.java                                     |    4 
 src/main/java/com/ruoyi/staff/service/StaffLeaveService.java                             |    2 
 src/main/java/com/ruoyi/home/dto/ProductionTurnoverDto.java                              |   27 ++
 src/main/java/com/ruoyi/quality/service/IQualityInspectService.java                      |    3 
 src/main/java/com/ruoyi/basic/mapper/ProductModelMapper.java                             |    3 
 src/main/java/com/ruoyi/project/system/service/impl/SysNoticeServiceImpl.java            |   61 ++++
 src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java                            |    7 
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java |   51 +++
 src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java                       |   18 +
 src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java                 |   22 
 /dev/null                                                                                |   43 ---
 src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java         |  140 ++++++++--
 src/main/java/com/ruoyi/quality/controller/QualityInspectController.java                 |    8 
 src/main/java/com/ruoyi/staff/service/StaffContractService.java                          |    7 
 src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java          |    2 
 doc/20260119-procurement_record_storage.sql                                              |    2 
 src/main/java/com/ruoyi/home/service/HomeService.java                                    |    5 
 src/main/resources/mapper/system/SysUserMapper.xml                                       |    2 
 src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml                  |    1 
 src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java                     |    1 
 src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java        |    2 
 39 files changed, 519 insertions(+), 232 deletions(-)

diff --git a/doc/20260119-procurement_record_storage.sql b/doc/20260119-procurement_record_storage.sql
new file mode 100644
index 0000000..923bbd3
--- /dev/null
+++ b/doc/20260119-procurement_record_storage.sql
@@ -0,0 +1,2 @@
+alter table procurement_record_storage
+    add quality_inspect_id bigint null comment '璐ㄦid';
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/basic/mapper/ProductModelMapper.java b/src/main/java/com/ruoyi/basic/mapper/ProductModelMapper.java
index a1669f1..05d5792 100644
--- a/src/main/java/com/ruoyi/basic/mapper/ProductModelMapper.java
+++ b/src/main/java/com/ruoyi/basic/mapper/ProductModelMapper.java
@@ -4,6 +4,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.basic.pojo.ProductModel;
+import com.ruoyi.procurementrecord.dto.ProcurementPageDto;
 import org.apache.ibatis.annotations.Param;
 
 
@@ -17,6 +18,8 @@
 
     IPage<ProductModel> listPageProductModel(Page<ProductModel> page, @Param("c") ProductModel productModel);
 
+    IPage<ProductModel> listPageProductionStock(Page<ProductModel> page, @Param("req") ProcurementPageDto req);
+
     ProductModel selectLatestRecord();
 
 }
diff --git a/src/main/java/com/ruoyi/basic/pojo/ProductModel.java b/src/main/java/com/ruoyi/basic/pojo/ProductModel.java
index 3e4fef7..069b665 100644
--- a/src/main/java/com/ruoyi/basic/pojo/ProductModel.java
+++ b/src/main/java/com/ruoyi/basic/pojo/ProductModel.java
@@ -6,6 +6,7 @@
 import lombok.Data;
 
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
 
 @Data
 @TableName("product_model")
@@ -59,4 +60,7 @@
     @TableField(exist = false)
     @Excel(name = "鍓╀綑搴撳瓨")
     private BigDecimal stockQuantity;
+
+    @TableField(exist = false)
+    private LocalDateTime createTime;
 }
diff --git a/src/main/java/com/ruoyi/collaborativeApproval/service/impl/MeetingServiceImpl.java b/src/main/java/com/ruoyi/collaborativeApproval/service/impl/MeetingServiceImpl.java
index bef5926..75cbc5a 100644
--- a/src/main/java/com/ruoyi/collaborativeApproval/service/impl/MeetingServiceImpl.java
+++ b/src/main/java/com/ruoyi/collaborativeApproval/service/impl/MeetingServiceImpl.java
@@ -30,8 +30,8 @@
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.mapper.SysUserMapper;
 import com.ruoyi.project.system.service.ISysNoticeService;
-import com.ruoyi.staff.mapper.StaffJoinLeaveRecordMapper;
-import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
+import com.ruoyi.staff.mapper.StaffOnJobMapper;
+import com.ruoyi.staff.pojo.StaffOnJob;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
@@ -48,11 +48,12 @@
     private final MeetDraftMapper meetDraftMapper;
 
     private final MeetApplicationMapper meetApplicationMapper;
-    private final StaffJoinLeaveRecordMapper staffJoinLeaveRecordMapper;
+    private final StaffOnJobMapper staffOnJobMapper;
 
     private final MeetingMinutesMapper meetingMinutesMapper;
     private final SysUserMapper userMapper;
     private final ISysNoticeService sysNoticeService;
+
 
     @Override
     public IPage<MeetingRoom> getMeetingRoomList(SearchMeetingRoomVo vo) {
@@ -165,7 +166,7 @@
                     .filter(s -> !s.isEmpty())
                     .map(Long::valueOf)
                     .map(staffId -> {
-                        StaffJoinLeaveRecord record = staffJoinLeaveRecordMapper.selectById(staffId);
+                        StaffOnJob record = staffOnJobMapper.selectById(staffId);
                         if (record == null) {
                             return null;
                         }
diff --git a/src/main/java/com/ruoyi/home/controller/HomeController.java b/src/main/java/com/ruoyi/home/controller/HomeController.java
index 810f9ae..712855c 100644
--- a/src/main/java/com/ruoyi/home/controller/HomeController.java
+++ b/src/main/java/com/ruoyi/home/controller/HomeController.java
@@ -99,8 +99,8 @@
     @GetMapping("/workInProcessTurnover")
     @ApiOperation("鍦ㄥ埗鍝佸懆杞儏鍐�")
     public AjaxResult workInProcessTurnover(){
-        Map<Integer, List<ProductWorkOrderDto>> productWorkOrderDtoMap = homeService.workInProcessTurnover();
-        return AjaxResult.success(productWorkOrderDtoMap);
+        ProductionTurnoverDto productionTurnoverDto = homeService.workInProcessTurnover();
+        return AjaxResult.success(productionTurnoverDto);
     }
 
     @ApiOperation("瓒呰繃15澶╁緟鍥炴鎻愮ず")
diff --git a/src/main/java/com/ruoyi/home/dto/ProductionProgressDto.java b/src/main/java/com/ruoyi/home/dto/ProductionProgressDto.java
index 99d9e61..88fe4b6 100644
--- a/src/main/java/com/ruoyi/home/dto/ProductionProgressDto.java
+++ b/src/main/java/com/ruoyi/home/dto/ProductionProgressDto.java
@@ -12,14 +12,14 @@
 @ApiModel
 public class ProductionProgressDto {
     @ApiModelProperty("鎬昏鍗曟暟")
-    private Integer totalOrderCount;
+    private Long totalOrderCount;
 
     @ApiModelProperty("宸插畬鎴愯鍗曟暟")
-    private Integer completedOrderCount;
+    private Long completedOrderCount;
     @ApiModelProperty("鏈畬鎴愯鍗曟暟")
-    private Integer uncompletedOrderCount;
-    @ApiModelProperty("鎬讳綋瀹屾垚杩涘害")
-    private BigDecimal completedProgressCount;
+    private Long uncompletedOrderCount;
+    @ApiModelProperty("閮ㄥ垎瀹屾垚璁㈠崟鏁�")
+    private Long partialCompletedOrderCount;
     @ApiModelProperty("璁㈠崟璇︽儏")
     private List<ProductOrderDto> completedOrderDetails;
 }
diff --git a/src/main/java/com/ruoyi/home/dto/ProductionTurnoverDto.java b/src/main/java/com/ruoyi/home/dto/ProductionTurnoverDto.java
new file mode 100644
index 0000000..41ad82b
--- /dev/null
+++ b/src/main/java/com/ruoyi/home/dto/ProductionTurnoverDto.java
@@ -0,0 +1,27 @@
+package com.ruoyi.home.dto;
+
+import com.ruoyi.production.dto.ProductOrderDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+@ApiModel
+public class ProductionTurnoverDto {
+    @ApiModelProperty("鎬诲湪鍒舵暟閲�")
+    private Long totalOrderCount;
+
+    @ApiModelProperty("骞冲潎鍛ㄨ浆澶╂暟")
+    private BigDecimal averageTurnoverDays;
+    @ApiModelProperty("鍛ㄨ浆鏁堢巼")
+    private BigDecimal turnoverEfficiency;
+
+    @ApiModelProperty("宸ュ簭璇︽儏")
+    private List<String> processDetails;
+
+    @ApiModelProperty("宸ュ簭瀵瑰簲鐨勬暟閲忚鎯�")
+    private List<Long> processQuantityDetails;
+}
diff --git a/src/main/java/com/ruoyi/home/service/HomeService.java b/src/main/java/com/ruoyi/home/service/HomeService.java
index 9017de6..e950e20 100644
--- a/src/main/java/com/ruoyi/home/service/HomeService.java
+++ b/src/main/java/com/ruoyi/home/service/HomeService.java
@@ -31,9 +31,8 @@
 
     Long noticesCount();
 
-     ProductionProgressDto productionProgress();
-     Map<Integer, List<ProductWorkOrderDto>> workInProcessTurnover();
-
+    ProductionProgressDto productionProgress();
+    ProductionTurnoverDto workInProcessTurnover();
 
     Long overdueReceivable();
 }
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 848670b..5cc269c 100644
--- a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
+++ b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -2,9 +2,12 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 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.ProductModelMapper;
+import com.ruoyi.basic.pojo.ProductModel;
 import com.ruoyi.collaborativeApproval.mapper.NoticeMapper;
 import com.ruoyi.collaborativeApproval.pojo.Notice;
 import com.ruoyi.common.utils.SecurityUtils;
@@ -24,13 +27,16 @@
 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.mapper.SysDeptMapper;
@@ -59,6 +65,7 @@
 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;
@@ -113,10 +120,13 @@
     @Autowired
     private ProductOrderMapper productOrderMapper;
     @Autowired
-    private ProductionProductMainMapper productionProductMainMapper;
+    private ProductProcessMapper productProcessMapper;
     @Autowired
     private ProductWorkOrderMapper productWorkOrderMapper;
-
+    @Autowired
+    private ProductModelMapper productModelMapper;
+    @Autowired
+    private StockUtils stockUtils;
     @Override
     public HomeBusinessDto business() {
         // 鏋勫缓缁撴灉
@@ -169,23 +179,35 @@
             homeBusinessDto.setMonthPurchaseHaveMoney(unReceiptPaymentAmount.setScale(2, RoundingMode.HALF_UP).toString());
         }
         // 缁熻搴撳瓨
-        List<ProcurementRecordStorage> procurementRecordStorages = procurementRecordStorageMapper.selectList(null);
-        BigDecimal stockAmount = procurementRecordStorages.stream()
-                .map(ProcurementRecordStorage::getInboundNum)
-                .filter(Objects::nonNull)
-                .reduce(BigDecimal.ZERO, BigDecimal::add);
-        // 鑷畾涔夊簱瀛�
-        List<CustomStorage> customStorages = customStorageMapper.selectList(null);
-        BigDecimal customStockAmount = customStorages.stream()
-                .map(CustomStorage::getInboundNum)
-                .filter(Objects::nonNull)
-                .reduce(BigDecimal.ZERO, BigDecimal::add);
-        List<ProcurementRecordOut> procurementRecordOuts = procurementRecordOutMapper.selectList(null);
-        BigDecimal outboundAmount = procurementRecordOuts.stream()
-                .map(ProcurementRecordOut::getInboundNum)
-                .filter(Objects::nonNull)
-                .reduce(BigDecimal.ZERO, BigDecimal::add);
-        BigDecimal stock = stockAmount.add(customStockAmount).subtract(outboundAmount);
+//        List<ProcurementRecordStorage> procurementRecordStorages = procurementRecordStorageMapper.selectList(null);
+//        BigDecimal stockAmount = procurementRecordStorages.stream()
+//                .map(ProcurementRecordStorage::getInboundNum)
+//                .filter(Objects::nonNull)
+//                .reduce(BigDecimal.ZERO, BigDecimal::add);
+//        // 鑷畾涔夊簱瀛�
+//        List<CustomStorage> customStorages = customStorageMapper.selectList(null);
+//        BigDecimal customStockAmount = customStorages.stream()
+//                .map(CustomStorage::getInboundNum)
+//                .filter(Objects::nonNull)
+//                .reduce(BigDecimal.ZERO, BigDecimal::add);
+//        List<ProcurementRecordOut> procurementRecordOuts = procurementRecordOutMapper.selectList(null);
+//        BigDecimal outboundAmount = procurementRecordOuts.stream()
+//                .map(ProcurementRecordOut::getInboundNum)
+//                .filter(Objects::nonNull)
+//                .reduce(BigDecimal.ZERO, BigDecimal::add);
+//        BigDecimal stock = stockAmount.add(customStockAmount).subtract(outboundAmount);
+        IPage<ProductModel> productModelIPage = productModelMapper.listPageProductModel(new Page<>(1, -1), new ProductModel());
+        if(!CollectionUtils.isEmpty(productModelIPage.getRecords())){
+            //鑾峰彇瑙勬牸id
+            List<Long> modelIds = productModelIPage.getRecords().stream().map(ProductModel::getId).collect(Collectors.toList());
+            BigDecimal stockQuantityTotal = modelIds.stream()
+                    .map(stockUtils::getStockQuantity)
+                    .map(map -> map.get("stockQuantity"))
+                    .filter(Objects::nonNull)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            homeBusinessDto.setInventoryNum(stockQuantityTotal.setScale(2, RoundingMode.HALF_UP).toString());
+        }
+
         // 鑾峰彇褰撳ぉ鍏ュ簱鏁伴噺
         LambdaQueryWrapper<ProcurementRecordStorage> procurementRecordStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
         procurementRecordStorageLambdaQueryWrapper.ge(ProcurementRecordStorage::getCreateTime, now)  // 澶т簬绛変簬褰撳ぉ
@@ -195,7 +217,7 @@
                 .map(ProcurementRecordStorage::getInboundNum)
                 .filter(Objects::nonNull)
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
-        homeBusinessDto.setInventoryNum(stock.setScale(2, RoundingMode.HALF_UP).toString());
+//        homeBusinessDto.setInventoryNum(stock.setScale(2, RoundingMode.HALF_UP).toString());
         homeBusinessDto.setTodayInventoryNum(stockAmount1.setScale(2, RoundingMode.HALF_UP).toString());
         return homeBusinessDto;
     }
@@ -512,37 +534,55 @@
     @Override
     public ProductionProgressDto productionProgress() {
         ProductionProgressDto productionProgressDto = new ProductionProgressDto();
-        List<ProductOrder> productOrderList = productOrderMapper.selectList(new LambdaQueryWrapper<ProductOrder>());
-        List<ProductOrderDto> productOrderDtoList = new ArrayList<>();
-        productOrderList.forEach(productOrder -> {
-            ProductOrderDto productOrderDto = productOrderMapper.productMainByOrderId(productOrder);
-//            if (productOrderDto != null && productOrderDto.getPlanQuantity() != null && productOrderDto.getQuantity() != null) {
-//                productOrderDto.setCompletionStatus((productOrderDto.getPlanQuantity().subtract(productOrderDto.getQuantity())).divide(productOrderDto.getPlanQuantity(), 2, RoundingMode.HALF_UP));
-//            }
-            productOrderDtoList.add(productOrderDto);
-        });
-        productionProgressDto.setCompletedOrderDetails(productOrderDtoList);
-        // 1. 鏌ヨ鎵�鏈夌敓浜ц鍗曪紙鍙牴鎹渶姹傛坊鍔犺繃婊ゆ潯浠讹紝濡傛帓闄ゅ凡鍒犻櫎銆佸凡鍙栨秷鐨勮鍗曪級
-        IPage<ProductOrderDto> productOrderDtoIPage = productOrderMapper.pageProductOrder(new Page<>(1, -1), new ProductOrderDto());
-
-        // 2. 鍒濆鍖栨眹鎬绘暟鎹�
-        int totalCount = productOrderDtoIPage.getRecords().size();
-        int completedCount = (int) productOrderDtoIPage.getRecords().stream().map(productOrderDto -> productOrderMapper.productMainByOrderId(productOrderDto)).filter(productOrderDto1 -> productOrderDto1.getQuantity() != null && productOrderDto1.getQuantity().compareTo(BigDecimal.ZERO) == 0).count();
-
-        // 6. 璧嬪�兼眹鎬绘暟鎹�
+        ProductOrderDto orderDto = new ProductOrderDto();
+        orderDto.setStartTime(LocalDateTime.now().minusMonths(1));
+        orderDto.setEndTime(LocalDateTime.now());
+        List<ProductOrderDto> productOrderDtos = productOrderMapper.pageProductOrder(new Page<>(1, -1), orderDto).getRecords();
+        productionProgressDto.setCompletedOrderDetails(productOrderDtos);
+        long totalCount = productOrderDtos.size();
+        long count = productOrderDtos.stream().filter(productOrderDto -> productOrderDto.getCompleteQuantity().compareTo(productOrderDto.getQuantity()) >= 0).count();
+        long count2 = productOrderDtos.stream().filter(productOrderDto -> productOrderDto.getCompleteQuantity().compareTo(BigDecimal.ZERO) == 0).count();
         productionProgressDto.setTotalOrderCount(totalCount);
-        productionProgressDto.setCompletedOrderCount(completedCount);
-        productionProgressDto.setUncompletedOrderCount(totalCount - completedCount);
-        productionProgressDto.setCompletedProgressCount(BigDecimal.valueOf(completedCount).divide(BigDecimal.valueOf(totalCount), 2, RoundingMode.HALF_UP));
+        productionProgressDto.setCompletedOrderCount(count);
+        productionProgressDto.setUncompletedOrderCount(count2);
+        productionProgressDto.setPartialCompletedOrderCount(totalCount-count-count2);
         return productionProgressDto;
     }
     @Override
-    public Map<Integer, List<ProductWorkOrderDto>> workInProcessTurnover() {
-        List<ProductWorkOrderDto> productWorkOrderDtoList = productWorkOrderMapper.selectProductWorkOrderDtoList();
-       //鏍规嵁鐘舵�佸尯鍒嗗伐鍗曠殑鍚勪釜鐘舵��
-        Map<Integer, List<ProductWorkOrderDto>> productWorkOrderDtoMap = productWorkOrderDtoList.stream().collect(Collectors.groupingBy(ProductWorkOrderDto::getStatus));
-
-        return productWorkOrderDtoMap;
+    public ProductionTurnoverDto workInProcessTurnover() {
+        ProductionTurnoverDto productionTurnoverDto = new ProductionTurnoverDto();
+        ProductWorkOrderDto workOrder = new ProductWorkOrderDto();
+        workOrder.setPlanStartTime(LocalDate.now().minusMonths(1));
+        workOrder.setPlanEndTime(LocalDate.now());
+        List<ProductWorkOrderDto> productWorkOrders = productWorkOrderMapper.pageProductWorkOrder(new Page<>(1, -1), workOrder).getRecords();
+        long sum = productWorkOrders.stream()
+                .filter(productWorkOrder -> productWorkOrder.getPlanQuantity().compareTo(productWorkOrder.getCompleteQuantity()) > 0)
+                .map(ProductWorkOrder::getPlanQuantity)
+                .mapToLong(BigDecimal::longValue)
+                .sum();
+        if (sum == 0)return null;
+        productionTurnoverDto.setTotalOrderCount(sum);//鎬诲湪鍒跺搧鏁伴噺
+        productionTurnoverDto.setAverageTurnoverDays(BigDecimal.valueOf(sum).divide(BigDecimal.valueOf(ChronoUnit.DAYS.between(LocalDateTime.now().minusMonths(1), LocalDateTime.now())),2,RoundingMode.HALF_UP));
+        long completeQuantity = productWorkOrders.stream()
+                .filter(productWorkOrder -> productWorkOrder.getCompleteQuantity().compareTo(productWorkOrder.getPlanQuantity()) >= 0)
+                .map(ProductWorkOrder::getCompleteQuantity)
+                .mapToLong(BigDecimal::longValue)
+                .sum();
+        productionTurnoverDto.setTurnoverEfficiency(BigDecimal.valueOf(completeQuantity).divide(BigDecimal.valueOf(sum),2,RoundingMode.HALF_UP));
+        Map<String, List<ProductWorkOrderDto>> map = productWorkOrders.stream()
+                .filter(productWorkOrder -> productWorkOrder.getPlanQuantity().compareTo(productWorkOrder.getCompleteQuantity()) > 0)
+                .collect(Collectors.groupingBy(ProductWorkOrderDto::getProcessName));
+        List<String> strings = new ArrayList<>();
+        List<Long> processQuantityDetails = new ArrayList<>();
+        map.entrySet().stream().forEach(entry -> {
+            String key = entry.getKey();
+            long completeSum = entry.getValue().stream().map(ProductWorkOrderDto::getCompleteQuantity).mapToLong(BigDecimal::longValue).sum();
+            strings.add(key);
+            processQuantityDetails.add(completeSum);
+        });
+        productionTurnoverDto.setProcessDetails(strings);
+        productionTurnoverDto.setProcessQuantityDetails(processQuantityDetails);
+        return productionTurnoverDto;
 
     }
 
diff --git a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
index 5234b3f..879b328 100644
--- a/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
+++ b/src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
@@ -237,8 +237,8 @@
 
     @GetMapping("/listPageProductionStock")
     @Log(title = "搴撳瓨绠$悊-鎴愬搧搴撳瓨", businessType = BusinessType.OTHER)
-    public AjaxResult listPageProductionStock(Page page) {
-        IPage<ProductModel> result = procurementRecordService.listPageProductionStock(page);
+    public AjaxResult listPageProductionStock(Page page, ProcurementPageDto procurementDto) {
+        IPage<ProductModel> result = procurementRecordService.listPageProductionStock(page,procurementDto);
         return AjaxResult.success(result);
     }
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java
index 98ea4eb..6bb4e47 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java
@@ -22,5 +22,6 @@
 
     private String typeName;
     private Integer purchaseLedgerId;
+    private Long qualityInspectId;
 
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
index a23002a..1d06eb6 100644
--- a/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
+++ b/src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
@@ -192,4 +192,6 @@
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     private LocalDate endDate;
 
+    private Long productModelId;
+
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
index 0e18336..29e77c4 100644
--- a/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
+++ b/src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
@@ -100,4 +100,6 @@
      * 浜у搧ID
      */
     private Long productModelId;
+
+    private Long qualityInspectId;
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
index 4c3ffee..6bd187c 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
@@ -60,7 +60,7 @@
     BigDecimal getProcurementAmount(Long salesProductId);
     InventoryInformationDto getReportList();
 
-    IPage<ProductModel> listPageProductionStock(Page page);
+    IPage<ProductModel> listPageProductionStock(Page page, ProcurementPageDto procurementDto);
 
     IPage<ProcurementPageDto> listPageByProductProduction(Page page, ProcurementPageDto procurementDto);
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
index 35ec34c..19509a3 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -781,7 +781,8 @@
                     .updateTime(LocalDateTime.now())
                     .updateUser(loginUser.getUserId())
                     .createBy(procurementDto.getNickName())
-                    .productModelId(detail.getProductModelId());
+                    .productModelId(detail.getProductModelId())
+                    .qualityInspectId(ObjectUtils.isNotNull(procurementDto.getQualityInspectId())?procurementDto.getQualityInspectId():0L);
             this.save(procurementRecordBuilder.build());
             // 鍏ュ簱鎴愬姛鍑忔帀閲囪喘鏁伴噺
 //            LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductLambdaQueryWrapper = new LambdaQueryWrapper<>();
@@ -881,21 +882,51 @@
         }
         return procurementPageDtoCopyIPage;
     }
+
     @Override
-    public IPage<ProductModel> listPageProductionStock(Page page) {
-        ProductModel productModel = new ProductModel();
-        IPage<ProductModel> iPage = productModelMapper.listPageProductModel(page, productModel);
-        iPage.getRecords().forEach(item -> {
-            item.setInboundNum(stockUtils.getStockQuantity(item.getId()).get("inboundNum"));
-            item.setOutboundNum(stockUtils.getStockQuantity(item.getId()).get("outboundNum"));
-            item.setStockQuantity(stockUtils.getStockQuantity(item.getId()).get("stockQuantity"));
-        });
-        return iPage;
+    public IPage<ProductModel> listPageProductionStock(Page page, ProcurementPageDto dto) {
+        return productModelMapper.listPageProductionStock(page, dto);
     }
 
     @Override
     public IPage<ProcurementPageDto> listPageByProductProduction(Page page, ProcurementPageDto procurementDto) {
         IPage<ProcurementPageDto> procurementPageDtoIPage = procurementRecordMapper.listPageByProductProduction(page, procurementDto);
+
+
+        List<ProcurementPageDto> procurementPageDtos = procurementPageDtoIPage.getRecords();
+        // 璁$畻寰呭叆搴撴暟閲�
+        // 鏌ヨ閲囪喘璁板綍宸插叆搴撴暟閲�
+        List<Integer> collect = procurementPageDtos.stream().map(ProcurementPageDto::getId).collect(Collectors.toList());
+        if(CollectionUtils.isEmpty( collect)){
+            return procurementPageDtoIPage;
+        }
+        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect)
+                .eq(ProcurementRecordOut::getType, 4);
+        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
+        if(CollectionUtils.isEmpty( procurementRecords)){
+            return procurementPageDtoIPage;
+        }
+        for (ProcurementPageDto dto : procurementPageDtos) {
+            // 鏍规嵁閲囪喘鍙拌处ID绛涢�夊搴旂殑鍑哄簱璁板綍
+            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
+                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
+                    .collect(Collectors.toList());
+
+            // 濡傛灉娌℃湁鐩稿叧鐨勫嚭搴撹褰曪紝璺宠繃璇ユ潯鏁版嵁
+            if(CollectionUtils.isEmpty(collect1)){
+                dto.setInboundNum0(dto.getInboundNum());
+                continue;
+            }
+
+            // 璁$畻宸插嚭搴撴暟閲忔�诲拰锛屽苟璁剧疆寰呭嚭搴撴暟閲�
+            BigDecimal totalInboundNum = collect1.stream()
+                    .map(ProcurementRecordOut::getInboundNum)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+            // 寰呭嚭搴撴暟閲� = 鎬绘暟閲� - 宸插嚭搴撴暟閲�
+            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
+        }
         return procurementPageDtoIPage;
     }
 
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java
index 46f988f..8a8a52f 100644
--- a/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java
+++ b/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java
@@ -17,5 +17,4 @@
 
     IPage<ProductWorkOrderDto> pageProductWorkOrder(Page<ProductWorkOrderDto> page, @Param("c") ProductWorkOrderDto productWorkOrder);
 
-    List<ProductWorkOrderDto> selectProductWorkOrderDtoList();
 }
diff --git a/src/main/java/com/ruoyi/project/system/service/impl/SysNoticeServiceImpl.java b/src/main/java/com/ruoyi/project/system/service/impl/SysNoticeServiceImpl.java
index ca0303a..2d21535 100644
--- a/src/main/java/com/ruoyi/project/system/service/impl/SysNoticeServiceImpl.java
+++ b/src/main/java/com/ruoyi/project/system/service/impl/SysNoticeServiceImpl.java
@@ -14,7 +14,11 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.xiaoymin.knife4j.core.util.StrUtil;
 import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.project.system.domain.SysDept;
 import com.ruoyi.project.system.domain.SysUser;
+import com.ruoyi.project.system.domain.SysUserDept;
+import com.ruoyi.project.system.mapper.SysDeptMapper;
+import com.ruoyi.project.system.mapper.SysUserDeptMapper;
 import com.ruoyi.project.system.mapper.SysUserMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
@@ -36,6 +40,12 @@
 
     @Autowired
     private SysUserMapper userMapper;
+
+    @Autowired
+    private SysDeptMapper deptMapper;
+
+    @Autowired
+    private SysUserDeptMapper userDeptMapper;
 
     @Autowired
     @Lazy
@@ -137,12 +147,53 @@
     }
 
     @Override
-    public void simpleNoticeAll(String title, String message,  Long tenantId,String jumpPath) {
+    public void simpleNoticeAll(String title, String message, Long rootDeptId, String jumpPath) {
         Long userId = SecurityUtils.getLoginUser().getUserId();
-        List<SysUser> sysUsers = userMapper.selectList(Wrappers.<SysUser>lambdaQuery()
-                .eq(SysUser::getStatus, "0")
-                .eq(SysUser::getTenantId, tenantId));
-        List<SysNotice> collect = sysUsers.stream().map(it -> convertSysNotice(title, message, it.getUserId(),tenantId, jumpPath,  userId)).collect(Collectors.toList());
+        if (userId == null) {
+            return;
+        }
+
+        //  鏌ユ墍鏈夊瓙閮ㄩ棬
+        List<SysDept> childrenDepts = deptMapper.selectChildrenDeptById(rootDeptId);
+
+        //  缁勮 deptIds
+        List<Long> deptIds = childrenDepts.stream()
+                .map(SysDept::getDeptId)
+                .collect(Collectors.toList());
+        deptIds.add(rootDeptId);
+
+        //  鏌ョ敤鎴稩D
+        List<Long> userIds = userDeptMapper.selectList(
+                        Wrappers.<SysUserDept>lambdaQuery()
+                                .in(SysUserDept::getDeptId, deptIds)
+                ).stream()
+                .map(SysUserDept::getUserId)
+                .distinct()
+                .collect(Collectors.toList());
+
+        if (userIds.isEmpty()) {
+            return;
+        }
+
+        //  鏌ョ敤鎴�
+        List<SysUser> sysUsers = userMapper.selectList(
+                Wrappers.<SysUser>lambdaQuery()
+                        .eq(SysUser::getStatus, "0")
+                        .in(SysUser::getUserId, userIds)
+        );
+
+        //  鍙戦�氱煡
+        List<SysNotice> collect = sysUsers.stream()
+                .map(it -> convertSysNotice(
+                        title,
+                        message,
+                        it.getUserId(),
+                        it.getTenantId(),
+                        jumpPath,
+                        userId
+                ))
+                .collect(Collectors.toList());
+
         sysNoticeService.saveBatch(collect);
     }
 
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
index 58e9359..9c115c0 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -24,6 +24,8 @@
 import com.ruoyi.framework.security.LoginUser;
 import com.ruoyi.other.mapper.TempFileMapper;
 import com.ruoyi.other.pojo.TempFile;
+import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
+import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.mapper.SysUserMapper;
 import com.ruoyi.purchase.dto.PurchaseLedgerDto;
@@ -108,6 +110,7 @@
     private final QualityTestStandardParamMapper qualityTestStandardParamMapper;
     private final QualityInspectParamMapper qualityInspectParamMapper;
 
+    private final ProcurementRecordMapper procurementRecordStorageMapper;
     @Value("${file.upload-dir}")
     private String uploadDir;
 
@@ -409,6 +412,19 @@
         if (ids == null || ids.length == 0) {
            throw new BaseException("璇烽�変腑鑷冲皯涓�鏉℃暟鎹�");
         }
+        // 鎵归噺鍒犻櫎鍏宠仈鐨勯噰璐叆搴撹褰�
+        LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductQueryWrapper = new LambdaQueryWrapper<>();
+        salesLedgerProductQueryWrapper.in(SalesLedgerProduct::getSalesLedgerId, ids)
+                .eq(SalesLedgerProduct::getType, 2);
+        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(salesLedgerProductQueryWrapper);
+        if (CollectionUtils.isNotEmpty(salesLedgerProducts)) {
+            salesLedgerProducts.stream().forEach(salesLedgerProduct -> {
+                // 鎵归噺鍒犻櫎鍏宠仈鐨勯噰璐彴璐︿骇鍝�
+                LambdaQueryWrapper<ProcurementRecordStorage> queryWrapper = new LambdaQueryWrapper<>();
+                queryWrapper.eq(ProcurementRecordStorage::getSalesLedgerProductId, salesLedgerProduct.getId());
+                procurementRecordStorageMapper.delete(queryWrapper);
+            });
+        }
         // 鎵归噺鍒犻櫎鍏宠仈鐨勯噰璐彴璐︿骇鍝�
         LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.in(SalesLedgerProduct::getSalesLedgerId, ids)
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java
index a828596..1406667 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java
@@ -50,10 +50,7 @@
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -258,48 +255,119 @@
 
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public int delRegistration(Long[] ids) {
-        // 鍒犻櫎閲囪喘鍙拌处浜у搧寮�绁ㄨ褰曞璞�
-        LambdaQueryWrapper<ProductRecord> productRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
-        productRecordLambdaQueryWrapper.in(ProductRecord::getId, Arrays.asList(ids));
-        List<ProductRecord> productRecords = productRecordMapper.selectList(productRecordLambdaQueryWrapper);
-        if(CollectionUtils.isEmpty(productRecords)){
+
+        //  鏌ヨ瑕佸垹闄ょ殑浜у搧鏉ョエ璁板綍
+        LambdaQueryWrapper<ProductRecord> productWrapper = new LambdaQueryWrapper<>();
+        productWrapper.in(ProductRecord::getId, Arrays.asList(ids));
+        List<ProductRecord> productRecords = productRecordMapper.selectList(productWrapper);
+
+        if (CollectionUtils.isEmpty(productRecords)) {
             return 0;
         }
-        LambdaQueryWrapper<TicketRegistration> ticketRegistrationLambdaQueryWrapper = new LambdaQueryWrapper<>();
-        ticketRegistrationLambdaQueryWrapper.in(TicketRegistration::getId, productRecords.stream().map(ProductRecord::getTicketRegistrationId).collect(Collectors.toList()));
-        List<TicketRegistration> ticketRegistrations = ticketRegistrationMapper.selectList(ticketRegistrationLambdaQueryWrapper);
 
-        // 淇敼浜у搧淇℃伅
-        for (ProductRecord productRecord : productRecords) {
-            BigDecimal subtract = ticketRegistrations.get(0).getInvoiceAmount().subtract(productRecords.get(0).getTicketsAmount());
-            // 灏忎簬绛変簬0鍒犻櫎 锛屽ぇ浜�0淇敼
-            if(subtract.compareTo(BigDecimal.ZERO) <= 0){
-                ticketRegistrationMapper.deleteById(ticketRegistrations.get(0));
-                // 鍒犻櫎浠樻娴佹按璁板綍
-                paymentRegistrationMapper.delete(new LambdaQueryWrapper<PaymentRegistration>().eq(PaymentRegistration::getTicketRegistrationId, ticketRegistrations.get(0).getId()));
-            }else if(subtract.compareTo(BigDecimal.ZERO) > 0){
-                ticketRegistrations.get(0).setInvoiceAmount(subtract);
-                ticketRegistrationMapper.updateById(ticketRegistrations.get(0));
-            }
-            LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductLambdaQueryWrapper = new LambdaQueryWrapper<>();
-            salesLedgerProductLambdaQueryWrapper.eq(SalesLedgerProduct::getId, productRecord.getSaleLedgerProjectId())
-                    .eq(SalesLedgerProduct::getType, 2);
-            List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(salesLedgerProductLambdaQueryWrapper);
-            if(!CollectionUtils.isEmpty(salesLedgerProducts)){
-                for (SalesLedgerProduct salesLedgerProduct : salesLedgerProducts) {
-                    salesLedgerProduct.setFutureTickets(salesLedgerProduct.getFutureTickets().add(productRecord.getTicketsNum()));
-                    salesLedgerProduct.setFutureTicketsAmount(salesLedgerProduct.getFutureTicketsAmount().add(productRecord.getTicketsAmount()));
-                    salesLedgerProductMapper.updateById(salesLedgerProduct);
+        //  鏀堕泦鍏宠仈ID
+        Set<Long> ticketRegistrationIds = productRecords.stream()
+                .map(ProductRecord::getTicketRegistrationId)
+                .collect(Collectors.toSet());
 
-                }
+        Set<Long> salesLedgerProductIds = productRecords.stream()
+                .map(ProductRecord::getSaleLedgerProjectId)
+                .collect(Collectors.toSet());
+
+        //  鏌ヨ鏉ョエ鐧昏
+        List<TicketRegistration> ticketRegistrations =
+                ticketRegistrationMapper.selectBatchIds(ticketRegistrationIds);
+
+        //  澶勭悊鏉ョエ鐧昏閲戦銆佷粯娆炬祦姘�
+        for (TicketRegistration ticket : ticketRegistrations) {
+
+            // 璇ユ潵绁ㄧ櫥璁颁笅鎵�鏈変骇鍝佽褰�
+            List<ProductRecord> recordsOfTicket = productRecords.stream()
+                    .filter(r -> r.getTicketRegistrationId().equals(ticket.getId()))
+                    .collect(Collectors.toList());
+
+            // 璁$畻瑕佸洖閫�鐨勯噾棰�
+            BigDecimal rollbackAmount = recordsOfTicket.stream()
+                    .map(ProductRecord::getTicketsAmount)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+            BigDecimal remain = ticket.getInvoiceAmount().subtract(rollbackAmount);
+
+            if (remain.compareTo(BigDecimal.ZERO) <= 0) {
+                // 鍒犻櫎鏉ョエ鐧昏
+                ticketRegistrationMapper.deleteById(ticket.getId());
+                // 鍒犻櫎浠樻娴佹按
+                paymentRegistrationMapper.delete(
+                        new LambdaQueryWrapper<PaymentRegistration>()
+                                .eq(PaymentRegistration::getTicketRegistrationId, ticket.getId())
+                );
+            } else {
+                ticket.setInvoiceAmount(remain);
+                ticketRegistrationMapper.updateById(ticket);
             }
         }
-        // 鍒犻櫎閲囪喘鍙拌处浜у搧寮�绁ㄨ褰�
-        productRecordMapper.delete(productRecordLambdaQueryWrapper);
+
+        //  鍥為��閿�鍞彴璐︿骇鍝佺殑鏈潵绁�
+        for (ProductRecord record : productRecords) {
+
+            LambdaQueryWrapper<SalesLedgerProduct> wrapper = new LambdaQueryWrapper<>();
+            wrapper.eq(SalesLedgerProduct::getId, record.getSaleLedgerProjectId())
+                    .eq(SalesLedgerProduct::getType, 2);
+
+            SalesLedgerProduct product = salesLedgerProductMapper.selectOne(wrapper);
+            if (product != null) {
+                product.setFutureTickets(
+                        product.getFutureTickets().add(record.getTicketsNum())
+                );
+                product.setFutureTicketsAmount(
+                        product.getFutureTicketsAmount().add(record.getTicketsAmount())
+                );
+                salesLedgerProductMapper.updateById(product);
+            }
+        }
+
+        //  鍒犻櫎浜у搧鏉ョエ璁板綍
+        productRecordMapper.delete(productWrapper);
+
+        //  閲嶆柊璁$畻 currentInvoiceAmount
+        for (Long productId : salesLedgerProductIds) {
+            refreshCurrentInvoiceAmount(productId);
+        }
+
         return 1;
     }
 
+    private void refreshCurrentInvoiceAmount(Long salesLedgerProductId) {
+
+        // 鏌ヨ璇ヤ骇鍝佹渶鏂颁竴鏉℃潵绁ㄨ褰�
+        LambdaQueryWrapper<ProductRecord> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(ProductRecord::getSaleLedgerProjectId, salesLedgerProductId)
+                .orderByDesc(ProductRecord::getCreatedAt)
+                .last("limit 1");
+
+        ProductRecord latestRecord = productRecordMapper.selectOne(wrapper);
+
+        SalesLedgerProduct product =
+                salesLedgerProductMapper.selectById(salesLedgerProductId);
+
+        if (product == null) {
+            return;
+        }
+
+        if (latestRecord == null) {
+            //  娌℃湁浠讳綍鏉ョエ璁板綍
+            product.setTicketsAmount(BigDecimal.ZERO);
+        } else {
+            //  姘歌繙鍙栨渶鏂颁竴鏉�
+            product.setTicketsAmount(latestRecord.getTicketsAmount());
+        }
+
+        salesLedgerProductMapper.updateById(product);
+    }
+
+
     @Override
     public TicketRegistrationDto getRegistrationById(TicketRegistrationDto ticketRegistrationDto) {
         TicketRegistration ticketRegistration = ticketRegistrationMapper.selectById(ticketRegistrationDto.getId());
diff --git a/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java b/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
index fa50217..1555082 100644
--- a/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
+++ b/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
@@ -3,6 +3,9 @@
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
+import com.ruoyi.procurementrecord.service.ProcurementRecordService;
+import com.ruoyi.procurementrecord.service.impl.ProcurementRecordServiceImpl;
 import com.ruoyi.quality.dto.QualityInspectDto;
 import com.ruoyi.quality.pojo.QualityInspect;
 import com.ruoyi.quality.pojo.QualityInspectFile;
@@ -12,6 +15,7 @@
 import com.ruoyi.quality.service.IQualityInspectParamService;
 import com.ruoyi.quality.service.IQualityInspectService;
 import com.ruoyi.quality.service.IQualityUnqualifiedService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.*;
 
@@ -34,6 +38,8 @@
 
     @Resource
     private IQualityInspectFileService qualityInspectFileService;
+    @Autowired
+    private ProcurementRecordService procurementRecordService;
 
 
     /**
@@ -62,6 +68,8 @@
         //鍒犻櫎妫�楠岄檮浠�
         qualityInspectFileService.remove(Wrappers.<QualityInspectFile>lambdaQuery()
         .in(QualityInspectFile::getInspectId,ids));
+        //鍒犻櫎鍏ュ簱璁板綍
+        procurementRecordService.remove(Wrappers.<ProcurementRecordStorage>lambdaQuery().in(ProcurementRecordStorage::getQualityInspectId,ids));
         //鍒犻櫎妫�楠屽崟
         return AjaxResult.success(qualityInspectService.removeBatchByIds(ids));
     }
diff --git a/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java b/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
index f464e9b..92bc88f 100644
--- a/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
+++ b/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
@@ -5,11 +5,8 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.quality.dto.QualityInspectDto;
 import com.ruoyi.quality.pojo.QualityInspect;
-import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
-import com.ruoyi.staff.pojo.StaffOnJob;
 
 import javax.servlet.http.HttpServletResponse;
-import java.util.List;
 
 public interface IQualityInspectService extends IService<QualityInspect> {
 
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 f39a456..48b055b 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -1,10 +1,8 @@
 package com.ruoyi.quality.service.impl;
 
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -21,22 +19,15 @@
 import com.ruoyi.procurementrecord.service.ProcurementRecordService;
 import com.ruoyi.quality.dto.QualityInspectDto;
 import com.ruoyi.quality.mapper.QualityInspectMapper;
-import com.ruoyi.quality.mapper.QualityInspectParamMapper;
 import com.ruoyi.quality.mapper.QualityTestStandardMapper;
 import com.ruoyi.quality.mapper.QualityUnqualifiedMapper;
 import com.ruoyi.quality.pojo.QualityInspect;
 import com.ruoyi.quality.pojo.QualityInspectParam;
-import com.ruoyi.quality.pojo.QualityTestStandard;
 import com.ruoyi.quality.pojo.QualityUnqualified;
 import com.ruoyi.quality.service.IQualityInspectParamService;
 import com.ruoyi.quality.service.IQualityInspectService;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
-import com.ruoyi.staff.mapper.StaffJoinLeaveRecordMapper;
-import com.ruoyi.staff.mapper.StaffOnJobMapper;
-import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
-import com.ruoyi.staff.pojo.StaffOnJob;
-import com.ruoyi.staff.service.IStaffOnJobService;
 import lombok.AllArgsConstructor;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
@@ -113,7 +104,7 @@
             if ("鍚堟牸".equals(qualityInspect.getCheckResult())) {
                 ProcurementAddDto procurementRecordOutAdd = new ProcurementAddDto();
                 procurementRecordOutAdd.setType(1);
-                procurementRecordOutAdd.setTypeName("閲囪喘鍏ュ簱");
+                procurementRecordOutAdd.setTypeName("閲囪喘鍘熸潗鏂欐楠屽悎鏍煎叆搴�");
                 procurementRecordOutAdd.setNickName(loginUser.getNickName());
                 procurementRecordOutAdd.setPurchaseLedgerId(Math.toIntExact(qualityInspect.getPurchaseLedgerId()));
                 if (qualityInspect.getPurchaseLedgerId() == null) {
@@ -131,13 +122,14 @@
                 details.setProductModelId(qualityInspect.getProductModelId());
                 detailss.add( details);
                 procurementRecordOutAdd.setDetails(detailss);
+                procurementRecordOutAdd.setQualityInspectId(qualityInspect.getId());
                 procurementRecordService.add(procurementRecordOutAdd);
             }
         }else if (qualityInspect.getInspectType() == 1) {
             //鏌ヨUnitPrice/TotalPrice
             ProcurementAddDto procurementRecordOutAdd = new ProcurementAddDto();
             procurementRecordOutAdd.setType(2);
-            procurementRecordOutAdd.setTypeName("鐢熶骇鍏ュ簱");
+            procurementRecordOutAdd.setTypeName("鐢熶骇杩囩▼妫�楠屽悎鏍煎叆搴�");
             procurementRecordOutAdd.setNickName(loginUser.getNickName());
             List<Details> details = new ArrayList<>();
             Details details1 = new Details();
@@ -158,7 +150,8 @@
                     .updateTime(LocalDateTime.now())
                     .updateUser(loginUser.getUserId())
                     .createBy(procurementRecordOutAdd.getNickName())
-                    .productModelId(details1.getProductModelId());
+                    .productModelId(details1.getProductModelId())
+                    .qualityInspectId(qualityInspect.getId());
             procurementRecordService.save(procurementRecordBuilder.build());
 
 
@@ -168,7 +161,7 @@
             SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectSalesLedgerProductByMainId(qualityInspect.getProductMainId());
             ProcurementAddDto procurementRecordOutAdd = new ProcurementAddDto();
             procurementRecordOutAdd.setType(2);
-            procurementRecordOutAdd.setTypeName("鐢熶骇鍏ュ簱");
+            procurementRecordOutAdd.setTypeName("鐢熶骇鍑哄巶妫�楠屽悎鏍煎叆搴�");
             procurementRecordOutAdd.setNickName(loginUser.getNickName());
             List<Details> details = new ArrayList<>();
             Details details1 = new Details();
@@ -179,6 +172,7 @@
             details1.setProductModelId(salesLedgerProduct.getProductModelId());
             details.add(details1);
             procurementRecordOutAdd.setDetails(details);
+            procurementRecordOutAdd.setQualityInspectId(qualityInspect.getId());
             procurementRecordService.add(procurementRecordOutAdd);
         }
         qualityInspect.setInspectState(1);//宸叉彁浜�
diff --git a/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java b/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
index ee7f721..63f417b 100644
--- a/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
+++ b/src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
@@ -89,19 +89,21 @@
 
         //  瀹℃壒閫氳繃
         if (req.getApproveStatus() == 3) {
-            // 鏌ヨ閲囪喘鍏ュ簱璁板綍
-            LambdaQueryWrapper<ProcurementRecordStorage> lambdaQueryWrapper = new LambdaQueryWrapper<ProcurementRecordStorage>()
-                    .eq(ProcurementRecordStorage::getSalesLedgerProductId, req.getSalesLedgerProductId());
-            ProcurementRecordStorage procurementRecordStorage = procurementRecordStorageService.getOne(lambdaQueryWrapper);
-
-            if (procurementRecordStorage == null) {
-                // 淇濊瘉鍓嶉潰鐨勪慨鏀瑰叏閮ㄥ洖婊�
-                throw new ServiceException("閲囪喘璁板綍涓嶅瓨鍦紝瀹℃壒鍥炴粴");
-            }
+//            // 鏌ヨ閲囪喘鍏ュ簱璁板綍
+//            LambdaQueryWrapper<ProcurementRecordStorage> lambdaQueryWrapper = new LambdaQueryWrapper<ProcurementRecordStorage>()
+//                    .eq(ProcurementRecordStorage::getSalesLedgerProductId, req.getSalesLedgerProductId());
+//            ProcurementRecordStorage procurementRecordStorage = procurementRecordStorageService.getOne(lambdaQueryWrapper);
+//
+//            if (procurementRecordStorage == null) {
+//                // 淇濊瘉鍓嶉潰鐨勪慨鏀瑰叏閮ㄥ洖婊�
+//                throw new ServiceException("閲囪喘璁板綍涓嶅瓨鍦紝瀹℃壒鍥炴粴");
+//            }
 
             //  鐢熸垚鍑哄簱璁板綍
             ProcurementRecordOutAdd procurementRecordOutAdd = new ProcurementRecordOutAdd();
-            procurementRecordOutAdd.setId(procurementRecordStorage.getId());
+//            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()));
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
index acab688..270f256 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -98,10 +98,10 @@
                         if(ledgerProduct.getId().intValue() == registrationProductDto.getSalesLedgerProductId()){
                             invoiceNum =  invoiceNum.add(registrationProductDto.getInvoiceNum());
                             invoiceAmount = invoiceAmount.add(registrationProductDto.getInvoiceAmount());
-                            noInvoiceNum = ledgerProduct.getQuantity().subtract(invoiceNum);
-                            noInvoiceAmount = ledgerProduct.getTaxInclusiveTotalPrice().subtract(invoiceAmount);
                         }
                     }
+                    noInvoiceNum = ledgerProduct.getQuantity().subtract(invoiceNum);
+                    noInvoiceAmount = ledgerProduct.getTaxInclusiveTotalPrice().subtract(invoiceAmount);
                     ledgerProduct.setInvoiceNum(invoiceNum);
                     ledgerProduct.setInvoiceAmount(invoiceAmount);
                     ledgerProduct.setNoInvoiceNum(noInvoiceNum);
diff --git a/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java b/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java
index 2f84699..53f55fd 100644
--- a/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java
+++ b/src/main/java/com/ruoyi/staff/controller/PersonalAttendanceRecordsController.java
@@ -3,8 +3,6 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.staff.pojo.PersonalAttendanceRecords;
-import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
-import com.ruoyi.staff.pojo.StaffOnJob;
 import com.ruoyi.staff.service.PersonalAttendanceRecordsService;
 import lombok.AllArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
diff --git a/src/main/java/com/ruoyi/staff/controller/StaffJoinLeaveRecordController.java b/src/main/java/com/ruoyi/staff/controller/StaffJoinLeaveRecordController.java
deleted file mode 100644
index ceec984..0000000
--- a/src/main/java/com/ruoyi/staff/controller/StaffJoinLeaveRecordController.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package com.ruoyi.staff.controller;
-
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.ruoyi.basic.dto.SupplierManageDto;
-import com.ruoyi.basic.pojo.SupplierManage;
-import com.ruoyi.basic.service.ISupplierService;
-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.staff.dto.StaffJoinLeaveRecordDto;
-import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
-import com.ruoyi.staff.service.IStaffJoinLeaveRecordService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.util.CollectionUtils;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletResponse;
-import java.util.List;
-
-/**
- * 鏂板鍏ヨ亴/绂昏亴
- */
-@RestController
-@RequestMapping("/staff/staffJoinLeaveRecord")
-public class StaffJoinLeaveRecordController {
-
-    @Resource
-    private IStaffJoinLeaveRecordService staffJoinLeaveRecordService;
-
-    /**
-     * 鏂板鍏ヨ亴/绂昏亴
-     * @param staffJoinLeaveRecord
-     * @return
-     */
-    @PostMapping("/add")
-    public AjaxResult add(@RequestBody StaffJoinLeaveRecord staffJoinLeaveRecord) {
-        return AjaxResult.success(staffJoinLeaveRecordService.add(staffJoinLeaveRecord));
-    }
-
-    /**
-     * 鍒犻櫎鍏ヨ亴/绂昏亴
-     * @param ids
-     * @return
-     */
-    @DeleteMapping("/del")
-    public AjaxResult delStaffJoinLeaveRecord(@RequestBody List<Integer> ids) {
-        if(CollectionUtils.isEmpty(ids)){
-            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
-        }
-        return AjaxResult.success(staffJoinLeaveRecordService.delStaffJoinLeaveRecord(ids));
-    }
-
-    /**
-     * 鍏ヨ亴/绂昏亴璇︽儏
-     * @param id
-     * @return
-     */
-    @GetMapping("/{id}")
-    public AjaxResult staffJoinLeaveRecordDetail(@PathVariable("id") Integer id) {
-        return AjaxResult.success(staffJoinLeaveRecordService.getById(id));
-    }
-
-    /**
-     * 鍏ヨ亴/绂昏亴淇敼
-     * @param staffJoinLeaveRecord
-     * @return
-     */
-    @PostMapping("/update")
-    public AjaxResult update(@RequestBody StaffJoinLeaveRecord staffJoinLeaveRecord) {
-        return AjaxResult.success(staffJoinLeaveRecordService.updateStaffJoinLeaveRecord(staffJoinLeaveRecord));
-    }
-
-    /**
-     * 鍏ヨ亴/绂昏亴鍒嗛〉鏌ヨ
-     * @param page
-     * @param staffJoinLeaveRecord
-     * @return
-     */
-    @GetMapping("/listPage")
-    public AjaxResult staffJoinLeaveRecordListPage(Page page, StaffJoinLeaveRecord staffJoinLeaveRecord) {
-        return AjaxResult.success(staffJoinLeaveRecordService.staffJoinLeaveRecordListPage(page, staffJoinLeaveRecord));
-    }
-
-    /**
-     * 鍏ヨ亴/绂昏亴瀵煎嚭
-     * @param response
-     * @param staffJoinLeaveRecord
-     */
-    @PostMapping("/export")
-    public void staffJoinLeaveRecordExport(HttpServletResponse response,StaffJoinLeaveRecord staffJoinLeaveRecord) {
-        staffJoinLeaveRecordService.staffJoinLeaveRecordExport(response, staffJoinLeaveRecord);
-    }
-
-
-}
diff --git a/src/main/java/com/ruoyi/staff/controller/StaffLeaveController.java b/src/main/java/com/ruoyi/staff/controller/StaffLeaveController.java
index f4a0830..c018008 100644
--- a/src/main/java/com/ruoyi/staff/controller/StaffLeaveController.java
+++ b/src/main/java/com/ruoyi/staff/controller/StaffLeaveController.java
@@ -3,7 +3,6 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.staff.dto.StaffLeaveDto;
-import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
 import com.ruoyi.staff.service.StaffLeaveService;
 import io.swagger.annotations.Api;
 import org.springframework.util.CollectionUtils;
diff --git a/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java b/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
index f996ad1..8e3d6b6 100644
--- a/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
+++ b/src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
@@ -5,9 +5,8 @@
 import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.staff.dto.StaffOnJobDto;
-import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
+import com.ruoyi.staff.pojo.StaffContract;
 import com.ruoyi.staff.pojo.StaffOnJob;
-import com.ruoyi.staff.service.IStaffJoinLeaveRecordService;
 import com.ruoyi.staff.service.IStaffOnJobService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -48,8 +47,8 @@
      * @return
      */
     @GetMapping("/list")
-    public AjaxResult staffOnJobList() {
-        return AjaxResult.success(staffOnJobService.staffOnJobList());
+    public AjaxResult staffOnJobList(StaffOnJob staffOnJob) {
+        return AjaxResult.success(staffOnJobService.staffOnJobList(staffOnJob));
     }
 
     /**
@@ -96,6 +95,17 @@
     }
 
     /**
+     * 缁鍚堝悓
+     * @param id
+     * @param staffContract
+     * @return
+     */
+    @PostMapping("/renewContract/{id}")
+    public AjaxResult renewContract(@PathVariable("id") Long id, @RequestBody StaffContract staffContract) {
+        return AjaxResult.success(staffOnJobService.renewContract(id, staffContract));
+    }
+
+    /**
      * 鍦ㄨ亴鍛樺伐瀵煎叆
      */
     @PostMapping("/import")
diff --git a/src/main/java/com/ruoyi/staff/dto/StaffJoinLeaveRecordDto.java b/src/main/java/com/ruoyi/staff/dto/StaffJoinLeaveRecordDto.java
deleted file mode 100644
index eb0466f..0000000
--- a/src/main/java/com/ruoyi/staff/dto/StaffJoinLeaveRecordDto.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.ruoyi.staff.dto;
-
-import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
-import lombok.Data;
-
-@Data
-public class StaffJoinLeaveRecordDto extends StaffJoinLeaveRecord {
-    private String postName;
-}
diff --git a/src/main/java/com/ruoyi/staff/dto/StaffOnJobDto.java b/src/main/java/com/ruoyi/staff/dto/StaffOnJobDto.java
index 724d9c1..7afd407 100644
--- a/src/main/java/com/ruoyi/staff/dto/StaffOnJobDto.java
+++ b/src/main/java/com/ruoyi/staff/dto/StaffOnJobDto.java
@@ -2,7 +2,6 @@
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ruoyi.framework.aspectj.lang.annotation.Excel;
-import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
 import com.ruoyi.staff.pojo.StaffOnJob;
 import lombok.Data;
 
@@ -16,14 +15,11 @@
     @Excel(name = "宀椾綅",sort = 8)
     private String postName;
 
-    @Excel(name = "鍚堝悓骞撮檺")
     private String contractTerm;
 
     @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "鍚堝悓寮�濮嬫棩鏈�", width = 30, dateFormat = "yyyy-MM-dd")
     private Date contractStartTime;
 
     @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "鍚堝悓缁撴潫鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
     private Date contractEndTime;
 }
diff --git a/src/main/java/com/ruoyi/staff/mapper/StaffJoinLeaveRecordMapper.java b/src/main/java/com/ruoyi/staff/mapper/StaffJoinLeaveRecordMapper.java
deleted file mode 100644
index 8fe879c..0000000
--- a/src/main/java/com/ruoyi/staff/mapper/StaffJoinLeaveRecordMapper.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.ruoyi.staff.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.basic.dto.SupplierManageDto;
-import com.ruoyi.basic.excel.SupplierManageExcelDto;
-import com.ruoyi.basic.pojo.SupplierManage;
-import com.ruoyi.staff.dto.StaffJoinLeaveRecordDto;
-import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
-import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
-
-@Mapper
-public interface StaffJoinLeaveRecordMapper extends BaseMapper<StaffJoinLeaveRecord> {
-
-    IPage<StaffJoinLeaveRecordDto> staffJoinLeaveRecordListPage(Page page, @Param("staffJoinLeaveRecord") StaffJoinLeaveRecord staffJoinLeaveRecord);
-
-    List<StaffJoinLeaveRecord> staffJoinLeaveRecordList(@Param("staffJoinLeaveRecord") StaffJoinLeaveRecord staffJoinLeaveRecord);
-
-    List<StaffJoinLeaveRecord> staffOnJobList();
-
-}
diff --git a/src/main/java/com/ruoyi/staff/pojo/StaffJoinLeaveRecord.java b/src/main/java/com/ruoyi/staff/pojo/StaffJoinLeaveRecord.java
deleted file mode 100644
index 7cf3d29..0000000
--- a/src/main/java/com/ruoyi/staff/pojo/StaffJoinLeaveRecord.java
+++ /dev/null
@@ -1,225 +0,0 @@
-package com.ruoyi.staff.pojo;
-
-import com.baomidou.mybatisplus.annotation.*;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import com.ruoyi.dto.DateQueryDto;
-import com.ruoyi.framework.aspectj.lang.annotation.Excel;
-import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
-import lombok.NonNull;
-
-import javax.validation.constraints.NotBlank;
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.time.LocalDateTime;
-import java.util.Date;
-
-/**
- * 浜哄憳绠$悊--鏂板鍏ヨ亴/绂昏亴
- * staff_join_leave_record
- */
-@TableName(value = "staff_join_leave_record")
-@Data
-public class StaffJoinLeaveRecord extends DateQueryDto implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    /**
-     * 搴忓彿
-     */
-    @TableId(type = IdType.AUTO)
-    private Long id;
-
-    /**
-     * 鐘舵��(0:绂昏亴;1:鍏ヨ亴)
-     */
-    @NotBlank(message = "鍛樺伐鐘舵�佷笉鑳戒负绌�!!!!!!!!")
-    @Excel(name = "鐘舵��",readConverterExp = "0=绂昏亴,1=鍏ヨ亴")
-    private Integer staffState;
-
-    /**
-     * 璇曠敤鏈燂紙鏈堬級
-     */
-    @Excel(name = "璇曠敤鏈燂紙鏈堬級")
-    private Integer probationPeriod;
-
-
-
-    /**
-     * 鍛樺伐缂栧彿
-     */
-    @Excel(name = "鍛樺伐缂栧彿")
-    private String staffNo;
-
-    /**
-     * 鍛樺伐濮撳悕
-     */
-    @Excel(name = "鍛樺伐濮撳悕")
-    private String staffName;
-
-    /**
-     * 鎬у埆
-     */
-    @Excel(name = "鎬у埆")
-    private String sex;
-
-    /**
-     * 绫嶈疮
-     */
-    @Excel(name = "绫嶈疮")
-    private String nativePlace;
-
-    /**
-     * 宀椾綅
-     */
-    @Excel(name = "宀椾綅")
-    private Integer sysPostId;
-
-    /**
-     * 瀹跺涵浣忓潃
-     */
-    @Excel(name = "瀹跺涵浣忓潃")
-    private String adress;
-
-    /**
-     * 绗竴瀛﹀巻
-     */
-    @Excel(name = "绗竴瀛﹀巻")
-    private String firstStudy;
-
-    /**
-     * 涓撲笟
-     */
-    @Excel(name = "涓撲笟")
-    private String profession;
-
-    /**
-     * 韬唤璇佸彿鐮�
-     */
-    @Excel(name = "韬唤璇佸彿鐮�")
-    private String identityCard;
-
-    /**
-     * 骞撮緞
-     */
-    @Excel(name = "骞撮緞")
-    private String age;
-
-    /**
-     * 鑱旂郴鐢佃瘽
-     */
-    @Excel(name = "鑱旂郴鐢佃瘽")
-    private String phone;
-
-    /**
-     * 绱ф�ヨ仈绯讳汉
-     */
-    @Excel(name = "绱ф�ヨ仈绯讳汉")
-    private String emergencyContact;
-
-    /**
-     * 绱ф�ヨ仈绯讳汉鐢佃瘽
-     */
-    @Excel(name = "绱ф�ヨ仈绯讳汉鐢佃瘽")
-    private String emergencyContactPhone;
-
-    /**
-     * 鍚堝悓骞撮檺
-     */
-    @Excel(name = "鍚堝悓骞撮檺")
-    private String contractTerm;
-
-    /**
-     * 鍚堝悓寮�濮嬫棩鏈�
-     */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "鍚堝悓寮�濮嬫棩鏈�", width = 30, dateFormat = "yyyy-MM-dd")
-    private Date contractStartTime;
-
-    /**
-     * 鍚堝悓缁撴潫鏃ユ湡
-     */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "鍚堝悓缁撴潫鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
-    private Date contractEndTime;
-
-
-    /**
-     * 寮�濮嬭瘯鐢ㄦ棩鏈�
-     */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "寮�濮嬭瘯鐢ㄦ棩鏈�", width = 30, dateFormat = "yyyy-MM-dd")
-    private Date trialStartDate;
-
-    /**
-     * 璇曠敤缁撴潫鏃ユ湡
-     */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "璇曠敤缁撴潫鏃ユ湡", width = 30, dateFormat = "yyyy-MM-dd")
-    private Date trialEndDate;
-
-    /**
-     * 绛捐鏃堕棿
-     */
-    @JsonFormat(pattern = "yyyy-MM-dd")
-    @Excel(name = "绛捐鏃堕棿", width = 30, dateFormat = "yyyy-MM-dd")
-    private Date signDate;
-
-    /**
-     * 宸ヨ祫鎶ラ叕閫夋嫨鏉℃
-     */
-//    @Excel(name = "宸ヨ祫鎶ラ叕閫夋嫨鏉℃")
-    private String salarySelect;
-
-    /**
-     * 璇曠敤鏈熷伐璧�
-     */
-    @Excel(name = "璇曠敤鏈熷伐璧�")
-    private BigDecimal proSalary;
-
-    /**
-     * 鍔冲姩鍚堝悓鏈熼檺閫夋嫨
-     */
-//    @Excel(name = "鍔冲姩鍚堝悓鏈熼檺閫夋嫨")
-    private String dateSelect;
-
-    /**
-     * 澶囨敞锛堢鍒╁緟閬囷級
-     */
-    @Excel(name = "澶囨敞锛堢鍒╁緟閬囷級")
-    private String remark;
-
-    /**
-     * 绂昏亴鍘熷洜
-     */
-    @Excel(name = "绂昏亴鍘熷洜",readConverterExp = "salary=钖祫寰呴亣,career_development=鑱屼笟鍙戝睍,work_environment=宸ヤ綔鐜,personal_reason=涓汉鍘熷洜,other=鍏朵粬")
-    private String dimissionReason;
-
-    /**
-     * 绂昏亴澶囨敞
-     */
-    @Excel(name = "绂昏亴澶囨敞")
-    private String dimissionRemark;
-
-
-    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
-    @TableField(fill = FieldFill.INSERT)
-    private LocalDateTime createTime;
-
-    @ApiModelProperty(value = "鍒涘缓鐢ㄦ埛")
-    @TableField(fill = FieldFill.INSERT)
-    private Integer createUser;
-
-    @ApiModelProperty(value = "淇敼鏃堕棿")
-    @TableField(fill = FieldFill.INSERT_UPDATE)
-    private LocalDateTime updateTime;
-
-    @ApiModelProperty(value = "淇敼鐢ㄦ埛")
-    @TableField(fill = FieldFill.INSERT_UPDATE)
-    private Integer updateUser;
-
-    @ApiModelProperty(value = "绉熸埛ID")
-    @TableField(fill = FieldFill.INSERT)
-    private Long tenantId;
-
-
-}
diff --git a/src/main/java/com/ruoyi/staff/service/IStaffJoinLeaveRecordService.java b/src/main/java/com/ruoyi/staff/service/IStaffJoinLeaveRecordService.java
deleted file mode 100644
index 1cf0f82..0000000
--- a/src/main/java/com/ruoyi/staff/service/IStaffJoinLeaveRecordService.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.ruoyi.staff.service;
-
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.ruoyi.basic.dto.SupplierManageDto;
-import com.ruoyi.basic.pojo.SupplierManage;
-import com.ruoyi.staff.dto.StaffJoinLeaveRecordDto;
-import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.List;
-
-public interface IStaffJoinLeaveRecordService extends IService<StaffJoinLeaveRecord> {
-
-
-    IPage<StaffJoinLeaveRecordDto> staffJoinLeaveRecordListPage(Page page, StaffJoinLeaveRecord staffJoinLeaveRecord);
-
-    void staffJoinLeaveRecordExport(HttpServletResponse response, StaffJoinLeaveRecord staffJoinLeaveRecord);
-
-    int add(StaffJoinLeaveRecord staffJoinLeaveRecord);
-
-    int delStaffJoinLeaveRecord(List<Integer> ids);
-
-    int updateStaffJoinLeaveRecord(StaffJoinLeaveRecord staffJoinLeaveRecord);
-}
diff --git a/src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java b/src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java
index e6e5a40..1e60ffe 100644
--- a/src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java
+++ b/src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java
@@ -4,9 +4,8 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.staff.dto.StaffOnJobDto;
-import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
+import com.ruoyi.staff.pojo.StaffContract;
 import com.ruoyi.staff.pojo.StaffOnJob;
-import org.bouncycastle.crypto.digests.LongDigest;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
@@ -25,9 +24,11 @@
 
     int delStaffOnJobs(List<Integer> ids);
 
+    int renewContract(Long id, StaffContract staffContract);
+
     void staffOnJobExport(HttpServletResponse response, StaffOnJob staffOnJob);
 
-    List<StaffJoinLeaveRecord> staffOnJobList();
+    List<StaffOnJobDto> staffOnJobList(StaffOnJob staffOnJob);
 
     Boolean importData(MultipartFile file);
 
diff --git a/src/main/java/com/ruoyi/staff/service/StaffContractService.java b/src/main/java/com/ruoyi/staff/service/StaffContractService.java
index 5c2319c..a7414ba 100644
--- a/src/main/java/com/ruoyi/staff/service/StaffContractService.java
+++ b/src/main/java/com/ruoyi/staff/service/StaffContractService.java
@@ -4,14 +4,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.staff.dto.StaffContractDto;
-import com.ruoyi.staff.dto.StaffOnJobDto;
 import com.ruoyi.staff.pojo.StaffContract;
-import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
-import com.ruoyi.staff.pojo.StaffOnJob;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.List;
 
 public interface StaffContractService extends IService<StaffContract> {
 
diff --git a/src/main/java/com/ruoyi/staff/service/StaffLeaveService.java b/src/main/java/com/ruoyi/staff/service/StaffLeaveService.java
index be27fdc..9fab5a1 100644
--- a/src/main/java/com/ruoyi/staff/service/StaffLeaveService.java
+++ b/src/main/java/com/ruoyi/staff/service/StaffLeaveService.java
@@ -4,8 +4,6 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.staff.dto.StaffLeaveDto;
-import com.ruoyi.staff.dto.StaffOnJobDto;
-import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
 import com.ruoyi.staff.pojo.StaffLeave;
 
 import javax.servlet.http.HttpServletResponse;
diff --git a/src/main/java/com/ruoyi/staff/service/impl/StaffJoinLeaveRecordServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/StaffJoinLeaveRecordServiceImpl.java
deleted file mode 100644
index 0b2eba7..0000000
--- a/src/main/java/com/ruoyi/staff/service/impl/StaffJoinLeaveRecordServiceImpl.java
+++ /dev/null
@@ -1,179 +0,0 @@
-package com.ruoyi.staff.service.impl;
-
-
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-
-import com.ruoyi.common.exception.base.BaseException;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.staff.dto.StaffJoinLeaveRecordDto;
-import com.ruoyi.staff.mapper.StaffJoinLeaveRecordMapper;
-import com.ruoyi.staff.mapper.StaffOnJobMapper;
-import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
-import com.ruoyi.staff.pojo.StaffOnJob;
-import com.ruoyi.staff.service.IStaffJoinLeaveRecordService;
-import lombok.AllArgsConstructor;
-import org.springframework.beans.BeanUtils;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.servlet.http.HttpServletResponse;
-import java.util.*;
-
-
-@Service
-@AllArgsConstructor
-@Transactional(rollbackFor = Exception.class)
-public class StaffJoinLeaveRecordServiceImpl extends ServiceImpl<StaffJoinLeaveRecordMapper, StaffJoinLeaveRecord>  implements IStaffJoinLeaveRecordService {
-
-    private StaffJoinLeaveRecordMapper staffJoinLeaveRecordMapper;
-    private StaffOnJobMapper staffOnJobMapper;
-
-
-    //鍒嗛〉鏌ヨ
-    @Override
-    public IPage<StaffJoinLeaveRecordDto> staffJoinLeaveRecordListPage(Page page, StaffJoinLeaveRecord staffJoinLeaveRecord) {
-        return staffJoinLeaveRecordMapper.staffJoinLeaveRecordListPage(page,staffJoinLeaveRecord);
-    }
-
-    //瀵煎嚭
-    @Override
-    public void staffJoinLeaveRecordExport(HttpServletResponse response, StaffJoinLeaveRecord staffJoinLeaveRecord) {
-        List<StaffJoinLeaveRecord> staffJoinLeaveRecords =staffJoinLeaveRecordMapper.staffJoinLeaveRecordList(staffJoinLeaveRecord);
-        ExcelUtil<StaffJoinLeaveRecord> util = new ExcelUtil<StaffJoinLeaveRecord>(StaffJoinLeaveRecord.class);
-        util.exportExcel(response, staffJoinLeaveRecords, staffJoinLeaveRecord.getStaffState()==0?"鍛樺伐绂昏亴":"鍛樺伐鍏ヨ亴"+"瀵煎嚭");
-    }
-
-    //鏂板鍏ヨ亴/绂昏亴
-    @Override
-    public int add(StaffJoinLeaveRecord staffJoinLeaveRecord) {
-        String[] ignoreProperties = {"id"};//鎺掗櫎id灞炴��
-        List<StaffOnJob> staffOnJobs = staffOnJobMapper.selectList(Wrappers.<StaffOnJob>lambdaQuery().eq(StaffOnJob::getStaffNo, staffJoinLeaveRecord.getStaffNo()));
-        if (staffJoinLeaveRecord.getStaffState()==1){
-            /*鍏ヨ亴*/
-            //(鏍规嵁鍛樺伐缂栧彿鍒ゆ柇鏄惁宸茬粡鏂板鍒板湪鑱岃〃閲岄潰,濡傛灉宸茬粡鏈夊氨鏇存柊,娌℃湁灏辨柊澧�)
-            if (staffOnJobs.size()>0){
-                StaffOnJob staffOnJob = staffOnJobs.get(0);
-                //鍏堟瘮杈冨埌鏈熸棩鏈�,杩欓噷閫夌敤鍒版湡鏃ユ湡鏈�涔呯殑
-                if (staffJoinLeaveRecord.getContractEndTime().compareTo(staffOnJob.getContractExpireTime())>0) {
-                    BeanUtils.copyProperties(staffJoinLeaveRecord,staffOnJob,ignoreProperties);
-                    staffOnJobMapper.updateById(staffOnJob);
-                }
-            }else {
-                StaffOnJob staffOnJob = new StaffOnJob();
-                BeanUtils.copyProperties(staffJoinLeaveRecord,staffOnJob,ignoreProperties);
-                staffOnJob.setContractExpireTime(staffJoinLeaveRecord.getContractEndTime());
-                staffOnJobMapper.insert(staffOnJob);
-            }
-        }else {
-            /*绂昏亴*/
-            //鏍规嵁鍛樺伐缂栧彿鎵惧埌瀵瑰簲鐨勬暟鎹皢鐘舵�佸彉鏇�
-            if (staffOnJobs.size()>0){
-                StaffOnJob staffOnJob = staffOnJobs.get(0);
-                staffOnJob.setStaffState(staffJoinLeaveRecord.getStaffState());
-                staffOnJobMapper.updateById(staffOnJob);
-            }else {
-                throw new BaseException("娌℃湁鎵惧埌"+staffJoinLeaveRecord.getStaffNo()+"缂栧彿鐨勫憳宸�,鏃犳硶鏂板绂昏亴!!!");
-            }
-            if (staffJoinLeaveRecord.getDimissionReason()==null){
-                throw new BaseException("绂昏亴鍘熷洜涓嶈兘涓虹┖!!!");
-            }
-        }
-        return staffJoinLeaveRecordMapper.insert(staffJoinLeaveRecord);
-    }
-
-
-    //鍒犻櫎鍏ヨ亴/绂昏亴
-    @Override
-    public int delStaffJoinLeaveRecord(List<Integer> ids) {
-        List<StaffJoinLeaveRecord> staffJoinLeaveRecords = staffJoinLeaveRecordMapper.selectBatchIds(ids);
-        for (StaffJoinLeaveRecord staffJoinLeaveRecord : staffJoinLeaveRecords) {
-            //鍏堝垽鏂槸鍏ヨ亴杩樻槸绂昏亴
-            if (staffJoinLeaveRecord.getStaffState()==1){
-                /*鍏ヨ亴*/
-                //濡傛灉鏄叆鑱�,闇�瑕佸厛鏍规嵁鍛樺伐缂栧彿鍒ゆ柇璇ュ憳宸ユ槸鍚﹁繕鏈夊叾浠栧叆鑱屼俊鎭�
-                List<StaffJoinLeaveRecord> joinLeaveRecords = staffJoinLeaveRecordMapper.selectList(Wrappers.<StaffJoinLeaveRecord>lambdaQuery()
-                        .eq(StaffJoinLeaveRecord::getStaffState, 1)
-                        .eq(StaffJoinLeaveRecord::getStaffNo, staffJoinLeaveRecord.getStaffNo())
-                        .ne(StaffJoinLeaveRecord::getId, staffJoinLeaveRecord.getId()));
-                if (joinLeaveRecords.size()>0){
-                    //杩橀渶瑕佸垽鏂鍛樺伐鏄惁鏈夌鑱屼俊鎭�
-                    List<StaffJoinLeaveRecord> leaveRecords = staffJoinLeaveRecordMapper.selectList(Wrappers.<StaffJoinLeaveRecord>lambdaQuery()
-                            .eq(StaffJoinLeaveRecord::getStaffState, 0)
-                            .eq(StaffJoinLeaveRecord::getStaffNo, staffJoinLeaveRecord.getStaffNo()));
-                    // 濡傛灉鏈夐偅鍦ㄨ亴琛ㄤ粎鍋氭洿鏂颁笉鍒犻櫎,濡傛灉娌℃湁鍏朵粬鍏ヨ亴淇℃伅,閭d箞鍦ㄨ亴琛ㄩ渶鍚屾鍒犻櫎
-                    if (leaveRecords.size()>0){
-                        //濡傛灉鏈夌鑱屼俊鎭�,鍒ゆ柇绂昏亴鏁伴噺鍜屽叆鑱屾暟閲忔瘯绔�,濡傛灉鍏ヨ亴鏁伴噺澶т簬绂昏亴
-                        if (joinLeaveRecords.size()>leaveRecords.size()){
-                            //璇ュ憳宸ュ氨杩樻槸鍦ㄨ亴
-                            //鍏堟瘮杈冨埌鏈熸棩鏈�,杩欓噷閫夌敤鍒版湡鏃ユ湡鏈�涔呯殑
-                            Optional<StaffJoinLeaveRecord> max = joinLeaveRecords.stream().max(Comparator.comparing(StaffJoinLeaveRecord::getContractEndTime));
-                            staffOnJobMapper.update(null,Wrappers.<StaffOnJob>lambdaUpdate()
-                                    .eq(StaffOnJob::getStaffNo, staffJoinLeaveRecord.getStaffNo())
-                                    .set(StaffOnJob::getContractTerm, max.get().getContractTerm())
-                                    .set(StaffOnJob::getContractExpireTime, max.get().getContractEndTime()));
-                        }else {
-                            //璇ュ憳宸ュ睘浜庣鑱�
-                            staffOnJobMapper.update(null,Wrappers.<StaffOnJob>lambdaUpdate()
-                                    .eq(StaffOnJob::getStaffNo, staffJoinLeaveRecord.getStaffNo())
-                                    .set(StaffOnJob::getStaffState, 0));
-                        }
-                    }else {
-                        //濡傛灉娌℃湁绂昏亴淇℃伅閭d箞灏辨瘮杈冨埌鏈熸棩鏈�,杩欓噷閫夌敤鍒版湡鏃ユ湡鏈�涔呯殑
-                        Optional<StaffJoinLeaveRecord> max = joinLeaveRecords.stream().max(Comparator.comparing(StaffJoinLeaveRecord::getContractEndTime));
-                        staffOnJobMapper.update(null,Wrappers.<StaffOnJob>lambdaUpdate()
-                                .eq(StaffOnJob::getStaffNo, staffJoinLeaveRecord.getStaffNo())
-                                .set(StaffOnJob::getContractTerm, max.get().getContractTerm())
-                                .set(StaffOnJob::getContractExpireTime, max.get().getContractEndTime()));
-                    }
-                }else {
-                    staffOnJobMapper.delete(Wrappers.<StaffOnJob>lambdaQuery().eq(StaffOnJob::getStaffNo,staffJoinLeaveRecord.getStaffNo()));
-                }
-            }else {
-                /*绂昏亴*/
-                //鍏堟煡璇㈠湪鑱岃〃鏄惁鏈夎繖涓�,濡傛灉鏈�,灏卞皢璇ュ憳宸ョ殑鐘舵�佸彉鏇翠负鍦ㄨ亴
-                List<StaffOnJob> staffOnJobs = staffOnJobMapper.selectList(Wrappers.<StaffOnJob>lambdaQuery().eq(StaffOnJob::getStaffNo, staffJoinLeaveRecord.getStaffNo()));
-                if (staffOnJobs.size()>0){
-                    StaffOnJob staffOnJob = staffOnJobs.get(0);
-                    staffOnJob.setStaffState(1);
-                    staffOnJobMapper.updateById(staffOnJob);
-                }else {
-                    throw new BaseException("娌℃湁鎵惧埌"+staffJoinLeaveRecord.getStaffNo()+"缂栧彿鐨勫憳宸�,璇锋鏌ユ槸鍚︽湁鑴忔暟鎹�!!!");
-                }
-            }
-            staffJoinLeaveRecordMapper.deleteById(staffJoinLeaveRecord);
-        }
-        return 0;
-    }
-
-    //淇敼鍏ヨ亴/绂昏亴
-    @Override
-    public int updateStaffJoinLeaveRecord(StaffJoinLeaveRecord staffJoinLeaveRecord) {
-        String[] ignoreProperties = {"id"};//鎺掗櫎id灞炴��
-        List<StaffOnJob> staffOnJobs = staffOnJobMapper.selectList(Wrappers.<StaffOnJob>lambdaQuery().eq(StaffOnJob::getStaffNo, staffJoinLeaveRecord.getStaffNo()));
-        if (staffJoinLeaveRecord.getStaffState()==1){
-            /*鍏ヨ亴*/
-            StaffOnJob job = staffOnJobMapper.selectList(Wrappers.<StaffOnJob>lambdaQuery()
-                    .eq(StaffOnJob::getStaffNo, staffJoinLeaveRecord.getStaffNo())).get(0);
-            // 澧炲姞浜嗗悎鍚屾柟妗堟墍浠ュ幓鎺夎繖涓垽鏂�
-            //濡傛灉鏇存敼鐨勫悎鍚屽埌鏈熸椂闂存洿涔呭垯鏇存柊,濡傛灉娌℃湁灏变笉鐢ㄦ洿鏂�
-//            if (staffJoinLeaveRecord.getContractEndTime().compareTo(job.getContractExpireTime())>0) {
-//                BeanUtils.copyProperties(staffJoinLeaveRecord,job,ignoreProperties);
-//                staffOnJobMapper.updateById(job);
-//            }
-            if(job != null){
-                BeanUtils.copyProperties(staffJoinLeaveRecord,job,ignoreProperties);
-                staffOnJobMapper.updateById(job);
-            }
-        }else {
-            /*绂昏亴*/
-            //绂昏亴鐨勭紪杈戜笉浼氬奖鍝嶅湪鑱岃〃
-            if (staffJoinLeaveRecord.getDimissionReason()==null){
-                throw new BaseException("绂昏亴鍘熷洜涓嶈兘涓虹┖!!!");
-            }
-        }
-        return staffJoinLeaveRecordMapper.updateById(staffJoinLeaveRecord);
-    }
-}
diff --git a/src/main/java/com/ruoyi/staff/service/impl/StaffLeaveServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/StaffLeaveServiceImpl.java
index 20ec7be..2d30dc5 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/StaffLeaveServiceImpl.java
+++ b/src/main/java/com/ruoyi/staff/service/impl/StaffLeaveServiceImpl.java
@@ -1,17 +1,13 @@
 package com.ruoyi.staff.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.staff.dto.StaffLeaveDto;
-import com.ruoyi.staff.dto.StaffOnJobDto;
 import com.ruoyi.staff.mapper.StaffLeaveMapper;
 import com.ruoyi.staff.mapper.StaffOnJobMapper;
-import com.ruoyi.staff.pojo.StaffContract;
-import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
 import com.ruoyi.staff.pojo.StaffOnJob;
 import com.ruoyi.staff.service.StaffLeaveService;
 import lombok.AllArgsConstructor;
diff --git a/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
index 3de1ca9..6fb0cd0 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
+++ b/src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
@@ -1,7 +1,6 @@
 package com.ruoyi.staff.service.impl;
 
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -13,11 +12,9 @@
 import com.ruoyi.project.system.mapper.SysPostMapper;
 import com.ruoyi.staff.dto.StaffOnJobDto;
 import com.ruoyi.staff.mapper.StaffContractMapper;
-import com.ruoyi.staff.mapper.StaffJoinLeaveRecordMapper;
 import com.ruoyi.staff.mapper.StaffLeaveMapper;
 import com.ruoyi.staff.mapper.StaffOnJobMapper;
 import com.ruoyi.staff.pojo.StaffContract;
-import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
 import com.ruoyi.staff.pojo.StaffLeave;
 import com.ruoyi.staff.pojo.StaffOnJob;
 import com.ruoyi.staff.service.IStaffOnJobService;
@@ -47,7 +44,6 @@
 
     private SysPostMapper sysPostMapper;
 
-    private StaffJoinLeaveRecordMapper staffJoinLeaveRecordMapper;
     private StaffContractMapper staffContractMapper;
     private StaffLeaveMapper staffLeaveMapper;
 
@@ -69,6 +65,7 @@
             throw new BaseException("缂栧彿涓�"+staffOnJobPrams.getStaffNo()+"鐨勫憳宸ュ凡缁忓瓨鍦�,鏃犳硶鏂板!!!");
         }
         // 鍒涘缓鍏ヨ亴鏁版嵁
+        staffOnJobPrams.setContractExpireTime(staffOnJobPrams.getContractEndTime());
         staffOnJobMapper.insert(staffOnJobPrams);
 
         // 鍒涘缓鍚堝悓璁板綍
@@ -90,20 +87,22 @@
             throw new BaseException("缂栧彿涓�"+staffOnJobParams.getStaffNo()+"鐨勫憳宸ヤ笉瀛樺湪,鏃犳硶鏇存柊!!!");
         }
 
-        // 鏇存柊鍛樺伐鏁版嵁
         String[] ignoreProperties = {"id"};//鎺掗櫎id灞炴��
-        BeanUtils.copyProperties(staffOnJobParams,job,ignoreProperties);
-        staffOnJobMapper.updateById(job);
 
         // 鑾峰彇鏈�鏂板悎鍚屾暟鎹紝骞朵笖鏇存柊
         StaffContract contract = staffContractMapper.selectOne(Wrappers.<StaffContract>lambdaQuery()
                 .eq(StaffContract::getStaffOnJobId, id)
+                .last("limit 1")
                 .orderByDesc(StaffContract::getId));
         if (contract != null){
             BeanUtils.copyProperties(staffOnJobParams,contract,ignoreProperties);
-            return staffContractMapper.updateById(contract);
+            staffContractMapper.updateById(contract);
         }
-        return 0;
+
+        // 鏇存柊鍛樺伐鏁版嵁
+        BeanUtils.copyProperties(staffOnJobParams,job,ignoreProperties);
+        job.setContractExpireTime(staffOnJobParams.getContractEndTime());
+        return staffOnJobMapper.updateById(job);
     }
 
     //鍒犻櫎鍏ヨ亴
@@ -118,10 +117,38 @@
         return staffContractMapper.delete(Wrappers.<StaffContract>lambdaQuery().in(StaffContract::getStaffOnJobId, ids));
     }
 
+    // 缁鍚堝悓
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int renewContract(Long id, StaffContract staffContract) {
+        // 鍒ゆ柇瀵硅薄鏄惁瀛樺湪
+        StaffOnJob job = staffOnJobMapper.selectById(id);
+        if (job == null){
+            throw new BaseException("璇ュ憳宸ヤ笉瀛樺湪,鏃犳硶鏇存柊!!!");
+        }
+
+        // 澧炲姞鍚堝悓
+        StaffContract newStaffContract = new StaffContract();
+        newStaffContract.setStaffOnJobId(id);
+        newStaffContract.setContractTerm(staffContract.getContractTerm());
+        newStaffContract.setContractStartTime(staffContract.getContractStartTime());
+        newStaffContract.setContractEndTime(staffContract.getContractEndTime());
+        staffContractMapper.insert(newStaffContract);
+
+        // 鏇存柊鍛樺伐鍚堝悓杩囨湡鏃堕棿
+        job.setContractExpireTime(staffContract.getContractEndTime());
+        staffOnJobMapper.updateById(job);
+        return 0;
+    }
+
     //鍦ㄨ亴鍛樺伐璇︽儏
     @Override
     public StaffOnJobDto staffOnJobDetail(Long id) {
         StaffOnJob staffOnJob  = staffOnJobMapper.selectById(id);
+        if (staffOnJob == null) {
+            throw new IllegalArgumentException("璇ュ憳宸ヤ笉瀛樺湪");
+        }
+
         StaffOnJobDto staffOnJobDto = new StaffOnJobDto();
         BeanUtils.copyProperties(staffOnJob, staffOnJobDto);
         // 鏌ヨ宀椾綅鍚嶇О
@@ -131,6 +158,7 @@
         // 鏌ヨ鍚堝悓淇℃伅
         StaffContract contract = staffContractMapper.selectOne(Wrappers.<StaffContract>lambdaQuery()
                 .eq(StaffContract::getStaffOnJobId, staffOnJob.getId())
+                .last("limit 1")
                 .orderByDesc(StaffContract::getId));
         if (contract != null){
             staffOnJobDto.setContractTerm(contract.getContractTerm());
@@ -149,8 +177,8 @@
     }
 
     @Override
-    public List<StaffJoinLeaveRecord> staffOnJobList() {
-        return staffJoinLeaveRecordMapper.staffOnJobList();
+    public List<StaffOnJobDto> staffOnJobList(StaffOnJob staffOnJob) {
+        return staffOnJobMapper.staffOnJobList(staffOnJob);
     }
 
     @Override
diff --git a/src/main/resources/mapper/basic/ProductModelMapper.xml b/src/main/resources/mapper/basic/ProductModelMapper.xml
index afdfc4a..e12b63c 100644
--- a/src/main/resources/mapper/basic/ProductModelMapper.xml
+++ b/src/main/resources/mapper/basic/ProductModelMapper.xml
@@ -13,7 +13,6 @@
         <result column="tenant_id" property="tenantId" />
         <result column="product_name" property="productName" />
         <result column="product_id" property="productId" />
-        <result column="product_code" property="productCode" />
     </resultMap>
     <select id="listPageProductModel" resultType="com.ruoyi.basic.pojo.ProductModel">
         select pm.*,p.product_name
@@ -35,5 +34,68 @@
             LIMIT 1
     </select>
 
+    <select id="listPageProductionStock" resultType="com.ruoyi.basic.pojo.ProductModel">
+        SELECT
+        pm.id,
+        pm.product_id,
+        pm.model,
+        pm.unit,
+        p.product_name,
+        GREATEST(s.last_in_time, o.last_out_time) AS create_time,
+        COALESCE(s.inboundNum, 0) AS inboundNum,
+        COALESCE(o.outboundNum, 0) AS outboundNum,
+        COALESCE(s.inboundNum, 0) - COALESCE(o.outboundNum, 0) AS stockQuantity
+        FROM product_model pm
+        LEFT JOIN product p ON pm.product_id = p.id
+
+        -- 鍏ュ簱姹囨��
+        LEFT JOIN (
+        SELECT
+        product_model_id,
+        SUM(inbound_num) AS inboundNum,
+        MAX(create_time) AS last_in_time
+        FROM procurement_record_storage
+        <where>
+            <if test="req.timeStr != null and req.timeStr != ''">
+                AND create_time &gt;= #{req.timeStr}
+                AND create_time &lt; DATE_ADD(#{req.timeStr}, INTERVAL 1 DAY)
+            </if>
+        </where>
+        GROUP BY product_model_id
+        ) s ON s.product_model_id = pm.id
+
+        -- 鍑哄簱姹囨��
+        LEFT JOIN (
+        SELECT
+        product_model_id,
+        SUM(inbound_num) AS outboundNum,
+        MAX(create_time) AS last_out_time
+        FROM procurement_record_out
+        <where>
+            <if test="req.timeStr != null and req.timeStr != ''">
+                AND create_time &gt;= #{req.timeStr}
+                AND create_time &lt; DATE_ADD(#{req.timeStr}, INTERVAL 1 DAY)
+            </if>
+        </where>
+        GROUP BY product_model_id
+        ) o ON o.product_model_id = pm.id
+
+        <where>
+            <if test="req.timeStr != null and req.timeStr != ''">
+                AND (s.product_model_id IS NOT NULL OR o.product_model_id IS NOT NULL)
+            </if>
+
+            <if test="req.productCategory != null and req.productCategory != ''">
+                AND EXISTS (
+                SELECT 1
+                FROM sales_ledger_product slp
+                WHERE slp.product_id = p.id
+                AND slp.product_category LIKE CONCAT('%', #{req.productCategory}, '%')
+                )
+            </if>
+        </where>
+
+        ORDER BY pm.id DESC
+    </select>
 
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
index 6270d57..e1d9381 100644
--- a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
+++ b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
@@ -361,6 +361,7 @@
     <select id="listPageByProductProduction" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDto">
         select
         t1.*,
+        t1.inbound_num as inboundNum0,
         t2.model as specification_model  ,
         t2.unit,
         t3.product_name as product_category
diff --git a/src/main/resources/mapper/production/ProductOrderMapper.xml b/src/main/resources/mapper/production/ProductOrderMapper.xml
index b47d5cf..28e03b5 100644
--- a/src/main/resources/mapper/production/ProductOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductOrderMapper.xml
@@ -43,6 +43,9 @@
             <if test="c.specificationModel != null and c.specificationModel != ''">
                 and slp.specification_model like concat('%',#{c.specificationModel},'%')
             </if>
+            <if test="c.startTime != null and c.endTime != null">
+                and po.create_time between #{c.startTime} and #{c.endTime}
+            </if>
         </where>
     </select>
     <select id="productMainByOrderId" resultType="com.ruoyi.production.dto.ProductOrderDto">
diff --git a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
index 9a03b30..06f79e1 100644
--- a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -38,11 +38,9 @@
             <if test="c.workOrderNo != null and c.workOrderNo != ''">
                 pwo.work_order_no like concat('%',#{c.workOrderNo},'%')
             </if>
+            <if test="c.planStartTime != null and c.planEndTime != null">
+                and DATE(pwo.create_time) between #{c.planStartTime} and #{c.planEndTime}
+            </if>
         </where>
-    </select>
-    <select id="selectProductWorkOrderDtoList" resultType="com.ruoyi.production.dto.ProductWorkOrderDto">
-        select *
-        from product_work_order pwo
-        left join product_order po on po.id = pwo.product_order_id
     </select>
 </mapper>
diff --git a/src/main/resources/mapper/staff/StaffJoinLeaveRecordMapper.xml b/src/main/resources/mapper/staff/StaffJoinLeaveRecordMapper.xml
deleted file mode 100644
index e51999b..0000000
--- a/src/main/resources/mapper/staff/StaffJoinLeaveRecordMapper.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
-<mapper namespace="com.ruoyi.staff.mapper.StaffJoinLeaveRecordMapper">
-    <select id="staffJoinLeaveRecordListPage" resultType="com.ruoyi.staff.dto.StaffJoinLeaveRecordDto">
-        SELECT
-        staff_join_leave_record.*,
-        sp.post_name as postName
-        FROM staff_join_leave_record
-        LEFT JOIN
-        sys_post sp ON sp.post_id = staff_join_leave_record.sys_post_id
-        where
-        staff_state = #{staffJoinLeaveRecord.staffState}
-        <if test="staffJoinLeaveRecord.staffName != null and staffJoinLeaveRecord.staffName != '' ">
-            AND staff_name LIKE CONCAT('%',#{staffJoinLeaveRecord.staffName},'%')
-        </if>
-        <if test="staffJoinLeaveRecord.entryDateStart != null and staffJoinLeaveRecord.entryDateStart != '' ">
-            and contract_start_time like concat('%',#{staffJoinLeaveRecord.entryDateStart},'%')
-        </if>
-        <if test="staffJoinLeaveRecord.entryDateEnd != null and staffJoinLeaveRecord.entryDateEnd != '' ">
-            and contract_end_time like concat('%',#{staffJoinLeaveRecord.entryDateEnd},'%')
-        </if>
-        order by create_time desc
-    </select>
-    <select id="staffJoinLeaveRecordList" resultType="com.ruoyi.staff.pojo.StaffJoinLeaveRecord">
-        SELECT
-        *
-        FROM staff_join_leave_record
-        where
-        staff_state = #{staffJoinLeaveRecord.staffState}
-        <if test="staffJoinLeaveRecord.staffName != null and staffJoinLeaveRecord.staffName != '' ">
-            AND staff_name LIKE CONCAT('%',#{staffJoinLeaveRecord.staffName},'%')
-        </if>
-    </select>
-    <select id="staffOnJobList" resultType="com.ruoyi.staff.pojo.StaffJoinLeaveRecord">
-        select *
-        from (select *,
-                     ROW_NUMBER() over (PARTITION BY staff_no ORDER BY create_time DESC ) as rn
-              from staff_join_leave_record
-              where staff_state = 1) t
-        where rn = 1
-
-    </select>
-</mapper>
diff --git a/src/main/resources/mapper/system/SysUserMapper.xml b/src/main/resources/mapper/system/SysUserMapper.xml
index d0a03fb..d837b7e 100644
--- a/src/main/resources/mapper/system/SysUserMapper.xml
+++ b/src/main/resources/mapper/system/SysUserMapper.xml
@@ -88,7 +88,7 @@
 		<if test="params.endTime != null and params.endTime != ''"><!-- 缁撴潫鏃堕棿妫�绱� -->
 			AND date_format(u.create_time,'%Y%m%d') &lt;= date_format(#{params.endTime},'%Y%m%d')
 		</if>
-		<if test="params.deptId != null">
+		<if test="deptId != null">
 			AND u.user_id IN
 			(
 			SELECT user_id FROM sys_user_dept WHERE dept_id = #{deptId}

--
Gitblit v1.9.3