diff --git a/klp-admin/src/main/resources/db/migration/V4__newSql.sql b/klp-admin/src/main/resources/db/migration/V4__newSql.sql new file mode 100644 index 00000000..79727e22 --- /dev/null +++ b/klp-admin/src/main/resources/db/migration/V4__newSql.sql @@ -0,0 +1,6 @@ +alter table wms_purchase_plan_detail + modify plan_id bigint null comment '采购计划ID'; + +alter table wms_purchase_plan_detail + add detail_code varchar(64) null comment '详情编码' after plan_id; + diff --git a/klp-flowable/src/main/java/com/klp/flowable/listener/UserTaskListener.java b/klp-flowable/src/main/java/com/klp/flowable/listener/UserTaskListener.java index 1ec6011c..eeb17de1 100644 --- a/klp-flowable/src/main/java/com/klp/flowable/listener/UserTaskListener.java +++ b/klp-flowable/src/main/java/com/klp/flowable/listener/UserTaskListener.java @@ -4,6 +4,8 @@ import org.flowable.engine.delegate.TaskListener; import org.flowable.task.service.delegate.DelegateTask; import org.springframework.stereotype.Component; +import java.util.Map; + /** * 用户任务监听器 * @@ -20,8 +22,24 @@ public class UserTaskListener implements TaskListener { @Override public void notify(DelegateTask delegateTask) { - //TODO 实现你的任务监听器逻辑 System.out.println("执行任务监听器..."); + + // 检查是否有指定的下一个处理人 + Map variables = delegateTask.getVariables(); + if (variables.containsKey("nextUserIds")) { + String nextUserIds = (String) variables.get("nextUserIds"); + if (nextUserIds != null && !nextUserIds.isEmpty()) { + // 设置任务的处理人 + String[] userIds = nextUserIds.split(","); + if (userIds.length > 0) { + delegateTask.setAssignee(userIds[0]); + } + // 如果有多个处理人,可以设置为候选人 + for (int i = 1; i < userIds.length; i++) { + delegateTask.addCandidateUser(userIds[i]); + } + } + } } } diff --git a/klp-flowable/src/main/java/com/klp/flowable/utils/NextUserSelector.java b/klp-flowable/src/main/java/com/klp/flowable/utils/NextUserSelector.java new file mode 100644 index 00000000..bc6e33ca --- /dev/null +++ b/klp-flowable/src/main/java/com/klp/flowable/utils/NextUserSelector.java @@ -0,0 +1,68 @@ +package com.klp.flowable.utils; + +import org.flowable.engine.RuntimeService; +import org.flowable.engine.TaskService; +import org.flowable.task.api.Task; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +/** + * 下一个处理人选择器 + * 用于处理用户自定义选择下一个处理人的逻辑 + * + * @author CodeBuddy + * @since 2025/8/22 + */ +@Component +public class NextUserSelector { + + private final TaskService taskService; + private final RuntimeService runtimeService; + + public NextUserSelector(TaskService taskService, RuntimeService runtimeService) { + this.taskService = taskService; + this.runtimeService = runtimeService; + } + + /** + * 设置下一个任务的处理人 + * + * @param taskId 当前任务ID + * @param nextUserIds 下一个处理人ID,多个用逗号分隔 + */ + public void setNextTaskUsers(String taskId, String nextUserIds) { + if (nextUserIds == null || nextUserIds.isEmpty()) { + return; + } + + Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); + if (task == null) { + return; + } + + // 设置流程变量,在任务完成后传递给下一个任务 + Map variables = new HashMap<>(); + variables.put("nextUserIds", nextUserIds); + + // 更新流程实例变量 + runtimeService.setVariables(task.getExecutionId(), variables); + } + + /** + * 获取当前任务的指定处理人 + * + * @param taskId 任务ID + * @return 指定的处理人ID,多个用逗号分隔 + */ + public String getNextTaskUsers(String taskId) { + Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); + if (task == null) { + return null; + } + + Object nextUserIds = runtimeService.getVariable(task.getExecutionId(), "nextUserIds"); + return nextUserIds != null ? nextUserIds.toString() : null; + } +} \ No newline at end of file diff --git a/klp-system/src/main/java/com/klp/workflow/service/impl/WfTaskServiceImpl.java b/klp-system/src/main/java/com/klp/workflow/service/impl/WfTaskServiceImpl.java index 5bee9e87..1a26bde5 100644 --- a/klp-system/src/main/java/com/klp/workflow/service/impl/WfTaskServiceImpl.java +++ b/klp-system/src/main/java/com/klp/workflow/service/impl/WfTaskServiceImpl.java @@ -74,6 +74,18 @@ public class WfTaskServiceImpl extends FlowServiceFactory implements IWfTaskServ // 获取 bpmn 模型 BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId()); identityService.setAuthenticatedUserId(TaskUtils.getUserId()); + + // 处理下一级审批人,将用户选择的下一个处理人保存到流程变量中 + if (StringUtils.isNotBlank(taskBo.getNextUserIds())) { + // 如果有指定下一个处理人,则将其保存到流程变量中 + Map variables = taskBo.getVariables(); + if (variables == null) { + variables = new HashMap<>(); + taskBo.setVariables(variables); + } + variables.put("nextUserIds", taskBo.getNextUserIds()); + } + if (DelegationState.PENDING.equals(task.getDelegationState())) { taskService.addComment(taskBo.getTaskId(), taskBo.getProcInsId(), FlowComment.DELEGATE.getType(), taskBo.getComment()); taskService.resolveTask(taskBo.getTaskId()); diff --git a/klp-ui/src/views/workflow/work/detail.vue b/klp-ui/src/views/workflow/work/detail.vue index 43c5ca21..e36e7b10 100644 --- a/klp-ui/src/views/workflow/work/detail.vue +++ b/klp-ui/src/views/workflow/work/detail.vue @@ -42,6 +42,10 @@ {{ item.nickName }} +
+ + 您可以指定下一个任务的处理人,系统将自动将任务分配给指定的人员 +
@@ -651,4 +655,16 @@ export default { .button-new-tag { margin-left: 10px; } + +.form-item-tip { + margin-top: 8px; + font-size: 12px; + color: #909399; + line-height: 1.5; + + i { + margin-right: 4px; + color: #E6A23C; + } +} diff --git a/klp-wms/src/main/java/com/klp/domain/WmsPurchasePlanDetail.java b/klp-wms/src/main/java/com/klp/domain/WmsPurchasePlanDetail.java index 3e2bd9c3..98c98299 100644 --- a/klp-wms/src/main/java/com/klp/domain/WmsPurchasePlanDetail.java +++ b/klp-wms/src/main/java/com/klp/domain/WmsPurchasePlanDetail.java @@ -73,4 +73,9 @@ public class WmsPurchasePlanDetail extends BaseEntity { */ private Long contractId; + /** + * 详情编号 + */ + private String detailCode; + } diff --git a/klp-wms/src/main/java/com/klp/domain/bo/WmsPurchasePlanDetailBo.java b/klp-wms/src/main/java/com/klp/domain/bo/WmsPurchasePlanDetailBo.java index 8fa5da79..37e3c605 100644 --- a/klp-wms/src/main/java/com/klp/domain/bo/WmsPurchasePlanDetailBo.java +++ b/klp-wms/src/main/java/com/klp/domain/bo/WmsPurchasePlanDetailBo.java @@ -75,5 +75,10 @@ public class WmsPurchasePlanDetailBo extends BaseEntity { */ private Long contractId; + /** + * 详情编号 + */ + private String detailCode; + } diff --git a/klp-wms/src/main/java/com/klp/domain/vo/WmsPurchasePlanDetailVo.java b/klp-wms/src/main/java/com/klp/domain/vo/WmsPurchasePlanDetailVo.java index 721da3f6..185db049 100644 --- a/klp-wms/src/main/java/com/klp/domain/vo/WmsPurchasePlanDetailVo.java +++ b/klp-wms/src/main/java/com/klp/domain/vo/WmsPurchasePlanDetailVo.java @@ -111,4 +111,9 @@ public class WmsPurchasePlanDetailVo { * 合同编号 */ private String contractNo; + + /** + * 详情编号 + */ + private String detailCode; } diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsPurchasePlanDetailServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsPurchasePlanDetailServiceImpl.java index 19505ce5..cbb7e864 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsPurchasePlanDetailServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsPurchasePlanDetailServiceImpl.java @@ -66,6 +66,7 @@ public class WmsPurchasePlanDetailServiceImpl implements IWmsPurchasePlanDetailS lqw.eq(StringUtils.isNotBlank(bo.getOwner()), WmsPurchasePlanDetail::getOwner, bo.getOwner()); lqw.eq(bo.getQuantity() != null, WmsPurchasePlanDetail::getQuantity, bo.getQuantity()); lqw.eq(StringUtils.isNotBlank(bo.getUnit()), WmsPurchasePlanDetail::getUnit, bo.getUnit()); + lqw.like(StringUtils.isNotBlank(bo.getDetailCode()), WmsPurchasePlanDetail::getDetailCode, bo.getDetailCode()); return lqw; } @@ -78,6 +79,7 @@ public class WmsPurchasePlanDetailServiceImpl implements IWmsPurchasePlanDetailS qw.eq(StringUtils.isNotBlank(bo.getOwner()), "wpd.owner", bo.getOwner()); qw.eq(bo.getQuantity() != null, "wpd.quantity", bo.getQuantity()); qw.eq(StringUtils.isNotBlank(bo.getUnit()), "wpd.unit", bo.getUnit()); + qw.like(StringUtils.isNotBlank(bo.getDetailCode()), "wpd.detail_code", bo.getDetailCode()); return qw; } diff --git a/klp-wms/src/main/resources/mapper/klp/WmsPurchasePlanDetailMapper.xml b/klp-wms/src/main/resources/mapper/klp/WmsPurchasePlanDetailMapper.xml index 6e16aabf..f117e1c8 100644 --- a/klp-wms/src/main/resources/mapper/klp/WmsPurchasePlanDetailMapper.xml +++ b/klp-wms/src/main/resources/mapper/klp/WmsPurchasePlanDetailMapper.xml @@ -21,6 +21,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" +