From 009318295cfe6892f51db325b23195921679481b Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Wed, 15 Jan 2025 19:19:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8C=85=E5=A4=B4=E6=B5=81=E7=A8=8B=E7=BB=91?= =?UTF-8?q?=E5=AE=9A=E8=A1=A8=E5=8D=95=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bean/process/props/ApprovalProps.java | 3 + .../service/impl/ProcessTaskServiceImpl.java | 108 ++++++++++++++++-- 2 files changed, 104 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/wflow/workflow/bean/process/props/ApprovalProps.java b/src/main/java/com/wflow/workflow/bean/process/props/ApprovalProps.java index 2f6574d..5d3b334 100644 --- a/src/main/java/com/wflow/workflow/bean/process/props/ApprovalProps.java +++ b/src/main/java/com/wflow/workflow/bean/process/props/ApprovalProps.java @@ -20,6 +20,9 @@ import java.util.Map; @Data public class ApprovalProps implements Serializable { private static final long serialVersionUID = -45475579271153023L; + private String saveDateTime; + + private String saveFormUser; private ApprovalTypeEnum assignedType; diff --git a/src/main/java/com/wflow/workflow/service/impl/ProcessTaskServiceImpl.java b/src/main/java/com/wflow/workflow/service/impl/ProcessTaskServiceImpl.java index 5a6917c..f20da2b 100644 --- a/src/main/java/com/wflow/workflow/service/impl/ProcessTaskServiceImpl.java +++ b/src/main/java/com/wflow/workflow/service/impl/ProcessTaskServiceImpl.java @@ -7,6 +7,8 @@ import cn.hutool.core.collection.ConcurrentHashSet; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -18,6 +20,7 @@ import com.wflow.mapper.WflowModelHistorysMapper; import com.wflow.mapper.WflowModelsMapper; import com.wflow.service.OrgRepositoryService; import com.wflow.utils.UserUtil; +import com.wflow.workflow.UELTools; import com.wflow.workflow.bean.dto.NotifyDto; import com.wflow.workflow.bean.dto.ProcessInstanceOwnerDto; import com.wflow.workflow.bean.process.OrgUser; @@ -26,8 +29,12 @@ import com.wflow.workflow.bean.process.props.CcProps; import com.wflow.workflow.bean.vo.*; import com.wflow.workflow.config.WflowGlobalVarDef; import com.wflow.workflow.extension.cmd.RecallToHisApprovalNodeCmd; -import com.wflow.workflow.service.*; +import com.wflow.workflow.service.BusinessDataStorageService; +import com.wflow.workflow.service.NotifyService; +import com.wflow.workflow.service.ProcessTaskService; +import com.wflow.workflow.service.UserDeptOrLeaderService; import com.wflow.workflow.utils.FlowableUtils; +import com.zhgd.xmgl.security.util.SecurityUtils; import com.zhgd.xmgl.tenant.TenantContextHolder; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -49,6 +56,7 @@ import org.flowable.task.api.history.HistoricTaskInstance; import org.flowable.task.service.history.NativeHistoricTaskInstanceQuery; import org.flowable.variable.api.history.HistoricVariableInstance; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -62,6 +70,12 @@ import java.util.stream.Collectors; @Slf4j @Service("processTaskService") public class ProcessTaskServiceImpl implements ProcessTaskService { + @Lazy + @Autowired + private WflowModelHistorysMapper modelHistorysMapper; + + @Autowired + private UELTools uelTools; @Autowired private TaskService taskService; @@ -337,6 +351,63 @@ public class ProcessTaskServiceImpl implements ProcessTaskService { return page; } + /** + * 获取表单id的现在时间 + * @param instanceId + * @param fieldId + */ + private String getFormDataNowTime(String instanceId, String fieldId) { + String format = "yyyy-MM-dd HH:mm:ss"; + //先查实例,然后判断是子流程还是主流程 + HistoricProcessInstance instance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(instanceId).singleResult(); + //是否是子流程 + boolean isSub = StrUtil.isNotBlank(instance.getSuperProcessInstanceId()); + HistoricProcessInstance mainInst = isSub ? null : instance; + if (isSub) { + //查出主流程表单数据 + mainInst = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(instance.getSuperProcessInstanceId()).singleResult(); + } + //搜索当前版本流程的配置 + WflowModelHistorys modelHistory = modelHistorysMapper.selectOne(new LambdaQueryWrapper<>(WflowModelHistorys.builder() + .processDefId(mainInst.getProcessDefinitionId()).version(mainInst.getProcessDefinitionVersion()).build())); + String formItems = modelHistory.getFormItems(); + JSONArray root = JSON.parseArray(formItems); + boolean find = false; + for (int i = 0; i < root.size(); i++) { + JSONObject jo = root.getJSONObject(i); + String valueType = jo.getString("valueType"); + if (Objects.equals(valueType, "Array")) { + JSONArray items = jo.getJSONObject("props").getJSONArray("items"); + for (int j = 0; j < items.size(); j++) { + JSONObject jo1 = items.getJSONObject(j); + String valueType1 = jo.getString("valueType"); + if (Objects.equals(valueType1, "Date")) { + if (jo1.getString("id").equals(fieldId)) { + find = true; + format = jo1.getJSONObject("props").getString("format"); + break; + } + } + } + } else { + String valueType1 = jo.getString("valueType"); + if (Objects.equals(valueType1, "Date")) { + if (jo.getString("id").equals(fieldId)) { + find = true; + format = jo.getJSONObject("props").getString("format"); + break; + } + } + } + if (find) { + break; + } + } + return DateUtil.format(new Date(), format); + } + @Override @Transactional public void approvalTask(ProcessHandlerParamsVo params) { @@ -346,6 +417,29 @@ public class ProcessTaskServiceImpl implements ProcessTaskService { if (StrUtil.isNotBlank(params.getTaskId())) { task = taskService.createTaskQuery().taskId(params.getTaskId()).active().singleResult(); } + String instanceId = params.getInstanceId(); + String processDefinitionId = task.getProcessDefinitionId(); + Map contextVar = uelTools.getContextVar(instanceId, processDefinitionId); + Map map = (Map) contextVar.get(WflowGlobalVarDef.WFLOW_NODE_PROPS); + Object nodeProps = map.get(task.getTaskDefinitionKey()); + Map nodeLis = null; + if (nodeProps instanceof ApprovalProps) { + ApprovalProps props = (ApprovalProps) nodeProps; + String saveFormUser = props.getSaveFormUser(); + if (StrUtil.isNotBlank(saveFormUser)) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("name", SecurityUtils.getUser().getRealName()); + jsonObject.put("id", userId); + jsonObject.put("type", "user"); + jsonObject.put("selected", true); + params.getFormData().put(saveFormUser, Arrays.asList(jsonObject)); + } + String saveDateTime = props.getSaveDateTime(); + if (StrUtil.isNotBlank(saveDateTime)) { + params.getFormData().put(saveDateTime, getFormDataNowTime(instanceId, saveDateTime)); + } + } + boolean isComment = ProcessHandlerParamsVo.Action.comment.equals(params.getAction()); if (hasComment(params.getComment())) { boolean putComment = Objects.nonNull(task) && userId.equals(task.getAssignee()); @@ -355,7 +449,7 @@ public class ProcessTaskServiceImpl implements ProcessTaskService { if (!(isComment || putComment)){ throw new BusinessException("任务不存在,请刷新数据"); } - taskService.addComment(params.getTaskId(), params.getInstanceId(), JSONObject.toJSONString(params.getComment())); + taskService.addComment(params.getTaskId(), instanceId, JSONObject.toJSONString(params.getComment())); } if (StrUtil.isNotBlank(params.getSignature())) { if (params.getUpdateSign()) { @@ -380,20 +474,20 @@ public class ProcessTaskServiceImpl implements ProcessTaskService { switch (params.getAction()) { case agree: case refuse: - businessDataService.updateInstanceFormData(userId, params.getInstanceId(), params.getFormData()); + businessDataService.updateInstanceFormData(userId, instanceId, params.getFormData()); doApproval(task, params); break; case recall: //退回 doRecallTask(task, userId, params); break; case transfer: //转交 - businessDataService.updateInstanceFormData(userId, params.getInstanceId(), params.getFormData()); + businessDataService.updateInstanceFormData(userId, instanceId, params.getFormData()); doTransferTask(task, params, userId); break; case afterAdd: case beforeAdd: //加签,暂时只支持后加签 //加签如果是顺序会签,暂时先禁止, - BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId()); + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId); UserTask userTask = (UserTask) bpmnModel.getMainProcess().getFlowElement(task.getTaskDefinitionKey()); MultiInstanceLoopCharacteristics loopCharacteristics = userTask.getLoopCharacteristics(); if (Objects.isNull(loopCharacteristics) || loopCharacteristics.isSequential()) { @@ -405,8 +499,8 @@ public class ProcessTaskServiceImpl implements ProcessTaskService { break; case cancel: List instances = runtimeService.createActivityInstanceQuery() - .processInstanceId(params.getInstanceId()).unfinished().list(); - doCancelProcess(params.getInstanceId(), + .processInstanceId(instanceId).unfinished().list(); + doCancelProcess(instanceId, instances.stream() .filter(v -> v.getActivityType().equalsIgnoreCase("userTask")) .findFirst().get().getActivityId());