|
@@ -0,0 +1,181 @@
|
|
|
|
|
+package com.fs.his.service.impl;
|
|
|
|
|
+
|
|
|
|
|
+import com.fs.common.utils.DateUtils;
|
|
|
|
|
+import com.fs.his.domain.FsAiWorkflow;
|
|
|
|
|
+import com.fs.his.domain.FsAiWorkflowEdge;
|
|
|
|
|
+import com.fs.his.domain.FsAiWorkflowNode;
|
|
|
|
|
+import com.fs.his.domain.FsAiWorkflowNodeType;
|
|
|
|
|
+import com.fs.his.mapper.FsAiWorkflowEdgeMapper;
|
|
|
|
|
+import com.fs.his.mapper.FsAiWorkflowMapper;
|
|
|
|
|
+import com.fs.his.mapper.FsAiWorkflowNodeMapper;
|
|
|
|
|
+import com.fs.his.mapper.FsAiWorkflowNodeTypeMapper;
|
|
|
|
|
+import com.fs.his.param.FsAiWorkflowSaveParam;
|
|
|
|
|
+import com.fs.his.service.IFsAiWorkflowService;
|
|
|
|
|
+import com.fs.his.vo.FsAiWorkflowVO;
|
|
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
+
|
|
|
|
|
+import java.util.Date;
|
|
|
|
|
+import java.util.List;
|
|
|
|
|
+import java.util.UUID;
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * AI工作流Service业务层处理
|
|
|
|
|
+ *
|
|
|
|
|
+ * @author fs
|
|
|
|
|
+ * @date 2026-01-06
|
|
|
|
|
+ */
|
|
|
|
|
+@Service
|
|
|
|
|
+public class FsAiWorkflowServiceImpl implements IFsAiWorkflowService {
|
|
|
|
|
+
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private FsAiWorkflowMapper fsAiWorkflowMapper;
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private FsAiWorkflowNodeMapper fsAiWorkflowNodeMapper;
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private FsAiWorkflowEdgeMapper fsAiWorkflowEdgeMapper;
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private FsAiWorkflowNodeTypeMapper fsAiWorkflowNodeTypeMapper;
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public FsAiWorkflowVO selectFsAiWorkflowById(Long workflowId) {
|
|
|
|
|
+ FsAiWorkflow workflow = fsAiWorkflowMapper.selectFsAiWorkflowById(workflowId);
|
|
|
|
|
+ if (workflow == null) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ FsAiWorkflowVO vo = new FsAiWorkflowVO();
|
|
|
|
|
+ BeanUtils.copyProperties(workflow, vo);
|
|
|
|
|
+ vo.setNodes(fsAiWorkflowNodeMapper.selectFsAiWorkflowNodeByWorkflowId(workflowId));
|
|
|
|
|
+ vo.setEdges(fsAiWorkflowEdgeMapper.selectFsAiWorkflowEdgeByWorkflowId(workflowId));
|
|
|
|
|
+ return vo;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public List<FsAiWorkflow> selectFsAiWorkflowList(FsAiWorkflow fsAiWorkflow) {
|
|
|
|
|
+ return fsAiWorkflowMapper.selectFsAiWorkflowList(fsAiWorkflow);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
|
|
+ public Long saveFsAiWorkflow(FsAiWorkflowSaveParam param) {
|
|
|
|
|
+ Date now = DateUtils.getNowDate();
|
|
|
|
|
+ Long workflowId = param.getWorkflowId();
|
|
|
|
|
+
|
|
|
|
|
+ if (workflowId == null) {
|
|
|
|
|
+ // 新增
|
|
|
|
|
+ FsAiWorkflow workflow = new FsAiWorkflow();
|
|
|
|
|
+ workflow.setWorkflowName(param.getWorkflowName());
|
|
|
|
|
+ workflow.setWorkflowDesc(param.getWorkflowDesc());
|
|
|
|
|
+ workflow.setWorkflowType(param.getWorkflowType());
|
|
|
|
|
+ workflow.setCanvasData(param.getCanvasData());
|
|
|
|
|
+ workflow.setStatus(1);
|
|
|
|
|
+ workflow.setVersion(1);
|
|
|
|
|
+ workflow.setCreateTime(now);
|
|
|
|
|
+ fsAiWorkflowMapper.insertFsAiWorkflow(workflow);
|
|
|
|
|
+ workflowId = workflow.getWorkflowId();
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 更新
|
|
|
|
|
+ FsAiWorkflow workflow = new FsAiWorkflow();
|
|
|
|
|
+ workflow.setWorkflowId(workflowId);
|
|
|
|
|
+ workflow.setWorkflowName(param.getWorkflowName());
|
|
|
|
|
+ workflow.setWorkflowDesc(param.getWorkflowDesc());
|
|
|
|
|
+ workflow.setWorkflowType(param.getWorkflowType());
|
|
|
|
|
+ workflow.setCanvasData(param.getCanvasData());
|
|
|
|
|
+ workflow.setUpdateTime(now);
|
|
|
|
|
+ fsAiWorkflowMapper.updateFsAiWorkflow(workflow);
|
|
|
|
|
+ // 删除旧的节点和连线
|
|
|
|
|
+ fsAiWorkflowNodeMapper.deleteFsAiWorkflowNodeByWorkflowId(workflowId);
|
|
|
|
|
+ fsAiWorkflowEdgeMapper.deleteFsAiWorkflowEdgeByWorkflowId(workflowId);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 保存节点
|
|
|
|
|
+ List<FsAiWorkflowNode> nodes = param.getNodes();
|
|
|
|
|
+ if (nodes != null && !nodes.isEmpty()) {
|
|
|
|
|
+ for (FsAiWorkflowNode node : nodes) {
|
|
|
|
|
+ node.setWorkflowId(workflowId);
|
|
|
|
|
+ node.setCreateTime(now);
|
|
|
|
|
+ }
|
|
|
|
|
+ fsAiWorkflowNodeMapper.batchInsertFsAiWorkflowNode(nodes);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 保存连线
|
|
|
|
|
+ List<FsAiWorkflowEdge> edges = param.getEdges();
|
|
|
|
|
+ if (edges != null && !edges.isEmpty()) {
|
|
|
|
|
+ for (FsAiWorkflowEdge edge : edges) {
|
|
|
|
|
+ edge.setWorkflowId(workflowId);
|
|
|
|
|
+ edge.setCreateTime(now);
|
|
|
|
|
+ }
|
|
|
|
|
+ fsAiWorkflowEdgeMapper.batchInsertFsAiWorkflowEdge(edges);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return workflowId;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public int updateFsAiWorkflowStatus(Long workflowId, Integer status) {
|
|
|
|
|
+ FsAiWorkflow workflow = new FsAiWorkflow();
|
|
|
|
|
+ workflow.setWorkflowId(workflowId);
|
|
|
|
|
+ workflow.setStatus(status);
|
|
|
|
|
+ workflow.setUpdateTime(DateUtils.getNowDate());
|
|
|
|
|
+ return fsAiWorkflowMapper.updateFsAiWorkflow(workflow);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
|
|
+ public int deleteFsAiWorkflowByIds(Long[] workflowIds) {
|
|
|
|
|
+ return fsAiWorkflowMapper.deleteFsAiWorkflowByIds(workflowIds);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
|
|
+ public Long copyFsAiWorkflow(Long workflowId) {
|
|
|
|
|
+ FsAiWorkflowVO source = selectFsAiWorkflowById(workflowId);
|
|
|
|
|
+ if (source == null) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ Date now = DateUtils.getNowDate();
|
|
|
|
|
+
|
|
|
|
|
+ // 复制工作流
|
|
|
|
|
+ FsAiWorkflow workflow = new FsAiWorkflow();
|
|
|
|
|
+ workflow.setWorkflowName(source.getWorkflowName() + "_副本");
|
|
|
|
|
+ workflow.setWorkflowDesc(source.getWorkflowDesc());
|
|
|
|
|
+ workflow.setWorkflowType(source.getWorkflowType());
|
|
|
|
|
+ workflow.setCanvasData(source.getCanvasData());
|
|
|
|
|
+ workflow.setStatus(0);
|
|
|
|
|
+ workflow.setVersion(1);
|
|
|
|
|
+ workflow.setCreateTime(now);
|
|
|
|
|
+ fsAiWorkflowMapper.insertFsAiWorkflow(workflow);
|
|
|
|
|
+ Long newWorkflowId = workflow.getWorkflowId();
|
|
|
|
|
+
|
|
|
|
|
+ // 复制节点
|
|
|
|
|
+ List<FsAiWorkflowNode> nodes = source.getNodes();
|
|
|
|
|
+ if (nodes != null && !nodes.isEmpty()) {
|
|
|
|
|
+ for (FsAiWorkflowNode node : nodes) {
|
|
|
|
|
+ node.setNodeId(null);
|
|
|
|
|
+ node.setWorkflowId(newWorkflowId);
|
|
|
|
|
+ node.setCreateTime(now);
|
|
|
|
|
+ }
|
|
|
|
|
+ fsAiWorkflowNodeMapper.batchInsertFsAiWorkflowNode(nodes);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 复制连线
|
|
|
|
|
+ List<FsAiWorkflowEdge> edges = source.getEdges();
|
|
|
|
|
+ if (edges != null && !edges.isEmpty()) {
|
|
|
|
|
+ for (FsAiWorkflowEdge edge : edges) {
|
|
|
|
|
+ edge.setEdgeId(null);
|
|
|
|
|
+ edge.setWorkflowId(newWorkflowId);
|
|
|
|
|
+ edge.setCreateTime(now);
|
|
|
|
|
+ }
|
|
|
|
|
+ fsAiWorkflowEdgeMapper.batchInsertFsAiWorkflowEdge(edges);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return newWorkflowId;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public List<FsAiWorkflowNodeType> selectAllEnabledNodeTypes() {
|
|
|
|
|
+ return fsAiWorkflowNodeTypeMapper.selectAllEnabledNodeTypes();
|
|
|
|
|
+ }
|
|
|
|
|
+}
|