diff --git a/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskCreateApi.java b/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskCreateApi.java index 1a5673e552285f47f67850bfaad1365a06fc3a64..c26d12c4d17b95b93a5d76a443968af6ebf33c16 100644 --- a/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskCreateApi.java +++ b/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskCreateApi.java @@ -4,13 +4,16 @@ import com.alibaba.fastjson.JSONObject; import neatlogic.framework.auth.core.AuthAction; import neatlogic.framework.common.constvalue.ApiParamType; import neatlogic.framework.process.auth.PROCESS_BASE; +import neatlogic.framework.process.dto.ProcessTaskCreateVo; import neatlogic.framework.restful.annotation.*; import neatlogic.framework.restful.constvalue.OperationTypeEnum; import neatlogic.framework.restful.core.privateapi.PrivateApiComponentBase; +import neatlogic.module.process.service.ProcessTaskAsyncCreateService; import neatlogic.module.process.service.ProcessTaskCreatePublicService; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.Objects; @AuthAction(action = PROCESS_BASE.class) @Service @@ -21,6 +24,9 @@ public class ProcessTaskCreateApi extends PrivateApiComponentBase { @Resource private ProcessTaskCreatePublicService processTaskCreatePublicService; + @Resource + private ProcessTaskAsyncCreateService processTaskAsyncCreateService; + @Override public String getToken() { return "processtask/create"; @@ -63,6 +69,16 @@ public class ProcessTaskCreateApi extends PrivateApiComponentBase { @Description(desc = "nmpap.processtaskcreateapi.getname") @Override public Object myDoService(JSONObject jsonObj) throws Exception { - return processTaskCreatePublicService.createProcessTask(jsonObj); + JSONObject resultObj = new JSONObject(); + ProcessTaskCreateVo processTaskCreateVo = jsonObj.toJavaObject(ProcessTaskCreateVo.class); + Integer isAsync = jsonObj.getInteger("isAsync"); + if (Objects.equals(isAsync, 1)) { + Long processTaskId = processTaskAsyncCreateService.addNewProcessTaskAsyncCreate(processTaskCreateVo); + resultObj.put("processTaskId", processTaskId); + } else { + Long processTaskId = processTaskCreatePublicService.createProcessTask(processTaskCreateVo); + resultObj.put("processTaskId", processTaskId); + } + return resultObj; } } diff --git a/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskImportFromExcelApi.java b/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskImportFromExcelApi.java index f40acc1257fac6743fb0e6a5a8a8614ca681845e..4461c4fba84cf3224683548175c6d26a75e5cf3a 100644 --- a/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskImportFromExcelApi.java +++ b/src/main/java/neatlogic/module/process/api/processtask/ProcessTaskImportFromExcelApi.java @@ -1,5 +1,7 @@ package neatlogic.module.process.api.processtask; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import neatlogic.framework.auth.core.AuthAction; import neatlogic.framework.common.constvalue.ApiParamType; import neatlogic.framework.exception.file.*; @@ -11,9 +13,6 @@ import neatlogic.framework.form.exception.FormActiveVersionNotFoundExcepiton; import neatlogic.framework.form.exception.FormNotFoundException; import neatlogic.framework.process.auth.BATCH_REPORT_PROCESS_TASK; import neatlogic.framework.process.constvalue.ProcessTaskSource; -import neatlogic.module.process.dao.mapper.catalog.ChannelMapper; -import neatlogic.module.process.dao.mapper.catalog.PriorityMapper; -import neatlogic.module.process.dao.mapper.processtask.ProcessTaskMapper; import neatlogic.framework.process.dto.*; import neatlogic.framework.process.exception.channel.ChannelNotFoundException; import neatlogic.framework.process.exception.process.ProcessNotFoundException; @@ -21,10 +20,11 @@ import neatlogic.framework.restful.annotation.*; import neatlogic.framework.restful.constvalue.OperationTypeEnum; import neatlogic.framework.restful.core.privateapi.PrivateBinaryStreamApiComponentBase; import neatlogic.framework.util.ExcelUtil; +import neatlogic.module.process.dao.mapper.catalog.ChannelMapper; +import neatlogic.module.process.dao.mapper.catalog.PriorityMapper; import neatlogic.module.process.dao.mapper.process.ProcessMapper; +import neatlogic.module.process.dao.mapper.processtask.ProcessTaskMapper; import neatlogic.module.process.service.ProcessTaskCreatePublicService; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; @@ -192,15 +192,16 @@ public class ProcessTaskImportFromExcelApi extends PrivateBinaryStreamApiCompone int successCount = 0; /** 上报工单 */ for (Map map : contentList) { - JSONObject task = parseTask(channelUuid, formAttributeVoList, map, isNeedPriority); - task.put("source", ProcessTaskSource.IMPORT.getValue()); + ProcessTaskCreateVo task = parseTask(channelUuid, formAttributeVoList, map, isNeedPriority); +// task.put("source", ProcessTaskSource.IMPORT.getValue()); + task.setSource(ProcessTaskSource.IMPORT.getValue()); ProcessTaskImportAuditVo auditVo = new ProcessTaskImportAuditVo(); auditVo.setChannelUuid(channelUuid); - auditVo.setTitle(task.getString("title")); - auditVo.setOwner(task.getString("owner")); + auditVo.setTitle(task.getTitle()); + auditVo.setOwner(task.getOwner()); try { - JSONObject resultObj = processTaskCreatePublicService.createProcessTask(task); - auditVo.setProcessTaskId(resultObj.getLong("processTaskId")); + Long processTaskId = processTaskCreatePublicService.createProcessTask(task); + auditVo.setProcessTaskId(processTaskId); auditVo.setStatus(1); successCount++; } catch (Exception e) { @@ -247,25 +248,31 @@ public class ProcessTaskImportFromExcelApi extends PrivateBinaryStreamApiCompone * @param isNeedPriority 是否需要优先级 * @return */ - private JSONObject parseTask(String channelUuid, List formAttributeList, Map map, int isNeedPriority) { - JSONObject task = new JSONObject(); + private ProcessTaskCreateVo parseTask(String channelUuid, List formAttributeList, Map map, int isNeedPriority) { +// JSONObject task = new JSONObject(); + ProcessTaskCreateVo processTaskCreateVo = new ProcessTaskCreateVo(); JSONArray formAttributeDataList = new JSONArray(); - task.put("channel", channelUuid); +// task.put("channel", channelUuid); + processTaskCreateVo.setChannel(channelUuid); for (Map.Entry entry : map.entrySet()) { String key = entry.getKey().replace("(必填)", ""); if ("标题".equals(key)) { - task.put("title", entry.getValue()); +// task.put("title", entry.getValue()); + processTaskCreateVo.setTitle(entry.getValue()); } else if ("请求人".equals(key)) { if (StringUtils.isNotBlank(entry.getValue())) { - task.put("owner", entry.getValue()); +// task.put("owner", entry.getValue()); + processTaskCreateVo.setOwner(entry.getValue()); } } else if ("优先级".equals(key)) { PriorityVo priority = null; if (isNeedPriority == 1 && StringUtils.isNotBlank(entry.getValue()) && (priority = priorityMapper.getPriorityByName(entry.getValue())) != null) { - task.put("priority", priority.getUuid()); +// task.put("priority", priority.getUuid()); + processTaskCreateVo.setPriority(priority.getUuid()); } } else if ("描述".equals(key)) { - task.put("content", entry.getValue()); +// task.put("content", entry.getValue()); + processTaskCreateVo.setContent(entry.getValue()); } else { if (CollectionUtils.isNotEmpty(formAttributeList) && formAttributeList.stream().anyMatch(o -> Objects.equals(o.getLabel(), key))) { JSONObject formdata = new JSONObject(); @@ -284,10 +291,13 @@ public class ProcessTaskImportFromExcelApi extends PrivateBinaryStreamApiCompone } } } - task.put("formAttributeDataList", formAttributeDataList); - task.put("hidecomponentList", new JSONArray()); - task.put("readcomponentList", new JSONArray()); - return task; +// task.put("formAttributeDataList", formAttributeDataList); +// task.put("hidecomponentList", new JSONArray()); +// task.put("readcomponentList", new JSONArray()); + processTaskCreateVo.setFormAttributeDataList(formAttributeDataList); + processTaskCreateVo.setHidecomponentList(new JSONArray()); + processTaskCreateVo.setReadcomponentList(new JSONArray()); + return processTaskCreateVo; } private Map getTaskDataFromFirstSheet(MultipartFile file) throws Exception { diff --git a/src/main/java/neatlogic/module/process/api/processtask/RedoAsyncCreateProcessTaskApi.java b/src/main/java/neatlogic/module/process/api/processtask/RedoAsyncCreateProcessTaskApi.java new file mode 100644 index 0000000000000000000000000000000000000000..4517e6c6344d500ba5c8ef71fb81b4719fd47645 --- /dev/null +++ b/src/main/java/neatlogic/module/process/api/processtask/RedoAsyncCreateProcessTaskApi.java @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2024 深圳极向量科技有限公司 All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package neatlogic.module.process.api.processtask; + +import com.alibaba.fastjson.JSONObject; +import neatlogic.framework.auth.core.AuthAction; +import neatlogic.framework.common.constvalue.ApiParamType; +import neatlogic.framework.process.auth.PROCESSTASK_MODIFY; +import neatlogic.framework.process.dto.ProcessTaskAsyncCreateVo; +import neatlogic.framework.restful.annotation.*; +import neatlogic.framework.restful.constvalue.OperationTypeEnum; +import neatlogic.framework.restful.core.privateapi.PrivateApiComponentBase; +import neatlogic.module.process.dao.mapper.processtask.ProcessTaskAsyncCreateMapper; +import neatlogic.module.process.dao.mapper.processtask.ProcessTaskMapper; +import neatlogic.module.process.service.ProcessTaskAsyncCreateService; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +@Service +@AuthAction(action = PROCESSTASK_MODIFY.class) +@OperationType(type = OperationTypeEnum.CREATE) +public class RedoAsyncCreateProcessTaskApi extends PrivateApiComponentBase { + + @Resource + private ProcessTaskAsyncCreateMapper processTaskAsyncCreateMapper; + + @Resource + private ProcessTaskMapper processTaskMapper; + + @Resource + private ProcessTaskAsyncCreateService processTaskAsyncCreateService; + + @Override + public String getName() { + return "nmpap.redoasynccreateprocesstaskapi.getname"; + } + + @Input({ + @Param(name = "id", type = ApiParamType.LONG, desc = "id"), + @Param(name = "serverId", type = ApiParamType.INTEGER, desc = "term.framework.serverid"), + }) + @Output({ + @Param(name = "processTaskIdList", type = ApiParamType.LONG, desc = "term.itsm.processtaskidlist") + }) + @Description(desc = "nmpap.redoasynccreateprocesstaskapi.getname") + @Override + public Object myDoService(JSONObject paramObj) throws Exception { + JSONObject resultObj = new JSONObject(); + List processTaskIdArray = new ArrayList<>(); + Long id = paramObj.getLong("id"); + Integer serverId = paramObj.getInteger("serverId"); + if (id != null) { + ProcessTaskAsyncCreateVo processTaskAsyncCreateVo = processTaskAsyncCreateMapper.getProcessTaskAsyncCreateById(id); + if (processTaskAsyncCreateVo != null && Objects.equals(processTaskAsyncCreateVo.getStatus(), "redo")) { + Long processTaskId = processTaskAsyncCreateVo.getProcessTaskId(); + if (processTaskMapper.getProcessTaskById(processTaskId) == null) { + return resultObj; + } + processTaskIdArray.add(processTaskId); + processTaskAsyncCreateService.addRedoProcessTaskAsyncCreate(processTaskAsyncCreateVo.getId()); + } + } else if (serverId != null) { + List doneIdList = new ArrayList<>(); + List redoIdList = new ArrayList<>(); + ProcessTaskAsyncCreateVo searchVo = new ProcessTaskAsyncCreateVo(); + searchVo.setStatus("redo"); + searchVo.setServerId(serverId); + int rowNum = processTaskAsyncCreateMapper.getProcessTaskAsyncCreateCount(searchVo); + if (rowNum > 0) { + searchVo.setRowNum(rowNum); + searchVo.setPageSize(100); + Integer pageCount = searchVo.getPageCount(); + for (int currentPage = 1; currentPage <= pageCount; currentPage++) { + searchVo.setCurrentPage(currentPage); + List list = processTaskAsyncCreateMapper.getProcessTaskAsyncCreateList(searchVo); + List processTaskIdList = list.stream().map(ProcessTaskAsyncCreateVo::getProcessTaskId).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(processTaskIdList)) { + processTaskIdList = processTaskMapper.checkProcessTaskIdListIsExists(processTaskIdList); + } + for (ProcessTaskAsyncCreateVo processTaskAsyncCreateVo : list) { + if (processTaskIdList.contains(processTaskAsyncCreateVo.getProcessTaskId())) { + doneIdList.add(processTaskAsyncCreateVo.getId()); + } else { + processTaskIdArray.add(processTaskAsyncCreateVo.getProcessTaskId()); + redoIdList.add(processTaskAsyncCreateVo.getId()); + } + + } + } + } + if (CollectionUtils.isNotEmpty(doneIdList)) { + processTaskAsyncCreateMapper.deleteProcessTaskAsyncCreateByIdList(doneIdList); + } + redoIdList.sort(Long::compareTo); + for (Long redoId : redoIdList) { + processTaskAsyncCreateService.addRedoProcessTaskAsyncCreate(redoId); + } + } + resultObj.put("processTaskIdList", processTaskIdArray); + return resultObj; + } + + @Override + public String getToken() { + return "processtask/asynccreate/redo"; + } +} diff --git a/src/main/java/neatlogic/module/process/api/processtask/test/TestAsyncCreateProcessTaskApi.java b/src/main/java/neatlogic/module/process/api/processtask/test/TestAsyncCreateProcessTaskApi.java new file mode 100644 index 0000000000000000000000000000000000000000..5aa05c3e3a44c3f17ae9d469f69dfebc4aef478c --- /dev/null +++ b/src/main/java/neatlogic/module/process/api/processtask/test/TestAsyncCreateProcessTaskApi.java @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2024 深圳极向量科技有限公司 All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package neatlogic.module.process.api.processtask.test; + +import com.alibaba.fastjson.JSONObject; +import neatlogic.framework.auth.core.AuthAction; +import neatlogic.framework.common.constvalue.ApiParamType; +import neatlogic.framework.process.auth.PROCESSTASK_MODIFY; +import neatlogic.framework.process.dto.ProcessTaskCreateVo; +import neatlogic.framework.restful.annotation.*; +import neatlogic.framework.restful.constvalue.OperationTypeEnum; +import neatlogic.framework.restful.core.privateapi.PrivateApiComponentBase; +import neatlogic.module.process.service.ProcessTaskAsyncCreateService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@Service +@AuthAction(action = PROCESSTASK_MODIFY.class) +@OperationType(type = OperationTypeEnum.CREATE) +public class TestAsyncCreateProcessTaskApi extends PrivateApiComponentBase { + + @Resource + private ProcessTaskAsyncCreateService processTaskAsyncCreateService; + + @Override + public String getName() { + return "nmpapt.testasynccreateprocesstaskapi.getname"; + } + + @Input({ + @Param(name = "channel", type = ApiParamType.STRING, isRequired = true, desc = "term.itsm.channel", help = "支持channelUuid和channelName入参"), + @Param(name = "title", type = ApiParamType.STRING, isRequired = true, maxLength = 80, desc = "common.title"), + @Param(name = "owner", type = ApiParamType.STRING, isRequired = true, desc = "term.itsm.owner", help = "上报人uuid和上报人id入参"), + @Param(name = "reporter", type = ApiParamType.STRING, desc = "term.itsm.reporter"), + @Param(name = "priority", type = ApiParamType.STRING, isRequired = true, desc = "common.priority"), + @Param(name = "formAttributeDataList", type = ApiParamType.JSONARRAY, desc = "term.itsm.formattributedatalist"), + @Param(name = "hidecomponentList", type = ApiParamType.JSONARRAY, desc = "term.itsm.hidecomponentlist"), + @Param(name = "readcomponentList", type = ApiParamType.JSONARRAY, desc = "term.itsm.readcomponentlist"), + @Param(name = "content", type = ApiParamType.STRING, desc = "common.content"), + @Param(name = "filePathPrefix", type = ApiParamType.STRING, defaultValue = "file:", desc = "common.filepathprefix"), + @Param(name = "filePathList", type = ApiParamType.JSONARRAY, desc = "common.filepathlist"), + @Param(name = "fileIdList", type = ApiParamType.JSONARRAY, desc = "common.fileidlist"), + @Param(name = "handlerStepInfo", type = ApiParamType.JSONOBJECT, desc = "term.itsm.handlerstepinfo"), + @Param(name = "source", type = ApiParamType.STRING, desc = "common.source"), +// @Param(name = "newProcessTaskId", type = ApiParamType.LONG, desc = "指定工单id,则会使用该id作为工单id"), + @Param(name = "region", type = ApiParamType.STRING, desc = "common.region", help = "全路径or地域id"), + @Param(name = "count", type = ApiParamType.INTEGER, isRequired = true, desc = "common.count") + }) + @Output({ + @Param(name = "processTaskIdList", type = ApiParamType.LONG, desc = "term.itsm.processtaskidlist") + }) + @Description(desc = "nmpapt.testasynccreateprocesstaskapi.getname") + @Override + public Object myDoService(JSONObject paramObj) throws Exception { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + Date startDate = new Date(); + System.out.println("start = " + dateFormat.format(startDate)); + Integer count = paramObj.getInteger("count"); + String title = paramObj.getString("title"); + String jsonString = paramObj.toJSONString(); + List processTaskIdList = new ArrayList<>(); + for (int i = 0; i < count; i++) { + ProcessTaskCreateVo processTaskCreateVo = paramObj.toJavaObject(ProcessTaskCreateVo.class); +// JSONObject config = JSONObject.parseObject(jsonString); +// Long processTaskId = SnowflakeUtil.uniqueLong(); +// config.put("newProcessTaskId", processTaskId); +// config.put("title", title + "-" + i); + processTaskCreateVo.setTitle(title + "-" + i); + Long processTaskId = processTaskAsyncCreateService.addNewProcessTaskAsyncCreate(processTaskCreateVo); + processTaskIdList.add(processTaskId); + } + Date endDate = new Date(); + System.out.println("end = " + dateFormat.format(endDate)); + System.out.println("cost = " + (endDate.getTime() - startDate.getTime())); + JSONObject resultObj = new JSONObject(); + resultObj.put("processTaskIdList", processTaskIdList); + return resultObj; + } + + @Override + public String getToken() { + return "processtask/asynccreate/test"; + } +} diff --git a/src/main/java/neatlogic/module/process/dao/mapper/processtask/ProcessTaskAsyncCreateMapper.java b/src/main/java/neatlogic/module/process/dao/mapper/processtask/ProcessTaskAsyncCreateMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..f263d9f3e618bdcdb45ab158201cc293d313613f --- /dev/null +++ b/src/main/java/neatlogic/module/process/dao/mapper/processtask/ProcessTaskAsyncCreateMapper.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2024 深圳极向量科技有限公司 All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package neatlogic.module.process.dao.mapper.processtask; + +import neatlogic.framework.process.crossover.IProcessTaskAsyncCreateCrossoverMapper; +import neatlogic.framework.process.dto.ProcessTaskAsyncCreateVo; + +import java.util.List; + +public interface ProcessTaskAsyncCreateMapper extends IProcessTaskAsyncCreateCrossoverMapper { + + ProcessTaskAsyncCreateVo getProcessTaskAsyncCreateById(Long id); + + List getProcessTaskAsyncCreateList(ProcessTaskAsyncCreateVo processTaskAsyncCreateVo); + + int getProcessTaskAsyncCreateCount(ProcessTaskAsyncCreateVo processTaskAsyncCreateVo); + + int insertProcessTaskAsyncCreate(ProcessTaskAsyncCreateVo processTaskAsyncCreateVo); + + int updateProcessTaskAsyncCreate(ProcessTaskAsyncCreateVo processTaskAsyncCreateVo); + + int deleteProcessTaskAsyncCreateById(Long id); + + int deleteProcessTaskAsyncCreateByIdList(List idList); +} diff --git a/src/main/java/neatlogic/module/process/dao/mapper/processtask/ProcessTaskAsyncCreateMapper.xml b/src/main/java/neatlogic/module/process/dao/mapper/processtask/ProcessTaskAsyncCreateMapper.xml new file mode 100644 index 0000000000000000000000000000000000000000..e217b59820403c55abcdc6ff525bfedca6c43b78 --- /dev/null +++ b/src/main/java/neatlogic/module/process/dao/mapper/processtask/ProcessTaskAsyncCreateMapper.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + INSERT INTO `processtask_async_create` ( + `id`, + `processtask_id`, + `title`, + `status`, + `config`, + `try_count`, + `server_id`, + `fcu`, + `fcd` + ) + VALUES + ( + #{id}, + #{processTaskId}, + #{title}, + #{status}, + #{configStr}, + 0, + #{serverId}, + #{fcu}, + NOW(3) + ) + + + + UPDATE `processtask_async_create` + SET + `status` = #{status}, + `error` = #{error}, + `try_count` = `try_count` + 1, + `lcd` = NOW(3) + WHERE `id` = #{id} + + + + DELETE FROM `processtask_async_create` WHERE `id` = #{value} + + + + DELETE FROM `processtask_async_create` + WHERE `id` IN + + #{id} + + + \ No newline at end of file diff --git a/src/main/java/neatlogic/module/process/service/ProcessTaskAsyncCreateService.java b/src/main/java/neatlogic/module/process/service/ProcessTaskAsyncCreateService.java new file mode 100644 index 0000000000000000000000000000000000000000..8df7859d978b0b42e6747d37111b8c3da4a7e68d --- /dev/null +++ b/src/main/java/neatlogic/module/process/service/ProcessTaskAsyncCreateService.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2024 深圳极向量科技有限公司 All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package neatlogic.module.process.service; + +import neatlogic.framework.process.dto.ProcessTaskCreateVo; + +public interface ProcessTaskAsyncCreateService { + /** + * 添加新的工单信息到阻塞队列 + * @param processTaskCreateVo + */ + Long addNewProcessTaskAsyncCreate(ProcessTaskCreateVo processTaskCreateVo); + + /** + * 添加需要重新执行的工单信息到阻塞队列 + * @param id + */ + void addRedoProcessTaskAsyncCreate(Long id); +} diff --git a/src/main/java/neatlogic/module/process/service/ProcessTaskAsyncCreateServiceImpl.java b/src/main/java/neatlogic/module/process/service/ProcessTaskAsyncCreateServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..8a348767ee35d627c962e58fdf1938ff7deaa2a8 --- /dev/null +++ b/src/main/java/neatlogic/module/process/service/ProcessTaskAsyncCreateServiceImpl.java @@ -0,0 +1,191 @@ +/* + * Copyright (C) 2024 深圳极向量科技有限公司 All Rights Reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package neatlogic.module.process.service; + +import com.alibaba.fastjson.JSONObject; +import neatlogic.framework.asynchronization.queue.NeatLogicBlockingQueue; +import neatlogic.framework.asynchronization.thread.NeatLogicThread; +import neatlogic.framework.asynchronization.threadlocal.TenantContext; +import neatlogic.framework.asynchronization.threadlocal.UserContext; +import neatlogic.framework.common.config.Config; +import neatlogic.framework.crossover.CrossoverServiceFactory; +import neatlogic.framework.dao.mapper.TenantMapper; +import neatlogic.framework.dto.TenantVo; +import neatlogic.framework.process.crossover.IProcessTaskAsyncCreateCrossoverService; +import neatlogic.framework.process.crossover.IProcessTaskCreatePublicCrossoverService; +import neatlogic.framework.process.dto.ProcessTaskAsyncCreateVo; +import neatlogic.framework.process.dto.ProcessTaskCreateVo; +import neatlogic.framework.util.SnowflakeUtil; +import neatlogic.module.process.dao.mapper.processtask.ProcessTaskAsyncCreateMapper; +import neatlogic.module.process.dao.mapper.processtask.ProcessTaskMapper; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.stream.Collectors; + +@Service +public class ProcessTaskAsyncCreateServiceImpl implements ProcessTaskAsyncCreateService, IProcessTaskAsyncCreateCrossoverService { + private static final Logger logger = LoggerFactory.getLogger(ProcessTaskAsyncCreateServiceImpl.class); + + private final static NeatLogicBlockingQueue blockingQueue = new NeatLogicBlockingQueue<>(new LinkedBlockingQueue<>()); + + @Resource + private ProcessTaskAsyncCreateMapper processTaskAsyncCreateMapper; + + @Resource + private ProcessTaskMapper processTaskMapper; + + @Resource + private TenantMapper tenantMapper; + + @PostConstruct + public void init() { + // 启动服务器时加载数据库中`processtask_async_create`表status为doing,server_id为Config.SCHEDULE_SERVER_ID的数据到blockingQueue中 + TenantContext.get().setUseDefaultDatasource(true); + List tenantList = tenantMapper.getAllActiveTenant(); + for (TenantVo tenantVo : tenantList) { + TenantContext.get().switchTenant(tenantVo.getUuid()); + List doneIdList = new ArrayList<>(); + List doingIdList = new ArrayList<>(); + ProcessTaskAsyncCreateVo searchVo = new ProcessTaskAsyncCreateVo(); + searchVo.setStatus("doing"); + searchVo.setServerId(Config.SCHEDULE_SERVER_ID); + int rowNum = processTaskAsyncCreateMapper.getProcessTaskAsyncCreateCount(searchVo); + if (rowNum > 0) { + searchVo.setRowNum(rowNum); + searchVo.setPageSize(100); + Integer pageCount = searchVo.getPageCount(); + for (int currentPage = 1; currentPage <= pageCount; currentPage++) { + searchVo.setCurrentPage(currentPage); + List list = processTaskAsyncCreateMapper.getProcessTaskAsyncCreateList(searchVo); + List processTaskIdList = list.stream().map(ProcessTaskAsyncCreateVo::getProcessTaskId).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(processTaskIdList)) { + processTaskIdList = processTaskMapper.checkProcessTaskIdListIsExists(processTaskIdList); + } + for (ProcessTaskAsyncCreateVo processTaskAsyncCreateVo : list) { + if (processTaskIdList.contains(processTaskAsyncCreateVo.getProcessTaskId())) { + doneIdList.add(processTaskAsyncCreateVo.getId()); + } else { + doingIdList.add(processTaskAsyncCreateVo.getId()); + } + } + } + } + if (CollectionUtils.isNotEmpty(doneIdList)) { + processTaskAsyncCreateMapper.deleteProcessTaskAsyncCreateByIdList(doneIdList); + } + doingIdList.sort(Long::compareTo); + for (Long id : doingIdList) { + boolean offer = blockingQueue.offer(id); + if (!offer && logger.isDebugEnabled()) { + logger.debug("异步创建工单数据加入队列失败, id: " + id); + } + } + } + TenantContext.get().setUseDefaultDatasource(true); + + Thread t = new Thread(new NeatLogicThread("ASYNC-CREATE-PROCESSTASK-MANAGER") { + @Override + protected void execute() { + IProcessTaskCreatePublicCrossoverService processTaskCreatePublicCrossoverService = CrossoverServiceFactory.getApi(IProcessTaskCreatePublicCrossoverService.class); + while (!Thread.currentThread().isInterrupted()) { + Long id = null; + try { + id = blockingQueue.take(); + ProcessTaskAsyncCreateVo processTaskAsyncCreate = processTaskAsyncCreateMapper.getProcessTaskAsyncCreateById(id); + if (processTaskAsyncCreate != null) { + processTaskCreatePublicCrossoverService.createProcessTask(processTaskAsyncCreate.getConfig()); + } + processTaskAsyncCreateMapper.deleteProcessTaskAsyncCreateById(id); + } catch (InterruptedException e) { + if (id != null) { + ProcessTaskAsyncCreateVo processTaskAsyncCreateVo = new ProcessTaskAsyncCreateVo(); + processTaskAsyncCreateVo.setId(id); + processTaskAsyncCreateVo.setStatus("failed"); + processTaskAsyncCreateVo.setError(ExceptionUtils.getStackTrace(e)); + processTaskAsyncCreateMapper.updateProcessTaskAsyncCreate(processTaskAsyncCreateVo); + } + Thread.currentThread().interrupt(); + break; + } catch (Exception e) { + if (id != null) { + ProcessTaskAsyncCreateVo processTaskAsyncCreateVo = new ProcessTaskAsyncCreateVo(); + processTaskAsyncCreateVo.setId(id); + processTaskAsyncCreateVo.setStatus("failed"); + processTaskAsyncCreateVo.setError(ExceptionUtils.getStackTrace(e)); + processTaskAsyncCreateMapper.updateProcessTaskAsyncCreate(processTaskAsyncCreateVo); + } + logger.error(e.getMessage(), e); + } + } + } + }); + t.setDaemon(true); + t.start(); + } + + @Override + public Long addNewProcessTaskAsyncCreate(ProcessTaskCreateVo processTaskCreateVo) { + if (processTaskCreateVo == null) { + return null; + } + Long processTaskId = processTaskCreateVo.getNewProcessTaskId(); + if (processTaskId != null) { + if (processTaskMapper.getProcessTaskById(processTaskId) != null) { + processTaskId = null; + } + } + if (processTaskId == null) { + processTaskId = SnowflakeUtil.uniqueLong(); + processTaskCreateVo.setNewProcessTaskId(processTaskId); + } + ProcessTaskAsyncCreateVo processTaskAsyncCreateVo = new ProcessTaskAsyncCreateVo(); + processTaskAsyncCreateVo.setProcessTaskId(processTaskId); + processTaskAsyncCreateVo.setTitle(processTaskCreateVo.getTitle()); + processTaskAsyncCreateVo.setStatus("doing"); + processTaskAsyncCreateVo.setFcu(UserContext.get().getUserUuid()); + processTaskAsyncCreateVo.setServerId(Config.SCHEDULE_SERVER_ID); + processTaskAsyncCreateVo.setConfig(processTaskCreateVo); + processTaskAsyncCreateMapper.insertProcessTaskAsyncCreate(processTaskAsyncCreateVo); + boolean offer = blockingQueue.offer(processTaskAsyncCreateVo.getId()); + if (!offer && logger.isDebugEnabled()) { + logger.debug("异步创建工单数据加入队列失败, processTaskAsyncCreateVo: " + JSONObject.toJSONString(processTaskAsyncCreateVo)); + } + return processTaskId; + } + + @Override + public void addRedoProcessTaskAsyncCreate(Long id) { + if (id == null) { + return; + } + + boolean offer = blockingQueue.offer(id); + if (!offer && logger.isDebugEnabled()) { + logger.debug("异步创建工单数据加入队列失败, id: " + id); + } + } +} diff --git a/src/main/java/neatlogic/module/process/service/ProcessTaskCreatePublicService.java b/src/main/java/neatlogic/module/process/service/ProcessTaskCreatePublicService.java index 1d336f0f918472aaccc22b9d8adcbc6596dcbe24..9ec30f6d402709fa735029b39acfb689f95f9d5b 100644 --- a/src/main/java/neatlogic/module/process/service/ProcessTaskCreatePublicService.java +++ b/src/main/java/neatlogic/module/process/service/ProcessTaskCreatePublicService.java @@ -1,14 +1,15 @@ package neatlogic.module.process.service; import com.alibaba.fastjson.JSONObject; +import neatlogic.framework.process.dto.ProcessTaskCreateVo; public interface ProcessTaskCreatePublicService { /** * 创建工单 * - * @param paramObj 创建工单所需参数 + * @param processTaskCreateVo 创建工单所需参数 * @return * @throws Exception */ - JSONObject createProcessTask(JSONObject paramObj) throws Exception; + Long createProcessTask(ProcessTaskCreateVo processTaskCreateVo) throws Exception; } diff --git a/src/main/java/neatlogic/module/process/service/ProcessTaskCreatePublicServiceImpl.java b/src/main/java/neatlogic/module/process/service/ProcessTaskCreatePublicServiceImpl.java index 45b33a88fac6a7aa79f73490267cb72ec8f5d0fb..4b94975a0b70b15de274191f1755363980f6697e 100644 --- a/src/main/java/neatlogic/module/process/service/ProcessTaskCreatePublicServiceImpl.java +++ b/src/main/java/neatlogic/module/process/service/ProcessTaskCreatePublicServiceImpl.java @@ -2,9 +2,7 @@ package neatlogic.module.process.service; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import neatlogic.framework.asynchronization.thread.NeatLogicThread; import neatlogic.framework.asynchronization.threadlocal.UserContext; -import neatlogic.framework.asynchronization.threadpool.CachedThreadPool; import neatlogic.framework.common.constvalue.SystemUser; import neatlogic.framework.dao.mapper.UserMapper; import neatlogic.framework.dao.mapper.region.RegionMapper; @@ -27,6 +25,7 @@ import neatlogic.framework.process.crossover.IProcessTaskCreatePublicCrossoverSe import neatlogic.framework.process.dto.ChannelVo; import neatlogic.framework.process.dto.PriorityVo; import neatlogic.framework.process.dto.ProcessFormVo; +import neatlogic.framework.process.dto.ProcessTaskCreateVo; import neatlogic.framework.process.exception.channel.ChannelNotFoundException; import neatlogic.framework.process.exception.priority.PriorityNotFoundException; import neatlogic.framework.process.exception.process.ProcessNotFoundException; @@ -34,7 +33,6 @@ import neatlogic.framework.process.exception.processtask.ProcessTaskNextStepIlle import neatlogic.framework.process.exception.processtask.ProcessTaskNextStepOverOneException; import neatlogic.framework.service.AuthenticationInfoService; import neatlogic.framework.service.RegionService; -import neatlogic.framework.util.SnowflakeUtil; import neatlogic.module.process.dao.mapper.catalog.ChannelMapper; import neatlogic.module.process.dao.mapper.catalog.PriorityMapper; import neatlogic.module.process.dao.mapper.process.ProcessMapper; @@ -47,7 +45,10 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; @Service public class ProcessTaskCreatePublicServiceImpl implements ProcessTaskCreatePublicService, IProcessTaskCreatePublicCrossoverService { @@ -89,15 +90,25 @@ public class ProcessTaskCreatePublicServiceImpl implements ProcessTaskCreatePubl /** * 创建工单 * - * @param paramObj + * @param processTaskCreateVo * @return * @throws Exception */ @Override - public JSONObject createProcessTask(JSONObject paramObj) throws Exception { + public Long createProcessTask(ProcessTaskCreateVo processTaskCreateVo) throws Exception { JSONObject result = new JSONObject(); + JSONObject paramObj = new JSONObject(); + paramObj.put("title", processTaskCreateVo.getTitle()); + paramObj.put("owner", processTaskCreateVo.getOwner()); + paramObj.put("reporter", processTaskCreateVo.getReporter()); + paramObj.put("hidecomponentList", processTaskCreateVo.getHidecomponentList()); + paramObj.put("readcomponentList", processTaskCreateVo.getReadcomponentList()); + paramObj.put("content", processTaskCreateVo.getContent()); + paramObj.put("fileIdList", processTaskCreateVo.getFileIdList());// + paramObj.put("handlerStepInfo", processTaskCreateVo.getHandlerStepInfo()); + paramObj.put("source", processTaskCreateVo.getSource()); //上报人,支持上报人uuid和上报人id入参 - String owner = paramObj.getString("owner"); + String owner = processTaskCreateVo.getOwner(); UserVo userVo = userMapper.getUserByUuid(owner); if (userVo == null) { userVo = userMapper.getUserByUserId(owner); @@ -107,7 +118,7 @@ public class ProcessTaskCreatePublicServiceImpl implements ProcessTaskCreatePubl paramObj.put("owner", userVo.getUuid()); } //地域 - String region = paramObj.getString("region"); + String region = processTaskCreateVo.getRegion(); Long regionId = null; if(StringUtils.isNotBlank(region)){ RegionVo regionVo = regionMapper.getRegionByUpwardNamePath(region); @@ -130,7 +141,7 @@ public class ProcessTaskCreatePublicServiceImpl implements ProcessTaskCreatePubl paramObj.put("regionId", regionId); //处理channel,支持channelUuid和channelName入参 - String channel = paramObj.getString("channel"); + String channel = processTaskCreateVo.getChannel(); ChannelVo channelVo = channelMapper.getChannelByUuid(channel); if (channelVo == null) { channelVo = channelMapper.getChannelByName(channel); @@ -140,7 +151,7 @@ public class ProcessTaskCreatePublicServiceImpl implements ProcessTaskCreatePubl } paramObj.put("channelUuid", channelVo.getUuid()); //优先级 - String priority = paramObj.getString("priority"); + String priority = processTaskCreateVo.getPriority(); if (StringUtils.isNotBlank(priority)) { PriorityVo priorityVo = priorityMapper.getPriorityByUuid(priority); if (priorityVo == null) { @@ -152,9 +163,9 @@ public class ProcessTaskCreatePublicServiceImpl implements ProcessTaskCreatePubl paramObj.put("priorityUuid", priorityVo.getUuid()); } // 附件传递文件路径 - JSONArray filePathList = paramObj.getJSONArray("filePathList"); - if( filePathList != null && filePathList.size() > 0 ){ - String filePathPrefix = paramObj.getString("filePathPrefix"); + JSONArray filePathList = processTaskCreateVo.getFilePathList(); + if( filePathList != null && !filePathList.isEmpty()){ + String filePathPrefix = processTaskCreateVo.getFilePathPrefix(); JSONArray fileIdList = new JSONArray(); // MimetypesFileTypeMap mimeTypesMap = new MimetypesFileTypeMap(); for (Object filePath: filePathList ) { @@ -176,7 +187,7 @@ public class ProcessTaskCreatePublicServiceImpl implements ProcessTaskCreatePubl throw new ProcessNotFoundException(processUuid); } //如果表单属性数据列表,使用的唯一标识是label时,需要转换成attributeUuid - JSONArray formAttributeDataList = paramObj.getJSONArray("formAttributeDataList"); + JSONArray formAttributeDataList = processTaskCreateVo.getFormAttributeDataList(); if (CollectionUtils.isNotEmpty(formAttributeDataList)) { int count = 0; for (int i = 0; i < formAttributeDataList.size(); i++) { @@ -262,9 +273,10 @@ public class ProcessTaskCreatePublicServiceImpl implements ProcessTaskCreatePubl } } } + paramObj.put("formAttributeDataList", formAttributeDataList); //代报人,支持代报人uuid和代报人id入参 - String reporter = paramObj.getString("reporter"); + String reporter = processTaskCreateVo.getReporter(); if (StringUtils.isNotBlank(reporter)) { UserVo reporterUserVo = userMapper.getUserByUuid(reporter); if (reporterUserVo == null) { @@ -285,43 +297,43 @@ public class ProcessTaskCreatePublicServiceImpl implements ProcessTaskCreatePubl } Long processTaskId = null; - Integer isAsync = paramObj.getInteger("isAsync"); - if (Objects.equals(isAsync, 1)) { - Long newProcessTaskId = SnowflakeUtil.uniqueLong(); - NeatLogicThread neatLogicThread = new NeatLogicThread("PUBLIC_CREATE_PROCESSTASK_" + newProcessTaskId, true) { - @Override - protected void execute() { - try { - //暂存 - //TODO isNeedValid 参数是否需要??? - paramObj.put("isNeedValid", 1); - JSONObject saveResultObj = processTaskService.saveProcessTaskDraft(paramObj, newProcessTaskId); - - //查询可执行下一 步骤 - Long processTaskId = saveResultObj.getLong("processTaskId"); - List nextStepIdList = processTaskMapper.getToProcessTaskStepIdListByFromIdAndType(saveResultObj.getLong("processTaskStepId"), ProcessFlowDirection.FORWARD.getValue()); - if (nextStepIdList.isEmpty()) { - throw new ProcessTaskNextStepIllegalException(processTaskId); - } - if (nextStepIdList.size() != 1) { - throw new ProcessTaskNextStepOverOneException(processTaskId); - } - saveResultObj.put("nextStepId", nextStepIdList.get(0)); - - //流转 - processTaskService.startProcessProcessTask(saveResultObj); - } catch (Exception e) { - logger.error(e.getMessage(), e); - } - } - }; - CachedThreadPool.execute(neatLogicThread); - processTaskId = newProcessTaskId; - } else { +// Integer isAsync = paramObj.getInteger("isAsync"); +// if (Objects.equals(isAsync, 1)) { +// Long newProcessTaskId = SnowflakeUtil.uniqueLong(); +// NeatLogicThread neatLogicThread = new NeatLogicThread("PUBLIC_CREATE_PROCESSTASK_" + newProcessTaskId, true) { +// @Override +// protected void execute() { +// try { +// //暂存 +// //TODO isNeedValid 参数是否需要??? +// paramObj.put("isNeedValid", 1); +// JSONObject saveResultObj = processTaskService.saveProcessTaskDraft(paramObj, newProcessTaskId); +// +// //查询可执行下一 步骤 +// Long processTaskId = saveResultObj.getLong("processTaskId"); +// List nextStepIdList = processTaskMapper.getToProcessTaskStepIdListByFromIdAndType(saveResultObj.getLong("processTaskStepId"), ProcessFlowDirection.FORWARD.getValue()); +// if (nextStepIdList.isEmpty()) { +// throw new ProcessTaskNextStepIllegalException(processTaskId); +// } +// if (nextStepIdList.size() != 1) { +// throw new ProcessTaskNextStepOverOneException(processTaskId); +// } +// saveResultObj.put("nextStepId", nextStepIdList.get(0)); +// +// //流转 +// processTaskService.startProcessProcessTask(saveResultObj); +// } catch (Exception e) { +// logger.error(e.getMessage(), e); +// } +// } +// }; +// CachedThreadPool.execute(neatLogicThread); +// processTaskId = newProcessTaskId; +// } else { //暂存 //TODO isNeedValid 参数是否需要??? paramObj.put("isNeedValid", 1); - Long newProcessTaskId = paramObj.getLong("newProcessTaskId"); + Long newProcessTaskId = processTaskCreateVo.getNewProcessTaskId(); JSONObject saveResultObj = processTaskService.saveProcessTaskDraft(paramObj, newProcessTaskId); //查询可执行下一 步骤 @@ -337,9 +349,8 @@ public class ProcessTaskCreatePublicServiceImpl implements ProcessTaskCreatePubl //流转 processTaskService.startProcessProcessTask(saveResultObj); - } +// } - result.put("processTaskId", processTaskId); - return result; + return processTaskId; } } diff --git a/src/main/resources/neatlogic/resources/process/changelog/2024-08-02/neatlogic_tenant.sql b/src/main/resources/neatlogic/resources/process/changelog/2024-08-02/neatlogic_tenant.sql new file mode 100644 index 0000000000000000000000000000000000000000..4b054c10e13559efce3dc83b1a0a5bcbd4d0acc7 --- /dev/null +++ b/src/main/resources/neatlogic/resources/process/changelog/2024-08-02/neatlogic_tenant.sql @@ -0,0 +1,15 @@ +CREATE TABLE IF NOT EXISTS `processtask_async_create` ( + `id` bigint NOT NULL COMMENT '主键ID', + `processtask_id` bigint NOT NULL COMMENT '工单ID', + `title` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '标题', + `status` enum('doing','done','failed','aborted','redo') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '状态', + `config` longtext COLLATE utf8mb4_general_ci NOT NULL COMMENT '配置信息', + `error` longtext COLLATE utf8mb4_general_ci COMMENT '异常信息', + `try_count` int NOT NULL DEFAULT '0' COMMENT '尝试次数', + `server_id` int NOT NULL COMMENT '服务器ID', + `fcu` char(32) COLLATE utf8mb4_general_ci NOT NULL COMMENT '创建人', + `fcd` timestamp(3) NOT NULL COMMENT '创建时间', + `lcd` timestamp(3) NULL DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `idx_processtask_id` (`processtask_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT = '异步创建工单表'; \ No newline at end of file diff --git a/src/main/resources/neatlogic/resources/process/changelog/2024-08-02/version.json b/src/main/resources/neatlogic/resources/process/changelog/2024-08-02/version.json new file mode 100644 index 0000000000000000000000000000000000000000..6608c91f6abeecbafc37bed662c32f092df055aa --- /dev/null +++ b/src/main/resources/neatlogic/resources/process/changelog/2024-08-02/version.json @@ -0,0 +1,10 @@ +{ + "content":[ + { + "type":"新增功能", + "detail":[ + {"msg":"1.通过changelog刷新channel表和channel_authority表数据"} + ] + } + ] +} diff --git a/src/main/resources/neatlogic/resources/process/sqlscript/ddl.sql b/src/main/resources/neatlogic/resources/process/sqlscript/ddl.sql index c397a8cc5228e56a5c1e7f824a05825ff16821d6..a5ca21798c03e6928cebb343a2f8290319718f26 100644 --- a/src/main/resources/neatlogic/resources/process/sqlscript/ddl.sql +++ b/src/main/resources/neatlogic/resources/process/sqlscript/ddl.sql @@ -653,6 +653,25 @@ CREATE TABLE IF NOT EXISTS `processtask_auto_score` ( PRIMARY KEY (`processtask_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '工单自动评分表'; +-- ---------------------------- +-- Table structure for processtask_async_create +-- ---------------------------- +CREATE TABLE IF NOT EXISTS `processtask_async_create` ( + `id` bigint NOT NULL COMMENT '主键ID', + `processtask_id` bigint NOT NULL COMMENT '工单ID', + `title` varchar(255) COLLATE utf8mb4_general_ci NOT NULL COMMENT '标题', + `status` enum('doing','done','failed','aborted','redo') CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '状态', + `config` longtext COLLATE utf8mb4_general_ci NOT NULL COMMENT '配置信息', + `error` longtext COLLATE utf8mb4_general_ci COMMENT '异常信息', + `try_count` int NOT NULL DEFAULT '0' COMMENT '尝试次数', + `server_id` int NOT NULL COMMENT '服务器ID', + `fcu` char(32) COLLATE utf8mb4_general_ci NOT NULL COMMENT '创建人', + `fcd` timestamp(3) NOT NULL COMMENT '创建时间', + `lcd` timestamp(3) NULL DEFAULT NULL COMMENT '修改时间', + PRIMARY KEY (`id`), + UNIQUE KEY `idx_processtask_id` (`processtask_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT = '异步创建工单表'; + -- ---------------------------- -- Table structure for processtask_config -- ----------------------------