Procházet zdrojové kódy

1.ai图片解析 2.解析记录

wjj před 2 dny
rodič
revize
20bbdf1639

+ 16 - 0
fs-company/src/main/java/com/fs/company/controller/handwrite/HandwriteCollectionController.java

@@ -3,7 +3,12 @@ package com.fs.company.controller.handwrite;
 import java.util.List;
 import javax.servlet.http.HttpServletResponse;
 
+import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
+import com.fs.framework.security.LoginUser;
+import com.fs.framework.service.TokenService;
+import com.fs.his.param.CollectionOrcParam;
+import com.fs.his.vo.CollectionOrcVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import com.fs.common.core.controller.BaseController;
@@ -26,6 +31,9 @@ public class HandwriteCollectionController extends BaseController
     @Autowired
     private IHandwriteCollectionService handwriteCollectionService;
 
+    @Autowired
+    private TokenService tokenService;
+
     /**
      * 查询手写信息采集表列表
      */
@@ -102,4 +110,12 @@ public class HandwriteCollectionController extends BaseController
         }
         return handwriteCollectionService.checkOrderCode(orderCode);
     }
+
+    @PostMapping("/orc")
+    public AjaxResult imageProcess(@RequestBody CollectionOrcParam param) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        param.setCompanyUserId(loginUser.getUser().getUserId());
+        CollectionOrcVO vo = handwriteCollectionService.imageProcess(param);
+        return AjaxResult.success(vo);
+    }
 }

+ 1 - 0
fs-company/src/main/java/com/fs/framework/config/SecurityConfig.java

@@ -135,6 +135,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 .antMatchers("/qw/data/**").anonymous()
                 .antMatchers("/qw/user/selectCloudByCompany").anonymous()
                 .antMatchers("/qw/user/qwExternalContactAddAndDelByRedis").anonymous()
+                .antMatchers("/handwrite/collection/**").anonymous()
                 // 除上面外的所有请求全部需要鉴权认证
                 .anyRequest().authenticated()
                 .and()

+ 90 - 0
fs-service/src/main/java/com/fs/fastgptApi/param/ChatImgParam.java

@@ -0,0 +1,90 @@
+package com.fs.fastgptApi.param;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+* 对话接口
+*/
+@Data
+public class ChatImgParam {
+
+    /**
+    * 聊天id
+    */
+    private String chatId;
+
+    //知识库id
+//    private String dataId;
+//    private String datasetId;
+
+    /**
+    * 是否开启 stream模式 (stream模式下会通过event进行区分/非stream模式结果保存在responseData)
+    */
+    private Boolean stream;
+
+    /**
+    * 是否返回中间值(模块状态,响应的完整结果等)
+    */
+    private Boolean detail;
+
+
+    /**
+    * 模块变量,一个对象,会替换模块中,输入框内容里的{{key}}
+    */
+    private Variables variables;
+
+    /**
+    * 聊天信息(对话框)
+    */
+    private List<Message> messages;
+
+
+    @Data
+    public static class Variables {
+        //客户的id?
+        private String uid;
+        /**
+        * 客户名称
+        */
+        private String name;
+
+    }
+
+
+    @Data
+    public static class Message {
+        //知识库id
+        private String dataId;
+//        private String datasetId;
+
+        /**
+        *  问题
+        */
+        private List<content> content;
+        /**
+        * 用户权限
+         * 字段用来定义消息的发送者角色,具体包括三种选择:system、user、和 assistant。
+         *
+         * system(系统):通常用于设置聊天的上下文或者提供系统级别的指示和配置信息。
+         * user(用户):代表实际的用户输入,即用户向聊天系统提出的问题或者发起的对话内容。
+         * assistant(助手):代表智能助手的回复或者动作,是模型根据用户输入给出的响应。
+        */
+        private String role;
+
+        @Data
+        public static class content {
+            private String type;
+            private String text;
+            private ImageUrl image_url;
+        }
+
+        @Data
+        public static class ImageUrl {
+            private String url;
+        }
+
+    }
+
+}

