Commit 2be52782 by 赵剑炜

工作流跑通

parent 8271b051
...@@ -223,7 +223,13 @@ ...@@ -223,7 +223,13 @@
<version>1.1.4c</version> <version>1.1.4c</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<!-- <dependency>--> <dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-annotations</artifactId>
<version>3.0.3</version>
<scope>compile</scope>
</dependency>
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>--> <!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-swagger-ui</artifactId>--> <!-- <artifactId>springfox-swagger-ui</artifactId>-->
<!-- <version>2.9.2</version>--> <!-- <version>2.9.2</version>-->
......
...@@ -4,21 +4,17 @@ package com.junmp.junmpProcess.common; ...@@ -4,21 +4,17 @@ package com.junmp.junmpProcess.common;
* *
*/ */
public interface CommonConstants { public interface CommonConstants {
/** /** {@code 500 Server Error} (HTTP/1.0 - RFC 1945) */
* {@code 500 Server Error} (HTTP/1.0 - RFC 1945)
*/
Integer SC_INTERNAL_SERVER_ERROR_500 = 500; Integer SC_INTERNAL_SERVER_ERROR_500 = 500;
/** /** {@code 200 OK} (HTTP/1.0 - RFC 1945) */
* {@code 200 OK} (HTTP/1.0 - RFC 1945)
*/
Integer SC_OK_200 = 200; Integer SC_OK_200 = 200;
String FORM_VAR = "formData"; String FORM_VAR="formData";
String PROCESS_STATUS = "processStatus"; String PROCESS_STATUS="processStatus";
String START_USER_INFO = "startUser"; String START_USER_INFO="startUser";
String BUSINESS_STATUS_1 = "1"; //正在处理 String BUSINESS_STATUS_1="1"; //正在处理
String BUSINESS_STATUS_2 = "2";//撤销 String BUSINESS_STATUS_2="2";//撤销
String BUSINESS_STATUS_3 = "3";//驳回 String BUSINESS_STATUS_3="3";//驳回
String BUSINESS_STATUS_4 = "4";//已结束 String BUSINESS_STATUS_4="4";//已结束
} }
...@@ -44,7 +44,7 @@ public class ActivitiConfig { ...@@ -44,7 +44,7 @@ public class ActivitiConfig {
config.setTransactionManager(transactionManager); config.setTransactionManager(transactionManager);
config.setDisableIdmEngine(true); config.setDisableIdmEngine(true);
config.setDatabaseType(ProcessEngineConfigurationImpl.DATABASE_TYPE_MYSQL); config.setDatabaseType(ProcessEngineConfigurationImpl.DATABASE_TYPE_MYSQL);
config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE); config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE);
config.setDelegateExpressionFieldInjectionMode(DelegateExpressionFieldInjectionMode.MIXED); config.setDelegateExpressionFieldInjectionMode(DelegateExpressionFieldInjectionMode.MIXED);
config.setIdGenerator(idWorkerIdGenerator); config.setIdGenerator(idWorkerIdGenerator);
config.setAsyncExecutorActivate(Boolean.TRUE); config.setAsyncExecutorActivate(Boolean.TRUE);
...@@ -60,9 +60,9 @@ public class ActivitiConfig { ...@@ -60,9 +60,9 @@ public class ActivitiConfig {
config.setHttpClientConfig(httpClientConfig); config.setHttpClientConfig(httpClientConfig);
config.setKnowledgeBaseCacheLimit(200); config.setKnowledgeBaseCacheLimit(200);
config.setProcessDefinitionCacheLimit(200); config.setProcessDefinitionCacheLimit(200);
List<JobHandler> customJobHandlers = new ArrayList<>(); // List<JobHandler> customJobHandlers = new ArrayList<>();
customJobHandlers.add(new CustomJobHandler()); // customJobHandlers.add(new CustomJobHandler());
config.setCustomJobHandlers(customJobHandlers); // config.setCustomJobHandlers(customJobHandlers);
return config; return config;
} }
......
package com.junmp.junmpProcess.controller; package com.junmp.junmpProcess.controller;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.junmp.junmpProcess.common.R;
import com.junmp.junmpProcess.common.Result; import com.junmp.junmpProcess.common.Result;
import com.junmp.junmpProcess.doc.BpmnDoc; import com.junmp.junmpProcess.doc.BpmnDoc;
import com.junmp.junmpProcess.dto.StartProcessInstanceDTO;
import com.junmp.junmpProcess.dto.TaskDTO;
import com.junmp.junmpProcess.dto.json.JunmpUserInfo;
import com.junmp.junmpProcess.dto.json.UserInfo;
import com.junmp.junmpProcess.entity.ProcessTemplates;
import com.junmp.junmpProcess.exception.WorkFlowException;
import com.junmp.junmpProcess.service.Repository.ProcessTemplateService;
import com.junmp.junmpProcess.utils.BpmnConvert; import com.junmp.junmpProcess.utils.BpmnConvert;
import com.junmp.junmpProcess.vo.ProcessVO; import com.junmp.junmpProcess.vo.ProcessVO;
import com.junmp.junmpProcess.vo.TaskVO;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import com.junmp.junmpProcess.service.Bussiness.WorkProcessService; import com.junmp.junmpProcess.service.Bussiness.WorkProcessService;
import org.flowable.bpmn.model.BpmnModel; import org.flowable.bpmn.model.BpmnModel;
import org.flowable.engine.ProcessEngine; import org.flowable.bpmn.model.FlowElement;
import org.flowable.engine.ProcessEngineConfiguration; import org.flowable.common.engine.impl.identity.Authentication;
import org.flowable.engine.*;
import org.flowable.engine.repository.Deployment; import org.flowable.engine.repository.Deployment;
import org.flowable.engine.repository.ProcessDefinition;
import org.flowable.engine.runtime.ActivityInstance;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.engine.runtime.ProcessInstanceBuilder;
import org.flowable.task.api.DelegationState;
import org.flowable.task.api.Task;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.junmp.junmpProcess.common.CommonConstants.*;
@Slf4j @Slf4j
@RestController @RestController
@RequestMapping("/Bpmn") @RequestMapping("/Bpmn")
@Api(tags = "BPMNXX")
public class BpmnController implements BpmnDoc { public class BpmnController implements BpmnDoc {
@Resource @Resource
private DataSource dataSource; private RepositoryService repositoryService;
@Autowired
private ProcessTemplateService processTemplateService;
@Resource
private RuntimeService runtimeService;
@Resource
private TaskService taskService;
@Autowired @Autowired
private WorkProcessService ProcessService; private WorkProcessService WorkProcessService;
@Override @Override
@PostMapping(value = "bpmn/create") @PostMapping(value = "bpmn/create")
public Result<String> create(@RequestBody ProcessVO processVO) throws JsonProcessingException { public Result<String> create(@RequestBody ProcessVO processVO) throws JsonProcessingException {
// ProcessEngineConfiguration. //流程定义
ProcessEngineConfiguration config = ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration();
config.setDataSource(dataSource);
config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
ProcessEngine processEngine = config.buildProcessEngine();
//流程定义
ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
JsonNode processJsonNode = objectMapper.readTree(processVO.getProcessJson()); JsonNode processJsonNode = objectMapper.readTree(processVO.getProcessJson());
ObjectMapper formMapper = new ObjectMapper();
JsonNode formJsonNode = objectMapper.readTree(processVO.getFormJson()); JsonNode formJsonNode = objectMapper.readTree(processVO.getFormJson());
String formName=processVO.getFormName().toString();
//将json转换为bpmn //将json转换为bpmn
BpmnConvert bpmnConvert=new BpmnConvert(); BpmnModel bpmnModel = processTemplateService.toBpmn(processJsonNode,formJsonNode,formName);
BpmnModel bpmnModel = bpmnConvert.toBpmn(processJsonNode,formJsonNode); Deployment deploy = repositoryService.createDeployment()
Deployment deployment = processEngine.getRepositoryService()
.createDeployment()
.addBpmnModel(bpmnModel.getProcesses().get(0).getId()+".bpmn20.xml", bpmnModel) .addBpmnModel(bpmnModel.getProcesses().get(0).getId()+".bpmn20.xml", bpmnModel)
.deploy(); .deploy();
return Result.OK(deploy.getId());
}
@ApiOperation("通过流程定义id启动流程")
@PostMapping("process/start")
public Result<Object> start(@RequestBody StartProcessInstanceDTO startProcessInstanceDTO) {
return WorkProcessService.start(startProcessInstanceDTO);
}
@ApiOperation("查看我的待办")
@PostMapping("process/toDoList")
public Result<Page<TaskVO>> toDoList(@RequestBody TaskDTO taskDTO){
List<Task> tasks = taskService.createTaskQuery().taskAssignee(taskDTO.getCurrentUserInfo().getUserId())
.includeProcessVariables()
.orderByTaskCreateTime().desc()
.listPage((taskDTO.getPageNo() - 1) * taskDTO.getPageSize(), taskDTO.getPageSize());
long count = taskService.createTaskQuery().taskAssignee(taskDTO.getCurrentUserInfo().getUserId()).count();
List<TaskVO> taskVOS= new ArrayList<>();
Page<TaskVO> page =new Page<>();
List<String> taskIds= new ArrayList<>();
for (Task task : tasks) {
Map<String, Object> processVariables = task.getProcessVariables();
}
Map<Long, JunmpUserInfo> collect=new HashMap<>();
// if(CollUtil.isNotEmpty(taskIds)){
// LambdaQueryWrapper<JunmpUserInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>();
// lambdaQueryWrapper.in(JunmpUserInfo::getUserId,taskIds);
// List<Users> list = userService.list(lambdaQueryWrapper);
// collect = list.stream().collect(Collectors.toMap(Users::getUserId, Function.identity()));
// }
for (Task task : tasks) {
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
Map<String, Object> processVariables = task.getProcessVariables();
TaskVO taskVO=new TaskVO();
taskVO.setTaskId(task.getId());
taskVO.setProcessInstanceId(task.getProcessInstanceId());
taskVO.setProcessDefinitionName(bpmnModel.getMainProcess().getName());
taskVO.setStartUser(JSONObject.parseObject(MapUtil.getStr(processVariables,START_USER_INFO),new TypeReference<UserInfo>(){}));
// taskVO.setUsers(collect.get(Long.valueOf(taskVO.getStartUser().getId())));
taskVO.setStartTime(processInstance.getStartTime());
taskVO.setCurrentActivityName(getCurrentName(processInstance.getId(),false,processInstance.getProcessDefinitionId()));
taskVO.setBusinessStatus(MapUtil.getStr(processVariables,PROCESS_STATUS));
taskVO.setTaskCreatedTime(task.getCreateTime());
DelegationState delegationState = task.getDelegationState();
if(delegationState!=null){
taskVO.setDelegationState(delegationState);
}
taskVOS.add(taskVO);
}
page.setRecords(taskVOS);
page.setCurrent(taskDTO.getPageNo());
page.setSize(taskDTO.getPageSize());
page.setTotal(count);
return Result.OK(page);
}
private String getCurrentName(String processInstanceId,Boolean flag,String processDefinitionId){
if(flag){
return "流程已结束";
}
List<ActivityInstance> list = runtimeService.createActivityInstanceQuery().processInstanceId(processInstanceId).activityType("userTask").unfinished().orderByActivityInstanceStartTime().desc().list();
if(CollUtil.isEmpty(list)){
return "";
}
else{
String activityId = list.get(0).getActivityId();
BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
FlowElement flowElement = bpmnModel.getMainProcess().getFlowElement(activityId);
return flowElement.getName();
}
}
/**
* 查询表单模板数据
*
* @param templateId 模板id
* @return 模板详情数据
*/
@PostMapping(value = "bpmn/getFormTemplateById")
public Object getFormTemplateById(String templateId) {
ProcessTemplates processTemplates = processTemplateService.getById(templateId);
processTemplates.setFormId(processTemplates.getTemplateId());
return R.ok(processTemplates);
}
return Result.OK(deployment.getId()); /**
* 查询表单模板数据
*
* @param templateId 模板id
* @return 模板详情数据
*/
@ApiOperation("通过模板id查看流程信息 会附带流程定义id")
@GetMapping("process/detail")
public Result<ProcessTemplates> detail(@RequestParam("templateId") String templateId){
ProcessTemplates processTemplates = processTemplateService.getById(templateId);
processTemplates.setLogo(processTemplates.getIcon());
processTemplates.setFormId(processTemplates.getTemplateId());
processTemplates.setFormName(processTemplates.getTemplateName());
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("process"+templateId).latestVersion().singleResult();
if(processDefinition==null){
throw new WorkFlowException("该流程暂未接入Flowable,请重试");
}
processTemplates.setProcessDefinitionId(processDefinition.getId());
return Result.OK(processTemplates);
} }
} }
package com.junmp.junmpProcess.dto; package com.junmp.junmpProcess.dto;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.junmp.junmpProcess.dto.json.JunmpUserInfo;
import lombok.Data; import lombok.Data;
import com.junmp.junmpProcess.dto.json.UserInfo; import com.junmp.junmpProcess.dto.json.UserInfo;
...@@ -14,7 +15,8 @@ import java.util.Map; ...@@ -14,7 +15,8 @@ import java.util.Map;
@Data @Data
public class StartProcessInstanceDTO { public class StartProcessInstanceDTO {
private String processDefinitionId; private String processDefinitionId;
private String processId;
private JSONObject formData; private JSONObject formData;
private Map<String, List<UserInfo>> processUsers; private Map<String, List<JunmpUserInfo>> processUsers;
private UserInfo startUserInfo; private JunmpUserInfo startUserInfo;
} }
package com.junmp.junmpProcess.dto; package com.junmp.junmpProcess.dto;
import com.junmp.junmpProcess.dto.json.JunmpUserInfo;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import lombok.Data; import lombok.Data;
import com.junmp.junmpProcess.dto.json.UserInfo; import com.junmp.junmpProcess.dto.json.UserInfo;
...@@ -11,5 +12,5 @@ import com.junmp.junmpProcess.dto.json.UserInfo; ...@@ -11,5 +12,5 @@ import com.junmp.junmpProcess.dto.json.UserInfo;
@Data @Data
@ApiModel("待办 需要返回给前端的VO") @ApiModel("待办 需要返回给前端的VO")
public class TaskDTO extends PageDTO { public class TaskDTO extends PageDTO {
private UserInfo currentUserInfo; private JunmpUserInfo currentUserInfo;
} }
package com.junmp.junmpProcess.dto.json;
import lombok.Data;
@Data
public class JunmpUserInfo {
private String userId;
private String sex;
private String name;
}
...@@ -44,11 +44,11 @@ public class ProcessTemplates implements Serializable { ...@@ -44,11 +44,11 @@ public class ProcessTemplates implements Serializable {
/** /**
* 摸板表单 * 摸板表单
*/ */
private String formItems; private String formJson;
private String settings; private String settings;
private String process; private String processJson;
/** /**
* 图标 * 图标
*/ */
......
...@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; ...@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.junmp.junmpProcess.dto.*; import com.junmp.junmpProcess.dto.*;
import com.junmp.junmpProcess.dto.json.*;
import com.junmp.junmpProcess.exception.WorkFlowException; import com.junmp.junmpProcess.exception.WorkFlowException;
import com.junmp.junmpProcess.service.Bussiness.WorkProcessService; import com.junmp.junmpProcess.service.Bussiness.WorkProcessService;
import com.junmp.junmpProcess.service.Repository.ProcessTemplateService; import com.junmp.junmpProcess.service.Repository.ProcessTemplateService;
...@@ -37,10 +38,6 @@ import org.flowable.task.api.Task; ...@@ -37,10 +38,6 @@ import org.flowable.task.api.Task;
import org.flowable.task.api.history.HistoricTaskInstance; import org.flowable.task.api.history.HistoricTaskInstance;
import com.junmp.junmpProcess.common.Result; import com.junmp.junmpProcess.common.Result;
import com.junmp.junmpProcess.common.WorkFlowConstants; import com.junmp.junmpProcess.common.WorkFlowConstants;
import com.junmp.junmpProcess.dto.json.ChildNode;
import com.junmp.junmpProcess.dto.json.FormOperates;
import com.junmp.junmpProcess.dto.json.SettingsInfo;
import com.junmp.junmpProcess.dto.json.UserInfo;
import com.junmp.junmpProcess.dto.json.flowJson.FlowChildNode; import com.junmp.junmpProcess.dto.json.flowJson.FlowChildNode;
import com.junmp.junmpProcess.dto.json.flowJson.Inout; import com.junmp.junmpProcess.dto.json.flowJson.Inout;
import com.junmp.junmpProcess.entity.ProcessTemplates; import com.junmp.junmpProcess.entity.ProcessTemplates;
...@@ -332,14 +329,13 @@ public class WorkProcessServiceImpl implements WorkProcessService { ...@@ -332,14 +329,13 @@ public class WorkProcessServiceImpl implements WorkProcessService {
public Object getFormGroups(String templateId) { public Object getFormGroups(String templateId) {
ProcessTemplates processTemplates = processTemplateService.getById(templateId); ProcessTemplates processTemplates = processTemplateService.getById(templateId);
processTemplates.setLogo(processTemplates.getIcon());
processTemplates.setFormId(processTemplates.getTemplateId()); processTemplates.setFormId(processTemplates.getTemplateId());
processTemplates.setFormName(processTemplates.getTemplateName()); processTemplates.setFormName(processTemplates.getFormName());
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey(PROCESS_PREFIX + templateId).latestVersion().singleResult(); ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey(PROCESS_PREFIX + templateId).latestVersion().singleResult();
if (processDefinition == null) { if (processDefinition == null) {
throw new WorkFlowException("该流程暂未接入Flowable,请重试"); throw new WorkFlowException("该流程暂未接入Flowable,请重试");
} }
processTemplates.setProcessDefinitionId(processDefinition.getId()); // processTemplates.setProcessDefinitionId(processDefinition.getId());
return processTemplates; return processTemplates;
// return null; // return null;
} }
...@@ -352,14 +348,14 @@ public class WorkProcessServiceImpl implements WorkProcessService { ...@@ -352,14 +348,14 @@ public class WorkProcessServiceImpl implements WorkProcessService {
@Override @Override
public Result<ProcessTemplates> detail(String templateId) { public Result<ProcessTemplates> detail(String templateId) {
ProcessTemplates processTemplates = processTemplateService.getById(templateId); ProcessTemplates processTemplates = processTemplateService.getById(templateId);
processTemplates.setLogo(processTemplates.getIcon()); // processTemplates.setLogo(processTemplates.getIcon());
processTemplates.setFormId(processTemplates.getTemplateId()); processTemplates.setFormId(processTemplates.getTemplateId());
processTemplates.setFormName(processTemplates.getTemplateName()); processTemplates.setFormName(processTemplates.getFormName());
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey(PROCESS_PREFIX + templateId).latestVersion().singleResult(); ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey(PROCESS_PREFIX + templateId).latestVersion().singleResult();
if (processDefinition == null) { if (processDefinition == null) {
throw new WorkFlowException("该流程暂未接入Flowable,请重试"); throw new WorkFlowException("该流程暂未接入Flowable,请重试");
} }
processTemplates.setProcessDefinitionId(processDefinition.getId()); // processTemplates.setProcessDefinitionId(processDefinition.getId());
return Result.OK(processTemplates); return Result.OK(processTemplates);
} }
...@@ -375,28 +371,63 @@ public class WorkProcessServiceImpl implements WorkProcessService { ...@@ -375,28 +371,63 @@ public class WorkProcessServiceImpl implements WorkProcessService {
JSONObject formData = processInstanceDto.getFormData(); JSONObject formData = processInstanceDto.getFormData();
UserInfo startUserInfo = processInstanceDto.getStartUserInfo(); JunmpUserInfo startUserInfo = processInstanceDto.getStartUserInfo();
Authentication.setAuthenticatedUserId(startUserInfo.getId());
Map<String, Object> processVariables = new HashMap<>();
processVariables.put(FORM_VAR, formData); Map<String,Object> processVariables= new HashMap<>();
processVariables.put(PROCESS_STATUS, BUSINESS_STATUS_1); processVariables.put(FORM_VAR,formData);
processVariables.put(START_USER_INFO, JSONObject.toJSONString(startUserInfo)); // processVariables.put(PROCESS_STATUS,BUSINESS_STATUS_1);
ArrayList<UserInfo> userInfos = CollUtil.newArrayList(startUserInfo); processVariables.put(START_USER_INFO,JSONObject.toJSONString(startUserInfo));
processVariables.put("root", JSONObject.toJSONString(userInfos)); ArrayList<JunmpUserInfo> userInfos = CollUtil.newArrayList(startUserInfo);
// processVariables.put("initiator",JSONObject.toJSONString(userInfos));
Map formValue = JSONObject.parseObject(formData.toJSONString(), new TypeReference<Map>() { Map formValue = JSONObject.parseObject(formData.toJSONString(), new TypeReference<Map>() {
}); });
processVariables.putAll(formValue); processVariables.putAll(formValue);
ProcessInstanceBuilder processInstanceBuilder = runtimeService.createProcessInstanceBuilder(); ProcessInstanceBuilder processInstanceBuilder = runtimeService.createProcessInstanceBuilder();
ProcessInstance processInstance = processInstanceBuilder ProcessInstance processInstance = processInstanceBuilder
.processDefinitionId(processInstanceDto.getProcessDefinitionId()) .processDefinitionId(processInstanceDto.getProcessId())
.variable("initiator",startUserInfo.getUserId())
.variables(processVariables) .variables(processVariables)
.businessStatus(BUSINESS_STATUS_1) .businessStatus(BUSINESS_STATUS_1)
.start(); .start();
//手动完成第一个任务
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
Object ts=new Object();
if(task!=null){
taskService.complete(task.getId());
ts=taskService.createTaskQuery().taskId(task.getId()).singleResult();
}
// ProcessInstance processInstance = processInstanceBuilder
// .variable("initiator",startUserInfo.getUserId()).start();
// .
// Authentication.setAuthenticatedUserId(startUserInfo.getUserId());
// Map<String,Object> processVariables= new HashMap<>();
// processVariables.put(FORM_VAR,formData);
// processVariables.put(PROCESS_STATUS,BUSINESS_STATUS_1);
// processVariables.put(START_USER_INFO,JSONObject.toJSONString(startUserInfo));
// ArrayList<JunmpUserInfo> userInfos = CollUtil.newArrayList(startUserInfo);
// processVariables.put("root",JSONObject.toJSONString(userInfos));
// Map formValue = JSONObject.parseObject(formData.toJSONString(), new TypeReference<Map>() {
// });
// processVariables.putAll(formValue);
// ProcessInstanceBuilder processInstanceBuilder = runtimeService.createProcessInstanceBuilder();
// ProcessInstance processInstance = processInstanceBuilder
// .processDefinitionId(processInstanceDto.getProcessDefinitionId())
// .variables(processVariables)
// .businessStatus(BUSINESS_STATUS_1)
// .start();
return Result.OK(processInstance.getId()); return Result.OK(processInstance.getId());
} catch (Exception e) { }
catch (Exception e){
Throwable cause = e.getCause(); Throwable cause = e.getCause();
if (cause instanceof WorkFlowException) { if(cause instanceof WorkFlowException){
WorkFlowException workFlowException = (WorkFlowException) cause; WorkFlowException workFlowException=(WorkFlowException)cause;
return Result.error(workFlowException.getMessage()); return Result.error(workFlowException.getMessage());
} }
e.printStackTrace(); e.printStackTrace();
...@@ -462,11 +493,11 @@ public class WorkProcessServiceImpl implements WorkProcessService { ...@@ -462,11 +493,11 @@ public class WorkProcessServiceImpl implements WorkProcessService {
*/ */
@Override @Override
public Result<Page<TaskVO>> toDoList(TaskDTO taskDTO) { public Result<Page<TaskVO>> toDoList(TaskDTO taskDTO) {
List<Task> tasks = taskService.createTaskQuery().taskAssignee(taskDTO.getCurrentUserInfo().getId()) List<Task> tasks = taskService.createTaskQuery().taskAssignee(taskDTO.getCurrentUserInfo().getUserId())
.includeProcessVariables() .includeProcessVariables()
.orderByTaskCreateTime().desc() .orderByTaskCreateTime().desc()
.listPage((taskDTO.getPageNo() - 1) * taskDTO.getPageSize(), taskDTO.getPageSize()); .listPage((taskDTO.getPageNo() - 1) * taskDTO.getPageSize(), taskDTO.getPageSize());
long count = taskService.createTaskQuery().taskAssignee(taskDTO.getCurrentUserInfo().getId()).count(); long count = taskService.createTaskQuery().taskAssignee(taskDTO.getCurrentUserInfo().getUserId()).count();
List<TaskVO> taskVOS = new ArrayList<>(); List<TaskVO> taskVOS = new ArrayList<>();
Page<TaskVO> page = new Page<>(); Page<TaskVO> page = new Page<>();
for (Task task : tasks) { for (Task task : tasks) {
...@@ -513,13 +544,13 @@ public class WorkProcessServiceImpl implements WorkProcessService { ...@@ -513,13 +544,13 @@ public class WorkProcessServiceImpl implements WorkProcessService {
@Override @Override
public Result<Page<TaskVO>> doneList(TaskDTO taskDTO) { public Result<Page<TaskVO>> doneList(TaskDTO taskDTO) {
List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery() List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery()
.taskAssignee(taskDTO.getCurrentUserInfo().getId()) .taskAssignee(taskDTO.getCurrentUserInfo().getUserId())
.finished() .finished()
.includeProcessVariables() .includeProcessVariables()
.orderByTaskCreateTime().desc() .orderByTaskCreateTime().desc()
.listPage((taskDTO.getPageNo() - 1) * taskDTO.getPageSize(), taskDTO.getPageSize()); .listPage((taskDTO.getPageNo() - 1) * taskDTO.getPageSize(), taskDTO.getPageSize());
long count = historyService.createHistoricTaskInstanceQuery() long count = historyService.createHistoricTaskInstanceQuery()
.taskAssignee(taskDTO.getCurrentUserInfo().getId()).count(); .taskAssignee(taskDTO.getCurrentUserInfo().getUserId()).count();
List<TaskVO> taskVOS = new ArrayList<>(); List<TaskVO> taskVOS = new ArrayList<>();
Page<TaskVO> page = new Page<>(); Page<TaskVO> page = new Page<>();
for (HistoricTaskInstance task : tasks) { for (HistoricTaskInstance task : tasks) {
...@@ -927,10 +958,10 @@ public class WorkProcessServiceImpl implements WorkProcessService { ...@@ -927,10 +958,10 @@ public class WorkProcessServiceImpl implements WorkProcessService {
.includeProcessVariables().singleResult(); .includeProcessVariables().singleResult();
String processDefinitionKey = historicProcessInstance.getProcessDefinitionKey(); String processDefinitionKey = historicProcessInstance.getProcessDefinitionKey();
ProcessTemplates processTemplates = processTemplateService.getById(processDefinitionKey.replace(PROCESS_PREFIX, "")); ProcessTemplates processTemplates = processTemplateService.getById(processDefinitionKey.replace(PROCESS_PREFIX, ""));
processTemplates.setLogo(processTemplates.getIcon()); // processTemplates.setLogo(processTemplates.getIcon());
processTemplates.setFormId(processTemplates.getTemplateId()); processTemplates.setFormId(processTemplates.getTemplateId());
processTemplates.setFormName(processTemplates.getTemplateName()); processTemplates.setFormName(processTemplates.getFormName());
processTemplates.setProcessDefinitionId(historicProcessInstance.getProcessDefinitionId()); // processTemplates.setProcessDefinitionId(historicProcessInstance.getProcessDefinitionId());
HandleDataVO handleDataVO = new HandleDataVO(); HandleDataVO handleDataVO = new HandleDataVO();
Map<String, Object> processVariables = historicProcessInstance.getProcessVariables(); Map<String, Object> processVariables = historicProcessInstance.getProcessVariables();
...@@ -938,7 +969,7 @@ public class WorkProcessServiceImpl implements WorkProcessService { ...@@ -938,7 +969,7 @@ public class WorkProcessServiceImpl implements WorkProcessService {
handleDataVO.setProcessInstanceId(historicProcessInstance.getId()); handleDataVO.setProcessInstanceId(historicProcessInstance.getId());
JSONObject jsonObject = (JSONObject) processVariables.get(FORM_VAR); JSONObject jsonObject = (JSONObject) processVariables.get(FORM_VAR);
handleDataVO.setFormData(jsonObject); handleDataVO.setFormData(jsonObject);
String process = processTemplates.getProcess(); String process = processTemplates.getProcessJson();
ChildNode childNode = JSONObject.parseObject(process, new TypeReference<ChildNode>() { ChildNode childNode = JSONObject.parseObject(process, new TypeReference<ChildNode>() {
}); });
SettingsInfo settingsInfo = JSONObject.parseObject(processTemplates.getSettings(), new TypeReference<SettingsInfo>() { SettingsInfo settingsInfo = JSONObject.parseObject(processTemplates.getSettings(), new TypeReference<SettingsInfo>() {
......
package com.junmp.junmpProcess.service.Repository; package com.junmp.junmpProcess.service.Repository;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.fasterxml.jackson.databind.JsonNode;
import com.junmp.junmpProcess.entity.ProcessTemplates; import com.junmp.junmpProcess.entity.ProcessTemplates;
import org.flowable.bpmn.model.BpmnModel;
/** /**
* @author : willian fu * @author : willian fu
...@@ -9,5 +11,10 @@ import com.junmp.junmpProcess.entity.ProcessTemplates; ...@@ -9,5 +11,10 @@ import com.junmp.junmpProcess.entity.ProcessTemplates;
*/ */
public interface ProcessTemplateService extends IService<ProcessTemplates> { public interface ProcessTemplateService extends IService<ProcessTemplates> {
/**
* 获取用户可见表单
*
* @return
*/
public BpmnModel toBpmn(JsonNode processNode, JsonNode formNode,String formName);
} }
package com.junmp.junmpProcess.service.Repository.impl; package com.junmp.junmpProcess.service.Repository.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.junmp.junmpProcess.common.WorkFlowConstants;
import com.junmp.junmpProcess.dto.json.flowJson.Inout;
import com.junmp.junmpProcess.entity.ProcessTemplates; import com.junmp.junmpProcess.entity.ProcessTemplates;
import com.junmp.junmpProcess.mapper.ProcessTemplatesMapper; import com.junmp.junmpProcess.mapper.ProcessTemplatesMapper;
import com.junmp.junmpProcess.service.Repository.ProcessTemplateService; import com.junmp.junmpProcess.service.Repository.ProcessTemplateService;
import com.junmp.junmpProcess.utils.IdWorker;
import com.junmp.junmpProcess.utils.JsonToELConverter;
import org.flowable.bpmn.BpmnAutoLayout;
import org.flowable.bpmn.model.*;
import org.flowable.bpmn.model.Process;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import static com.junmp.junmpProcess.common.WorkFlowConstants.START_EVENT_ID;
import static com.junmp.junmpProcess.utils.BpmnModelUtils.createEndEvent;
import static com.junmp.junmpProcess.utils.BpmnModelUtils.createStartEvent;
/** /**
* @author : willian fu * @author : willian fu
* @version : 1.0 * @version : 1.0
...@@ -15,4 +36,279 @@ import org.springframework.stereotype.Service; ...@@ -15,4 +36,279 @@ import org.springframework.stereotype.Service;
public class ProcessTemplateServiceImpl extends ServiceImpl<ProcessTemplatesMapper, ProcessTemplates> implements public class ProcessTemplateServiceImpl extends ServiceImpl<ProcessTemplatesMapper, ProcessTemplates> implements
ProcessTemplateService { ProcessTemplateService {
@Resource
private IdWorker idWorker;
@Autowired
private ProcessTemplateService processTemplateService;
public BpmnModel toBpmn(JsonNode processNode, JsonNode formNode,String formName) {
//表单存储
String formItems = formNode.toString();
String templateId = idWorker.nextId()+"";
ProcessTemplates processTemplates = ProcessTemplates.builder().build();
processTemplates.setTemplateId(templateId);
processTemplates.setFormJson(formItems);
processTemplates.setProcessJson(processNode.toString());
processTemplates.setIsStop(false);
Date date= new Date();
processTemplates.setCreated(date);
processTemplates.setUpdated(date);
processTemplateService.save(processTemplates);
JSONObject jsonObject=new JSONObject();
jsonObject.put("processJson", processNode.toString());
jsonObject.put("formJson", formItems);
// 一.准备工作
BpmnModel bpmnModel = new BpmnModel();
String id=""+ UUID.randomUUID();
bpmnModel.setTargetNamespace(id+"");
Process process = new Process(); // 相当于图纸
process.setName(formName);
process.setId("Process_"+templateId);
process.setExecutable(true);
bpmnModel.addProcess(process);
// // 二.开始结束节点
// StartEvent startEvent = createStartEvent();// 新建开始节点
//
// EndEvent endEvent = createEndEvent(); // 新建结束节点
// 二.开始结束节点
StartEvent startEvent = new StartEvent();// 新建开始节点
startEvent.setId("_start");
startEvent.setInitiator("initiator");
process.addFlowElement(startEvent);// 绘制到图纸
EndEvent endEvent = new EndEvent(); // 新建结束节点
endEvent.setId("_end");// 绘制到图纸
process.addFlowElement(endEvent);
// 三.递归绘制节点
drawNode("root",process, processNode,formNode, "_start", "_end", null);
// 四.自动布局
new BpmnAutoLayout(bpmnModel).execute();
// 五.转xml
return bpmnModel;
}
/**
* 绘制节点
* @param process bpmn process 图纸
* @param node json的节点
* @param preId 上一节点id
* @param endId 结束节点
* @param preExpression 上一节点表达式
*/
public void drawNode(String typeNode,Process process, JsonNode node,JsonNode formJson, String preId, String endId, String preExpression) {
// 根据type绘制不同种类的节点
Inout inout = drawNodeByType(process, node,formJson,typeNode);
// 绘制前一根线
process.addFlowElement(createSequenceFlow(preId, inout.getIn(), preExpression));
if (node.get("childNode").toString().equals("null")) {
// 没有下一步, 绘制指向结束的线
process.addFlowElement(createSequenceFlow(inout.getOut(), endId, null));
} else {
// 有下一步, 递归绘制下一个节点
drawNode("",process, node.get("childNode"),formJson, inout.getOut(), endId, null);
}
}
/**
* 绘制不同种类节点
* @param process
* @param node
* @return Inout
*/
private Inout drawNodeByType(Process process, JsonNode node,JsonNode formJson,String typeNode) {
if (node.get("type").toString().equals("0")) { //标准节点
return drawBzNode(process, node,formJson,typeNode);
} else if (node.get("type").toString().equals("1")) {//审核节点
return drawAuditNode(process, node);
} else if (node.get("type").toString().equals("4")) {//路由
return drawExclusiveNode(process, node);
}
else {
throw new IllegalArgumentException();
}
}
/**
* 绘制标准节点
* @param process
* @param node
* @return Inout
*/
private Inout drawBzNode(Process process, JsonNode node,JsonNode formJson,String typeNode) {
String id= "Node_"+UUID.randomUUID();
//创建发起人结点
UserTask task = new UserTask();
//设置结点ID
task.setId(id);
//设置结点名称
task.setName(node.get("name").asText());
//通过将 ${initiator} 作为指派人的值,可以将用户任务分配给流程的发起人。当流程实例启动时,${initiator} 会被替换为实际的发起人信息。
//需要注意的是,在使用表达式时,需要确保流程引擎的配置中启用了表达式语言(例如使用 Flowable 的默认配置,会启用表达式语言)。
task.setAssignee("${initiator}");
List<FormProperty> formProperties = formJsonToFormProperty(formJson);
task.setFormProperties(formProperties);
//添加连线
process.addFlowElement(task);
return new Inout(id, id);
}
private List<FormProperty> formJsonToFormProperty(JsonNode formJson){
List<FormProperty> formList=new ArrayList<>();
for (JsonNode listInfo : formJson.get("list")) {
FormProperty form=new FormProperty();
JsonNode key=listInfo.get("key");
form.setId(key.asText());
form.setName(key.asText());
formList.add(form);
}
return formList;
}
/**
* 绘制审核节点
* @param process
* @param node
* @return Inout
*/
private Inout drawAuditNode(Process process, JsonNode node) {
// 绘制节点
String id = "Node_"+UUID.randomUUID();
UserTask userTask = new UserTask();
userTask.setId(id);
//写入节点名称
userTask.setName(node.get("name").asText());
ObjectMapper objectMapper = new ObjectMapper();
JsonNode[] approverGroups = objectMapper.convertValue(node.get("approverGroups"), JsonNode[].class);
for (int i = 0; i < approverGroups.length; i++) {
JsonNode element = approverGroups[i];
JsonNode approverType = element.get("approverType");
JsonNode[] approverIds = objectMapper.convertValue(element.get("approverIds"), JsonNode[].class);
if (approverType != null) {
//指定人员
if(approverType.asText().equals("1")){
for(int j=0;j<approverIds.length;j++){
userTask.setAssignee(approverIds[j].asText());
}
}
//指定角色
if(approverType.asText().equals("2")){
userTask.setAssignee(""); //去掉指点人员
for(int j=0;j<approverIds.length;j++){
//设置后选角色
userTask.getCandidateGroups().add(approverIds[j].asText());
}
userTask.setTaskListeners(getTaskListeners());//角色监听
}
//指定本部门中的某个角色
if(approverType.asText().equals("3")){
userTask.setAssignee(""); //去掉指点人员
for(int j=0;j<approverIds.length;j++){
//设置后选角色
userTask.getCandidateGroups().add(approverIds[j].asText());
}
// 设置任务监听器 获取本部门的角色才可进行审批
userTask.setTaskListeners(getTaskListeners());
}
}
}
process.addFlowElement(userTask);
return new Inout(id, id);
}
/**
* 获取用户任务监听节点
*
* @return 监听节点列表
*/
private List<FlowableListener> getTaskListeners() {
List<FlowableListener> taskListeners = new ArrayList<>();
//监听器开始class
FlowableListener listener = new FlowableListener();
listener.setEvent("all");
listener.setImplementationType("class");
listener.setImplementation("org.example.MultiInstanceTaskListener");
taskListeners.add(listener);
return taskListeners;
}
/**
* 绘制分支节点
* @param process 绘图对象
* @param node 当前节点信息
* @return Inout
*/
private Inout drawExclusiveNode(Process process, JsonNode node) {
// 开始网关
String startId = "Exclusive_"+UUID.randomUUID();
ExclusiveGateway startGateway = new ExclusiveGateway();
startGateway.setId(startId);
process.addFlowElement(startGateway);
// 结束网关
String endId = "Exclusive_"+UUID.randomUUID();
ExclusiveGateway endGateway = new ExclusiveGateway();
endGateway.setId(endId);
process.addFlowElement(endGateway);
// 绘制分支
JsonNode branches = node.get("conditionNodes");
for (JsonNode branch : branches) {
if (branch.get("childNode").toString().equals("null")) {
// 没有子流程,直接绘制结束 内容为EL表达式
//解释JSON数据,转换为EL表达式
JsonNode conditionGroup=branch.get("conditionGroup");
String condition = JsonToELConverter.convertToEL(conditionGroup);
//条件线路 根前端数据对接 内容为EL表达式
process.addFlowElement(createSequenceFlow(startId, endId, condition));
} else {
// 有子流程,递归绘制子流程
//解释JSON数据,转换为EL表达式
JsonNode conditionGroup=branch.get("conditionGroup");
//把JSOn转换为EL表达式
String condition = JsonToELConverter.convertToEL(conditionGroup);
//条件线路 根前端数据对接 内容为EL表达式
drawNode("",process, branch.get("childNode"),null, startId, endId, condition);
}
}
// int和out不一样
return new Inout(startId, endId);
}
/**
* 创建连线
* @param from 起点
* @param to 终点
* @return SequenceFlow
*/
public SequenceFlow createSequenceFlow(String from, String to, String conditionExpression) {
SequenceFlow flow = new SequenceFlow();
flow.setId("Node_"+UUID.randomUUID());
flow.setSourceRef(from);
flow.setTargetRef(to);
if (conditionExpression != null) {
flow.setConditionExpression(conditionExpression);
}
return flow;
}
} }
package com.junmp.junmpProcess.utils; package com.junmp.junmpProcess.utils;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.junmp.junmpProcess.dto.json.flowJson.Inout; import com.junmp.junmpProcess.dto.json.flowJson.Inout;
import com.junmp.junmpProcess.entity.ProcessTemplates;
import org.flowable.bpmn.BpmnAutoLayout; import org.flowable.bpmn.BpmnAutoLayout;
import org.flowable.bpmn.converter.BpmnXMLConverter; import org.flowable.bpmn.converter.BpmnXMLConverter;
import org.flowable.bpmn.model.*; import org.flowable.bpmn.model.*;
import org.flowable.bpmn.model.Process; import org.flowable.bpmn.model.Process;
import javax.annotation.Resource;
import java.util.*; import java.util.*;
public class BpmnConvert { public class BpmnConvert {
public BpmnModel toBpmn(JsonNode node,JsonNode formNode) { public BpmnModel toBpmn(JsonNode node,JsonNode formNode) {
//表单存储
// String remark = flowEngineDTO.getRemark();
// String formItems = flowEngineDTO.getFormItems();
// String formName = flowEngineDTO.getFormName();
// String logo = flowEngineDTO.getLogo();
// Integer groupId = flowEngineDTO.getGroupId();
// String templateId = idWorker.nextId()+"";
// ProcessTemplates processTemplates = ProcessTemplates.builder().build();
// processTemplates.setTemplateId(templateId);
// processTemplates.setTemplateName(formName);
// processTemplates.setGroupId(groupId);
// processTemplates.setFormItems(formItems);
// processTemplates.setProcess(processJson);
// processTemplates.setIcon(logo);
// processTemplates.setBackground(logo);
// processTemplates.setNotify(settingsInfo.getNotify().toJSONString());
// String adminInfo = JSONObject.toJSONString(settingsInfo.getAdmin());
// processTemplates.setSettings(settingsJson);
// processTemplates.setWhoCommit(adminInfo);
// processTemplates.setWhoEdit(adminInfo);
// processTemplates.setWhoExport(adminInfo);
// processTemplates.setRemark(flowEngineDTO.getRemark());
// processTemplates.setIsStop(false);
// Date date= new Date();
// processTemplates.setCreated(date);
// processTemplates.setUpdated(date);
// processTemplateService.save(processTemplates);
// 一.准备工作 // 一.准备工作
BpmnModel bpmnModel = new BpmnModel(); BpmnModel bpmnModel = new BpmnModel();
String id=""+UUID.randomUUID(); String id=""+UUID.randomUUID();
...@@ -110,10 +140,15 @@ public class BpmnConvert { ...@@ -110,10 +140,15 @@ public class BpmnConvert {
private List<FormProperty> formJsonToFormProperty(JsonNode formJson){ private List<FormProperty> formJsonToFormProperty(JsonNode formJson){
List<FormProperty> formList=new ArrayList<>(); List<FormProperty> formList=new ArrayList<>();
FormProperty form=new FormProperty();
return null;
for (JsonNode listInfo : formJson.get("list")) {
FormProperty form=new FormProperty();
form.setName(listInfo.get("key").toString());
formList.add(form);
}
return formList;
} }
...@@ -233,7 +268,7 @@ public class BpmnConvert { ...@@ -233,7 +268,7 @@ public class BpmnConvert {
*/ */
public SequenceFlow createSequenceFlow(String from, String to, String conditionExpression) { public SequenceFlow createSequenceFlow(String from, String to, String conditionExpression) {
SequenceFlow flow = new SequenceFlow(); SequenceFlow flow = new SequenceFlow();
flow.setId(from + "-" + to); flow.setId("Node_"+UUID.randomUUID());
flow.setSourceRef(from); flow.setSourceRef(from);
flow.setTargetRef(to); flow.setTargetRef(to);
if (conditionExpression != null) { if (conditionExpression != null) {
......
...@@ -32,7 +32,7 @@ public class JsonToELConverter { ...@@ -32,7 +32,7 @@ public class JsonToELConverter {
expressionBuilder.append(" "); expressionBuilder.append(" ");
} }
expressionBuilder.append("("); // expressionBuilder.append("(");
for (int j = 0; j < conditions.length; j++) { for (int j = 0; j < conditions.length; j++) {
JsonNode conditionObject = conditions[j]; JsonNode conditionObject = conditions[j];
...@@ -58,13 +58,13 @@ public class JsonToELConverter { ...@@ -58,13 +58,13 @@ public class JsonToELConverter {
expressionBuilder.append(columnValue); expressionBuilder.append(columnValue);
expressionBuilder.append(" "); expressionBuilder.append(" ");
expressionBuilder.append(optType); expressionBuilder.append(optType);
expressionBuilder.append(" '"); expressionBuilder.append(" ");
expressionBuilder.append(conditionValues[0].asText()); expressionBuilder.append(conditionValues[0].asText());
expressionBuilder.append("'}"); expressionBuilder.append("}");
} }
} }
expressionBuilder.append(")"); // expressionBuilder.append(")");
} }
} }
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论