From cfe049492f81d2c650a2b17348593edbc5054498 Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期三, 18 三月 2026 07:52:44 +0800
Subject: [PATCH] #3.5
---
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java | 163 ++++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 127 insertions(+), 36 deletions(-)
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
index 3a89c44..5d85c74 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
@@ -44,6 +44,7 @@
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
@@ -97,10 +98,9 @@
@Autowired
private BasStationService basStationService;
@Autowired
- private TaskService taskService;
- @Autowired
private LocItemWorkingService locItemWorkingService;
@Autowired
+ @Lazy
private WcsService wcsService;
@Autowired
private OutStockService outStockService;
@@ -109,6 +109,7 @@
@Autowired
private CheckOrderItemService checkOrderItemService;
@Autowired
+ @Lazy
private CheckOrderService checkOrderService;
@Autowired
private CheckDiffService checkDiffService;
@@ -123,6 +124,7 @@
@Autowired
private RemotesInfoProperties.RcsApi rcsApi;
@Autowired
+ @Lazy
private FlowStepInstanceService flowStepInstanceService;
@Autowired
private RemotesInfoProperties.WmsOpenApi wmsOpenApi;
@@ -404,7 +406,9 @@
if (Objects.isNull(station) || !station.getUseStatus().equals(LocStsType.LOC_STS_TYPE_O.type)) {
throw new CoolException("绔欑偣涓嶅瓨鍦ㄦ垨绔欑偣涓嶅浜庣┖搴撶姸鎬侊紒锛�");
}
- station.setUseStatus(LocStsType.LOC_STS_TYPE_R.type);
+ if (!station.getType().equals(0)){
+ station.setUseStatus(LocStsType.LOC_STS_TYPE_R.type);
+ }
if (!basStationService.updateById(station)) {
throw new CoolException("绔欑偣鐘舵�佹洿鏂板け璐ワ紒锛�");
@@ -789,14 +793,14 @@
@Transactional(rollbackFor = Exception.class)
public Task taskToTop(Long id, Long loginUserId) throws Exception {
List<Integer> longs = Arrays.asList(TaskStsType.GENERATE_IN.id, TaskStsType.GENERATE_OUT.id);
- Task tasks = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getId, id).in(Task::getTaskStatus, longs));
+ Task tasks = this.getOne(new LambdaQueryWrapper<Task>().eq(Task::getId, id).in(Task::getTaskStatus, longs));
if (Objects.isNull(tasks)) {
throw new CoolException("浠诲姟宸插鎵ц鐘舵�佷笉鍙竴閿疆椤讹紒锛�");
}
//鍒ゆ柇娴呭簱浣嶄换鍔★紝淇敼浠诲姟浼樺厛绾�
modiftyTaskSort(tasks, loginUserId);
- if (!taskService.updateById(tasks)) {
+ if (!this.updateById(tasks)) {
throw new CoolException("缃《澶辫触锛侊紒");
}
return null;
@@ -883,7 +887,13 @@
Set<Integer> terminalSet = TERMINAL_OR_WAITING_STATUS;
List<String> codes = tasks.stream().map(Task::getTaskCode).filter(Objects::nonNull).distinct().collect(Collectors.toList());
if (codes.isEmpty()) {
- tasks.forEach(t -> t.setCanComplete(Boolean.FALSE));
+ tasks.forEach(t -> {
+ t.setCanComplete(Boolean.FALSE);
+ t.setCanCancel(Boolean.FALSE);
+ if (t.getTaskStatus() != null && t.getTaskStatus().equals(TaskStsType.MISSION_INITIAL.id) && !isPhase2InboundType(t.getTaskType())) {
+ t.setCanCancel(Boolean.TRUE);
+ }
+ });
return;
}
List<FlowStepInstance> steps = codes.size() == 1
@@ -893,11 +903,19 @@
for (Task task : tasks) {
if (task.getTaskStatus() != null && terminalSet.contains(task.getTaskStatus())) {
task.setCanComplete(Boolean.FALSE);
+ task.setCanCancel(Boolean.FALSE);
+ continue;
+ }
+ // taskStatus=0锛堣矾寰勮鍒掍腑锛夊彲鍙栨秷锛涗簩闃舵鍏ュ簱锛堟嫞鏂�/鐩樼偣/骞舵澘鍏ュ簱锛変笉鍙彇娑�
+ if (task.getTaskStatus() != null && task.getTaskStatus().equals(TaskStsType.MISSION_INITIAL.id)) {
+ task.setCanCancel(!isPhase2InboundType(task.getTaskType()));
+ task.setCanComplete(Boolean.FALSE);
continue;
}
List<FlowStepInstance> taskSteps = stepsByTaskNo.get(task.getTaskCode());
if (taskSteps == null || taskSteps.isEmpty()) {
task.setCanComplete(Boolean.FALSE);
+ task.setCanCancel(Boolean.FALSE);
continue;
}
FlowStepInstance match = taskSteps.stream()
@@ -905,11 +923,21 @@
.findFirst().orElse(null);
if (match == null) {
task.setCanComplete(Boolean.FALSE);
+ task.setCanCancel(Boolean.FALSE);
continue;
}
boolean isLastStep = match.getWmsNextTaskStatus() == null || match.getWmsNextTaskStatus().equals(TaskStsType.MISSION_TRANSFER.id);
task.setCanComplete(!isLastStep);
+ task.setCanCancel(!isLastStep && !isPhase2InboundType(task.getTaskType()));
}
+ }
+
+ /** 浜岄樁娈靛叆搴擄細鎷f枡鍏ュ簱銆佺洏鐐瑰叆搴撱�佸苟鏉垮叆搴擄紝涓嶅彲鍙栨秷 */
+ private boolean isPhase2InboundType(Integer taskType) {
+ if (taskType == null) return false;
+ return taskType.equals(TaskType.TASK_TYPE_PICK_IN.type)
+ || taskType.equals(TaskType.TASK_TYPE_CHECK_IN.type)
+ || taskType.equals(TaskType.TASK_TYPE_MERGE_IN.type);
}
/**
@@ -937,7 +965,7 @@
throw new CoolException("鏁版嵁閿欒锛屽簱浣嶄笉瀛樺湪锛侊紒");
}
if (loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_S.type) || loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_R.type)) {
- Task serviceOne = taskService.getOne(new LambdaQueryWrapper<Task>()
+ Task serviceOne = this.getOne(new LambdaQueryWrapper<Task>()
.eq(Task::getOrgLoc, loc.getCode())
.or()
.eq(Task::getTargLoc, loc.getCode()));
@@ -1158,7 +1186,7 @@
locItemWorkingService.remove(new LambdaQueryWrapper<LocItemWorking>().eq(LocItemWorking::getTaskId, task.getId()));
task.setTaskStatus(TaskStsType.UPDATED_IN.id).setUpdateTime(new Date()).setUpdateBy(loginUserId);
- if (!taskService.updateById(task)) {
+ if (!this.updateById(task)) {
throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�");
}
@@ -1215,7 +1243,7 @@
locItemWorkingService.remove(new LambdaQueryWrapper<LocItemWorking>().eq(LocItemWorking::getTaskId, task.getId()));
task.setTaskStatus(TaskStsType.UPDATED_IN.id).setUpdateTime(new Date()).setUpdateBy(loginUserId);
- if (!taskService.updateById(task)) {
+ if (!this.updateById(task)) {
throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�");
}
// 鐩樼偣鍐嶅叆搴撲换鍔$粨鏉燂細灏嗗叧鑱旂殑鐩樼偣宸紓鍗曠疆涓哄凡瀹℃牳
@@ -1225,28 +1253,43 @@
}
/**
- * 鐩樼偣鍐嶅叆搴撳畬鎴愬悗锛屽皢鍏宠仈鐨勭洏鐐瑰樊寮傚崟缃负宸插鏍革紙鏈夊崟鎸� orderId锛屾棤鍗曟寜 鍑哄簱浠诲姟鍙� orderCode锛�
+ * 鐩樼偣鍐嶅叆搴撳畬鎴愬悗锛屽皢鏈崟瀵瑰簲鐨勫樊寮傛槑缁嗙疆涓哄凡瀹℃牳锛屽叏閮ㄦ槑缁嗗凡瀹℃牳鍚庡樊寮傚崟鏈韩缃负宸插鏍革紙鏈夊崟鎸� orderId锛屾棤鍗曟寜 鍑哄簱浠诲姟鍙� orderCode锛�
*/
@Override
public void markCheckDiffApprovedWhenCheckInDone(Task checkInTask) {
- List<TaskItem> items = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, checkInTask.getId()).last("limit 1"));
- Long orderId = items.isEmpty() ? null : items.get(0).getOrderId();
+ Task outTask = this.getOne(new LambdaQueryWrapper<Task>()
+ .eq(Task::getBarcode, checkInTask.getBarcode())
+ .eq(Task::getTaskType, TaskType.TASK_TYPE_CHECK_OUT.type)
+ .last("limit 1"));
+ if (outTask == null) {
+ return;
+ }
+ List<TaskItem> inItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, checkInTask.getId()));
+ Long orderId = inItems.isEmpty() ? null : inItems.get(0).getOrderId();
CheckDiff checkDiff = null;
if (orderId != null && !orderId.equals(0L)) {
checkDiff = checkDiffService.getOne(new LambdaQueryWrapper<CheckDiff>().eq(CheckDiff::getOrderId, orderId).last("limit 1"));
} else {
- Task outTask = taskService.getOne(new LambdaQueryWrapper<Task>()
- .eq(Task::getBarcode, checkInTask.getBarcode())
- .eq(Task::getTaskType, TaskType.TASK_TYPE_CHECK_OUT.type)
+ checkDiff = checkDiffService.getOne(new LambdaQueryWrapper<CheckDiff>()
+ .eq(CheckDiff::getOrderCode, outTask.getTaskCode())
+ .and(w -> w.isNull(CheckDiff::getOrderId).or().eq(CheckDiff::getOrderId, 0))
.last("limit 1"));
- if (outTask != null) {
- checkDiff = checkDiffService.getOne(new LambdaQueryWrapper<CheckDiff>()
- .eq(CheckDiff::getOrderCode, outTask.getTaskCode())
- .and(w -> w.isNull(CheckDiff::getOrderId).or().eq(CheckDiff::getOrderId, 0))
- .last("limit 1"));
- }
}
- if (checkDiff != null && !CheckDiffExceStatus.CHECK_DIFF_EXCE_STATUS_END.val.equals(checkDiff.getExceStatus())) {
+ if (checkDiff == null) {
+ return;
+ }
+ List<TaskItem> outItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, outTask.getId()));
+ List<Long> outTaskItemIds = outItems.stream().map(TaskItem::getId).filter(Objects::nonNull).collect(Collectors.toList());
+ if (!outTaskItemIds.isEmpty()) {
+ checkDiffItemService.update(new LambdaUpdateWrapper<CheckDiffItem>()
+ .eq(CheckDiffItem::getCheckId, checkDiff.getId())
+ .in(CheckDiffItem::getTaskItemId, outTaskItemIds)
+ .set(CheckDiffItem::getExceStatus, CheckDiffExceStatus.CHECK_DIFF_EXCE_STATUS_END.val));
+ }
+ long unApprovedCount = checkDiffItemService.count(new LambdaQueryWrapper<CheckDiffItem>()
+ .eq(CheckDiffItem::getCheckId, checkDiff.getId())
+ .ne(CheckDiffItem::getExceStatus, CheckDiffExceStatus.CHECK_DIFF_EXCE_STATUS_END.val));
+ if (unApprovedCount == 0 && !CheckDiffExceStatus.CHECK_DIFF_EXCE_STATUS_END.val.equals(checkDiff.getExceStatus())) {
checkDiffService.update(new LambdaUpdateWrapper<CheckDiff>()
.eq(CheckDiff::getId, checkDiff.getId())
.set(CheckDiff::getExceStatus, CheckDiffExceStatus.CHECK_DIFF_EXCE_STATUS_END.val));
@@ -1263,16 +1306,20 @@
@Override
@Transactional(rollbackFor = Exception.class)
public R removeTask(Long[] ids, Long loginUserId) {
- List<Integer> longs = Arrays.asList(TaskStsType.GENERATE_IN.id, TaskStsType.GENERATE_OUT.id);
List<Integer> list = Arrays.asList(TaskType.TASK_TYPE_IN.type, TaskType.TASK_TYPE_OUT.type, TaskType.TASK_TYPE_PICK_AGAIN_OUT.type,
TaskType.TASK_TYPE_CHECK_OUT.type, TaskType.TASK_TYPE_EMPTY_IN.type, TaskType.TASK_TYPE_LOC_MOVE.type,
- TaskType.TASK_TYPE_EMPTY_OUT.type, TaskType.TASK_TYPE_MERGE_OUT.type);
+ TaskType.TASK_TYPE_EMPTY_OUT.type, TaskType.TASK_TYPE_MERGE_OUT.type,
+ TaskType.TASK_TYPE_PICK_IN.type, TaskType.TASK_TYPE_CHECK_IN.type);
List<Task> tasks = this.list(new LambdaQueryWrapper<Task>()
.in(Task::getTaskType, list)
- .in(Task::getId, ids)
- .in(Task::getTaskStatus, longs));
+ .in(Task::getId, ids));
if (tasks.isEmpty()) {
- throw new CoolException("浠诲姟宸插鎵ц鐘舵�佷笉鍙彇娑堬紒锛�");
+ throw new CoolException("浠诲姟涓嶅瓨鍦ㄦ垨绫诲瀷涓嶅厑璁稿彇娑堬紒锛�");
+ }
+ fillCanComplete(tasks);
+ List<Task> notCancelable = tasks.stream().filter(t -> !Boolean.TRUE.equals(t.getCanCancel())).collect(Collectors.toList());
+ if (!notCancelable.isEmpty()) {
+ throw new CoolException("閮ㄥ垎浠诲姟涓嶅彲鍙栨秷锛堟嫞鏂�/鐩樼偣/骞舵澘鍏ュ簱涓轰簩闃舵浠诲姟涓嶅彲鍙栨秷锛涘叾浠栦粎 taskStatus=0 鎴栨祦绋嬫湭鍒� 9999 鏃跺彲鍙栨秷锛夛紒锛�");
}
for (Task task : tasks) {
//鍙栨秷绉诲簱浠诲姟
@@ -1288,7 +1335,7 @@
throw new CoolException("绉诲簱鐩爣搴撲綅鐘舵�佷慨鏀瑰け璐ワ紒锛�");
}
- Task outTask = taskService.getById(task.getParentId());
+ Task outTask = this.getById(task.getParentId());
if (!Objects.isNull(outTask)) {
LocToTaskParams params = new LocToTaskParams();
params.setOrgLoc(task.getOrgLoc()).setSiteNo(task.getOrgSite());
@@ -1329,12 +1376,47 @@
}
}
});
+ List<Long> orderIds = taskItems.stream()
+ .map(TaskItem::getOrderId)
+ .filter(Objects::nonNull)
+ .filter(id -> !id.equals(0L))
+ .distinct()
+ .collect(Collectors.toList());
+ for (Long orderId : orderIds) {
+ checkOrderService.update(new LambdaUpdateWrapper<WkOrder>()
+ .eq(WkOrder::getId, orderId)
+ .set(WkOrder::getExceStatus, CheckExceStatus.CHECK_ORDER_STATUS_UN_EXCE.val));
+ }
}
if (!locService.update(new LambdaUpdateWrapper<Loc>()
.eq(Loc::getCode, task.getOrgLoc())
.set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_F.type))) {
throw new CoolException("婧愬簱浣嶇姸鎬佷慨鏀瑰け璐ワ紒锛�");
+ }
+ }
+
+ // 鍑哄簱绫讳换鍔″彇娑堟椂锛屽洖閫�璺緞瑙勫垝闃舵鍗犵敤鐨勭洰鏍囩珯鐐癸紙S鈫扥锛�
+ if (task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type)
+ || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type)
+ || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_OUT.type)
+ || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type)
+ || task.getTaskType().equals(TaskType.TASK_TYPE_EMPTY_OUT.type)) {
+ if (!Cools.isEmpty(task.getTargSite())) {
+ LambdaQueryWrapper<BasStation> stationWrapper = new LambdaQueryWrapper<BasStation>()
+ .eq(BasStation::getStationName, task.getTargSite())
+ .eq(BasStation::getUseStatus, LocStsType.LOC_STS_TYPE_S.type);
+ if (!Cools.isEmpty(task.getBarcode())) {
+ stationWrapper.eq(BasStation::getBarcode, task.getBarcode());
+ }
+ BasStation targStation = basStationService.getOne(stationWrapper);
+ if (targStation != null) {
+ targStation.setUseStatus(LocStsType.LOC_STS_TYPE_O.type);
+ targStation.setBarcode(null);
+ if (!basStationService.updateById(targStation)) {
+ throw new CoolException("閲婃斁鐩爣绔欑偣澶辫触锛侊紒");
+ }
+ }
}
}
@@ -1356,7 +1438,9 @@
if (null == basStation) {
throw new CoolException("绔欑偣鐘舵�侀敊璇紒锛�");
}
- basStation.setUseStatus(LocStsType.LOC_STS_TYPE_F.type);
+ if (!basStation.getType().equals(0)){
+ basStation.setUseStatus(LocStsType.LOC_STS_TYPE_F.type);
+ }
if (!basStationService.updateById(basStation)) {
throw new CoolException("鏇存柊绔欑偣鐘舵�佸け璐ワ紒锛�");
}
@@ -2133,7 +2217,7 @@
return R.error("浠诲姟缂栫爜涓嶈兘涓虹┖锛侊紒");
}
List<Integer> integers = Arrays.asList(TaskStsType.GENERATE_IN.id, TaskStsType.GENERATE_OUT.id);
- List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>()
+ List<Task> tasks = this.list(new LambdaQueryWrapper<Task>()
.in(Task::getId, ids)
.in(Task::getTaskStatus, integers)
.orderByDesc(Task::getSort));
@@ -2147,7 +2231,7 @@
}
}
- taskService.pubTaskToWcs(tasks);
+ this.pubTaskToWcs(tasks);
return R.ok();
}
@@ -2181,12 +2265,16 @@
/**鍒ゆ柇鏄惁鍏夌數绔欑偣锛岄潪鍏夊簵绔欑偣闇�绠℃帶绔欑偣鐘舵��*/
if (!Objects.isNull(station) && station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) {
if (task.getTaskType() <= TaskType.TASK_TYPE_CHECK_IN.type && !task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) {
- station.setUseStatus(LocStsType.LOC_STS_TYPE_R.type);
+ if (!station.getType().equals(0)){
+ station.setUseStatus(LocStsType.LOC_STS_TYPE_R.type);
+ }
if (!basStationService.updateById(station)) {
throw new CoolException("绔欑偣鐘舵�佹洿鏂板け璐ワ紒锛�");
}
} else if (task.getTaskType() >= TaskType.TASK_TYPE_OUT.type) {
- station.setUseStatus(LocStsType.LOC_STS_TYPE_S.type);
+ if (!station.getType().equals(0)){
+ station.setUseStatus(LocStsType.LOC_STS_TYPE_S.type);
+ }
if (!basStationService.updateById(station)) {
throw new CoolException("绔欑偣鐘舵�佹洿鏂板け璐ワ紒锛�");
}
@@ -2269,7 +2357,7 @@
throw new CoolException("绔欑偣涓嶅瓨鍦紒锛�");
}
- if (!taskService.update(new LambdaUpdateWrapper<Task>().eq(Task::getTaskCode, task.getTaskCode())
+ if (!this.update(new LambdaUpdateWrapper<Task>().eq(Task::getTaskCode, task.getTaskCode())
.set(Task::getTaskStatus, TaskStsType.WCS_EXECUTE_IN.id))) {
throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�");
}
@@ -2293,7 +2381,7 @@
throw new CoolException("绔欑偣涓嶅瓨鍦紒锛�");
}
- if (!taskService.update(new LambdaUpdateWrapper<Task>().eq(Task::getTaskCode, task.getTaskCode())
+ if (!this.update(new LambdaUpdateWrapper<Task>().eq(Task::getTaskCode, task.getTaskCode())
.set(Task::getTaskStatus, TaskStsType.WCS_EXECUTE_OUT.id))) {
throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�");
}
@@ -2425,7 +2513,10 @@
WarehouseAreasItem itemServiceOne = warehouseAreasItemService.getOne(new LambdaQueryWrapper<WarehouseAreasItem>()
.eq(WarehouseAreasItem::getId, pakinItem.getSource()));
if (Objects.isNull(itemServiceOne)) {
- throw new CoolException("鏁版嵁閿欒锛氳鏌ョ湅璇疯揣鍖哄簱瀛樻槸鍚﹀瓨鍦紒锛�");
+ log.error("鏁版嵁閿欒锛氳鏌ョ湅璇疯揣鍖哄簱瀛樻槸鍚﹀瓨鍦紒锛�"+pakinItem.getPakinId());
+ return;
+// throw new CoolException("锛�");
+// throw new CoolException("鏁版嵁閿欒锛氳鏌ョ湅璇疯揣鍖哄簱瀛樻槸鍚﹀瓨鍦紒锛�");
}
Double workQty = Math.round((itemServiceOne.getWorkQty() - pakinItem.getAnfme()) * 1000000) / 1000000.0;
Double qty = Math.round((itemServiceOne.getQty() + pakinItem.getAnfme()) * 1000000) / 1000000.0;
--
Gitblit v1.9.1