+ 3 - 0
fs-service/src/main/java/com/fs/fastgptApi/service/ChatService.java

@@ -2,6 +2,7 @@ package com.fs.fastgptApi.service;
 
 
 import com.fs.common.core.domain.R;
+import com.fs.fastgptApi.param.ChatImgParam;
 import com.fs.fastgptApi.param.ChatParam;
 
 /**
@@ -13,4 +14,6 @@ public interface ChatService {
     * 发起对话
     */
     R initiatingTakeChat(ChatParam param,String url,String appKey);
+
+    R initiatingTakeChatNew(ChatImgParam param, String url, String appKey);
 }

+ 90 - 0
fs-service/src/main/java/com/fs/fastgptApi/service/Impl/ChatServiceImpl.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.fs.common.core.domain.R;
 import com.fs.fastgptApi.config.FastGptApiConfig;
+import com.fs.fastgptApi.param.ChatImgParam;
 import com.fs.fastgptApi.param.ChatParam;
 import com.fs.fastgptApi.result.ChatDetailFStreamFResult;
 import com.fs.fastgptApi.result.ChatDetailTStreamFResult;
@@ -116,6 +117,95 @@ public class ChatServiceImpl implements ChatService {
         return null;
     }
 
+    @Override
+    public R initiatingTakeChatNew(ChatImgParam param, String url, String appKey) {
+
+        String json = HttpUtil.sendPost(param, url+FastGptApiConfig.completionsUrl, appKey);
+
+        JSONObject jsonObject = JSON.parseObject(json);
+
+        // 判断是否有回应消息
+        if(jsonObject.containsKey("choices")){
+            // 获取消息列表
+            JSONArray choices = jsonObject.getJSONArray("choices");
+            // 回复消息不为空
+            if(!choices.isEmpty()){
+                // 判断是否转人工
+                if(JSON.parseObject(choices.get(0).toString()).getJSONObject("message").getString("content").contains("【转人工】")){
+                    jsonObject.put("artificial", true);
+                }
+                if(JSON.parseObject(choices.get(0).toString()).getJSONObject("message").getString("content").contains("FunctionCallBegin")){
+                    jsonObject.put("artificial", true);
+                }
+                if(JSON.parseObject(choices.get(0).toString()).getJSONObject("message").getString("content").contains("【长对话】")){
+                    jsonObject.put("longText", true);
+                }
+
+
+
+                // 替换AI回复里面的所有的【】包括里面的字符串
+                List<JSONObject> list = choices.stream().map(e -> {
+                    JSONObject result = JSON.parseObject(e.toString());
+                    JSONObject message = result.getJSONObject("message");
+                    message.put("content", message.getString("content"));
+                    return result;
+                }).collect(Collectors.toList());
+                jsonObject.put("choices", list);
+            }
+        }
+        // 判断是否匹配知识库逻辑
+        if(jsonObject.containsKey("responseData")){
+            // 遍历查找主对话框
+            JSONArray responseData = jsonObject.getJSONArray("responseData");
+            // 筛选出主对话框里面的信息,里面的historyPreview是匹配信息
+            responseData.stream().filter(e -> "主对话框".equals(JSON.parseObject(e.toString()).getString("moduleName"))).findFirst().ifPresent(e -> {
+                // 进入方法证明以及查找主对话框
+                JSONObject eJson = JSON.parseObject(e.toString());
+                // 如果主对话框里面信息为空则不处理
+                if(!eJson.containsKey("historyPreview") || StringUtils.isEmpty(eJson.getString("historyPreview"))) return;
+                // 循环里面的所有数据
+                JSONArray historyPreview = eJson.getJSONArray("historyPreview");
+                // 判断是否包含未匹配信息  -> true:未匹配到知识库  false:已匹配到知识库
+                boolean knowledge = historyPreview.stream().anyMatch(h -> {
+                    JSONObject hJson = JSON.parseObject(h.toString());
+                    return hJson.getString("value").contains("<Data>\n\n</Data>");
+                });
+                // 之所以取反,是为了后面实体类方便查看
+                jsonObject.put("knowledge", !knowledge);
+            });
+        }
+
+
+        if (jsonObject.containsKey("code") && !("200".equals(jsonObject.getString("code")))) {
+            return R.error().put("data", JSON.parseObject(json, KnowledgeBaseResult.class));
+        }
+        if (!param.getDetail() && !param.getStream()){
+
+            ChatDetailFStreamFResult result = jsonObject.toJavaObject(ChatDetailFStreamFResult.class);
+
+            return R.ok().put("data", result);
+        }
+        // flase true 的方式不建议(即stream流的方式),都是输出完才返回,没意义
+        if (!param.getDetail() && param.getStream()){
+
+//            ChatDetailFStreamTResult result = jsonObject.toJavaObject(ChatDetailFStreamTResult.class);
+
+            return R.ok().put("data", json);
+        }
+
+        if (param.getDetail()&&!param.getStream()){
+            ChatDetailTStreamFResult result = jsonObject.toJavaObject(ChatDetailTStreamFResult.class);
+            return R.ok().put("data", result);
+        }
+
+        // true true 的方式不建议(即stream流的方式),都是输出完才返回,没意义
+        if (param.getDetail()&&param.getStream()){
+
+            return R.ok().put("data", json);
+        }
+        return null;
+    }
+
 
 
 

