包头流程绑定表单字段

This commit is contained in:
guoshengxiong 2025-01-15 19:19:10 +08:00
parent 132d2f544f
commit 009318295c
2 changed files with 104 additions and 7 deletions

View File

@ -20,6 +20,9 @@ import java.util.Map;
@Data @Data
public class ApprovalProps implements Serializable { public class ApprovalProps implements Serializable {
private static final long serialVersionUID = -45475579271153023L; private static final long serialVersionUID = -45475579271153023L;
private String saveDateTime;
private String saveFormUser;
private ApprovalTypeEnum assignedType; private ApprovalTypeEnum assignedType;

View File

@ -7,6 +7,8 @@ import cn.hutool.core.collection.ConcurrentHashSet;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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.mapper.WflowModelsMapper;
import com.wflow.service.OrgRepositoryService; import com.wflow.service.OrgRepositoryService;
import com.wflow.utils.UserUtil; import com.wflow.utils.UserUtil;
import com.wflow.workflow.UELTools;
import com.wflow.workflow.bean.dto.NotifyDto; import com.wflow.workflow.bean.dto.NotifyDto;
import com.wflow.workflow.bean.dto.ProcessInstanceOwnerDto; import com.wflow.workflow.bean.dto.ProcessInstanceOwnerDto;
import com.wflow.workflow.bean.process.OrgUser; 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.bean.vo.*;
import com.wflow.workflow.config.WflowGlobalVarDef; import com.wflow.workflow.config.WflowGlobalVarDef;
import com.wflow.workflow.extension.cmd.RecallToHisApprovalNodeCmd; 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.wflow.workflow.utils.FlowableUtils;
import com.zhgd.xmgl.security.util.SecurityUtils;
import com.zhgd.xmgl.tenant.TenantContextHolder; import com.zhgd.xmgl.tenant.TenantContextHolder;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; 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.task.service.history.NativeHistoricTaskInstanceQuery;
import org.flowable.variable.api.history.HistoricVariableInstance; import org.flowable.variable.api.history.HistoricVariableInstance;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -62,6 +70,12 @@ import java.util.stream.Collectors;
@Slf4j @Slf4j
@Service("processTaskService") @Service("processTaskService")
public class ProcessTaskServiceImpl implements ProcessTaskService { public class ProcessTaskServiceImpl implements ProcessTaskService {
@Lazy
@Autowired
private WflowModelHistorysMapper modelHistorysMapper;
@Autowired
private UELTools uelTools;
@Autowired @Autowired
private TaskService taskService; private TaskService taskService;
@ -337,6 +351,63 @@ public class ProcessTaskServiceImpl implements ProcessTaskService {
return page; 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 @Override
@Transactional @Transactional
public void approvalTask(ProcessHandlerParamsVo params) { public void approvalTask(ProcessHandlerParamsVo params) {
@ -346,6 +417,29 @@ public class ProcessTaskServiceImpl implements ProcessTaskService {
if (StrUtil.isNotBlank(params.getTaskId())) { if (StrUtil.isNotBlank(params.getTaskId())) {
task = taskService.createTaskQuery().taskId(params.getTaskId()).active().singleResult(); task = taskService.createTaskQuery().taskId(params.getTaskId()).active().singleResult();
} }
String instanceId = params.getInstanceId();
String processDefinitionId = task.getProcessDefinitionId();
Map<String, Object> contextVar = uelTools.getContextVar(instanceId, processDefinitionId);
Map map = (Map) contextVar.get(WflowGlobalVarDef.WFLOW_NODE_PROPS);
Object nodeProps = map.get(task.getTaskDefinitionKey());
Map<String, JSONArray> 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()); boolean isComment = ProcessHandlerParamsVo.Action.comment.equals(params.getAction());
if (hasComment(params.getComment())) { if (hasComment(params.getComment())) {
boolean putComment = Objects.nonNull(task) && userId.equals(task.getAssignee()); boolean putComment = Objects.nonNull(task) && userId.equals(task.getAssignee());
@ -355,7 +449,7 @@ public class ProcessTaskServiceImpl implements ProcessTaskService {
if (!(isComment || putComment)){ if (!(isComment || putComment)){
throw new BusinessException("任务不存在,请刷新数据"); 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 (StrUtil.isNotBlank(params.getSignature())) {
if (params.getUpdateSign()) { if (params.getUpdateSign()) {
@ -380,20 +474,20 @@ public class ProcessTaskServiceImpl implements ProcessTaskService {
switch (params.getAction()) { switch (params.getAction()) {
case agree: case agree:
case refuse: case refuse:
businessDataService.updateInstanceFormData(userId, params.getInstanceId(), params.getFormData()); businessDataService.updateInstanceFormData(userId, instanceId, params.getFormData());
doApproval(task, params); doApproval(task, params);
break; break;
case recall: //退回 case recall: //退回
doRecallTask(task, userId, params); doRecallTask(task, userId, params);
break; break;
case transfer: //转交 case transfer: //转交
businessDataService.updateInstanceFormData(userId, params.getInstanceId(), params.getFormData()); businessDataService.updateInstanceFormData(userId, instanceId, params.getFormData());
doTransferTask(task, params, userId); doTransferTask(task, params, userId);
break; break;
case afterAdd: case afterAdd:
case beforeAdd: //加签暂时只支持后加签 case beforeAdd: //加签暂时只支持后加签
//加签如果是顺序会签暂时先禁止 //加签如果是顺序会签暂时先禁止
BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId()); BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
UserTask userTask = (UserTask) bpmnModel.getMainProcess().getFlowElement(task.getTaskDefinitionKey()); UserTask userTask = (UserTask) bpmnModel.getMainProcess().getFlowElement(task.getTaskDefinitionKey());
MultiInstanceLoopCharacteristics loopCharacteristics = userTask.getLoopCharacteristics(); MultiInstanceLoopCharacteristics loopCharacteristics = userTask.getLoopCharacteristics();
if (Objects.isNull(loopCharacteristics) || loopCharacteristics.isSequential()) { if (Objects.isNull(loopCharacteristics) || loopCharacteristics.isSequential()) {
@ -405,8 +499,8 @@ public class ProcessTaskServiceImpl implements ProcessTaskService {
break; break;
case cancel: case cancel:
List<ActivityInstance> instances = runtimeService.createActivityInstanceQuery() List<ActivityInstance> instances = runtimeService.createActivityInstanceQuery()
.processInstanceId(params.getInstanceId()).unfinished().list(); .processInstanceId(instanceId).unfinished().list();
doCancelProcess(params.getInstanceId(), doCancelProcess(instanceId,
instances.stream() instances.stream()
.filter(v -> v.getActivityType().equalsIgnoreCase("userTask")) .filter(v -> v.getActivityType().equalsIgnoreCase("userTask"))
.findFirst().get().getActivityId()); .findFirst().get().getActivityId());