From 422a5676c2d96dd37c1be62935a314d70fef79b5 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期三, 15 七月 2026 15:28:04 +0800
Subject: [PATCH] 修改不合格管理

---
 src/main/java/com/ruoyi/production/service/impl/ProductionAccountServiceImpl.java |  209 ++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 201 insertions(+), 8 deletions(-)

diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionAccountServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionAccountServiceImpl.java
index 9c1843c..2b6cb27 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionAccountServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionAccountServiceImpl.java
@@ -1,19 +1,41 @@
 package com.ruoyi.production.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.production.bean.dto.ProductionAccountDto;
 import com.ruoyi.production.bean.dto.ProductionProductMainDto;
 import com.ruoyi.production.bean.vo.ProductionAccountVo;
 import com.ruoyi.production.mapper.ProductionAccountMapper;
+import com.ruoyi.production.mapper.ProductionOperationTaskMapper;
+import com.ruoyi.production.mapper.ProductionOrderRoutingOperationMapper;
 import com.ruoyi.production.mapper.ProductionProductMainMapper;
+import com.ruoyi.production.mapper.ProductionProductOutputMapper;
 import com.ruoyi.production.pojo.ProductionAccount;
+import com.ruoyi.production.pojo.ProductionOperationTask;
+import com.ruoyi.production.pojo.ProductionOrderRoutingOperation;
+import com.ruoyi.production.pojo.ProductionProductMain;
+import com.ruoyi.production.pojo.ProductionProductOutput;
+import com.ruoyi.technology.mapper.TechnologyOperationMapper;
+import com.ruoyi.technology.mapper.TechnologyRoutingOperationMapper;
+import com.ruoyi.technology.pojo.TechnologyOperation;
+import com.ruoyi.technology.pojo.TechnologyRoutingOperation;
+import com.ruoyi.project.system.mapper.SysUserMapper;
+import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.production.service.ProductionAccountService;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.common.exception.ServiceException;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeParseException;
+import java.util.Arrays;
+import java.util.List;
 
 @Service
 @RequiredArgsConstructor
@@ -21,38 +43,198 @@
 
 
     private final ProductionProductMainMapper productionProductMainMapper;