+ 77 - 0
fs-service/src/main/java/com/fs/handwrite/service/impl/HandwriteCollectionServiceImpl.java

@@ -1,19 +1,34 @@
 package com.fs.handwrite.service.impl;
 
 import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.domain.R;
 import com.fs.common.exception.CustomException;
+import com.fs.fastgptApi.param.ChatImgParam;
+import com.fs.fastgptApi.result.ChatDetailTStreamFResult;
+import com.fs.fastgptApi.service.ChatService;
 import com.fs.handwrite.domain.HandwriteCollection;
 import com.fs.handwrite.mapper.HandwriteCollectionMapper;
 import com.fs.handwrite.service.IHandwriteCollectionService;
+import com.fs.his.domain.FsOrcAiRecord;
+import com.fs.his.param.CollectionOrcParam;
+import com.fs.his.service.IFsOrcAiRecordService;
+import com.fs.his.vo.CollectionOrcVO;
 import com.fs.hisStore.domain.FsStoreOrderScrm;
 import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
+import com.google.gson.Gson;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.core.util.UuidUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.UUID;
 
 /**
  * 手写信息采集表Service业务层处理
@@ -31,6 +46,12 @@ public class HandwriteCollectionServiceImpl implements IHandwriteCollectionServi
     @Autowired
     private FsStoreOrderScrmMapper storeOrderScrmMapper;
 
+    @Autowired
+    private ChatService chatService;
+
+    @Autowired
+    private IFsOrcAiRecordService orcAiRecordService;
+
     @Override
     public HandwriteCollection selectHandwriteCollectionById(Integer id)
     {
@@ -97,4 +118,60 @@ public class HandwriteCollectionServiceImpl implements IHandwriteCollectionServi
         }
         return AjaxResult.success();
     }
+
+    @Override
+    @Transactional
+    public CollectionOrcVO imageProcess(CollectionOrcParam collectionOrcParam) {
+        if (StringUtils.isEmpty(collectionOrcParam.getImgUrl())) {
+            log.error("图片地址不能为空!");
+            throw new CustomException("图片地址不能为空!");
+        }
+        ChatImgParam param=new ChatImgParam();
+        param.setChatId(UuidUtil.getTimeBasedUuid().toString());
+        param.setStream(false);
+        param.setDetail(true);
+        List<ChatImgParam.Message> messageList=new ArrayList<ChatImgParam.Message>();
+        ChatImgParam.Message message = new ChatImgParam.Message();
+        message.setRole("user");
+        List<ChatImgParam.Message.content> contents = new ArrayList<>();
+
+        ChatImgParam.Message.content content = new ChatImgParam.Message.content();
+        content.setType("text");
+        content.setText("请根据提示词识别图片内容");
+        contents.add(content);
+
+        //设置上传的图片
+        ChatImgParam.Message.content contentImg = new ChatImgParam.Message.content();
+        contentImg.setType("image_url");
+        ChatImgParam.Message.ImageUrl imageUrl = new ChatImgParam.Message.ImageUrl();
+        imageUrl.setUrl(collectionOrcParam.getImgUrl());
+        contentImg.setImage_url(imageUrl);
+        contents.add(contentImg);
+
+        message.setContent(contents);
+        messageList.add(message);
+        param.setMessages(messageList);
+
+        R r = chatService.initiatingTakeChatNew(param, "http://129.28.170.206:3000/api", "fastgpt-vHaXxiy4g5pfQyFFwUsAAtqDHDpztftrVzXyh5hgMtcUjaE6dFupgKz");
+        if(!r.get("code").equals(200)){
+            CollectionOrcVO vo = new CollectionOrcVO();
+            vo.setIsParse(0);
+        }
+        ChatDetailTStreamFResult result=(ChatDetailTStreamFResult)r.get("data");
+
+        String contentKh = result.getChoices().get(0).getMessage().getContent();
+        System.out.println("模型解析图片结果:"+contentKh);
+        Gson gson = new Gson();
+        CollectionOrcVO fromJson = gson.fromJson(contentKh, CollectionOrcVO.class);
+
+        //解析记录
+        FsOrcAiRecord record = new FsOrcAiRecord();
+        record.setCollectionId(collectionOrcParam.getCollectionId());
+        record.setCompanyUserId(collectionOrcParam.getCompanyUserId());
+        record.setImgUrl(collectionOrcParam.getImgUrl());
+        record.setCreateTime(new Date());
+        record.setUpdateTime(new Date());
+        orcAiRecordService.insertFsOrcAiRecord(record);
+        return fromJson;
+    }
 }

+ 30 - 0
fs-service/src/main/java/com/fs/his/domain/FsOrcAiRecord.java

@@ -0,0 +1,30 @@
+package com.fs.his.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+import com.fs.common.core.domain.BaseEntity;
+import lombok.EqualsAndHashCode;
+
+/**
+ * ai识别图片记录对象 fs_orc_ai_record
+ *
+ * @author fs
+ * @date 2026-05-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FsOrcAiRecord extends BaseEntity{
+
+    /** $column.columnComment */
+    private Long id;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String imgUrl;
+
+    /** 销售id */
+    @Excel(name = "销售id")
+    private Long companyUserId;
+
+}

