dcs 1 周之前
父節點
當前提交
cdcbbea1e3

+ 11 - 0
virgo.api/pom.xml

@@ -12,6 +12,11 @@
 		<version>0.0.1-SNAPSHOT</version>
 		<relativePath>../pom.xml</relativePath>
 	</parent>
+
+	<properties>
+		<jackson.version>2.13.0</jackson.version>
+	</properties>
+
 	<dependencies>
 		<!-- LEO associate dependency -->
 		<dependency>
@@ -67,6 +72,12 @@
 			<artifactId>gson</artifactId>
 		</dependency>
 
+		<dependency>
+			<groupId>io.github.imfangs</groupId>
+			<artifactId>dify-java-client</artifactId>
+			<version>1.1.2</version>
+		</dependency>
+
 	</dependencies>
 		
 	<!-- Package as an executable jar -->

+ 79 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/workark/controller/DifyController.java

@@ -0,0 +1,79 @@
+package com.bosshand.virgo.api.workark.controller;
+
+import com.bosshand.virgo.api.workark.model.DifyCompletion;
+import com.bosshand.virgo.api.workark.model.DifyType;
+import com.bosshand.virgo.api.workark.model.DifyWorkFlow;
+import com.bosshand.virgo.api.workark.service.DifyService;
+import com.bosshand.virgo.core.response.Response;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+@RestController
+@RequestMapping({"ai"})
+@Api(tags = {"dify"})
+public class DifyController {
+
+    @Autowired
+    DifyService difyService;
+
+    @ApiOperation("保存dify类型")
+    @RequestMapping(value = "/type", method = RequestMethod.POST)
+    public Response insertType(@RequestBody DifyType difyType) {
+        difyService.saveType(difyType);
+        return Response.ok();
+    }
+
+    @ApiOperation("更新dify类型")
+    @RequestMapping(value = "/type/update", method = RequestMethod.PUT)
+    public Response updateType(@RequestBody DifyType difyType) {
+        difyService.updateType(difyType);
+        return Response.ok();
+    }
+
+    @ApiOperation("查询dify类型")
+    @RequestMapping(value = "/type/query", method = RequestMethod.GET)
+    public Response getListType() {
+        return Response.ok(difyService.getListType());
+    }
+
+    @ApiOperation("执行workflow")
+    @RequestMapping(value = "/workflow/run/{difyTypeId}", method = RequestMethod.POST)
+    public Response workFlowRun(@PathVariable long difyTypeId, @RequestBody Map<String, Object> inputs) {
+        return Response.ok(difyService.workFlowRun(difyTypeId, inputs));
+    }
+
+    @ApiOperation("获取workflow执行情况")
+    @RequestMapping(value = "/workflow/{simpleUUID}", method = RequestMethod.GET)
+    public Response getWorkFlow(@PathVariable String simpleUUID) {
+        return Response.ok(difyService.getWorkFlow(simpleUUID));
+    }
+
+    @ApiOperation("获取workflow列表")
+    @RequestMapping(value = "/workflow", method = RequestMethod.POST)
+    public Response getWorkflowList(@RequestBody DifyWorkFlow difyWorkFlow) {
+        return Response.ok(difyService.getList(difyWorkFlow));
+    }
+
+    @ApiOperation("执行completion")
+    @RequestMapping(value = "/completion/run/{difyTypeId}", method = RequestMethod.POST)
+    public Response completionRun(@PathVariable long difyTypeId, @RequestBody Map<String, Object> inputs) {
+        return Response.ok(difyService.completionRun(difyTypeId, inputs));
+    }
+
+    @ApiOperation("获取completion执行情况")
+    @RequestMapping(value = "/completion/{simpleUUID}", method = RequestMethod.GET)
+    public Response getCompletion(@PathVariable String simpleUUID) {
+        return Response.ok(difyService.getCompletion(simpleUUID));
+    }
+
+    @ApiOperation("获取workflow列表")
+    @RequestMapping(value = "/completion", method = RequestMethod.POST)
+    public Response getCompletionList(@RequestBody DifyCompletion difyCompletion) {
+        return Response.ok(difyService.getCompletionList(difyCompletion));
+    }
+
+}

