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/ProductionProductMainServiceImpl.java |  216 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 212 insertions(+), 4 deletions(-)

diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
index 2e1e578..b6230aa 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -7,10 +7,16 @@
 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.alibaba.fastjson2.JSON;
+import com.ruoyi.approve.bean.dto.ApprovalInstanceDto;
+import com.ruoyi.approve.bean.vo.ApprovalTemplateVo;
+import com.ruoyi.approve.service.ApprovalInstanceService;
+import com.ruoyi.approve.service.ApprovalTemplateService;
 import com.ruoyi.basic.mapper.ProductMapper;
 import com.ruoyi.basic.mapper.ProductModelMapper;
 import com.ruoyi.basic.pojo.Product;
 import com.ruoyi.basic.pojo.ProductModel;
+import com.ruoyi.common.enums.TypeEnums;
 import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
 import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
 import com.ruoyi.common.exception.ServiceException;
@@ -78,6 +84,8 @@
     private final ProductionOrderRoutingOperationParamMapper productionOrderRoutingOperationParamMapper;
     private final TechnologyRoutingOperationMapper technologyRoutingOperationMapper;
     private final TechnologyOperationMapper technologyOperationMapper;
+    private final ApprovalTemplateService approvalTemplateService;
+    private final ApprovalInstanceService approvalInstanceService;
     private final StockUtils stockUtils;
     private final StockInRecordService stockInRecordService;
     private final StockInventoryService stockInventoryService;
@@ -277,9 +285,13 @@
         productionProductMain.setUserName(user == null ? dto.getUserName() : user.getNickName());
         productionProductMain.setProductionOperationTaskId(taskId);
         productionProductMain.setStatus(0);
+        productionProductMain.setReportType(dto.getReportType() == null ? 0 : dto.getReportType());
+        productionProductMain.setAuditStatus(dto.getAuditStatus() == null ? 0 : dto.getAuditStatus());
+        productionProductMain.setAuditRemark(dto.getAuditRemark());
         productionProductMain.setWorkHour(dto.getWorkHour());
         productionProductMainMapper.insert(productionProductMain);
         syncOperationParamInputValue(dto, routingOperation.getId(), productionProductMain.getId());
+        createReportApprovalInstance(productionProductMain);
 
         List<ProductStructureDto> productStructureDtos = resolveInputStructures(
                 productionOrder.getId(), routingOperation, productModel.getId());
@@ -378,8 +390,10 @@
             if (ObjectUtils.isNull(productionOrder.getStartTime())) {
                 productionOrder.setStartTime(LocalDateTime.now());
             }
