From df6efd77578c8ba54d1ae3be9198c70fb5173399 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期六, 29 八月 2026 01:46:11 +0800
Subject: [PATCH] feat(mes): 报工只填写报工数量,合格/不良数量由质检确定;快速报工响应返回剩余可报工数量
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackQuickCreateReqVO.java | 6 ---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java | 4 ++
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java | 72 +++++++++++++++++++-----------------
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackBatchCreateReqVO.java | 6 ---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackQuickCreateRespVO.java | 5 ++
5 files changed, 47 insertions(+), 46 deletions(-)
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackBatchCreateReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackBatchCreateReqVO.java
index 8837e16..d652ca1 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackBatchCreateReqVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackBatchCreateReqVO.java
@@ -20,12 +20,6 @@
@NotNull(message = "鎶ュ伐鏁伴噺涓嶈兘涓虹┖")
private BigDecimal feedbackQuantity;
- @Schema(description = "鍚堟牸鍝佹暟閲忥紙闈炶川妫�宸ュ簭蹇呭~锛�", example = "48")
- private BigDecimal qualifiedQuantity;
-
- @Schema(description = "涓嶈壇鍝佹暟閲�", example = "2")
- private BigDecimal unqualifiedQuantity;
-
@Schema(description = "澶囨敞", example = "鎵归噺鎶ュ伐")
private String remark;
}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackQuickCreateReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackQuickCreateReqVO.java
index 0b6ba8a..ce717b4 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackQuickCreateReqVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackQuickCreateReqVO.java
@@ -19,12 +19,6 @@
@NotNull(message = "鎶ュ伐鏁伴噺涓嶈兘涓虹┖")
private BigDecimal feedbackQuantity;
- @Schema(description = "鍚堟牸鍝佹暟閲忥紙闈炶川妫�宸ュ簭蹇呭~锛�", example = "48")
- private BigDecimal qualifiedQuantity;
-
- @Schema(description = "涓嶈壇鍝佹暟閲�", example = "2")
- private BigDecimal unqualifiedQuantity;
-
@Schema(description = "宸ヨ壓鍙傛暟鍊�")
private List<MesProFeedbackSaveReqVO.ParamValue> paramValues;
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackQuickCreateRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackQuickCreateRespVO.java
index f3a87c0..1b80a2c 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackQuickCreateRespVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/pro/feedback/vo/MesProFeedbackQuickCreateRespVO.java
@@ -4,6 +4,8 @@
import lombok.Data;
import lombok.experimental.Accessors;
+import java.math.BigDecimal;
+
@Schema(description = "绠$悊鍚庡彴 - MES 蹇�熸姤宸� Response VO")
@Data
@Accessors(chain = true)
@@ -17,4 +19,7 @@
@Schema(description = "宸ュ崟鐘舵�侊紙鍙兘鑷姩瀹屾垚锛�", example = "1")
private Integer workOrderStatus;
+
+ @Schema(description = "鎶ュ伐鍚庡墿浣欏彲鎶ュ伐鏁伴噺", example = "20.00")
+ private BigDecimal reportableQuantity;
}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java
index a7617dc..016e10a 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java
@@ -279,7 +279,17 @@
feedback.getRouteId(), feedback.getProcessId());
boolean keyFlag = routeProcess != null && Boolean.TRUE.equals(routeProcess.getKeyFlag());
boolean checkFlag = routeProcess != null && Boolean.TRUE.equals(routeProcess.getCheckFlag());
- // 2.2 闈炶川妫�宸ュ簭锛氫粛鏈夊緟妫�鏁伴噺鏃朵笉鑳藉鎵癸紙璐ㄦ宸ュ簭鐨� uncheckQuantity > 0 鏄甯哥姸鎬侊紝涓嶅仛鎷︽埅锛�
+ // 2.2 闈炶川妫�宸ュ簭锛氬悎鏍煎搧/涓嶈壇鍝佹暟閲忕敱璐ㄦ纭畾锛涙湰宸ュ簭涓嶇粡杩囪川妫�锛屾姤宸ユ湭濉啓鏃堕粯璁ゅ叏閮ㄤ负鍚堟牸鍝�
+ if (!checkFlag
+ && feedback.getQualifiedQuantity() == null
+ && feedback.getUnqualifiedQuantity() == null) {
+ feedback.setQualifiedQuantity(feedback.getFeedbackQuantity());
+ feedback.setUnqualifiedQuantity(BigDecimal.ZERO);
+ feedbackMapper.updateById(new MesProFeedbackDO().setId(feedback.getId())
+ .setQualifiedQuantity(feedback.getFeedbackQuantity())
+ .setUnqualifiedQuantity(BigDecimal.ZERO));
+ }
+ // 2.3 闈炶川妫�宸ュ簭锛氫粛鏈夊緟妫�鏁伴噺鏃朵笉鑳藉鎵癸紙璐ㄦ宸ュ簭鐨� uncheckQuantity > 0 鏄甯哥姸鎬侊紝涓嶅仛鎷︽埅锛�
if (!checkFlag
&& feedback.getUncheckQuantity() != null
&& feedback.getUncheckQuantity().compareTo(BigDecimal.ZERO) > 0) {
@@ -361,6 +371,12 @@
if (ObjUtil.equal(line.getQualityStatus(), MesWmQualityStatusEnum.PASS.getStatus())) {
qualifiedQty = qualifiedQty.add(line.getQuantity());
}
+ }
+ // 1.1 鍏滃簳锛氬叧閿潪璐ㄦ宸ュ簭瀹℃壒鏃朵骇鍑哄崟琛屽皻鏈敓鎴愶紝鐩存帴閲囩敤鎶ュ伐鍗曚笂鐨勫悎鏍�/涓嶈壇鏁伴噺
+ // 锛堥潪璐ㄦ宸ュ簭榛樿鍏ㄩ儴涓哄悎鏍煎搧锛涜川妫�宸ュ簭鐨勫悎鏍�/涓嶈壇鍦ㄨ川妫�鍥炶皟鍚庢寜浜у嚭琛岃仛鍚堬級
+ if (CollUtil.isEmpty(lines)) {
+ qualifiedQty = ObjectUtil.defaultIfNull(feedback.getQualifiedQuantity(), BigDecimal.ZERO);
+ unqualifiedQty = ObjectUtil.defaultIfNull(feedback.getUnqualifiedQuantity(), BigDecimal.ZERO);
}
// 2. 鏇存柊浠诲姟鐨勫凡鐢熶骇/鍚堟牸/涓嶅悎鏍兼暟閲�
@@ -461,21 +477,11 @@
if (routeProcess == null) {
throw exception(PRO_FEEDBACK_ROUTE_PROCESS_INVALID);
}
- // 4.1 鏍¢獙鏁伴噺
- boolean checkFlag = Boolean.TRUE.equals(routeProcess.getCheckFlag());
- if (checkFlag) {
- // 闇�瑕佹楠岋細鍙渶濉姤宸ユ暟閲忥紝涓斿繀椤� > 0
- if (reqVO.getFeedbackQuantity() == null
- || reqVO.getFeedbackQuantity().compareTo(BigDecimal.ZERO) <= 0) {
- throw exception(PRO_FEEDBACK_QUANTITY_MUST_POSITIVE);
- }
- } else {
- // 涓嶉渶妫�楠岋細闇�濉悎鏍煎搧 + 涓嶈壇鍝佹暟閲忥紝鍚堣 > 0
- BigDecimal qualified = ObjectUtil.defaultIfNull(reqVO.getQualifiedQuantity(), BigDecimal.ZERO);
- BigDecimal unqualified = ObjectUtil.defaultIfNull(reqVO.getUnqualifiedQuantity(), BigDecimal.ZERO);
- if (qualified.add(unqualified).compareTo(BigDecimal.ZERO) <= 0) {
- throw exception(PRO_FEEDBACK_QUALIFIED_UNQUALIFIED_REQUIRED);
- }
+ // 4.1 鏍¢獙鏁伴噺锛氭棤璁烘槸鍚﹂渶瑕佹楠岋紝鎶ュ伐鍙渶濉姤宸ユ暟閲忥紝涓斿繀椤� > 0
+ // 鍚堟牸鍝�/涓嶈壇鍝佹暟閲忕敱璐ㄦ纭畾锛堥潪璐ㄦ宸ュ簭鍦ㄥ鎵规椂榛樿鍏ㄩ儴涓哄悎鏍煎搧锛�
+ if (reqVO.getFeedbackQuantity() == null
+ || reqVO.getFeedbackQuantity().compareTo(BigDecimal.ZERO) <= 0) {
+ throw exception(PRO_FEEDBACK_QUANTITY_MUST_POSITIVE);
}
return task;
@@ -498,19 +504,10 @@
if (routeProcess == null) {
throw exception(PRO_FEEDBACK_ROUTE_PROCESS_INVALID);
}
- // 3. 鏍¢獙鏁伴噺
- boolean checkFlag = Boolean.TRUE.equals(routeProcess.getCheckFlag());
- if (checkFlag) {
- if (reqVO.getFeedbackQuantity() == null
- || reqVO.getFeedbackQuantity().compareTo(BigDecimal.ZERO) <= 0) {
- throw exception(PRO_FEEDBACK_QUANTITY_MUST_POSITIVE);
- }
- } else {
- BigDecimal qualified = ObjectUtil.defaultIfNull(reqVO.getQualifiedQuantity(), BigDecimal.ZERO);
- BigDecimal unqualified = ObjectUtil.defaultIfNull(reqVO.getUnqualifiedQuantity(), BigDecimal.ZERO);
- if (qualified.add(unqualified).compareTo(BigDecimal.ZERO) <= 0) {
- throw exception(PRO_FEEDBACK_QUALIFIED_UNQUALIFIED_REQUIRED);
- }
+ // 3. 鏍¢獙鏁伴噺锛氬彧濉姤宸ユ暟閲忥紝涓斿繀椤� > 0锛堝悎鏍煎搧/涓嶈壇鍝佹暟閲忕敱璐ㄦ纭畾锛�
+ if (reqVO.getFeedbackQuantity() == null
+ || reqVO.getFeedbackQuantity().compareTo(BigDecimal.ZERO) <= 0) {
+ throw exception(PRO_FEEDBACK_QUANTITY_MUST_POSITIVE);
}
// 4. 鏋勫缓鎶ュ伐DO
MesProFeedbackDO feedback = new MesProFeedbackDO()
@@ -523,8 +520,6 @@
.setTaskId(reqVO.getTaskId())
.setItemId(task.getItemId())
.setFeedbackQuantity(reqVO.getFeedbackQuantity())
- .setQualifiedQuantity(reqVO.getQualifiedQuantity())
- .setUnqualifiedQuantity(reqVO.getUnqualifiedQuantity())
.setScheduledQuantity(task.getQuantity())
.setFeedbackTime(LocalDateTime.now())
.setStatus(MesProFeedbackStatusEnum.APPROVING.getStatus())
@@ -533,10 +528,21 @@
saveParamValues(task.getId(), reqVO.getParamValues());
// 5. 杩斿洖缁撴灉
MesProWorkOrderDO workOrder = workOrderService.getWorkOrder(task.getWorkOrderId());
+ // 5.1 鎶ュ伐鍚庡墿浣欏彲鎶ュ伐鏁伴噺 = 鎺掍骇 - 宸茬敓浜� - 鍦ㄩ�旓紙鍚湰娆℃姤宸ワ級
+ BigDecimal reportable = task.getQuantity() == null ? BigDecimal.ZERO : task.getQuantity();
+ BigDecimal produced = task.getProducedQuantity() == null ? BigDecimal.ZERO : task.getProducedQuantity();
+ BigDecimal inTransit = BigDecimal.ZERO;
+ for (MesProFeedbackDO fb : getFeedbackListByTaskId(task.getId())) {
+ if (!ObjUtil.equal(fb.getStatus(), MesProFeedbackStatusEnum.FINISHED.getStatus())) {
+ inTransit = inTransit.add(fb.getFeedbackQuantity() == null ? BigDecimal.ZERO : fb.getFeedbackQuantity());
+ }
+ }
+ BigDecimal reportableQuantity = reportable.subtract(produced).subtract(inTransit).max(BigDecimal.ZERO);
return new MesProFeedbackQuickCreateRespVO()
.setFeedbackId(feedback.getId())
.setTaskStatus(task.getStatus())
- .setWorkOrderStatus(workOrder != null ? workOrder.getStatus() : null);
+ .setWorkOrderStatus(workOrder != null ? workOrder.getStatus() : null)
+ .setReportableQuantity(reportableQuantity);
}
@Override
@@ -550,8 +556,6 @@
MesProFeedbackQuickCreateReqVO singleReq = new MesProFeedbackQuickCreateReqVO();
singleReq.setTaskId(taskId);
singleReq.setFeedbackQuantity(reqVO.getFeedbackQuantity());
- singleReq.setQualifiedQuantity(reqVO.getQualifiedQuantity());
- singleReq.setUnqualifiedQuantity(reqVO.getUnqualifiedQuantity());
singleReq.setRemark(reqVO.getRemark());
MesProFeedbackQuickCreateRespVO resp = quickCreateFeedback(singleReq);
results.add(new MesProFeedbackBatchCreateRespVO.BatchResult()
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java
index ef11a06..1c45ee4 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productproduce/MesWmProductProduceServiceImpl.java
@@ -168,6 +168,10 @@
// 3.2 鏃犻渶妫�楠岋細鎸夊悎鏍煎搧/涓嶅悎鏍煎搧鍚勭敓鎴愪竴琛� + 鏄庣粏
BigDecimal qualifiedQty = ObjectUtil.defaultIfNull(feedback.getQualifiedQuantity(), BigDecimal.ZERO);
BigDecimal unqualifiedQty = ObjectUtil.defaultIfNull(feedback.getUnqualifiedQuantity(), BigDecimal.ZERO);
+ // 3.2.0 鍏滃簳锛氬悎鏍�/涓嶈壇鏁伴噺閮芥湭濉啓鏃讹紙鎶ュ伐鍙~鎶ュ伐鏁伴噺锛夛紝榛樿鏁村崟涓哄悎鏍煎搧
+ if (qualifiedQty.compareTo(BigDecimal.ZERO) <= 0 && unqualifiedQty.compareTo(BigDecimal.ZERO) <= 0) {
+ qualifiedQty = feedback.getFeedbackQuantity();
+ }
// 3.2.1 涓嶅悎鏍煎搧琛� + 鏄庣粏
if (unqualifiedQty.compareTo(BigDecimal.ZERO) > 0) {
MesWmProductProduceLineDO unqualifiedLine = buildProduceLine(produce, feedback, batchId, batchCode,
--
Gitblit v1.9.3