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 | 268 ++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 254 insertions(+), 14 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 175dd30..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,12 +7,17 @@
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.StockInUnQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.bean.BeanUtils;
@@ -27,6 +32,8 @@
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.quality.mapper.*;
import com.ruoyi.quality.pojo.*;
+import com.ruoyi.stock.pojo.StockInRecord;
+import com.ruoyi.stock.service.StockInRecordService;
import com.ruoyi.stock.dto.StockInventoryDto;
import com.ruoyi.stock.service.StockInventoryService;
import com.ruoyi.technology.mapper.TechnologyOperationMapper;
@@ -77,7 +84,10 @@
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;
@Override
@@ -275,8 +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());
@@ -291,7 +306,6 @@
// 褰撳墠瀹炵幇鎸夊伐搴忔垚鍝佺洿鎺ヤ綔涓烘姇鍏ワ紝鍚庣画鑻ユ帴鍏ラ鏂欒褰曞彲鍦ㄨ繖閲屾浛鎹㈡潵婧愩��
ProductionProductInput productionProductInput = new ProductionProductInput();
productionProductInput.setProductionProductMainId(productionProductMain.getId());
- productionProductInput.setProductMainId(productionProductMain.getId());
productionProductInput.setProductModelId(item.getProductModelId());
productionProductInput.setInputQuantity(item.getUnitQuantity().multiply(defaultDecimal(dto.getQuantity())));
productionProductInput.setQuantity(productionProductInput.getInputQuantity());
@@ -300,13 +314,14 @@
ProductionProductOutput productionProductOutput = new ProductionProductOutput();
productionProductOutput.setProductionProductMainId(productionProductMain.getId());
- productionProductOutput.setProductMainId(productionProductMain.getId());
productionProductOutput.setProductModelId(productModel.getId());
productionProductOutput.setQuantity(defaultDecimal(dto.getQuantity()));
productionProductOutput.setScrapQty(defaultDecimal(dto.getScrapQty()));
productionProductOutputMapper.insert(productionProductOutput);
BigDecimal reportQty = defaultDecimal(productionProductOutput.getQuantity());
+ BigDecimal scrapQty = defaultDecimal(productionProductOutput.getScrapQty());
BigDecimal productQty = reportQty;
+ String qualifiedBatchNo = null;
List<ProductionOrderRoutingOperation> routingOperationList = productionOrderRoutingOperationMapper.selectList(
Wrappers.<ProductionOrderRoutingOperation>lambdaQuery()
@@ -352,6 +367,11 @@
stockInventoryDto.setQualitity(productQty);
stockInventoryDto.setProductModelId(productModel.getId());
stockInventoryService.addStockInRecordOnly(stockInventoryDto);
+ qualifiedBatchNo = resolveLatestStockInBatchNo(
+ productionProductMain.getId(),
+ StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(),
+ productModel.getId(),
+ "0");
}
productionOperationTask.setCompleteQuantity(defaultDecimal(productionOperationTask.getCompleteQuantity()).add(productQty));
@@ -370,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
@@ -390,21 +412,158 @@
}
ProductionAccount productionAccount = new ProductionAccount();
productionAccount.setProductionProductMainId(productionProductMain.getId());
-// productionAccount.setSalesLedgerId(productionOrder.getSalesLedgerId());
-// productionAccount.setSalesLedgerProductId(productionOrder.getSalesLedgerProductId() == null ? null : productionOrder.getSalesLedgerProductId().longValue());
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 (defaultDecimal(dto.getScrapQty()).compareTo(BigDecimal.ZERO) > 0) {
-// stockUtils.addUnStock(productModel.getId(), dto.getScrapQty(),
-// StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId());
-// }
+ if (scrapQty.compareTo(BigDecimal.ZERO) > 0) {
+ stockUtils.addUnStockWithBatchNo(
+ productModel.getId(),
+ scrapQty,
+ StockInQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(),
+ productionProductMain.getId(),
+ 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,
+ String recordType,
+ Long productModelId,
+ String stockType) {
+ if (recordId == null || productModelId == null) {
+ return null;
+ }
+ StockInRecord stockInRecord = stockInRecordService.getOne(
+ Wrappers.<StockInRecord>lambdaQuery()
+ .eq(StockInRecord::getRecordId, recordId)
+ .eq(StockInRecord::getRecordType, recordType)
+ .eq(StockInRecord::getProductModelId, productModelId)
+ .eq(StockInRecord::getType, stockType)
+ .orderByDesc(StockInRecord::getId)
+ .last("limit 1"),
+ false);
+ if (stockInRecord == null) {
+ throw new ServiceException("鏈壘鍒板搴旂殑鍏ュ簱鐢宠璁板綍");
+ }
+ return stockInRecord.getBatchNo();
}
private void syncOperationParamInputValue(ProductionProductMainDto dto,
@@ -604,7 +763,7 @@
productionOrderRoutingOperationParamMapper.delete(
Wrappers.<ProductionOrderRoutingOperationParam>lambdaQuery()
.eq(ProductionOrderRoutingOperationParam::getProductionProductMainId, productionProductMain.getId()));
- stockUtils.deleteStockInRecord(productionProductMain.getId(), StockInUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
+ stockUtils.deleteStockInRecord(productionProductMain.getId(), StockInQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode());
stockUtils.deleteStockInRecord(productionProductMain.getId(), StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode());
stockUtils.deleteStockOutRecord(productionProductMain.getId(), StockOutQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_OUT.getCode());
productionProductMainMapper.deleteById(productionProductMain.getId());
@@ -647,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