-            // 璁㈠崟鐘舵�佺敱鏈�鍚庝竴閬撳伐搴忕殑鍚堟牸浜у嚭鎺ㄥ姩锛岄伩鍏嶄腑闂村伐搴忔彁鍓嶅畬宸ャ��
-            productionOrder.setStatus(ProductOrderStatusEnum.RUNNING.getCode());
+            // 浠呭緟寮�濮嬬姸鎬佹墠鎺ㄨ繘鍒拌繘琛屼腑锛岄伩鍏嶉潪鏈亾宸ュ簭鎶ュ伐鏃惰鐩栧凡瀹屾垚鐘舵�併��
+            if (ProductOrderStatusEnum.WAIT.getCode().equals(productionOrder.getStatus())) {
+                productionOrder.setStatus(ProductOrderStatusEnum.RUNNING.getCode());
+            }
             if (isLastOperation) {
                 productionOrder.setCompleteQuantity(defaultDecimal(productionOrder.getCompleteQuantity()).add(productQty));
                 if (productionOrder.getQuantity() != null
@@ -401,10 +415,9 @@
             productionAccount.setSchedulingUserId(user == null ? null : user.getUserId());
             productionAccount.setSchedulingUserName(user == null ? dto.getUserName() : user.getNickName());
             productionAccount.setFinishedNum(productQty);
-            productionAccount.setWorkHours(workHours);
+            productionAccount.setWorkHours(technologyOperation != null ? technologyOperation.getSalaryQuota() : null);
             productionAccount.setTechnologyOperationName(technologyOperation == null ? null : technologyOperation.getName());
             productionAccount.setSchedulingDate(LocalDateTime.now());
-            productionAccountMapper.insert(productionAccount);
         }
         if (scrapQty.compareTo(BigDecimal.ZERO) > 0) {
             stockUtils.addUnStockWithBatchNo(
@@ -415,6 +428,120 @@
                     qualifiedBatchNo);
         }
         return true;
+    }
+
+    private void createReportApprovalInstance(ProductionProductMain productionProductMain) {
+        if (productionProductMain == null || productionProductMain.getId() == null) {
+            return;
+        }
+        ApprovalTemplateVo templateVo = approvalTemplateService.getEnabledTemplateByBusinessType(
+                TypeEnums.PRODUCTION_REPORT_APPROVAL.getCode()
+        );
+        if (templateVo == null) {
+            throw new ServiceException("璇峰厛閰嶇疆鎶ュ伐瀹℃壒妯℃澘");
+        }
+        ApprovalInstanceDto approvalInstanceDto = new ApprovalInstanceDto();
+        approvalInstanceDto.setTemplateId(templateVo.getId());
+        approvalInstanceDto.setTemplateName(templateVo.getTemplateName());
+        approvalInstanceDto.setBusinessId(productionProductMain.getId());
+        approvalInstanceDto.setBusinessType(TypeEnums.PRODUCTION_REPORT_APPROVAL.getCode());
+        approvalInstanceDto.setTitle(productionProductMain.getProductNo());
+        approvalInstanceDto.setApplicantId(productionProductMain.getUserId());
+        approvalInstanceDto.setApplicantName(productionProductMain.getUserName());
+        approvalInstanceDto.setApplyTime(LocalDateTime.now());
+        approvalInstanceDto.setStatus("PENDING");
+        approvalInstanceDto.setFormConfig(JSON.toJSONString(buildReportApprovalFormConfig(productionProductMain)));
+        approvalInstanceService.add(approvalInstanceDto);
+    }
+
+    private Map<String, Object> buildReportApprovalFormConfig(ProductionProductMain productionProductMain) {
+        Map<String, Object> formConfig = new LinkedHashMap<>();
+        formConfig.put("summaryPlaceholder", "鎶ュ伐瀹℃壒");
+        formConfig.put("approvalType", "production_report");
+
+        List<Map<String, Object>> fields = new ArrayList<>();
+        fields.add(buildReportField("productNo", "鎶ュ伐鍗曞彿", "text", productionProductMain.getProductNo()));
+        fields.add(buildReportField("userName", "鎶ュ伐浜哄憳", "text", productionProductMain.getUserName()));
+        fields.add(buildReportField("workOrderNo", "宸ュ崟缂栧彿", "text", resolveWorkOrderNo(productionProductMain.getProductionOperationTaskId())));
+        fields.add(buildReportField("reportType", "鎶ュ伐缁撴灉", "select", resolveReportTypeLabel(productionProductMain.getReportType())));
+        fields.add(buildReportField("workHour", "宸ユ椂", "number", productionProductMain.getWorkHour()));
+        fields.add(buildReportField("auditStatus", "瀹℃牳鐘舵��", "select", resolveAuditStatusLabel(productionProductMain.getAuditStatus())));
+        fields.add(buildReportField("auditRemark", "瀹℃牳鎰忚", "textarea", productionProductMain.getAuditRemark()));
+        formConfig.put("fields", fields);
+
+        Map<String, Object> formPayload = new LinkedHashMap<>();
+        formPayload.put("productNo", productionProductMain.getProductNo());
+        formPayload.put("userName", productionProductMain.getUserName());
+        formPayload.put("workOrderNo", resolveWorkOrderNo(productionProductMain.getProductionOperationTaskId()));
+        formPayload.put("reportType", resolveReportTypeLabel(productionProductMain.getReportType()));
+        formPayload.put("workHour", productionProductMain.getWorkHour());
+        formPayload.put("auditStatus", resolveAuditStatusLabel(productionProductMain.getAuditStatus()));
+        formPayload.put("auditRemark", productionProductMain.getAuditRemark());
+        formConfig.put("formPayload", formPayload);
+        return formConfig;
+    }
+
+    private Map<String, Object> buildReportField(String key, String label, String type, Object defaultValue) {
+        Map<String, Object> field = new LinkedHashMap<>();
+        field.put("key", key);
+        field.put("label", label);
+        field.put("type", type);
+        field.put("required", Boolean.FALSE);
+        field.put("defaultValue", defaultValue);
+        return field;
+    }
+
+    private String resolveWorkOrderNo(Long productionOperationTaskId) {
+        if (productionOperationTaskId == null) {
+            return null;
+        }
+        ProductionOperationTask task = productionOperationTaskMapper.selectById(productionOperationTaskId);
+        if (task != null && task.getWorkOrderNo() != null) {
+            return task.getWorkOrderNo();
+        }
+        if (task == null || task.getProductionOrderRoutingOperationId() == null) {
+            return null;
+        }
+        ProductionOrderRoutingOperation routingOperation = productionOrderRoutingOperationMapper.selectById(task.getProductionOrderRoutingOperationId());
+        if (routingOperation == null || routingOperation.getProductionOrderId() == null) {
+            return null;
+        }
+        ProductionOrder productionOrder = productionOrderMapper.selectById(routingOperation.getProductionOrderId());
+        return productionOrder == null ? null : productionOrder.getNpsNo();
+    }
+
+    private String resolveReportTypeLabel(Integer reportType) {
+        if (reportType == null) {
+            return "鈥�";
+        }
+        switch (reportType) {
+            case 0:
+                return "鍚堟牸";
+            case 1:
+                return "杞诲井杩斿伐";
+            case 2:
+                return "涓ラ噸杩斿伐";
+            case 3:
+                return "鎶ュ簾";
+            default:
+                return "鈥�";
+        }
+    }
+
+    private String resolveAuditStatusLabel(Integer auditStatus) {
+        if (auditStatus == null) {
+            return "寰呭鏍�";
+        }
+        switch (auditStatus) {
+            case 0:
+                return "寰呭鏍�";
+            case 1:
+                return "瀹℃牳閫氳繃";
+            case 2:
+                return "瀹℃牳涓嶉�氳繃";
+            default:
+                return "鈥�";
+        }
     }
 
     private String resolveLatestStockInBatchNo(Long recordId,
@@ -679,6 +806,87 @@
         return dto.getProductionOperationTaskId();
     }
 
