| rsf-admin/src/i18n/en.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| rsf-admin/src/i18n/zh.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| rsf-admin/src/page/task/FlowStepInstanceModal.jsx | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| rsf-admin/src/page/task/TaskList.jsx | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatPreparationController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
rsf-admin/src/i18n/en.js
@@ -303,6 +303,8 @@ executeResult: "Execute Result", taskNo: "Task No", createTime: "Create Time", wmsNextTaskStatus: "WMS Next Task Status", wmsNowTaskStatus: "WMS Now Task Status", }, subsystemFlowTemplate: { flowCode: "flowCode", rsf-admin/src/i18n/zh.js
@@ -267,6 +267,8 @@ executeResult: "执行结果", taskNo: "任务号", createTime: "创建时间", wmsNextTaskStatus: "WMS下一步任务状态", wmsNowTaskStatus: "WMS当前任务状态", }, basStationArea: { type: "类型", rsf-admin/src/page/task/FlowStepInstanceModal.jsx
@@ -190,6 +190,8 @@ <NumberField source="status" label={translate("table.field.flowStepInstance.status")} /> <TextField source="executeResult" label={translate("table.field.flowStepInstance.executeResult")} /> <TextField source="taskNo" label={translate("table.field.flowStepInstance.taskNo")} /> <NumberField source="wmsNextTaskStatus" label={translate("table.field.flowStepInstance.wmsNextTaskStatus")} /> <NumberField source="wmsNowTaskStatus" label={translate("table.field.flowStepInstance.wmsNowTaskStatus")} /> <DateField source="createTime" label={translate("table.field.flowStepInstance.createTime")} showTime /> <WrapperField cellClassName="opt" label="common.field.opt" onClick={(e) => e.stopPropagation()} > <RowActions onEdit={handleEdit} onDelete={handleDelete} onJumpCurrent={handleJumpCurrent} /> rsf-admin/src/page/task/TaskList.jsx
@@ -343,8 +343,9 @@ notify(msg); } } // 仅当接口返回 canComplete 为 true 时展示(存在步骤满足 taskStatus=wmsNowTaskStatus 且 wmsNextTaskStatus!=null) return ( ((record?.taskStatus < 98) || (record?.taskType >= 101 && record?.taskStatus < 198)) || (record?.taskType == 11 && record?.taskStatus == 101) ? (<ConfirmButton label={"toolbar.complete"} color="secondary" startIcon={<TaskAltIcon />} onConfirm={clickComplete} />) : (<></>) record?.canComplete === true ? (<ConfirmButton label={"toolbar.complete"} color="secondary" startIcon={<TaskAltIcon />} onConfirm={clickComplete} />) : (<></>) ) } rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatPreparationController.java
@@ -59,7 +59,7 @@ PageParam<WkOrder, BaseParam> pageParam = new PageParam<>(baseParam, WkOrder.class); QueryWrapper<WkOrder> queryWrapper = pageParam.buildWrapper(true); List<String> list = Arrays.asList(OrderWorkType.ORDER_WORK_TYPE_STOCK_UP.type, OrderWorkType.ORDER_WORK_TYPE_NORMAL_MATERIAL_PREPARATION.type, OrderWorkType.ORDER_WORK_TYPE_FEED_IN_MATERIAL_PREPARATION.type); queryWrapper.in("type", OrderType.ORDER_PRE.type,OrderType.ORDER_PRE_NOT_OUT.type); queryWrapper.eq("type", OrderType.ORDER_PRE.type); queryWrapper.in("wk_type",list); return R.ok().add(outStockService.page(pageParam, queryWrapper)); } rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java
@@ -38,19 +38,25 @@ @Autowired private TaskService taskService; /** 分页查询任务列表,并根据 mission_flow_step_instance 判断每条是否可点完成(canComplete),供前端展示完成按钮 */ @PreAuthorize("hasAuthority('manager:task:list')") @PostMapping("/task/page") public R page(@RequestBody Map<String, Object> map) { BaseParam baseParam = buildParam(map, BaseParam.class); PageParam<Task, BaseParam> pageParam = new PageParam<>(baseParam, Task.class); QueryWrapper<Task> queryWrapper = pageParam.buildWrapper(true); return R.ok().add(taskService.page(pageParam, queryWrapper)); Page<Task> pageResult = taskService.page(pageParam, queryWrapper); taskService.fillCanComplete(pageResult.getRecords()); return R.ok().add(pageResult); } /** 查询任务列表,同样根据 flowStepInstance 填充 canComplete */ @PreAuthorize("hasAuthority('manager:task:list')") @PostMapping("/task/list") public R list(@RequestBody Map<String, Object> map) { return R.ok().add(taskService.list()); List<Task> list = taskService.list(); taskService.fillCanComplete(list); return R.ok().add(list); } @PreAuthorize("hasAuthority('manager:task:list')") rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java
@@ -51,6 +51,11 @@ @ApiModelProperty(value= "任务状态") private Integer taskStatus; /** 是否存在可执行的当前流程步骤,用于列表是否展示完成按钮 */ @TableField(exist = false,select = false) @ApiModelProperty(value = "是否可点击完成(有当前步骤且非终态)") private Boolean canComplete; @ApiModelProperty("上级任务ID") private Long parentId; rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java
@@ -34,6 +34,12 @@ Task operateComplete(Long id, Long loginUserId); /** 批量填充列表任务的 canComplete:有当前流程步骤且非终态时为 true */ void fillCanComplete(List<Task> tasks); /** 10000 状态按任务类型置为入库完成/等待确认/出库完成(与定时任务 completeStock10000 共用) */ void applyTransferEndStatus(Task task); void moveToDeep(Long loginUserId, String curLoc) throws Exception; void pubTaskToWcs(List<Task> tasks); rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
@@ -33,6 +33,8 @@ import com.vincent.rsf.server.manager.enums.LocStsType; import com.vincent.rsf.server.system.entity.Config; import com.vincent.rsf.server.system.service.ConfigService; import com.vincent.rsf.server.system.entity.FlowStepInstance; import com.vincent.rsf.server.system.service.FlowStepInstanceService; import com.vincent.rsf.server.system.utils.SerialRuleUtils; import com.vincent.rsf.server.system.utils.SystemAuthUtils; import lombok.Synchronized; @@ -120,6 +122,10 @@ private RestTemplate restTemplate; @Autowired private RemotesInfoProperties.RcsApi rcsApi; @Autowired private FlowStepInstanceService flowStepInstanceService; @Autowired private RemotesInfoProperties.WmsOpenApi wmsOpenApi; @Override @Transactional(rollbackFor = Exception.class) @@ -806,27 +812,83 @@ @Override @Transactional(rollbackFor = Exception.class) public Task operateComplete(Long id, Long loginUserId) { List<Integer> longs = Arrays.asList(TaskStsType.GENERATE_IN.id, TaskStsType.GENERATE_OUT.id); Task task = taskService.getOne(new LambdaQueryWrapper<Task>() .eq(Task::getId, id) .in(Task::getTaskStatus, longs)); Task task = getById(id); if (Objects.isNull(task)) { throw new CoolException("数据错误:当前任务不可执行完结操作!!"); throw new CoolException("数据错误:任务不存在!!"); } if (task.getTaskStatus() != null && TERMINAL_OR_WAITING_STATUS.contains(task.getTaskStatus())) { throw new CoolException("任务已处于终态或等待库存更新,无需完结"); } List<FlowStepInstance> steps = flowStepInstanceService.list( new LambdaQueryWrapper<FlowStepInstance>() .eq(FlowStepInstance::getTaskNo, task.getTaskCode()) .orderByAsc(FlowStepInstance::getStepOrder)); int maxCompletedOrder = steps.stream() .filter(s -> s.getStepOrder() != null && s.getStatus() != null && s.getStatus() == 3) .mapToInt(FlowStepInstance::getStepOrder) .max().orElse(-1); for (FlowStepInstance step : steps) { if (step.getStepOrder() != null && step.getStepOrder() > maxCompletedOrder) { step.setStatus((short) 5); flowStepInstanceService.updateById(step); } } modiftyTaskSort(task, loginUserId); // // if (task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) { // task.setTaskStatus(TaskStsType.COMPLETE_OUT.id); // } else { task.setTaskStatus(task.getTaskType() < 100 ? TaskStsType.COMPLETE_IN.id : task.getTaskType()==101? TaskStsType.COMPLETE_OUT.id:TaskStsType.AWAIT.id); // } if (!this.updateById(task)) { throw new CoolException("完成任务失败"); applyTransferEndStatus(task); // applyTransferEndStatus 未匹配到的任务类型(未置为 98/196/198/9999)时兜底置终态 if (task.getTaskStatus() == null || (!task.getTaskStatus().equals(TaskStsType.COMPLETE_IN.id) && !task.getTaskStatus().equals(TaskStsType.AWAIT.id) && !task.getTaskStatus().equals(TaskStsType.COMPLETE_OUT.id) && !task.getTaskStatus().equals(TaskStsType.MISSION_TRANSFER.id))) { task.setTaskStatus(task.getTaskType() != null && task.getTaskType() < 100 ? TaskStsType.COMPLETE_IN.id : Integer.valueOf(101).equals(task.getTaskType()) ? TaskStsType.COMPLETE_OUT.id : TaskStsType.AWAIT.id); updateById(task); } return task; } @Override public void applyTransferEndStatus(Task task) { if (TaskType.TASK_TYPE_IN.type.equals(task.getTaskType()) || TaskType.TASK_TYPE_PICK_IN.type.equals(task.getTaskType()) || TaskType.TASK_TYPE_CHECK_IN.type.equals(task.getTaskType()) || TaskType.TASK_TYPE_EMPTY_IN.type.equals(task.getTaskType()) || TaskType.TASK_TYPE_MERGE_IN.type.equals(task.getTaskType()) || TaskType.TASK_TYPE_LOC_MOVE.type.equals(task.getTaskType())) { task.setTaskStatus(TaskStsType.COMPLETE_IN.id); } else if (TaskType.TASK_TYPE_OUT.type.equals(task.getTaskType())) { task.setTaskStatus(TaskStsType.COMPLETE_OUT.id); } else if (TaskType.TASK_TYPE_PICK_AGAIN_OUT.type.equals(task.getTaskType()) || TaskType.TASK_TYPE_CHECK_OUT.type.equals(task.getTaskType())) { task.setTaskStatus(TaskStsType.AWAIT.id); } else if (TaskType.TASK_TYPE_MERGE_OUT.type.equals(task.getTaskType())) { task.setTaskStatus(TaskStsType.MISSION_TRANSFER.id); } else if (TaskType.TASK_TYPE_CROSS_DOCKING_OUT.type.equals(task.getTaskType()) || TaskType.TASK_TYPE_EMPTY_OUT.type.equals(task.getTaskType())) { task.setTaskStatus(TaskStsType.COMPLETE_OUT.id); } else { return; } updateById(task); } /** 终态或等待定时任务更新库存的状态,不展示完成按钮 */ private static final Set<Integer> TERMINAL_OR_WAITING_STATUS = new HashSet<>(Arrays.asList( TaskStsType.COMPLETE_IN.id, TaskStsType.REPORT_IN.id, TaskStsType.UPDATED_IN.id, TaskStsType.COMPLETE_OUT.id, TaskStsType.WAVE_SEED.id, TaskStsType.UPDATED_OUT.id, TaskStsType.MISSION_TRANSFER_END.id)); /** 完结不依赖流程步骤,仅未终态任务展示完成按钮 */ @Override public void fillCanComplete(List<Task> tasks) { if (tasks == null || tasks.isEmpty()) { return; } for (Task task : tasks) { boolean terminal = task.getTaskStatus() != null && TERMINAL_OR_WAITING_STATUS.contains(task.getTaskStatus()); task.setCanComplete(!terminal); } } /** * 修改任务优先级