From 2ee9e158e3129070f6b1fd953da1540f05d4f2b0 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期五, 10 七月 2026 18:04:50 +0800
Subject: [PATCH] 修改报工

---
 src/main/java/com/ruoyi/production/service/impl/ProductionAccountServiceImpl.java |  205 +++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 197 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 e8e3126..cd9e476 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionAccountServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionAccountServiceImpl.java
@@ -1,20 +1,209 @@
 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;
 
-/**
- * <p>
- * 鐢熶骇鏍哥畻琛� 鏈嶅姟瀹炵幇绫�
- * </p>
- *
- * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
- * @since 2026-04-21 03:55:52
- */
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+
 @Service
+@RequiredArgsConstructor
 public class ProductionAccountServiceImpl extends ServiceImpl<ProductionAccountMapper, ProductionAccount> implements ProductionAccountService {
 
+
+    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) {
+        // 鏌ヨ鐢熶骇鏍哥畻鏄庣粏
+        ProductionAccountDto queryDto = normalizeDateQuery(dto);
+        if (queryDto.getAuditStatus() == null) {
+            queryDto.setAuditStatus(1);
+        }
+        if (queryDto.getReportType() == null) {
+            queryDto.setReportType(0);
+        }
+        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)
+                .eq(ProductionProductMain::getReportType, 0);
+        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.getSchedulingUserId() == null) {
+            throw new ServiceException("璇烽�夋嫨闇�瑕佷慨姝g殑浜哄憳");
+        }
+        BigDecimal adjustAmount = dto.getAdjustAmount();
+        if (adjustAmount == null || adjustAmount.compareTo(BigDecimal.ZERO) == 0) {
+            throw new ServiceException("淇閲戦涓嶈兘涓虹┖");
+        }
+        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;
+    }
+
+    private void rebuildAccount(ProductionProductMain productionProductMain) {
+        if (productionProductMain == null || productionProductMain.getId() == null) {
+            return;
+        }
+        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());
+        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) {
+            if (dto.getEntryDateStart() == null) {
+                dto.setEntryDateStart(dateRange[0]);
+            }
+            if (dto.getEntryDateEnd() == null) {
+                dto.setEntryDateEnd(dateRange.length > 1 ? dateRange[1] : dateRange[0]);
+            }
+        }
+
+        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.setEntryDate(dto.getEntryDateStart());
+            }
+            dto.setEntryDateStart(null);
+            dto.setEntryDateEnd(null);
+        } else if ("month".equalsIgnoreCase(dateType)) {
+            if ((dto.getEntryDateStart() == null || dto.getEntryDateEnd() == null) && dto.getEntryDate() != null) {
+                LocalDate monthDate = dto.getEntryDate();
+                dto.setEntryDateStart(monthDate.withDayOfMonth(1));
+                dto.setEntryDateEnd(monthDate.withDayOfMonth(monthDate.lengthOfMonth()));
+            }
+            dto.setEntryDate(null);
+        }
+        return dto;
+    }
+
 }

--
Gitblit v1.9.3