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/ProductionProductMainServiceImpl.java | 215 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 211 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 8c4d50d..63069a7 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(technologyOperation.getSalaryQuota());
+ 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,86 @@
return dto.getProductionOperationTaskId();
}
+ private boolean isCountingWageReport(ProductionProductMain productionProductMain) {
+ return productionProductMain != null
+ && productionProductMain.getAuditStatus() != null
+ && productionProductMain.getAuditStatus() == 1
+ && productionProductMain.getReportType() != null
+ && productionProductMain.getReportType() == 0;
+ }
+
+ private boolean isExcludedFromWage(ProductionProductMain productionProductMain) {
+ return productionProductMain != null
+ && productionProductMain.getReportType() != null
+ && productionProductMain.getReportType() != 0;
+ }
+
+ @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