+    private boolean isCountingWageReport(ProductionProductMain productionProductMain) {
+        return productionProductMain != null
+                && productionProductMain.getAuditStatus() != null
+                && productionProductMain.getAuditStatus() == 1
+                && productionProductMain.getReportType() != null
+                && (productionProductMain.getReportType() == 0 || productionProductMain.getReportType() == 1);
+    }
+
+    private boolean isExcludedFromWage(ProductionProductMain productionProductMain) {
+        return productionProductMain != null
+                && productionProductMain.getReportType() != null
+                && productionProductMain.getReportType() != 0
+                && productionProductMain.getReportType() != 1;
+    }
+
+    @Override
+    public Boolean auditProductMain(ProductionProductMainDto productionProductMainDto) {
+        if (productionProductMainDto == null || productionProductMainDto.getId() == null) {
+            throw new ServiceException("鍙傛暟閿欒");
+        }
+        ProductionProductMain productionProductMain = productionProductMainMapper.selectById(productionProductMainDto.getId());
+        if (productionProductMain == null) {
+            throw new ServiceException("鎶ュ伐涓嶅瓨鍦�");
+        }
+        Integer auditStatus = productionProductMainDto.getAuditStatus();
+        if (auditStatus == null) {
+            throw new ServiceException("瀹℃牳鐘舵�佷笉鑳戒负绌�");
+        }
+        productionProductMain.setAuditStatus(auditStatus);
+        productionProductMain.setAuditRemark(productionProductMainDto.getAuditRemark());
+        productionProductMainMapper.updateById(productionProductMain);
+        productionAccountMapper.delete(new LambdaQueryWrapper<ProductionAccount>()
+                .eq(ProductionAccount::getProductionProductMainId, productionProductMain.getId()));
+        if (auditStatus == 1 && !isExcludedFromWage(productionProductMain)) {
+            rebuildProductionAccount(productionProductMain);
+        }
+        return true;
+    }
+
+    private void rebuildProductionAccount(ProductionProductMain productionProductMain) {
+        if (productionProductMain == null || productionProductMain.getId() == null) {
+            return;
+        }
+        ProductionProductOutput output = productionProductOutputMapper.selectOne(
+                Wrappers.<ProductionProductOutput>lambdaQuery()
+                        .eq(ProductionProductOutput::getProductionProductMainId, productionProductMain.getId())
+                        .last("limit 1"));
+        if (output == null) {
+            return;
+        }
+        ProductionOperationTask productionOperationTask = productionOperationTaskMapper.selectById(productionProductMain.getProductionOperationTaskId());
+        if (productionOperationTask == null) {
+            return;
+        }
+        ProductionOrderRoutingOperation routingOperation = productionOrderRoutingOperationMapper.selectById(productionOperationTask.getProductionOrderRoutingOperationId());
+        if (routingOperation == null) {
+            return;
+        }
+        ProductionOrder productionOrder = productionOrderMapper.selectById(productionOperationTask.getProductionOrderId());
+        if (productionOrder == null) {
+            return;
+        }
+        TechnologyRoutingOperation technologyRoutingOperation = technologyRoutingOperationMapper.selectById(routingOperation.getTechnologyRoutingOperationId());
+        TechnologyOperation technologyOperation = technologyRoutingOperation == null ? null
+                : technologyOperationMapper.selectById(technologyRoutingOperation.getTechnologyOperationId());
+        SysUser user = userMapper.selectUserById(productionProductMain.getUserId());
+        BigDecimal productQty = defaultDecimal(output.getQuantity());
+        if (productQty.compareTo(BigDecimal.ZERO) <= 0) {
+            return;
+        }
+        ProductionAccount productionAccount = new ProductionAccount();
+        productionAccount.setProductionProductMainId(productionProductMain.getId());
+        productionAccount.setSchedulingUserId(user == null ? productionProductMain.getUserId() : user.getUserId());
+        productionAccount.setSchedulingUserName(user == null ? productionProductMain.getUserName() : user.getNickName());
+        productionAccount.setFinishedNum(productQty);
+        productionAccount.setWorkHours(technologyOperation != null ? technologyOperation.getSalaryQuota() : null);
+        productionAccount.setTechnologyOperationName(technologyOperation == null ? null : technologyOperation.getName());
+        productionAccount.setSchedulingDate(LocalDateTime.now());
+        productionAccountMapper.insert(productionAccount);
+    }
+
     @Override
     public ArrayList<Long> listMain(List<Long> idList) {
         // 鏌ヨ涓昏〃ID闆嗗悎

--
Gitblit v1.9.3