+ 61 - 0
fs-service/src/main/java/com/fs/his/mapper/FsOrcAiRecordMapper.java

@@ -0,0 +1,61 @@
+package com.fs.his.mapper;
+
+import java.util.List;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fs.his.domain.FsOrcAiRecord;
+
+/**
+ * ai识别图片记录Mapper接口
+ * 
+ * @author fs
+ * @date 2026-05-20
+ */
+public interface FsOrcAiRecordMapper extends BaseMapper<FsOrcAiRecord>{
+    /**
+     * 查询ai识别图片记录
+     * 
+     * @param id ai识别图片记录主键
+     * @return ai识别图片记录
+     */
+    FsOrcAiRecord selectFsOrcAiRecordById(Long id);
+
+    /**
+     * 查询ai识别图片记录列表
+     * 
+     * @param fsOrcAiRecord ai识别图片记录
+     * @return ai识别图片记录集合
+     */
+    List<FsOrcAiRecord> selectFsOrcAiRecordList(FsOrcAiRecord fsOrcAiRecord);
+
+    /**
+     * 新增ai识别图片记录
+     * 
+     * @param fsOrcAiRecord ai识别图片记录
+     * @return 结果
+     */
+    int insertFsOrcAiRecord(FsOrcAiRecord fsOrcAiRecord);
+
+    /**
+     * 修改ai识别图片记录
+     * 
+     * @param fsOrcAiRecord ai识别图片记录
+     * @return 结果
+     */
+    int updateFsOrcAiRecord(FsOrcAiRecord fsOrcAiRecord);
+
+    /**
+     * 删除ai识别图片记录
+     * 
+     * @param id ai识别图片记录主键
+     * @return 结果
+     */
+    int deleteFsOrcAiRecordById(Long id);
+
+    /**
+     * 批量删除ai识别图片记录
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    int deleteFsOrcAiRecordByIds(Long[] ids);
+}

+ 14 - 0
fs-service/src/main/java/com/fs/his/param/CollectionOrcParam.java

@@ -0,0 +1,14 @@
+package com.fs.his.param;
+
+import lombok.Data;
+
+@Data
+public class CollectionOrcParam {
+
+    private Long companyUserId;
+
+    private String imgUrl;
+
+    private Long collectionId;
+
+}

+ 61 - 0
fs-service/src/main/java/com/fs/his/service/IFsOrcAiRecordService.java

@@ -0,0 +1,61 @@
+package com.fs.his.service;
+
+import java.util.List;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.his.domain.FsOrcAiRecord;
+
+/**
+ * ai识别图片记录Service接口
+ * 
+ * @author fs
+ * @date 2026-05-20
+ */
+public interface IFsOrcAiRecordService extends IService<FsOrcAiRecord>{
+    /**
+     * 查询ai识别图片记录
+     * 
+     * @param id ai识别图片记录主键
+     * @return ai识别图片记录
+     */
+    FsOrcAiRecord selectFsOrcAiRecordById(Long id);
+
+    /**
+     * 查询ai识别图片记录列表
+     * 
+     * @param fsOrcAiRecord ai识别图片记录
+     * @return ai识别图片记录集合
+     */
+    List<FsOrcAiRecord> selectFsOrcAiRecordList(FsOrcAiRecord fsOrcAiRecord);
+
+    /**
+     * 新增ai识别图片记录
+     * 
+     * @param fsOrcAiRecord ai识别图片记录
+     * @return 结果
+     */
+    int insertFsOrcAiRecord(FsOrcAiRecord fsOrcAiRecord);
+
+    /**
+     * 修改ai识别图片记录
+     * 
+     * @param fsOrcAiRecord ai识别图片记录
+     * @return 结果
+     */
+    int updateFsOrcAiRecord(FsOrcAiRecord fsOrcAiRecord);
+
+    /**
+     * 批量删除ai识别图片记录
+     * 
+     * @param ids 需要删除的ai识别图片记录主键集合
+     * @return 结果
+     */
+    int deleteFsOrcAiRecordByIds(Long[] ids);
+
+    /**
+     * 删除ai识别图片记录信息
+     * 
+     * @param id ai识别图片记录主键
+     * @return 结果
+     */
+    int deleteFsOrcAiRecordById(Long id);
+}

+ 94 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsOrcAiRecordServiceImpl.java

@@ -0,0 +1,94 @@
+package com.fs.his.service.impl;
+
+import java.util.List;
+import com.fs.common.utils.DateUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.fs.his.mapper.FsOrcAiRecordMapper;
+import com.fs.his.domain.FsOrcAiRecord;
+import com.fs.his.service.IFsOrcAiRecordService;
+
+/**
+ * ai识别图片记录Service业务层处理
+ * 
+ * @author fs
+ * @date 2026-05-20
+ */
+@Service
+public class FsOrcAiRecordServiceImpl extends ServiceImpl<FsOrcAiRecordMapper, FsOrcAiRecord> implements IFsOrcAiRecordService {
+
+    /**
+     * 查询ai识别图片记录
+     * 
+     * @param id ai识别图片记录主键
+     * @return ai识别图片记录
+     */
+    @Override
+    public FsOrcAiRecord selectFsOrcAiRecordById(Long id)
+    {
+        return baseMapper.selectFsOrcAiRecordById(id);
+    }
+
+    /**
+     * 查询ai识别图片记录列表
+     * 
+     * @param fsOrcAiRecord ai识别图片记录
+     * @return ai识别图片记录
+     */
+    @Override
+    public List<FsOrcAiRecord> selectFsOrcAiRecordList(FsOrcAiRecord fsOrcAiRecord)
+    {
+        return baseMapper.selectFsOrcAiRecordList(fsOrcAiRecord);
+    }
+
+    /**
+     * 新增ai识别图片记录
+     * 
+     * @param fsOrcAiRecord ai识别图片记录
+     * @return 结果
+     */
+    @Override
+    public int insertFsOrcAiRecord(FsOrcAiRecord fsOrcAiRecord)
+    {
+        fsOrcAiRecord.setCreateTime(DateUtils.getNowDate());
+        return baseMapper.insertFsOrcAiRecord(fsOrcAiRecord);
+    }
+
+    /**
+     * 修改ai识别图片记录
+     * 
+     * @param fsOrcAiRecord ai识别图片记录
+     * @return 结果
+     */
+    @Override
+    public int updateFsOrcAiRecord(FsOrcAiRecord fsOrcAiRecord)
+    {
+        fsOrcAiRecord.setUpdateTime(DateUtils.getNowDate());
+        return baseMapper.updateFsOrcAiRecord(fsOrcAiRecord);
+    }
+
+    /**
+     * 批量删除ai识别图片记录
+     * 
+     * @param ids 需要删除的ai识别图片记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsOrcAiRecordByIds(Long[] ids)
+    {
+        return baseMapper.deleteFsOrcAiRecordByIds(ids);
+    }
+
+    /**
+     * 删除ai识别图片记录信息
+     * 
+     * @param id ai识别图片记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteFsOrcAiRecordById(Long id)
+    {
+        return baseMapper.deleteFsOrcAiRecordById(id);
+    }
+}

+ 13 - 0
fs-service/src/main/java/com/fs/his/vo/CollectionOrcVO.java

@@ -0,0 +1,13 @@
+package com.fs.his.vo;
+
+import lombok.Data;
+
+@Data
+public class CollectionOrcVO {
+    private String phone;
+
+    private String name;
+
+    //是否解析 0-未解析 1-解析
+    private Integer isParse;
+}

+ 69 - 0
fs-service/src/main/resources/mapper/his/FsOrcAiRecordMapper.xml

@@ -0,0 +1,69 @@
+<?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.fs.his.mapper.FsOrcAiRecordMapper">
+    
+    <resultMap type="FsOrcAiRecord" id="FsOrcAiRecordResult">
+        <result property="id"    column="id"    />
+        <result property="imgUrl"    column="img_url"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="companyUserId"    column="company_user_id"    />
+    </resultMap>
+
+    <sql id="selectFsOrcAiRecordVo">
+        select id, img_url, create_time, update_time, company_user_id from fs_orc_ai_record
+    </sql>
+
+    <select id="selectFsOrcAiRecordList" parameterType="FsOrcAiRecord" resultMap="FsOrcAiRecordResult">
+        <include refid="selectFsOrcAiRecordVo"/>
+        <where>  
+            <if test="imgUrl != null  and imgUrl != ''"> and img_url = #{imgUrl}</if>
+            <if test="companyUserId != null "> and company_user_id = #{companyUserId}</if>
+        </where>
+    </select>
+    
+    <select id="selectFsOrcAiRecordById" parameterType="Long" resultMap="FsOrcAiRecordResult">
+        <include refid="selectFsOrcAiRecordVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertFsOrcAiRecord" parameterType="FsOrcAiRecord" useGeneratedKeys="true" keyProperty="id">
+        insert into fs_orc_ai_record
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="imgUrl != null">img_url,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="companyUserId != null">company_user_id,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="imgUrl != null">#{imgUrl},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="companyUserId != null">#{companyUserId},</if>
+         </trim>
+    </insert>
+
+    <update id="updateFsOrcAiRecord" parameterType="FsOrcAiRecord">
+        update fs_orc_ai_record
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="imgUrl != null">img_url = #{imgUrl},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="companyUserId != null">company_user_id = #{companyUserId},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteFsOrcAiRecordById" parameterType="Long">
+        delete from fs_orc_ai_record where id = #{id}
+    </delete>
+
+    <delete id="deleteFsOrcAiRecordByIds" parameterType="String">
+        delete from fs_orc_ai_record where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>