+    private final ProductionProductOutputMapper productionProductOutputMapper;
+    private final ProductionOperationTaskMapper productionOperationTaskMapper;
+    private final ProductionOrderRoutingOperationMapper productionOrderRoutingOperationMapper;
+    private final TechnologyRoutingOperationMapper technologyRoutingOperationMapper;
+    private final TechnologyOperationMapper technologyOperationMapper;
+    private final SysUserMapper sysUserMapper;
 
     @Override
     public IPage<ProductionAccountVo> listPage(Page<ProductionAccountDto> page, ProductionAccountDto dto) {
+        // 鍒嗛〉鏌ヨ鐢熶骇鏍哥畻鏁版嵁
         ProductionAccountDto queryDto = normalizeDateQuery(dto);
         return baseMapper.listPage(page, queryDto);
     }
 
     @Override
     public IPage<ProductionProductMainDto> listProductionDetails(ProductionAccountDto dto, Page page) {
-        return productionProductMainMapper.listProductionDetails(normalizeDateQuery(dto), page);
+        // 鏌ヨ鐢熶骇鏍哥畻鏄庣粏
+        ProductionAccountDto queryDto = normalizeDateQuery(dto);
+        if (queryDto.getAuditStatus() == null) {
+            queryDto.setAuditStatus(1);
+        }
+        return productionProductMainMapper.listProductionDetails(queryDto, page);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean batchAccounting(ProductionAccountDto dto) {
+        ProductionAccountDto queryDto = normalizeDateQuery(dto);
+        LambdaQueryWrapper<ProductionProductMain> queryWrapper = Wrappers.<ProductionProductMain>lambdaQuery()
+                .eq(ProductionProductMain::getAuditStatus, 1)
+                .in(ProductionProductMain::getReportType, Arrays.asList(0, 1));
+        if (queryDto.getSchedulingUserId() != null) {
+            queryWrapper.eq(ProductionProductMain::getUserId, queryDto.getSchedulingUserId());
+        }
+        if (queryDto.getSchedulingUserName() != null && !queryDto.getSchedulingUserName().isEmpty()) {
+            queryWrapper.like(ProductionProductMain::getUserName, queryDto.getSchedulingUserName());
+        }
+        if (queryDto.getEntryDate() != null) {
+            queryWrapper.apply("date(create_time) = {0}", queryDto.getEntryDate());
+        }
+        if (queryDto.getEntryDateStart() != null) {
+            queryWrapper.ge(ProductionProductMain::getCreateTime, queryDto.getEntryDateStart().atStartOfDay());
+        }
+        if (queryDto.getEntryDateEnd() != null) {
+            queryWrapper.le(ProductionProductMain::getCreateTime, queryDto.getEntryDateEnd().atTime(23, 59, 59));
+        }
+        List<ProductionProductMain> reportList = productionProductMainMapper.selectList(queryWrapper);
+        for (ProductionProductMain report : reportList) {
+            rebuildAccount(report);
+        }
+        return Boolean.TRUE;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean singleAdjust(ProductionAccountDto dto) {
+        if (dto == null || (dto.getProductionProductMainId() == null && dto.getSchedulingUserId() == null)) {
+            throw new ServiceException("璇烽�夋嫨闇�瑕佷慨姝g殑浜哄憳");
+        }
+        BigDecimal adjustAmount = dto.getAdjustAmount();
+        if (adjustAmount == null || adjustAmount.compareTo(BigDecimal.ZERO) == 0) {
+            throw new ServiceException("淇閲戦涓嶈兘涓虹┖");
+        }
+        if (dto.getProductionProductMainId() != null) {
+            ProductionAccount account = new ProductionAccount();
+            account.setAdjustAmount(adjustAmount);
+            account.setAdjustRemark(dto.getAdjustRemark());
+            account.setAdjustUser(dto.getAdjustUser());
+            account.setAdjustTime(LocalDateTime.now());
+            baseMapper.update(account, new LambdaQueryWrapper<ProductionAccount>()
+                    .eq(ProductionAccount::getProductionProductMainId, dto.getProductionProductMainId()));
+        } else {
+            ProductionAccount account = new ProductionAccount();
+            account.setSchedulingUserId(dto.getSchedulingUserId());
+            account.setSchedulingUserName(dto.getSchedulingUserName());
+            account.setTechnologyOperationName("宸ヨ祫淇");
+            account.setAdjustAmount(adjustAmount);
+            account.setAdjustRemark(dto.getAdjustRemark());
+            account.setAdjustUser(dto.getAdjustUser());
+            account.setAdjustTime(LocalDateTime.now());
+            account.setSchedulingDate(LocalDateTime.now());
+            account.setWorkHours(BigDecimal.ZERO);
+            account.setFinishedNum(BigDecimal.ZERO);
+            account.setAccountingBatchNo("ADJ-" + LocalDate.now());
+            baseMapper.insert(account);
+        }
+        return Boolean.TRUE;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean rebuildByProductionProductMainId(Long productionProductMainId) {
+        if (productionProductMainId == null) {
+            return Boolean.FALSE;
+        }
+        ProductionProductMain productionProductMain = productionProductMainMapper.selectById(productionProductMainId);
+        if (productionProductMain == null) {
+            return Boolean.FALSE;
+        }
+        if (productionProductMain.getAuditStatus() == null || productionProductMain.getAuditStatus() != 1) {
+            productionAccountDelete(productionProductMainId);
+            return Boolean.FALSE;
+        }
+        if (productionProductMain.getReportType() == null
+                || (!Integer.valueOf(0).equals(productionProductMain.getReportType())
+                && !Integer.valueOf(1).equals(productionProductMain.getReportType()))) {
+            productionAccountDelete(productionProductMainId);
+            return Boolean.FALSE;
+        }
+        rebuildAccount(productionProductMain);
+        return Boolean.TRUE;
+    }
+
+    private void rebuildAccount(ProductionProductMain productionProductMain) {
+        if (productionProductMain == null || productionProductMain.getId() == null) {
+            return;
+        }
+        ProductionAccount existedAccount = baseMapper.selectOne(Wrappers.<ProductionAccount>lambdaQuery()
+                .eq(ProductionAccount::getProductionProductMainId, productionProductMain.getId())
+                .last("limit 1"));
+        BigDecimal existedAdjustAmount = existedAccount == null ? null : existedAccount.getAdjustAmount();
+        String existedAdjustRemark = existedAccount == null ? null : existedAccount.getAdjustRemark();
+        Long existedAdjustUser = existedAccount == null ? null : existedAccount.getAdjustUser();
+        LocalDateTime existedAdjustTime = existedAccount == null ? null : existedAccount.getAdjustTime();
+
+        productionAccountDelete(productionProductMain.getId());
+        ProductionProductOutput output = productionProductOutputMapper.selectOne(
+                Wrappers.<ProductionProductOutput>lambdaQuery()
+                        .eq(ProductionProductOutput::getProductionProductMainId, productionProductMain.getId())
+                        .last("limit 1"));
+        if (output == null || output.getQuantity() == null || output.getQuantity().compareTo(BigDecimal.ZERO) <= 0) {
+            return;
+        }
+        ProductionOperationTask task = productionOperationTaskMapper.selectById(productionProductMain.getProductionOperationTaskId());
+        if (task == null) {
+            return;
+        }
+        ProductionOrderRoutingOperation routingOperation = productionOrderRoutingOperationMapper.selectById(task.getProductionOrderRoutingOperationId());
+        if (routingOperation == null) {
+            return;
+        }
+        TechnologyRoutingOperation technologyRoutingOperation = technologyRoutingOperationMapper.selectById(routingOperation.getTechnologyRoutingOperationId());
+        TechnologyOperation technologyOperation = technologyRoutingOperation == null ? null
+                : technologyOperationMapper.selectById(technologyRoutingOperation.getTechnologyOperationId());
+        SysUser user = sysUserMapper.selectUserById(productionProductMain.getUserId());
+
+        ProductionAccount account = new ProductionAccount();
+        account.setProductionProductMainId(productionProductMain.getId());
+        account.setSchedulingUserId(user == null ? productionProductMain.getUserId() : user.getUserId());
+        account.setSchedulingUserName(user == null ? productionProductMain.getUserName() : user.getNickName());
+        account.setFinishedNum(output.getQuantity());
+        account.setWorkHours(technologyOperation == null ? null : technologyOperation.getSalaryQuota());
+        account.setTechnologyOperationName(technologyOperation == null ? null : technologyOperation.getName());
+        account.setSchedulingDate(LocalDateTime.now());
+        account.setAccountingBatchNo("BATCH-" + LocalDate.now());
+        account.setAdjustAmount(existedAdjustAmount);
+        account.setAdjustRemark(existedAdjustRemark);
+        account.setAdjustUser(existedAdjustUser);
+        account.setAdjustTime(existedAdjustTime);
+        baseMapper.insert(account);
+    }
+
+    private void productionAccountDelete(Long productionProductMainId) {
+        if (productionProductMainId == null) {
+            return;
+        }
+        baseMapper.delete(new LambdaQueryWrapper<ProductionAccount>()
+                .eq(ProductionAccount::getProductionProductMainId, productionProductMainId));
     }
 
     private ProductionAccountDto normalizeDateQuery(ProductionAccountDto dto) {
+        // 瑙勮寖鏃ユ湡鏌ヨ鑼冨洿锛岃ˉ榻愮己澶辩殑寮�濮嬫垨缁撴潫鏃堕棿
         if (dto == null) {
             return new ProductionAccountDto();
         }
-        LocalDate[] dateRange = dto.getDateRange();
         if ((dto.getEntryDateStart() == null || dto.getEntryDateEnd() == null)
-                && dateRange != null
-                && dateRange.length > 0) {
+                && dto.getDateRange() != null
+                && dto.getDateRange().length > 0) {
+            LocalDate rangeStart = parseDate(dto.getDateRange()[0]);
+            LocalDate rangeEnd = dto.getDateRange().length > 1 ? parseDate(dto.getDateRange()[1]) : rangeStart;
             if (dto.getEntryDateStart() == null) {
-                dto.setEntryDateStart(dateRange[0]);
+                dto.setEntryDateStart(rangeStart);
             }
             if (dto.getEntryDateEnd() == null) {
-                dto.setEntryDateEnd(dateRange.length > 1 ? dateRange[1] : dateRange[0]);
+                dto.setEntryDateEnd(rangeEnd);
             }
         }
 
         String dateType = dto.getDateType();
         if ("day".equalsIgnoreCase(dateType)) {
-            if (dto.getEntryDate() == null && dateRange != null && dateRange.length > 0) {
-                dto.setEntryDate(dateRange[0]);
+            if (dto.getEntryDate() == null && dto.getDateRange() != null && dto.getDateRange().length > 0) {
+                dto.setEntryDate(parseDate(dto.getDateRange()[0]));
             }
             if (dto.getEntryDate() == null) {
                 dto.setEntryDate(dto.getEntryDateStart());
@@ -70,4 +252,15 @@
         return dto;
     }
 
+    private LocalDate parseDate(String dateValue) {
+        if (dateValue == null || dateValue.isEmpty()) {
+            return null;
+        }
+        try {
+            return LocalDate.parse(dateValue);
+        } catch (DateTimeParseException e) {
+            throw new ServiceException("鏃ユ湡鏍煎紡閿欒锛岃浣跨敤 yyyy-MM-dd");
+        }
+    }
+
 }

--
Gitblit v1.9.3