+ 19 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/workark/dao/DifyCompletionDao.java

@@ -0,0 +1,19 @@
+package com.bosshand.virgo.api.workark.dao;
+
+import com.bosshand.virgo.api.workark.model.DifyCompletion;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface DifyCompletionDao {
+
+    void save(DifyCompletion difyCompletion);
+
+    void update(DifyCompletion difyCompletion);
+
+    List<DifyCompletion> getList(DifyCompletion difyCompletion);
+
+    DifyCompletion getSimpleUUID(String simpleUUID);
+
+}

+ 19 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/workark/dao/DifyTypeDao.java

@@ -0,0 +1,19 @@
+package com.bosshand.virgo.api.workark.dao;
+
+import com.bosshand.virgo.api.workark.model.DifyType;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface DifyTypeDao {
+
+    void save(DifyType difyType);
+
+    void update(DifyType difyType);
+
+    List<DifyType> getList();
+
+    DifyType get(long id);
+
+}

+ 19 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/workark/dao/DifyWorkFlowDao.java

@@ -0,0 +1,19 @@
+package com.bosshand.virgo.api.workark.dao;
+
+import com.bosshand.virgo.api.workark.model.DifyWorkFlow;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface DifyWorkFlowDao {
+
+    void save(DifyWorkFlow difyWorkFlow);
+
+    void update(DifyWorkFlow difyWorkFlow);
+
+    List<DifyWorkFlow> getList(DifyWorkFlow difyWorkFlow);
+
+    DifyWorkFlow getSimpleUUID(String simpleUUID);
+
+}

+ 102 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/workark/model/DifyCompletion.java

