From 74ad846852f42b4e2258bfddd5c2a33cc1ce9847 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期六, 29 八月 2026 18:03:46 +0800
Subject: [PATCH] feat(mes): 新增工序等待时长和报工数量配置功能
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/pro/feedback/MesProFeedbackServiceImpl.java | 140 +++++++++++++++++++++++++++++++++++-----------
1 files changed, 106 insertions(+), 34 deletions(-)
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 e8fdc37..489c6b4 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
@@ -12,6 +12,7 @@
import cn.iocoder.yudao.module.mes.enums.pro.MesProFeedbackTypeEnum;
import cn.iocoder.yudao.module.mes.service.md.autocode.MesMdAutoCodeRecordService;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.feedback.MesProFeedbackDO;
+import cn.iocoder.yudao.module.mes.dal.dataobject.pro.process.MesProProcessDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.route.MesProRouteProcessDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.task.MesProTaskDO;
import cn.iocoder.yudao.module.mes.dal.dataobject.pro.workorder.MesProWorkOrderBomDO;
@@ -24,6 +25,7 @@
import cn.iocoder.yudao.module.mes.enums.pro.MesProFeedbackStatusEnum;
import cn.iocoder.yudao.module.mes.enums.pro.MesProTaskStatusEnum;
import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum;
+import cn.iocoder.yudao.module.mes.service.pro.process.MesProProcessService;
import cn.iocoder.yudao.module.mes.service.pro.route.MesProRouteProcessService;
import cn.iocoder.yudao.module.mes.service.pro.task.MesProTaskService;
import cn.iocoder.yudao.module.mes.service.pro.workorder.MesProWorkOrderBomService;
@@ -33,6 +35,7 @@
import cn.iocoder.yudao.module.mes.service.wm.itemconsume.MesWmItemConsumeService;
import cn.iocoder.yudao.module.mes.service.wm.productproduce.MesWmProductProduceLineService;
import cn.iocoder.yudao.module.mes.service.wm.productproduce.MesWmProductProduceService;
+import cn.iocoder.yudao.module.mes.service.wm.productreceipt.MesWmProductReceiptService;
import cn.iocoder.yudao.module.mes.service.mdm.MesMdmItemService;
import cn.iocoder.yudao.module.mes.dal.dataobject.mdm.MesMdmItemDO;
import cn.iocoder.yudao.module.mdm.api.item.MdmItemBatchConfigApi;
@@ -48,6 +51,7 @@
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
+import java.time.Duration;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collection;
@@ -78,6 +82,8 @@
@Resource
private MesProRouteProcessService routeProcessService;
@Resource
+ private MesProProcessService processService;
+ @Resource
private MesProWorkOrderBomService workOrderBomService;
@Resource
private MesProWorkOrderProcessService workOrderProcessService;
@@ -88,6 +94,9 @@
private MesWmItemConsumeService itemConsumeService;
@Resource
private MesWmProductProduceService productProduceService;
+ @Resource
+ @Lazy // 閬垮厤寰幆渚濊禆锛氫骇鍝佹敹璐у崟鑷姩鐢熸垚閫昏緫渚濊禆鎶ュ伐 Service
+ private MesWmProductReceiptService productReceiptService;
@Resource
private MesWmProductProduceLineService produceLineService;
@Resource
@@ -104,6 +113,7 @@
private cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi processInstanceApi;
@Override
+ @Transactional(rollbackFor = Exception.class)
public Long createFeedback(MesProFeedbackSaveReqVO createReqVO) {
// 1. 鏍¢獙
MesProTaskDO task = validateFeedbackData(createReqVO);
@@ -113,11 +123,13 @@
.setStatus(MesProFeedbackStatusEnum.PREPARE.getStatus())
.setItemId(task.getItemId());
feedbackMapper.insert(feedback);
+ // 3. 淇濆瓨鍙傛暟鍊硷紱蹇呭~鍙傛暟鏍¢獙澶辫触鏃舵暣浣撳洖婊氾紝閬垮厤娈嬬暀鑽夌
saveParamValues(task.getId(), createReqVO.getParamValues());
return feedback.getId();
}
@Override
+ @Transactional(rollbackFor = Exception.class)
public void updateFeedback(MesProFeedbackSaveReqVO updateReqVO) {
// 1.1 鏍¢獙瀛樺湪 + 鑽夌鐘舵��
validateFeedbackStatusPrepare(updateReqVO.getId());
@@ -128,11 +140,14 @@
MesProFeedbackDO updateObj = BeanUtils.toBean(updateReqVO, MesProFeedbackDO.class)
.setItemId(task.getItemId());
feedbackMapper.updateById(updateObj);
+ // 3. 淇濆瓨鍙傛暟鍊硷紱蹇呭~鍙傛暟鏍¢獙澶辫触鏃舵暣浣撳洖婊�
saveParamValues(task.getId(), updateReqVO.getParamValues());
}
private void saveParamValues(Long taskId, List<MesProFeedbackSaveReqVO.ParamValue> paramValues) {
+ // 鍗充娇鍙傛暟涓虹┖涔熻皟鐢ㄦ洿鏂帮紝浠ヤ究瑙﹀彂蹇呭~鍙傛暟鏍¢獙锛堜换鍔$粦瀹氫簡鍙傛暟鏃跺繀椤诲~鍐欙級
if (CollUtil.isEmpty(paramValues)) {
+ paramRecordService.updateTaskParamValues(taskId, null, null);
return;
}
paramRecordService.updateTaskParamValues(taskId,
@@ -260,20 +275,35 @@
public boolean approveFeedback(MesProFeedbackApproveReqVO reqVO) {
// 1.1 鏍¢獙瀛樺湪 + 瀹℃壒涓姸鎬�
MesProFeedbackDO feedback = validateFeedbackStatusApproving(reqVO.getId());
- // 1.2 鏍¢獙鎶ュ伐鏁伴噺 > 0
- if (feedback.getFeedbackQuantity() == null
- || feedback.getFeedbackQuantity().compareTo(BigDecimal.ZERO) <= 0) {
- throw exception(PRO_FEEDBACK_QUANTITY_MUST_POSITIVE);
+ // 1.2 鏍¢獙浠诲姟鏈畬鎴� + 绛夊緟鏃堕暱鍊掕鏃�
+ MesProTaskDO task = taskService.validateTaskNotFinished(feedback.getTaskId());
+ MesProProcessDO process = validateWaitDuration(task);
+ BigDecimal fbQty = feedback.getFeedbackQuantity() == null
+ ? BigDecimal.ZERO : feedback.getFeedbackQuantity();
+ // 1.3 鏍¢獙鎶ュ伐鏁伴噺锛氶粯璁ゅ繀椤� > 0锛涘伐搴忛厤缃�"涓嶉渶瑕佸~鍐欐姤宸ユ暟閲�"鏃跺厑璁镐负绌�
+ if (process == null || !Boolean.FALSE.equals(process.getNeedReportQuantity())) {
+ if (fbQty.compareTo(BigDecimal.ZERO) <= 0) {
+ throw exception(PRO_FEEDBACK_QUANTITY_MUST_POSITIVE);
+ }
}
- // 1.3 鏍¢獙浠诲姟鏈畬鎴�
- taskService.validateTaskNotFinished(feedback.getTaskId());
// 2.1 鏌ヨ宸ュ簭鐨勫叧閿伐搴忔爣璇� + 妫�楠屾爣璇嗭紙闇�鍦� uncheckQuantity 鏍¢獙涔嬪墠锛屽洜涓鸿川妫�宸ュ簭鍏佽 uncheckQuantity > 0锛�
MesProRouteProcessDO routeProcess = routeProcessService.getRouteProcessByRouteIdAndProcessId(
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 闈炶川妫�宸ュ簭锛氬悎鏍煎搧/涓嶈壇鍝佹暟閲忕敱璐ㄦ纭畾锛涙湰宸ュ簭涓嶇粡杩囪川妫�锛屾姤宸ユ湭濉啓鏃堕粯璁ゅ叏閮ㄤ负鍚堟牸鍝�
+ // 锛堟暟閲忎负绌�/0 鏃舵寜 0 澶勭悊锛岄伩鍏嶅啓鍏� null锛�
+ if (!checkFlag
+ && feedback.getQualifiedQuantity() == null
+ && feedback.getUnqualifiedQuantity() == null) {
+ feedback.setQualifiedQuantity(fbQty);
+ feedback.setUnqualifiedQuantity(BigDecimal.ZERO);
+ feedbackMapper.updateById(new MesProFeedbackDO().setId(feedback.getId())
+ .setQualifiedQuantity(fbQty)
+ .setUnqualifiedQuantity(BigDecimal.ZERO));
+ }
+ // 2.3 闈炶川妫�宸ュ簭锛氫粛鏈夊緟妫�鏁伴噺鏃朵笉鑳藉鎵癸紙璐ㄦ宸ュ簭鐨� uncheckQuantity > 0 鏄甯哥姸鎬侊紝涓嶅仛鎷︽埅锛�
if (!checkFlag
&& feedback.getUncheckQuantity() != null
&& feedback.getUncheckQuantity().compareTo(BigDecimal.ZERO) > 0) {
@@ -281,8 +311,9 @@
}
// 3. 鐗╂枡娑堣�楋細鍊掑啿宸ュ簭鎸� BOM 鑷姩鎵f枡锛涢潪鍊掑啿宸ュ簭璺宠繃锛堢墿鏂欒蛋鎵嬪伐棰嗘枡/鎶曟枡锛�
+ // 鎶ュ伐鏁伴噺涓虹┖/0 鏃惰烦杩囧�掑啿鎵f枡锛岄伩鍏嶇┖鏁伴噺璇墸绾胯竟搴�
boolean backflushFlag = routeProcess != null && Boolean.TRUE.equals(routeProcess.getBackflushFlag());
- if (backflushFlag) {
+ if (backflushFlag && fbQty.compareTo(BigDecimal.ZERO) > 0) {
// 3.1 鏍¢獙鍊掑啿宸ュ簭蹇呴』閰嶇疆 BOM 娑堣�楋紝閬垮厤闈欓粯涓嶆墸鏂�
List<MesProWorkOrderBomDO> boms = workOrderBomService.getWorkOrderBomListByWorkOrderId(
feedback.getWorkOrderId());
@@ -300,6 +331,14 @@
feedbackMapper.updateById(new MesProFeedbackDO().setId(reqVO.getId())
.setStatus(MesProFeedbackStatusEnum.FINISHED.getStatus())
.setUncheckQuantity(BigDecimal.ZERO));
+
+ // 5.1 鎶ュ伐鏁伴噺涓虹┖/0锛�"涓嶉渶瑕佸~鍐欐姤宸ユ暟閲�"鐨勫伐搴忥級锛氭棤浜у嚭鍙叆搴擄紝浠呮洿鏂颁换鍔¤繘搴﹀苟缁撴潫
+ if (fbQty.compareTo(BigDecimal.ZERO) <= 0) {
+ taskService.updateProducedQuantity(feedback.getTaskId(),
+ BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO);
+ checkAndPublishProductionFinished(feedback.getWorkOrderId());
+ return true;
+ }
// 6. 鏍规嵁鏄惁闇�瑕佹楠岋紝鍐冲畾浜у嚭鍜屽叆搴撴柟寮�
// 6.2 璋冩暣 鍙瀹℃壒鎴愬姛鐩存帴鏇存柊
@@ -325,6 +364,8 @@
// 6.2 鏃犻渶妫�楠岋細鐢熸垚浜у嚭鍗曪紙鎸夊悎鏍�/涓嶅悎鏍兼媶琛岋級锛岀洿鎺ュ畬鎴愬叆搴�
MesWmProductProduceDO produce = productProduceService.generateProductProduce(feedback, false, reqVO);
productProduceService.finishProductProduce(produce.getId());
+ // 6.3 鎶ュ伐浜у嚭瀹氱鍚庤嚜鍔ㄧ敓鎴愪骇鍝佸叆搴撳崟锛堜竴娆℃姤宸�=涓�鏉★紝骞傜瓑锛�
+ productReceiptService.createProductReceiptByFeedback(feedback.getId());
}
@@ -355,6 +396,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. 鏇存柊浠诲姟鐨勫凡鐢熶骇/鍚堟牸/涓嶅悎鏍兼暟閲�
@@ -455,24 +502,47 @@
if (routeProcess == null) {
throw exception(PRO_FEEDBACK_ROUTE_PROCESS_INVALID);
}
- // 4.1 鏍¢獙鏁伴噺
- boolean checkFlag = Boolean.TRUE.equals(routeProcess.getCheckFlag());
- if (checkFlag) {
- // 闇�瑕佹楠岋細鍙渶濉姤宸ユ暟閲忥紝涓斿繀椤� > 0
+ // 4. 鏍¢獙绛夊緟鏃堕暱鍊掕鏃讹細宸ュ簭閰嶇疆浜嗙瓑寰呮椂闀匡紙waitDuration > 0锛夋椂锛岄渶鍏堝紑濮嬪�掕鏃跺苟绛夊緟缁撴潫
+ MesProProcessDO process = validateWaitDuration(task);
+ // 4.1 鏍¢獙鏁伴噺锛氶粯璁ゅ繀椤� > 0锛涘伐搴忛厤缃�"涓嶉渶瑕佸~鍐欐姤宸ユ暟閲�"鏃跺厑璁镐负绌�
+ // 鍚堟牸鍝�/涓嶈壇鍝佹暟閲忕敱璐ㄦ纭畾锛堥潪璐ㄦ宸ュ簭鍦ㄥ鎵规椂榛樿鍏ㄩ儴涓哄悎鏍煎搧锛�
+ if (process == null || !Boolean.FALSE.equals(process.getNeedReportQuantity())) {
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);
- }
}
return task;
+ }
+
+ /**
+ * 鏍¢獙宸ュ簭绛夊緟鏃堕暱鍊掕鏃讹紙鎶ュ伐鍓嶇疆鏉′欢锛�
+ *
+ * <p>璇诲彇浠诲姟鍏宠仈鐨勫伐搴忎富鏁版嵁 waitDuration锛堝皬鏃讹級锛氳嫢鏈厤缃垨涓� 0 鍒欑洿鎺ヨ繑鍥烇紱閰嶇疆浜嗗垯闇�瑕�
+ * 浠诲姟宸茬偣鍑�"寮�濮嬪�掕鏃�"涓斿�掕鏃跺凡缁撴潫锛屽惁鍒欐姏鍑哄搴斿紓甯搞�傝繑鍥炲伐搴忎富鏁版嵁锛屼緵璋冪敤鏂瑰鐢�
+ * needReportQuantity 绛夊瓧娈点��
+ *
+ * @param task 鐢熶骇浠诲姟
+ * @return 宸ュ簭涓绘暟鎹�
+ */
+ private MesProProcessDO validateWaitDuration(MesProTaskDO task) {
+ MesProProcessDO process = processService.getProcess(task.getProcessId());
+ if (process == null || process.getWaitDuration() == null
+ || process.getWaitDuration().compareTo(BigDecimal.ZERO) <= 0) {
+ return process; // 鏈厤缃瓑寰呮椂闀匡紝鏃犻渶鍊掕鏃�
+ }
+ if (task.getWaitStartTime() == null) {
+ throw exception(PRO_TASK_WAIT_NOT_STARTED); // 璇峰厛鐐瑰嚮"寮�濮嬪�掕鏃�"
+ }
+ LocalDateTime readyTime = task.getWaitStartTime()
+ .plusMinutes((long) (process.getWaitDuration().doubleValue() * 60));
+ if (LocalDateTime.now().isBefore(readyTime)) {
+ Duration remaining = Duration.between(LocalDateTime.now(), readyTime);
+ throw exception(PRO_TASK_WAIT_NOT_ELAPSED,
+ remaining.toHours() + "灏忔椂" + remaining.toMinutesPart() + "鍒嗛挓");
+ }
+ return process;
}
@Override
@@ -492,21 +562,16 @@
if (routeProcess == null) {
throw exception(PRO_FEEDBACK_ROUTE_PROCESS_INVALID);
}
- // 3. 鏍¢獙鏁伴噺
- boolean checkFlag = Boolean.TRUE.equals(routeProcess.getCheckFlag());
- if (checkFlag) {
+ // 3. 鏍¢獙绛夊緟鏃堕暱鍊掕鏃讹細宸ュ簭閰嶇疆浜嗙瓑寰呮椂闀匡紙waitDuration > 0锛夋椂锛岄渶鍏堝紑濮嬪�掕鏃跺苟绛夊緟缁撴潫
+ MesProProcessDO process = validateWaitDuration(task);
+ // 4. 鏍¢獙鏁伴噺锛氶粯璁ゅ繀椤� > 0锛涘伐搴忛厤缃�"涓嶉渶瑕佸~鍐欐姤宸ユ暟閲�"鏃跺厑璁镐负绌猴紙鍚堟牸鍝�/涓嶈壇鍝佹暟閲忕敱璐ㄦ纭畾锛�
+ if (process == null || !Boolean.FALSE.equals(process.getNeedReportQuantity())) {
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);
- }
}
- // 4. 鏋勫缓鎶ュ伐DO
+ // 5. 鏋勫缓鎶ュ伐DO
MesProFeedbackDO feedback = new MesProFeedbackDO()
.setCode(autoCodeRecordService.generateAutoCode(MesMdAutoCodeRuleCodeEnum.PRO_FEEDBACK_CODE.getCode()))
.setType(MesProFeedbackTypeEnum.SELF.getType())
@@ -517,8 +582,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())
@@ -527,10 +590,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
@@ -544,8 +618,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()
--
Gitblit v1.9.3