|
|
|
@ -563,14 +563,18 @@ public class ProcessDefinitionService extends BaseDAGService {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* export process definition by id |
|
|
|
|
* |
|
|
|
|
* @param loginUser login user |
|
|
|
|
* @param projectName project name |
|
|
|
|
* @param processDefinitionId process definition id |
|
|
|
|
* @param response response |
|
|
|
|
* batch export process definition by ids |
|
|
|
|
* @param loginUser |
|
|
|
|
* @param projectName |
|
|
|
|
* @param processDefinitionIds |
|
|
|
|
* @param response |
|
|
|
|
*/ |
|
|
|
|
public void exportProcessDefinitionById(User loginUser, String projectName, Integer processDefinitionId, HttpServletResponse response) { |
|
|
|
|
public void batchExportProcessDefinitionByIds(User loginUser, String projectName, String processDefinitionIds, HttpServletResponse response){ |
|
|
|
|
|
|
|
|
|
if(StringUtils.isEmpty(processDefinitionIds)){ |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//export project info
|
|
|
|
|
Project project = projectMapper.queryByName(projectName); |
|
|
|
|
|
|
|
|
@ -578,39 +582,68 @@ public class ProcessDefinitionService extends BaseDAGService {
|
|
|
|
|
Map<String, Object> checkResult = projectService.checkProjectAndAuth(loginUser, project, projectName); |
|
|
|
|
Status resultStatus = (Status) checkResult.get(Constants.STATUS); |
|
|
|
|
|
|
|
|
|
if (resultStatus == Status.SUCCESS) { |
|
|
|
|
if(resultStatus != Status.SUCCESS){ |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
List<ProcessMeta> processDefinitionList = |
|
|
|
|
getProcessDefinitionList(processDefinitionIds); |
|
|
|
|
|
|
|
|
|
if(CollectionUtils.isNotEmpty(processDefinitionList)){ |
|
|
|
|
downloadProcessDefinitionFile(response, processDefinitionList); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* get process definition list by ids |
|
|
|
|
* @param processDefinitionIds |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private List<ProcessMeta> getProcessDefinitionList(String processDefinitionIds){ |
|
|
|
|
List<ProcessMeta> processDefinitionList = new ArrayList<>(); |
|
|
|
|
String[] processDefinitionIdArray = processDefinitionIds.split(","); |
|
|
|
|
for (String strProcessDefinitionId : processDefinitionIdArray) { |
|
|
|
|
//get workflow info
|
|
|
|
|
int processDefinitionId = Integer.parseInt(strProcessDefinitionId); |
|
|
|
|
ProcessDefinition processDefinition = processDefineMapper.queryByDefineId(processDefinitionId); |
|
|
|
|
|
|
|
|
|
if (null != processDefinition) { |
|
|
|
|
String exportProcessJson = exportProcessMetaDataStr(processDefinitionId, processDefinition); |
|
|
|
|
response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE); |
|
|
|
|
response.setHeader("Content-Disposition", "attachment;filename="+processDefinition.getName()+".json"); |
|
|
|
|
BufferedOutputStream buff = null; |
|
|
|
|
ServletOutputStream out = null; |
|
|
|
|
processDefinitionList.add(exportProcessMetaData(processDefinitionId, processDefinition)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return processDefinitionList; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* download the process definition file |
|
|
|
|
* @param response |
|
|
|
|
* @param processDefinitionList |
|
|
|
|
*/ |
|
|
|
|
private void downloadProcessDefinitionFile(HttpServletResponse response, List<ProcessMeta> processDefinitionList) { |
|
|
|
|
response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE); |
|
|
|
|
BufferedOutputStream buff = null; |
|
|
|
|
ServletOutputStream out = null; |
|
|
|
|
try { |
|
|
|
|
out = response.getOutputStream(); |
|
|
|
|
buff = new BufferedOutputStream(out); |
|
|
|
|
buff.write(JSON.toJSONString(processDefinitionList).getBytes(StandardCharsets.UTF_8)); |
|
|
|
|
buff.flush(); |
|
|
|
|
buff.close(); |
|
|
|
|
} catch (IOException e) { |
|
|
|
|
logger.warn("export process fail", e); |
|
|
|
|
}finally { |
|
|
|
|
if (null != buff) { |
|
|
|
|
try { |
|
|
|
|
out = response.getOutputStream(); |
|
|
|
|
buff = new BufferedOutputStream(out); |
|
|
|
|
buff.write(exportProcessJson.getBytes(StandardCharsets.UTF_8)); |
|
|
|
|
buff.flush(); |
|
|
|
|
buff.close(); |
|
|
|
|
} catch (IOException e) { |
|
|
|
|
logger.warn("export process fail", e); |
|
|
|
|
}finally { |
|
|
|
|
if (null != buff) { |
|
|
|
|
try { |
|
|
|
|
buff.close(); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
logger.warn("export process buffer not close", e); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (null != out) { |
|
|
|
|
try { |
|
|
|
|
out.close(); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
logger.warn("export process output stream not close", e); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
logger.warn("export process buffer not close", e); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (null != out) { |
|
|
|
|
try { |
|
|
|
|
out.close(); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
logger.warn("export process output stream not close", e); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -623,6 +656,17 @@ public class ProcessDefinitionService extends BaseDAGService {
|
|
|
|
|
* @return export process metadata string |
|
|
|
|
*/ |
|
|
|
|
public String exportProcessMetaDataStr(Integer processDefinitionId, ProcessDefinition processDefinition) { |
|
|
|
|
//create workflow json file
|
|
|
|
|
return JSONUtils.toJsonString(exportProcessMetaData(processDefinitionId,processDefinition)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* get export process metadata string |
|
|
|
|
* @param processDefinitionId process definition id |
|
|
|
|
* @param processDefinition process definition |
|
|
|
|
* @return export process metadata string |
|
|
|
|
*/ |
|
|
|
|
public ProcessMeta exportProcessMetaData(Integer processDefinitionId, ProcessDefinition processDefinition) { |
|
|
|
|
//correct task param which has data source or dependent param
|
|
|
|
|
String correctProcessDefinitionJson = addExportTaskNodeSpecialParam(processDefinition.getProcessDefinitionJson()); |
|
|
|
|
processDefinition.setProcessDefinitionJson(correctProcessDefinitionJson); |
|
|
|
@ -639,14 +683,6 @@ public class ProcessDefinitionService extends BaseDAGService {
|
|
|
|
|
List<Schedule> schedules = scheduleMapper.queryByProcessDefinitionId(processDefinitionId); |
|
|
|
|
if (!schedules.isEmpty()) { |
|
|
|
|
Schedule schedule = schedules.get(0); |
|
|
|
|
/*WorkerGroup workerGroup = workerGroupMapper.selectById(schedule.getWorkerGroupId()); |
|
|
|
|
|
|
|
|
|
if (null == workerGroup && schedule.getWorkerGroupId() == -1) { |
|
|
|
|
workerGroup = new WorkerGroup(); |
|
|
|
|
workerGroup.setId(-1); |
|
|
|
|
workerGroup.setName(""); |
|
|
|
|
}*/ |
|
|
|
|
|
|
|
|
|
exportProcessMeta.setScheduleWarningType(schedule.getWarningType().toString()); |
|
|
|
|
exportProcessMeta.setScheduleWarningGroupId(schedule.getWarningGroupId()); |
|
|
|
|
exportProcessMeta.setScheduleStartTime(DateUtils.dateToString(schedule.getStartTime())); |
|
|
|
@ -658,7 +694,7 @@ public class ProcessDefinitionService extends BaseDAGService {
|
|
|
|
|
exportProcessMeta.setScheduleWorkerGroupName(schedule.getWorkerGroup()); |
|
|
|
|
} |
|
|
|
|
//create workflow json file
|
|
|
|
|
return JSONUtils.toJsonString(exportProcessMeta); |
|
|
|
|
return exportProcessMeta; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
@ -705,24 +741,36 @@ public class ProcessDefinitionService extends BaseDAGService {
|
|
|
|
|
public Map<String, Object> importProcessDefinition(User loginUser, MultipartFile file, String currentProjectName) { |
|
|
|
|
Map<String, Object> result = new HashMap<>(5); |
|
|
|
|
String processMetaJson = FileUtils.file2String(file); |
|
|
|
|
ProcessMeta processMeta = JSONUtils.parseObject(processMetaJson, ProcessMeta.class); |
|
|
|
|
List<ProcessMeta> processMetaList = JSON.parseArray(processMetaJson,ProcessMeta.class); |
|
|
|
|
|
|
|
|
|
//check file content
|
|
|
|
|
if (null == processMeta) { |
|
|
|
|
if (CollectionUtils.isEmpty(processMetaList)) { |
|
|
|
|
putMsg(result, Status.DATA_IS_NULL, "fileContent"); |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
if (StringUtils.isEmpty(processMeta.getProjectName())) { |
|
|
|
|
putMsg(result, Status.DATA_IS_NULL, "projectName"); |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
if (StringUtils.isEmpty(processMeta.getProcessDefinitionName())) { |
|
|
|
|
putMsg(result, Status.DATA_IS_NULL, "processDefinitionName"); |
|
|
|
|
return result; |
|
|
|
|
|
|
|
|
|
for(ProcessMeta processMeta:processMetaList){ |
|
|
|
|
|
|
|
|
|
if (!checkAndImportProcessDefinition(loginUser, currentProjectName, result, processMeta)){ |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (StringUtils.isEmpty(processMeta.getProcessDefinitionJson())) { |
|
|
|
|
putMsg(result, Status.DATA_IS_NULL, "processDefinitionJson"); |
|
|
|
|
return result; |
|
|
|
|
|
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* check and import process definition |
|
|
|
|
* @param loginUser |
|
|
|
|
* @param currentProjectName |
|
|
|
|
* @param result |
|
|
|
|
* @param processMeta |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private boolean checkAndImportProcessDefinition(User loginUser, String currentProjectName, Map<String, Object> result, ProcessMeta processMeta) { |
|
|
|
|
|
|
|
|
|
if(!checkImportanceParams(processMeta,result)){ |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//deal with process name
|
|
|
|
@ -734,31 +782,84 @@ public class ProcessDefinitionService extends BaseDAGService {
|
|
|
|
|
processDefinitionName, 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//add special task param
|
|
|
|
|
String importProcessParam = addImportTaskNodeParam(loginUser, processMeta.getProcessDefinitionJson(), targetProject); |
|
|
|
|
// get create process result
|
|
|
|
|
Map<String, Object> createProcessResult = |
|
|
|
|
getCreateProcessResult(loginUser, |
|
|
|
|
currentProjectName, |
|
|
|
|
result, |
|
|
|
|
processMeta, |
|
|
|
|
processDefinitionName, |
|
|
|
|
addImportTaskNodeParam(loginUser, processMeta.getProcessDefinitionJson(), targetProject)); |
|
|
|
|
|
|
|
|
|
if(createProcessResult == null){ |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//create process definition
|
|
|
|
|
Integer processDefinitionId = |
|
|
|
|
Objects.isNull(createProcessResult.get("processDefinitionId"))? |
|
|
|
|
null:Integer.parseInt(createProcessResult.get("processDefinitionId").toString()); |
|
|
|
|
|
|
|
|
|
//scheduler param
|
|
|
|
|
return getImportProcessScheduleResult(loginUser, |
|
|
|
|
currentProjectName, |
|
|
|
|
result, |
|
|
|
|
processMeta, |
|
|
|
|
processDefinitionName, |
|
|
|
|
processDefinitionId); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Map<String, Object> createProcessResult; |
|
|
|
|
/** |
|
|
|
|
* get create process result |
|
|
|
|
* @param loginUser |
|
|
|
|
* @param currentProjectName |
|
|
|
|
* @param result |
|
|
|
|
* @param processMeta |
|
|
|
|
* @param processDefinitionName |
|
|
|
|
* @param importProcessParam |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private Map<String, Object> getCreateProcessResult(User loginUser, |
|
|
|
|
String currentProjectName, |
|
|
|
|
Map<String, Object> result, |
|
|
|
|
ProcessMeta processMeta, |
|
|
|
|
String processDefinitionName, |
|
|
|
|
String importProcessParam){ |
|
|
|
|
Map<String, Object> createProcessResult = null; |
|
|
|
|
try { |
|
|
|
|
createProcessResult = createProcessDefinition(loginUser |
|
|
|
|
,currentProjectName, |
|
|
|
|
processDefinitionName, |
|
|
|
|
processDefinitionName+"_import_"+System.currentTimeMillis(), |
|
|
|
|
importProcessParam, |
|
|
|
|
processMeta.getProcessDefinitionDescription(), |
|
|
|
|
processMeta.getProcessDefinitionLocations(), |
|
|
|
|
processMeta.getProcessDefinitionConnects()); |
|
|
|
|
putMsg(result, Status.SUCCESS); |
|
|
|
|
} catch (JsonProcessingException e) { |
|
|
|
|
logger.error("import process meta json data: {}", e.getMessage(), e); |
|
|
|
|
putMsg(result, Status.IMPORT_PROCESS_DEFINE_ERROR); |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
putMsg(result, Status.SUCCESS); |
|
|
|
|
//create process definition
|
|
|
|
|
Integer processDefinitionId = null; |
|
|
|
|
if (null != createProcessResult && Objects.nonNull(createProcessResult.get("processDefinitionId"))) { |
|
|
|
|
processDefinitionId = Integer.parseInt(createProcessResult.get("processDefinitionId").toString()); |
|
|
|
|
} |
|
|
|
|
//scheduler param
|
|
|
|
|
return createProcessResult; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* get import process schedule result |
|
|
|
|
* @param loginUser |
|
|
|
|
* @param currentProjectName |
|
|
|
|
* @param result |
|
|
|
|
* @param processMeta |
|
|
|
|
* @param processDefinitionName |
|
|
|
|
* @param processDefinitionId |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private boolean getImportProcessScheduleResult(User loginUser, |
|
|
|
|
String currentProjectName, |
|
|
|
|
Map<String, Object> result, |
|
|
|
|
ProcessMeta processMeta, |
|
|
|
|
String processDefinitionName, |
|
|
|
|
Integer processDefinitionId) { |
|
|
|
|
if (null != processMeta.getScheduleCrontab() && null != processDefinitionId) { |
|
|
|
|
int scheduleInsert = importProcessSchedule(loginUser, |
|
|
|
|
currentProjectName, |
|
|
|
@ -768,11 +869,33 @@ public class ProcessDefinitionService extends BaseDAGService {
|
|
|
|
|
|
|
|
|
|
if (0 == scheduleInsert) { |
|
|
|
|
putMsg(result, Status.IMPORT_PROCESS_DEFINE_ERROR); |
|
|
|
|
return result; |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return result; |
|
|
|
|
/** |
|
|
|
|
* check importance params |
|
|
|
|
* @param processMeta |
|
|
|
|
* @param result |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
private boolean checkImportanceParams(ProcessMeta processMeta,Map<String, Object> result){ |
|
|
|
|
if (StringUtils.isEmpty(processMeta.getProjectName())) { |
|
|
|
|
putMsg(result, Status.DATA_IS_NULL, "projectName"); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
if (StringUtils.isEmpty(processMeta.getProcessDefinitionName())) { |
|
|
|
|
putMsg(result, Status.DATA_IS_NULL, "processDefinitionName"); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
if (StringUtils.isEmpty(processMeta.getProcessDefinitionJson())) { |
|
|
|
|
putMsg(result, Status.DATA_IS_NULL, "processDefinitionJson"); |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|