@@ -0,0 +1,102 @@
+package com.bosshand.virgo.api.workark.model;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.util.Date;
+
+/**
+ * 文本生成应用 (Completion)
+ */
+public class DifyCompletion {
+
+    private Long id;
+
+    private String simpleUUID;
+
+    private long difyTypeId;
+
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date date;
+
+    private long userId;
+
+    private String status;
+
+    private String inputs;
+
+    private String outputs;
+
+    private String messageId;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getSimpleUUID() {
+        return simpleUUID;
+    }
+
+    public void setSimpleUUID(String simpleUUID) {
+        this.simpleUUID = simpleUUID;
+    }
+
+    public long getDifyTypeId() {
+        return difyTypeId;
+    }
+
+    public void setDifyTypeId(long difyTypeId) {
+        this.difyTypeId = difyTypeId;
+    }
+
+    public Date getDate() {
+        return date;
+    }
+
+    public void setDate(Date date) {
+        this.date = date;
+    }
+
+    public long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(long userId) {
+        this.userId = userId;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getInputs() {
+        return inputs;
+    }
+
+    public void setInputs(String inputs) {
+        this.inputs = inputs;
+    }
+
+    public String getOutputs() {
+        return outputs;
+    }
+
+    public void setOutputs(String outputs) {
+        this.outputs = outputs;
+    }
+
+    public String getMessageId() {
+        return messageId;
+    }
+
+    public void setMessageId(String messageId) {
+        this.messageId = messageId;
+    }
+}

+ 47 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/workark/model/DifyType.java

@@ -0,0 +1,47 @@
+package com.bosshand.virgo.api.workark.model;
+
+/**
+ * dify 类型
+ */
+public class DifyType {
+
+    private Long id;
+
+    private String name;
+
+    private String apiKey;
+
+    private String type;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getApiKey() {
+        return apiKey;
+    }
+
+    public void setApiKey(String apiKey) {
+        this.apiKey = apiKey;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+}

+ 162 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/workark/model/DifyWorkFlow.java

@@ -0,0 +1,162 @@
+package com.bosshand.virgo.api.workark.model;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.util.Date;
+
+/**
+ * 工作流应用 (Workflow)
+ */
+public class DifyWorkFlow {
+
+    private Long id;
+
+    private String simpleUUID;
+
+    private long difyTypeId;
+
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date date;
+
+    private long userId;
+
+    private String workflowRunId;
+
+    private String status;
+
+    private String inputs;
+
+    private String outputs;
+
+    private String createdAt;
+
+    private String finishedAt;
+
+    private Double elapsedTime;
+
+    private String error;
+
+    private int totalSteps;
+
+    private int totalTokens;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getSimpleUUID() {
+        return simpleUUID;
+    }
+
+    public void setSimpleUUID(String simpleUUID) {
+        this.simpleUUID = simpleUUID;
+    }
+
+    public long getDifyTypeId() {
+        return difyTypeId;
+    }
+
+    public void setDifyTypeId(long difyTypeId) {
+        this.difyTypeId = difyTypeId;
+    }
+
+    public Date getDate() {
+        return date;
+    }
+
+    public void setDate(Date date) {
+        this.date = date;
+    }
+
+    public long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(long userId) {
+        this.userId = userId;
+    }
+
+    public String getWorkflowRunId() {
+        return workflowRunId;
+    }
+
+    public void setWorkflowRunId(String workflowRunId) {
+        this.workflowRunId = workflowRunId;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getInputs() {
+        return inputs;
+    }
+
+    public void setInputs(String inputs) {
+        this.inputs = inputs;
+    }
+
+    public String getOutputs() {
+        return outputs;
+    }
+
+    public void setOutputs(String outputs) {
+        this.outputs = outputs;
+    }
+
+    public String getCreatedAt() {
+        return createdAt;
+    }
+
+    public void setCreatedAt(String createdAt) {
+        this.createdAt = createdAt;
+    }
+
+    public String getFinishedAt() {
+        return finishedAt;
+    }
+
+    public void setFinishedAt(String finishedAt) {
+        this.finishedAt = finishedAt;
+    }
+
+    public Double getElapsedTime() {
+        return elapsedTime;
+    }
+
+    public void setElapsedTime(Double elapsedTime) {
+        this.elapsedTime = elapsedTime;
+    }
+
+    public String getError() {
+        return error;
+    }
+
+    public void setError(String error) {
+        this.error = error;
+    }
+
+    public int getTotalSteps() {
+        return totalSteps;
+    }
+
+    public void setTotalSteps(int totalSteps) {
+        this.totalSteps = totalSteps;
+    }
+
+    public int getTotalTokens() {
+        return totalTokens;
+    }
+
+    public void setTotalTokens(int totalTokens) {
+        this.totalTokens = totalTokens;
+    }
+}

+ 269 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/workark/service/DifyService.java

@@ -0,0 +1,269 @@
+package com.bosshand.virgo.api.workark.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.bosshand.virgo.api.workark.dao.DifyCompletionDao;
+import com.bosshand.virgo.api.workark.dao.DifyTypeDao;
+import com.bosshand.virgo.api.workark.dao.DifyWorkFlowDao;
+import com.bosshand.virgo.api.workark.model.DifyCompletion;
+import com.bosshand.virgo.api.workark.model.DifyType;
+import com.bosshand.virgo.api.workark.model.DifyWorkFlow;
+import com.bosshand.virgo.core.model.UserContext;
+import com.bosshand.virgo.core.utils.ContextUtils;
+import io.github.imfangs.dify.client.DifyClientFactory;
+import io.github.imfangs.dify.client.DifyCompletionClient;
+import io.github.imfangs.dify.client.DifyWorkflowClient;
+import io.github.imfangs.dify.client.callback.CompletionStreamCallback;
+import io.github.imfangs.dify.client.callback.WorkflowStreamCallback;
+import io.github.imfangs.dify.client.enums.ResponseMode;
+import io.github.imfangs.dify.client.event.*;
+import io.github.imfangs.dify.client.exception.DifyApiException;
+import io.github.imfangs.dify.client.model.completion.CompletionRequest;
+import io.github.imfangs.dify.client.model.workflow.WorkflowRunRequest;
+import io.github.imfangs.dify.client.model.workflow.WorkflowRunStatusResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+@Service
+public class DifyService {
+
+    @Autowired
+    DifyWorkFlowDao difyWorkFlowDao;
+
+    @Autowired
+    DifyTypeDao difyTypeDao;
+
+    @Autowired
+    DifyCompletionDao difyCompletionDao;
+
+    public void saveType(DifyType difyType) {
+        difyTypeDao.save(difyType);
+    }
+
+    public void updateType(DifyType difyType) {
+        difyTypeDao.update(difyType);
+    }
+
+    public List<DifyType> getListType() {
+        return difyTypeDao.getList();
+    }
+
+    public List<DifyWorkFlow> getList(DifyWorkFlow difyWorkFlow) {
+        return difyWorkFlowDao.getList(difyWorkFlow);
+    }
+
+    /**
+     * 工作流应用
+     */
+    public String workFlowRun(long difyTypeId, Map<String, Object> inputs) {
+
+        String simpleUUID = UUID.randomUUID().toString().replace("-", "");
+
+        UserContext userContext = ContextUtils.getUserContext();
+
+        DifyType difyType = difyTypeDao.get(difyTypeId);
+
+        // 创建工作流客户端
+        DifyWorkflowClient workFlowClient = DifyClientFactory.createWorkflowClient("http://203.110.233.149:9000/v1", difyType.getApiKey());
+
+        // 创建工作流请求
+        WorkflowRunRequest request = WorkflowRunRequest.builder()
+                .inputs(inputs)
+                .responseMode(ResponseMode.STREAMING)
+                .user(userContext.getUserName() + "-" + userContext.getUserId())
+                .build();
+
+        // 执行工作流流式请求
+        try {
+            workFlowClient.runWorkflowStream(request, new WorkflowStreamCallback() {
+                @Override
+                public void onWorkflowStarted(WorkflowStartedEvent event) {
+                    System.out.println("工作流开始: " + event);
+                    startedEvent(userContext.getUserId(), difyTypeId, event.getWorkflowRunId(), simpleUUID);
+                }
+
+                @Override
+                public void onNodeStarted(NodeStartedEvent event) {
+                    //System.out.println("节点开始: " + event);
+                }
+
+                @Override
+                public void onNodeFinished(NodeFinishedEvent event) {
+                    //System.out.println("节点完成: " + event);
+                }
+
+                @Override
+                public void onWorkflowFinished(WorkflowFinishedEvent event) {
+                    //System.out.println("工作流完成: " + event);
+                }
+
+                @Override
+                public void onError(ErrorEvent event) {
+                    System.err.println("错误: " + event.getMessage());
+                }
+
+                @Override
+                public void onException(Throwable throwable) {
+                    System.err.println("异常: " + throwable.getMessage());
+                }
+            });
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (DifyApiException e) {
+            e.printStackTrace();
+        }
+        return simpleUUID;
+    }
+
+    private void startedEvent(long userId, long difyTypeId, String workflowRunId, String simpleUUID) {
+        DifyWorkFlow difyWorkFlow = new DifyWorkFlow();
+        difyWorkFlow.setSimpleUUID(simpleUUID);
+        difyWorkFlow.setDifyTypeId(difyTypeId);
+        difyWorkFlow.setUserId(userId);
+        difyWorkFlow.setWorkflowRunId(workflowRunId);
+        difyWorkFlow.setStatus("running");
+        difyWorkFlowDao.save(difyWorkFlow);
+    }
+
+    public DifyWorkFlow getWorkFlow(String simpleUUID) {
+        DifyWorkFlow df = difyWorkFlowDao.getSimpleUUID(simpleUUID);
+        if (df.getStatus().equals("succeeded")) {
+            return df;
+        }
+        WorkflowRunStatusResponse workflowRun = getWorkflowRun(df.getWorkflowRunId(), df.getDifyTypeId());
+        df.setCreatedAt(workflowRun.getCreatedAt());
+        df.setStatus(workflowRun.getStatus());
+        df.setError(workflowRun.getError());
+        df.setElapsedTime(workflowRun.getElapsedTime());
+        df.setFinishedAt(workflowRun.getFinishedAt());
+        df.setInputs(unicodeEscapeToChinese(workflowRun.getInputs().toString()));
+        df.setOutputs(unicodeEscapeToChinese(workflowRun.getOutputs().toString()));
+        df.setTotalSteps(workflowRun.getTotalSteps());
+        df.setTotalTokens(workflowRun.getTotalTokens());
+        difyWorkFlowDao.update(df);
+        return df;
+    }
+
+    private WorkflowRunStatusResponse getWorkflowRun(String workflowRunId, long difyTypeId) {
+
+        DifyType difyType = difyTypeDao.get(difyTypeId);
+
+        // 创建工作流客户端
+        DifyWorkflowClient workFlowClient = DifyClientFactory.createWorkflowClient("http://203.110.233.149:9000/v1", difyType.getApiKey());
+
+        WorkflowRunStatusResponse statusResponse = null;
+
+        // 获取工作流执行情况
+        try {
+            statusResponse = workFlowClient.getWorkflowRun(workflowRunId);
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (DifyApiException e) {
+            e.printStackTrace();
+        }
+        return statusResponse;
+    }
+
+    /**
+     * unicode转为中文
+     */
+    public String unicodeEscapeToChinese(String unicodeEscapedString) {
+        // 解码Unicode转义序列
+        StringBuilder decodedString = new StringBuilder();
+        int i = 0;
+        while (i < unicodeEscapedString.length()) {
+            if (unicodeEscapedString.startsWith("\\u", i)) {
+                // 找到一个Unicode转义序列
+                int codePoint = Integer.parseInt(unicodeEscapedString.substring(i + 2, i + 6), 16);
+                decodedString.appendCodePoint(codePoint);
+                // 跳过这个Unicode转义序列
+                i += 6;
+            } else {
+                // 不是Unicode转义序列,直接添加字符
+                decodedString.append(unicodeEscapedString.charAt(i));
+                i++;
+            }
+        }
+        return decodedString.toString();
+    }
+
+    /**
+     * 文本生成应用
+     */
+    public String completionRun(long difyTypeId, Map<String, Object> inputs) {
+
+        DifyType difyType = difyTypeDao.get(difyTypeId);
+
+        UserContext userContext = ContextUtils.getUserContext();
+
+        String simpleUUID = UUID.randomUUID().toString().replace("-", "");
+
+        DifyCompletion difyCompletion = new DifyCompletion();
+        difyCompletion.setDifyTypeId(difyTypeId);
+        difyCompletion.setStatus("running");
+        difyCompletion.setSimpleUUID(simpleUUID);
+        difyCompletion.setUserId(userContext.getUserId());
+        JSONObject json = new JSONObject(inputs);
+        difyCompletion.setInputs(json.toJSONString());
+        difyCompletionDao.save(difyCompletion);
+
+
+        DifyCompletionClient completionClient = DifyClientFactory.createCompletionClient("http://203.110.233.149:9000/v1", difyType.getApiKey());
+
+        CompletionRequest request = CompletionRequest.builder()
+                .inputs(inputs)
+                .responseMode(ResponseMode.STREAMING)
+                .user(userContext.getUserName() + "-" + userContext.getUserId())
+                .build();
+
+        StringBuilder sb = new StringBuilder();
+
+        // 发送流式请求
+        try {
+            completionClient.sendCompletionMessageStream(request, new CompletionStreamCallback() {
+                @Override
+                public void onMessage(MessageEvent event) {
+                    //System.out.println("收到消息片段: " + event.getAnswer());
+                    sb.append(event.getAnswer());
+                }
+
+                @Override
+                public void onMessageEnd(MessageEndEvent event) {
+                    System.out.println("消息结束,完整消息ID: " + event.getMessageId());
+                    DifyCompletion difyCompletion = difyCompletionDao.getSimpleUUID(simpleUUID);
+                    difyCompletion.setStatus("succeeded");
+                    difyCompletion.setMessageId(event.getMessageId());
+                    difyCompletion.setOutputs(sb.toString());
+                    difyCompletionDao.update(difyCompletion);
+                }
+
+                @Override
+                public void onError(ErrorEvent event) {
+                    System.err.println("错误: " + event.getMessage());
+                }
+
+                @Override
+                public void onException(Throwable throwable) {
+                    System.err.println("异常: " + throwable.getMessage());
+                }
+            });
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (DifyApiException e) {
+            e.printStackTrace();
+        }
+        return simpleUUID;
+    }
+
+    public DifyCompletion getCompletion(String simpleUUID) {
+        return difyCompletionDao.getSimpleUUID(simpleUUID);
+    }
+
+    public List<DifyCompletion> getCompletionList(DifyCompletion difyCompletion) {
+        return difyCompletionDao.getList(difyCompletion);
+    }
+}

+ 54 - 0
virgo.api/src/main/resources/mapper/DifyCompletionMapper.xml

@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.bosshand.virgo.api.workark.dao.DifyCompletionDao">
+
+    <resultMap type="com.bosshand.virgo.api.workark.model.DifyCompletion" id="result">
+        <id column="id" property="id"/>
+        <result column="simpleUUID" property="simpleUUID"/>
+        <result column="difyTypeId" property="difyTypeId"/>
+        <result column="date" property="date"/>
+        <result column="userId" property="userId"/>
+        <result column="inputs" property="inputs"/>
+        <result column="outputs" property="outputs"/>
+        <result column="messageId" property="messageId"/>
+        <result column="status" property="status"/>
+    </resultMap>
+
+    <insert id="save" parameterType="com.bosshand.virgo.api.workark.model.DifyCompletion" useGeneratedKeys="true" keyProperty="id">
+        INSERT INTO dify_work_completion(`simpleUUID`, `difyTypeId`, `date`, `userId`, `inputs`, `outputs`,`status`,`messageId`)
+        VALUES (#{simpleUUID}, #{difyTypeId}, now(), #{userId}, #{inputs}, #{outputs}, #{status}, #{messageId})
+    </insert>
+
+    <select id="getSimpleUUID" resultMap="result">
+        SELECT * FROM dify_work_completion where simpleUUID = #{simpleUUID}
+    </select>
+
+    <update id="update" parameterType="com.bosshand.virgo.api.workark.model.DifyCompletion">
+        UPDATE dify_work_completion
+        <trim prefix="set" suffixOverrides=",">
+            <if test="status != null">status = #{status},</if>
+            <if test="outputs != null">outputs = #{outputs},</if>
+            <if test="messageId != null">messageId = #{messageId},</if>
+        </trim>
+        WHERE id=#{id}
+    </update>
+
+    <select id="getList" resultMap="result">
+        select * from dify_work_completion
+        <where>
+            <if test="difyTypeId != 0">
+                and difyTypeId = #{difyTypeId}
+            </if>
+            <if test="userId != 0">
+                and userId = #{userId}
+            </if>
+            <if test="messageId != null">
+                and messageId = #{messageId}
+            </if>
+            <if test="status != null">
+                and status = #{status}
+            </if>
+        </where>
+    </select>
+
+</mapper>

+ 34 - 0
virgo.api/src/main/resources/mapper/DifyTypeMapper.xml

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.bosshand.virgo.api.workark.dao.DifyTypeDao">
+
+    <resultMap type="com.bosshand.virgo.api.workark.model.DifyType" id="result">
+        <id column="id" property="id"/>
+        <result column="name" property="name"/>
+        <result column="apiKey" property="apiKey"/>
+        <result column="type" property="type"/>
+    </resultMap>
+
+    <insert id="save" parameterType="com.bosshand.virgo.api.workark.model.DifyType" useGeneratedKeys="true" keyProperty="id">
+        INSERT INTO dify_type(`name`, `apiKey`, `type`) VALUES (#{name}, #{apiKey}, #{type})
+    </insert>
+
+    <update id="update" parameterType="com.bosshand.virgo.api.workark.model.DifyType">
+        UPDATE dify_type
+        <trim prefix="set" suffixOverrides=",">
+            <if test="name != null">name = #{name},</if>
+            <if test="apiKey != null">apiKey = #{apiKey},</if>
+            <if test="type != null">type = #{type},</if>
+        </trim>
+        WHERE id=#{id}
+    </update>
+
+    <select id="getList" resultMap="result">
+        select * from dify_type
+    </select>
+
+    <select id="get" resultMap="result">
+        select * from dify_type where id =#{id}
+    </select>
+
+</mapper>

+ 67 - 0
virgo.api/src/main/resources/mapper/DifyWorkFlowMapper.xml

@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.bosshand.virgo.api.workark.dao.DifyWorkFlowDao">
+
+    <resultMap type="com.bosshand.virgo.api.workark.model.DifyWorkFlow" id="result">
+        <id column="id" property="id"/>
+        <result column="simpleUUID" property="simpleUUID"/>
+        <result column="difyTypeId" property="difyTypeId"/>
+        <result column="date" property="date"/>
+        <result column="userId" property="userId"/>
+        <result column="workflowRunId" property="workflowRunId"/>
+        <result column="status" property="status"/>
+        <result column="inputs" property="inputs"/>
+        <result column="outputs" property="outputs"/>
+        <result column="createdAt" property="createdAt"/>
+        <result column="finishedAt" property="finishedAt"/>
+        <result column="elapsedTime" property="elapsedTime"/>
+        <result column="error" property="error"/>
+        <result column="totalSteps" property="totalSteps"/>
+        <result column="totalTokens" property="totalTokens"/>
+    </resultMap>
+
+    <insert id="save" parameterType="com.bosshand.virgo.api.workark.model.DifyWorkFlow" useGeneratedKeys="true" keyProperty="id">
+        INSERT INTO dify_work_flow(`simpleUUID`, `difyTypeId`, `date`, `userId`, `workflowRunId`, `status`, `inputs`, `outputs`, `createdAt`, `finishedAt`, `elapsedTime`, `error`, `totalSteps`, `totalTokens`)
+        VALUES (#{simpleUUID}, #{difyTypeId}, now(), #{userId}, #{workflowRunId}, #{status}, #{inputs}, #{outputs}, #{createdAt}, #{finishedAt}, #{elapsedTime}, #{error}, #{totalSteps}, #{totalTokens})
+    </insert>
+
+    <select id="getSimpleUUID" resultMap="result">
+        SELECT * FROM dify_work_flow where simpleUUID = #{simpleUUID}
+    </select>
+
+    <update id="update" parameterType="com.bosshand.virgo.api.workark.model.DifyWorkFlow">
+        UPDATE dify_work_flow
+        <trim prefix="set" suffixOverrides=",">
+            <if test="status != null">status = #{status},</if>
+            <if test="inputs != null">inputs = #{inputs},</if>
+            <if test="outputs != null">outputs = #{outputs},</if>
+            <if test="userId != 0">userId = #{userId},</if>
+            <if test="createdAt != null">createdAt = #{createdAt},</if>
+            <if test="finishedAt != null">finishedAt = #{finishedAt},</if>
+            <if test="elapsedTime != 0">elapsedTime = #{elapsedTime},</if>
+            <if test="error != null">error = #{error},</if>
+            <if test="totalSteps != 0">totalSteps = #{totalSteps},</if>
+            <if test="totalTokens != 0">totalTokens = #{totalTokens},</if>
+        </trim>
+        WHERE id=#{id}
+    </update>
+
+    <select id="getList" resultMap="result">
+        select * from dify_work_flow
+        <where>
+            <if test="difyTypeId != 0">
+                and difyTypeId = #{difyTypeId}
+            </if>
+            <if test="userId != 0">
+                and userId = #{userId}
+            </if>
+            <if test="workflowRunId != null">
+                and workflowRunId = #{workflowRunId}
+            </if>
+            <if test="status != null">
+                and status = #{status}
+            </if>
+        </where>
+    </select>
+
+</mapper>