diff --git a/src/main/java/com/supervision/police/domain/AttributeMmht.java b/src/main/java/com/supervision/police/domain/AttributeMmht.java
new file mode 100644
index 0000000..28f466b
--- /dev/null
+++ b/src/main/java/com/supervision/police/domain/AttributeMmht.java
@@ -0,0 +1,136 @@
+package com.supervision.police.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 买卖合同属性
+ * @TableName attribute_mmht
+ */
+@TableName(value ="attribute_mmht")
+@Data
+public class AttributeMmht implements Serializable {
+    /**
+     * 主键
+     */
+    private String id;
+
+    /**
+     * 证据id
+     */
+    private String evidenceId;
+
+    /**
+     * 甲方
+     */
+    @Schema(description = "甲方", type = "1")
+    private String partA;
+
+    /**
+     * 乙方
+     */
+    @Schema(description = "乙方", type = "1")
+    private String partB;
+
+    /**
+     * 乙方
+     */
+    @Schema(description = "丙方", type = "1")
+    private String partC;
+
+    /**
+     * 资质要求
+     */
+    @Schema(description = "资质要求", type = "1")
+    private String qualifications;
+
+    /**
+     * 合同标的物
+     */
+    @Schema(description = "合同标的物", type = "1")
+    private String subjectMatter;
+
+    /**
+     * 数量
+     */
+    @Schema(description = "数量", type = "2")
+    private String number;
+
+    /**
+     * 金额
+     */
+    @Schema(description = "金额", type = "2")
+    private String amountMoney;
+
+    /**
+     * 支付方式
+     */
+    @Schema(description = "支付方式", type = "1")
+    private String paymentMethod;
+
+    /**
+     * 支付时间
+     */
+    @Schema(description = "支付时间", type = "3")
+    private String paymentTime;
+
+    /**
+     * 履行期限
+     */
+    @Schema(description = "履行期限", type = "3")
+    private String performancePeriod;
+
+    /**
+     * 履行地点
+     */
+    @Schema(description = "履行地点", type = "1")
+    private String placePerformance;
+
+    /**
+     * 违约责任
+     */
+    @Schema(description = "违约责任", type = "1")
+    private String liabilityBreach;
+
+    /**
+     * 项目详细信息
+     */
+    @Schema(description = "项目详细信息", type = "1")
+    private String projectDetails;
+
+    /**
+     * 签订日期
+     */
+    @Schema(description = "签订日期", type = "3")
+    private String signingDate;
+
+    /**
+     * 
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 
+     */
+    private String createUserId;
+
+    /**
+     * 
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 
+     */
+    private String updateUserId;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/src/main/java/com/supervision/police/domain/AttributeYhls.java b/src/main/java/com/supervision/police/domain/AttributeYhls.java
new file mode 100644
index 0000000..6e16ecb
--- /dev/null
+++ b/src/main/java/com/supervision/police/domain/AttributeYhls.java
@@ -0,0 +1,88 @@
+package com.supervision.police.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 银行流水证据属性
+ * @TableName attribute_yhls
+ */
+@TableName(value ="attribute_yhls")
+@Data
+public class AttributeYhls implements Serializable {
+    /**
+     * 主键
+     */
+    private String id;
+
+    /**
+     * 证据id
+     */
+    private String evidenceId;
+
+    /**
+     * 账户信息
+     */
+    @Schema(description = "账户信息", type = "1")
+    private String accountInformation;
+
+    /**
+     * 对方账户信息
+     */
+    @Schema(description = "对方账户信息", type = "1")
+    private String otherAccountInformation;
+
+    /**
+     * 金额
+     */
+    @Schema(description = "金额", type = "2")
+    private String amount;
+
+    /**
+     * 交易时间
+     */
+    @Schema(description = "交易时间", type = "3")
+    private String tradingTime;
+
+    /**
+     * 收入支出标识
+     */
+    @Schema(description = "收入支出标识", type = "1")
+    private String revenueExpenditureIdentification;
+
+    /**
+     * 摘要
+     */
+    @Schema(description = "摘要", type = "1")
+    private String abstractInfo;
+
+    /**
+     * 
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 
+     */
+    private String createUserId;
+
+    /**
+     * 
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 
+     */
+    private String updateUserId;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/src/main/java/com/supervision/police/domain/AttributeZfpz.java b/src/main/java/com/supervision/police/domain/AttributeZfpz.java
new file mode 100644
index 0000000..8f3e7d0
--- /dev/null
+++ b/src/main/java/com/supervision/police/domain/AttributeZfpz.java
@@ -0,0 +1,82 @@
+package com.supervision.police.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 证据支付凭证属性表
+ * @TableName attribute_zfpz
+ */
+@TableName(value ="attribute_zfpz")
+@Data
+public class AttributeZfpz implements Serializable {
+    /**
+     * 主键
+     */
+    private String id;
+
+    /**
+     * 证据id
+     */
+    private String evidenceId;
+
+    /**
+     * 付款方名称
+     */
+    @Schema(description = "付款方名称", type = "1")
+    private String payerName;
+
+    /**
+     * 收款方名称
+     */
+    @Schema(description = "收款方名称", type = "1")
+    private String payeeName;
+
+    /**
+     * 支付时间
+     */
+    @Schema(description = "支付时间", type = "3")
+    private String paymentTime;
+
+    /**
+     * 金额
+     */
+    @Schema(description = "金额", type = "2")
+    private String amount;
+
+    /**
+     * 说明
+     */
+    @Schema(description = "说明", type = "1")
+    private String describeInfo;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 
+     */
+    private String createUserId;
+
+    /**
+     * 
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 
+     */
+    private String updateUserId;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}
\ No newline at end of file
diff --git a/src/main/java/com/supervision/police/mapper/AttributeMmhtMapper.java b/src/main/java/com/supervision/police/mapper/AttributeMmhtMapper.java
new file mode 100644
index 0000000..ad1b0c4
--- /dev/null
+++ b/src/main/java/com/supervision/police/mapper/AttributeMmhtMapper.java
@@ -0,0 +1,18 @@
+package com.supervision.police.mapper;
+
+import com.supervision.police.domain.AttributeMmht;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author Administrator
+* @description 针对表【attribute_mmht(买卖合同属性)】的数据库操作Mapper
+* @createDate 2024-11-19 16:44:46
+* @Entity com.supervision.police.domain.AttributeMmht
+*/
+public interface AttributeMmhtMapper extends BaseMapper<AttributeMmht> {
+
+}
+
+
+
+
diff --git a/src/main/java/com/supervision/police/mapper/AttributeYhlsMapper.java b/src/main/java/com/supervision/police/mapper/AttributeYhlsMapper.java
new file mode 100644
index 0000000..0c641bc
--- /dev/null
+++ b/src/main/java/com/supervision/police/mapper/AttributeYhlsMapper.java
@@ -0,0 +1,18 @@
+package com.supervision.police.mapper;
+
+import com.supervision.police.domain.AttributeYhls;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author Administrator
+* @description 针对表【attribute_yhls(银行流水证据属性)】的数据库操作Mapper
+* @createDate 2024-11-20 14:40:46
+* @Entity com.supervision.police.domain.AttributeYhls
+*/
+public interface AttributeYhlsMapper extends BaseMapper<AttributeYhls> {
+
+}
+
+
+
+
diff --git a/src/main/java/com/supervision/police/mapper/AttributeZfpzMapper.java b/src/main/java/com/supervision/police/mapper/AttributeZfpzMapper.java
new file mode 100644
index 0000000..18dc9fc
--- /dev/null
+++ b/src/main/java/com/supervision/police/mapper/AttributeZfpzMapper.java
@@ -0,0 +1,18 @@
+package com.supervision.police.mapper;
+
+import com.supervision.police.domain.AttributeZfpz;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+* @author Administrator
+* @description 针对表【attribute_zfpz(证据支付凭证属性表)】的数据库操作Mapper
+* @createDate 2024-11-20 14:40:46
+* @Entity com.supervision.police.domain.AttributeZfpz
+*/
+public interface AttributeZfpzMapper extends BaseMapper<AttributeZfpz> {
+
+}
+
+
+
+
diff --git a/src/main/java/com/supervision/police/service/AttributeMmhtService.java b/src/main/java/com/supervision/police/service/AttributeMmhtService.java
new file mode 100644
index 0000000..8e52336
--- /dev/null
+++ b/src/main/java/com/supervision/police/service/AttributeMmhtService.java
@@ -0,0 +1,13 @@
+package com.supervision.police.service;
+
+import com.supervision.police.domain.AttributeMmht;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author Administrator
+* @description 针对表【attribute_mmht(买卖合同属性)】的数据库操作Service
+* @createDate 2024-11-19 16:44:46
+*/
+public interface AttributeMmhtService extends IService<AttributeMmht> {
+
+}
diff --git a/src/main/java/com/supervision/police/service/AttributeYhlsService.java b/src/main/java/com/supervision/police/service/AttributeYhlsService.java
new file mode 100644
index 0000000..daebe8d
--- /dev/null
+++ b/src/main/java/com/supervision/police/service/AttributeYhlsService.java
@@ -0,0 +1,13 @@
+package com.supervision.police.service;
+
+import com.supervision.police.domain.AttributeYhls;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author Administrator
+* @description 针对表【attribute_yhls(银行流水证据属性)】的数据库操作Service
+* @createDate 2024-11-20 14:40:46
+*/
+public interface AttributeYhlsService extends IService<AttributeYhls> {
+
+}
diff --git a/src/main/java/com/supervision/police/service/AttributeZfpzService.java b/src/main/java/com/supervision/police/service/AttributeZfpzService.java
new file mode 100644
index 0000000..69d6085
--- /dev/null
+++ b/src/main/java/com/supervision/police/service/AttributeZfpzService.java
@@ -0,0 +1,13 @@
+package com.supervision.police.service;
+
+import com.supervision.police.domain.AttributeZfpz;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+* @author Administrator
+* @description 针对表【attribute_zfpz(证据支付凭证属性表)】的数据库操作Service
+* @createDate 2024-11-20 14:40:46
+*/
+public interface AttributeZfpzService extends IService<AttributeZfpz> {
+
+}
diff --git a/src/main/java/com/supervision/police/service/CaseEvidencePropertyService.java b/src/main/java/com/supervision/police/service/CaseEvidencePropertyService.java
new file mode 100644
index 0000000..3a1e7cb
--- /dev/null
+++ b/src/main/java/com/supervision/police/service/CaseEvidencePropertyService.java
@@ -0,0 +1,24 @@
+package com.supervision.police.service;
+
+import com.supervision.police.dto.NotePromptExtractAttributesDto;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 案件证据属性服务
+ */
+public interface CaseEvidencePropertyService {
+
+    List<NotePromptExtractAttributesDto> findExtractAttributes(String categoryId);
+
+
+    void saveEvidenceProperty(String evidenceId,String categoryId, List<NotePromptExtractAttributesDto> attributes);
+
+    void updateEvidenceProperty(String evidenceId,String categoryId, List<NotePromptExtractAttributesDto> attributes);
+
+    void deleteEvidenceProperty(String evidenceId,String categoryId);
+
+    Map<String,List<NotePromptExtractAttributesDto>> listEvidenceProperty(String categoryId,List<String> evidenceIdList);
+
+}
diff --git a/src/main/java/com/supervision/police/service/impl/AttributeMmhtServiceImpl.java b/src/main/java/com/supervision/police/service/impl/AttributeMmhtServiceImpl.java
new file mode 100644
index 0000000..ed6640e
--- /dev/null
+++ b/src/main/java/com/supervision/police/service/impl/AttributeMmhtServiceImpl.java
@@ -0,0 +1,22 @@
+package com.supervision.police.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.supervision.police.domain.AttributeMmht;
+import com.supervision.police.service.AttributeMmhtService;
+import com.supervision.police.mapper.AttributeMmhtMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author Administrator
+* @description 针对表【attribute_mmht(买卖合同属性)】的数据库操作Service实现
+* @createDate 2024-11-19 16:44:46
+*/
+@Service
+public class AttributeMmhtServiceImpl extends ServiceImpl<AttributeMmhtMapper, AttributeMmht>
+    implements AttributeMmhtService{
+
+}
+
+
+
+
diff --git a/src/main/java/com/supervision/police/service/impl/AttributeYhlsServiceImpl.java b/src/main/java/com/supervision/police/service/impl/AttributeYhlsServiceImpl.java
new file mode 100644
index 0000000..1d37824
--- /dev/null
+++ b/src/main/java/com/supervision/police/service/impl/AttributeYhlsServiceImpl.java
@@ -0,0 +1,22 @@
+package com.supervision.police.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.supervision.police.domain.AttributeYhls;
+import com.supervision.police.service.AttributeYhlsService;
+import com.supervision.police.mapper.AttributeYhlsMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author Administrator
+* @description 针对表【attribute_yhls(银行流水证据属性)】的数据库操作Service实现
+* @createDate 2024-11-20 14:40:46
+*/
+@Service
+public class AttributeYhlsServiceImpl extends ServiceImpl<AttributeYhlsMapper, AttributeYhls>
+    implements AttributeYhlsService{
+
+}
+
+
+
+
diff --git a/src/main/java/com/supervision/police/service/impl/AttributeZfpzServiceImpl.java b/src/main/java/com/supervision/police/service/impl/AttributeZfpzServiceImpl.java
new file mode 100644
index 0000000..ac45397
--- /dev/null
+++ b/src/main/java/com/supervision/police/service/impl/AttributeZfpzServiceImpl.java
@@ -0,0 +1,22 @@
+package com.supervision.police.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.supervision.police.domain.AttributeZfpz;
+import com.supervision.police.service.AttributeZfpzService;
+import com.supervision.police.mapper.AttributeZfpzMapper;
+import org.springframework.stereotype.Service;
+
+/**
+* @author Administrator
+* @description 针对表【attribute_zfpz(证据支付凭证属性表)】的数据库操作Service实现
+* @createDate 2024-11-20 14:40:46
+*/
+@Service
+public class AttributeZfpzServiceImpl extends ServiceImpl<AttributeZfpzMapper, AttributeZfpz>
+    implements AttributeZfpzService{
+
+}
+
+
+
+
diff --git a/src/main/java/com/supervision/police/service/impl/CaseEvidencePropertyServiceImpl.java b/src/main/java/com/supervision/police/service/impl/CaseEvidencePropertyServiceImpl.java
new file mode 100644
index 0000000..7d55358
--- /dev/null
+++ b/src/main/java/com/supervision/police/service/impl/CaseEvidencePropertyServiceImpl.java
@@ -0,0 +1,269 @@
+package com.supervision.police.service.impl;
+
+import cn.hutool.core.bean.BeanDesc;
+import cn.hutool.core.bean.PropDesc;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.supervision.police.dto.NotePromptExtractAttributesDto;
+import com.supervision.police.service.CaseEvidencePropertyService;
+import com.supervision.police.service.ComDictionaryService;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.annotation.PostConstruct;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Service;
+
+import java.lang.reflect.Field;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+@SuppressWarnings("all")
+@RequiredArgsConstructor
+public class CaseEvidencePropertyServiceImpl implements CaseEvidencePropertyService {
+
+    private final ApplicationContext applicationContext;
+
+    private final ComDictionaryService comDictionaryService;
+    private final Map<String, IService<?>> evidencePropertyServiceMap = new HashMap<>();
+    private final Map<String, BeanDesc> beanDescMap = new HashMap<>();
+
+    @Override
+    public List<NotePromptExtractAttributesDto> findExtractAttributes(String categoryId) {
+        if (StrUtil.isEmpty(categoryId)){
+            return new ArrayList<>();
+        }
+
+        String beanName = getEntityNameIfExist(categoryId);
+        if (StrUtil.isEmpty(beanName)){
+            return new ArrayList<>();
+        }
+
+        BeanDesc beanDesc = beanDescMap.get(beanName);
+        Assert.notNull(beanDesc, "字典表evidence_property_bean中不存在"+beanName+"对应的属性");
+
+        return beanDesc.getProps().stream()
+                .filter(prop -> null != prop.getField().getAnnotation(Schema.class)).map(prop -> {
+                    NotePromptExtractAttributesDto attributesDto = new NotePromptExtractAttributesDto();
+                    Field field = prop.getField();
+                    attributesDto.setAttrName(getFieldDesc(field));
+                    attributesDto.setAttrValueType(getFieldType(field));
+                    return attributesDto;
+                }).toList();
+    }
+
+    @Override
+    public void saveEvidenceProperty(String evidenceId, String categoryId,List<NotePromptExtractAttributesDto> attributes) {
+
+        if (CollUtil.isEmpty(attributes)){
+            log.warn("保存证据属性时,属性为空,不保存任何数据,证据id:{}", evidenceId);
+            return;
+        }
+        if (StrUtil.isEmpty(evidenceId) || StrUtil.isEmpty(categoryId)){
+            return;
+        }
+        String entityName = getEntityName(categoryId);
+        IService iService = evidencePropertyServiceMap.get(entityName);
+        Assert.notNull(iService, "不存在"+entityName+"对应的bean");
+
+
+        JSONObject entityJson = mapToEntityJson(entityName,attributes);
+        entityJson.set("evidenceId", evidenceId);
+
+        if (entityJson.isEmpty()){
+            log.warn("保存证据属性时,属性为空,不保存任何数据,证据id:{}", evidenceId);
+            return;
+        }
+        iService.save(JSONUtil.toBean(entityJson, iService.getEntityClass()));
+    }
+
+
+
+    @Override
+    public void updateEvidenceProperty(String evidenceId, String categoryId, List<NotePromptExtractAttributesDto> attributes) {
+        if (StrUtil.isEmpty(categoryId) || StrUtil.isEmpty(evidenceId) || CollUtil.isEmpty(attributes)){
+            return;
+        }
+
+        String entityName = getEntityNameIfExist(categoryId);
+        if (StrUtil.isEmpty(entityName)){
+            return;
+        }
+        IService iService = evidencePropertyServiceMap.get(entityName);
+        Assert.notNull(iService, "不存在"+entityName+"对应的bean");
+
+        JSONObject entityJson = mapToEntityJson(entityName, attributes);
+        if (entityJson.isEmpty()){
+            return;
+        }
+
+        iService.update(entityJson, new QueryWrapper<>().eq("evidence_id", evidenceId));
+
+    }
+
+    @Override
+    public void deleteEvidenceProperty(String evidenceId, String categoryId) {
+        if (StrUtil.isEmpty(evidenceId) || StrUtil.isEmpty(categoryId)){
+            return;
+        }
+        String entityName = getEntityNameIfExist(categoryId);
+        if (StrUtil.isEmpty(entityName)){
+            return;
+        }
+        IService iService = evidencePropertyServiceMap.get(entityName);
+
+        iService.remove(new QueryWrapper<>().eq("evidence_id", evidenceId));
+    }
+
+    @Override
+    public Map<String,List<NotePromptExtractAttributesDto>> listEvidenceProperty(String categoryId,List<String> evidenceIdList) {
+
+        Map<String,List<NotePromptExtractAttributesDto>> result = evidenceIdList.stream()
+                .distinct().collect(Collectors.toMap(String::valueOf, v -> new ArrayList<>()));
+
+        if (CollUtil.isEmpty(evidenceIdList) || StrUtil.isEmpty(categoryId)){
+            return result;
+        }
+
+        String entityName = getEntityNameIfExist(categoryId);
+        if (StrUtil.isEmpty(entityName)){
+            return result;
+        }
+
+        IService<?> iService = evidencePropertyServiceMap.get(entityName);
+        Assert.notNull(iService, "不存在"+entityName+"对应的bean");
+
+        // 从数据库查询证据数据
+        QueryWrapper queryWrapper = new QueryWrapper<>();
+        queryWrapper.in("evidence_id", evidenceIdList);
+        List<Map<String,Object>> properties = iService.getBaseMapper().selectMaps(queryWrapper);
+        if (CollUtil.isEmpty(properties)){
+            return result;
+        }
+
+        // 对查询出来的格式进行转换
+        for (Map<String, Object> property : properties) {
+            String evidenceId = (String) property.get("evidence_id");
+            if (StrUtil.isEmpty(evidenceId)){
+                continue;
+            }
+            result.put(evidenceId, mapToAttributes(entityName, property));
+        }
+
+        return result;
+    }
+
+
+
+    @PostConstruct
+    public void init(){
+
+        // 缓存证据属性bean
+        Map<String, String> evidencePropertyBean = comDictionaryService.getDictionaryMap("evidence_property_bean");
+        for (Map.Entry<String, String> entry : evidencePropertyBean.entrySet()) {
+
+            IService<?> bean = applicationContext.getBean(StrUtil.lowerFirst(entry.getValue())+"ServiceImpl", IService.class);
+            evidencePropertyServiceMap.put(entry.getValue(), bean);
+
+            Class<?> entityClass = bean.getEntityClass();
+
+            beanDescMap.put(entityClass.getSimpleName(),new BeanDesc(entityClass));
+
+        }
+
+    }
+
+
+    private JSONObject mapToEntityJson(String entityName, List<NotePromptExtractAttributesDto> attributes) {
+
+        BeanDesc beanDesc = beanDescMap.get(entityName);
+        Collection<PropDesc> props = beanDesc.getProps();
+        JSONObject json = new JSONObject();
+        for (NotePromptExtractAttributesDto attribute : attributes) {
+            String attrName = attribute.getAttrName();
+            String fieldName = getFieldName(props, attrName);
+            if (StrUtil.isNotEmpty(fieldName)){
+                json.set(fieldName, attribute.getAttrValue());
+            }
+        }
+        return json;
+    }
+
+    private String getFieldName(Collection<PropDesc> props,String fieldDesc) {
+        for (PropDesc prop : props) {
+            if (StrUtil.equals(getFieldDesc(prop.getField()), fieldDesc)){
+                return prop.getFieldName();
+            }
+        }
+        return null;
+    }
+
+    private String getEntityName(String categoryId){
+        Map<String, String> evidencePropertyBean = comDictionaryService.getDictionaryMap("evidence_property_bean");
+        Assert.notEmpty(evidencePropertyBean, "字典表evidence_property_bean为空");
+        String beanName = evidencePropertyBean.get(categoryId);
+        Assert.notEmpty(beanName, "字典表evidence_property_bean中不存在"+categoryId+"对应的bean");
+        return beanName;
+    }
+
+    private String getEntityNameIfExist(String categoryId){
+        Map<String, String> evidencePropertyBean = comDictionaryService.getDictionaryMap("evidence_property_bean");
+        if (CollUtil.isEmpty(evidencePropertyBean)){
+            return null;
+        }
+        return evidencePropertyBean.get(categoryId);
+    }
+
+    private List<NotePromptExtractAttributesDto> mapToAttributes(String entityName, Map<String,Object> property){
+
+        if (StrUtil.isEmpty(entityName)){
+            return new ArrayList<>();
+        }
+
+        BeanDesc beanDesc = beanDescMap.get(entityName);
+        return property.entrySet().stream().map(entry -> {
+            Field field = beanDesc.getField(StrUtil.toCamelCase(entry.getKey()));
+            NotePromptExtractAttributesDto attributesDto = new NotePromptExtractAttributesDto();
+            attributesDto.setAttrName(getFieldDesc(field));
+            attributesDto.setAttrValue(StrUtil.toString(entry.getValue()));
+            attributesDto.setAttrValueType(getFieldType(field));
+            return attributesDto;
+        }).filter(a->StrUtil.isNotEmpty(a.getAttrName())).toList();
+    }
+
+
+    private String getFieldDesc(Field field){
+        if (StrUtil.equalsAny(field.getName(),
+                "createTime","updateTime","createUserId",
+                "updateUserId","serialVersionUID")){
+            return null;
+        }
+
+        Schema schema = field.getAnnotation(Schema.class);
+        if (null == schema){
+           return null;
+        }
+        return schema.description();
+    }
+
+    /**
+     * 1: 文字
+     * 2: 数字
+     * 3: 日期
+     */
+    private String getFieldType(Field field) {
+
+        Schema schema = field.getAnnotation(Schema.class);
+        if (null != schema){
+            return schema.type();
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/com/supervision/police/service/impl/CaseEvidenceServiceImpl.java b/src/main/java/com/supervision/police/service/impl/CaseEvidenceServiceImpl.java
index 9399fe5..42010f0 100644
--- a/src/main/java/com/supervision/police/service/impl/CaseEvidenceServiceImpl.java
+++ b/src/main/java/com/supervision/police/service/impl/CaseEvidenceServiceImpl.java
@@ -27,7 +27,6 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.aop.framework.AopContext;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Lazy;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
@@ -57,9 +56,6 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
 
     private final ModelCaseService modelCaseService;
 
-    @Lazy
-    @Autowired
-    private OCREvidenceService ocrEvidenceService;
     @Autowired
     private LLMExtractService llmExtractService;
     @Autowired
@@ -71,6 +67,8 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
 
     private final XxlJobService xxlJobService;
 
+    private final CaseEvidencePropertyService caseEvidencePropertyService;
+
     @Override
     @Transactional(transactionManager = "dataSourceTransactionManager", rollbackFor = Exception.class)
     public String saveEvidence(CaseEvidenceDTO caseEvidenceDTO) {
@@ -81,6 +79,14 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
         CaseEvidence caseEvidence = caseEvidenceDTO.toCaseEvidence();
         super.save(caseEvidence);
 
+        if (CollUtil.isNotEmpty(caseEvidence.getProperty())){
+            // 同时保存证据属性值
+            EvidenceDirectoryDTO rootDirectory = new EvidenceDirectoryDTO(evidenceDirectoryService.listDirectoryTree(caseEvidence.getCaseId()));
+            EvidenceDirectoryDTO directory = rootDirectory.findDirectory(caseEvidence.getDirectoryId());
+            caseEvidencePropertyService.saveEvidenceProperty(caseEvidence.getId(),directory.getCategoryId(),caseEvidence.getProperty());
+        }
+
+
         //保存文件关联信息
         caseEvidenceDTO.getFileIdList().forEach(fileId -> {
             EvidenceFile evidenceFile = new EvidenceFile();
@@ -112,6 +118,17 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
         CaseEvidence caseEvidence = caseEvidenceDTO.toCaseEvidence();
         super.updateById(caseEvidence);
 
+        // 更新证据属性
+        EvidenceDirectoryDTO rootDirectory = new EvidenceDirectoryDTO(evidenceDirectoryService.listDirectoryTree(caseEvidence.getCaseId()));
+        EvidenceDirectoryDTO directory = rootDirectory.findDirectory(caseEvidence.getDirectoryId());
+        if (null != directory && StrUtil.isNotEmpty(directory.getCategoryId())){
+            if (CollUtil.isNotEmpty(caseEvidence.getProperty())){
+                caseEvidencePropertyService.updateEvidenceProperty(caseEvidence.getId(),directory.getCategoryId(),caseEvidence.getProperty());
+            }else {
+                caseEvidencePropertyService.deleteEvidenceProperty(caseEvidence.getId(),directory.getCategoryId());
+            }
+        }
+
         // 更新文件关联信息
         evidenceFileService.lambdaUpdate().eq(EvidenceFile::getEvidenceId, caseEvidence.getId()).remove();
         caseEvidenceDTO.getFileIdList().forEach(fileId -> {
@@ -148,6 +165,7 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
             if (remove) {
                 evidenceFileService.lambdaUpdate().eq(EvidenceFile::getEvidenceId, evidenceId).remove();
                 evidenceDirectoryService.removeDirectoryIf(directory.getId(), () -> directory.getLevel() == 3);
+                caseEvidencePropertyService.deleteEvidenceProperty(evidenceId, directory.getCategoryId());
                 caseStatusManageService.whenUpdateEvidence(caseEvidence.getCaseId());
             }
         } else {
@@ -322,6 +340,9 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
             EvidenceDirectory directory = evidenceDirectoryService.getById(caseEvidence.getDirectoryId());
             NotePrompt notePrompt = notePromptService.lambdaQuery().eq(NotePrompt::getEvidenceCategoryId, directory.getCategoryId()).one();
             if (notePrompt != null) {
+                // 重新设置extractAttributes属性信息
+                List<NotePromptExtractAttributesDto> attributes = caseEvidencePropertyService.findExtractAttributes(directory.getCategoryId());
+                notePrompt.setExtractAttributes(attributes);
                 log.info("属性提取开始。");
                 long attrStart = System.currentTimeMillis();
                 llmExtractDto.setPrompt(notePrompt.getPrompt());
@@ -335,6 +356,9 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
                                 }
                             }).toList();
                     caseEvidence.setProperty(extractAttributes);
+                    // 同时设置案件属性值
+                    caseEvidencePropertyService.deleteEvidenceProperty(evidenceId, directory.getCategoryId());
+                    caseEvidencePropertyService.saveEvidenceProperty(evidenceId, directory.getCategoryId(), extractAttributes);
                 }
                 log.info("属性提取完成。更新证据处理状态为【属性提取完成】。属性:【{}】。耗时:【{}】", caseEvidence.getProperty(), System.currentTimeMillis() - attrStart);
                 caseEvidence.setProcessStatus(EvidenceConstants.PROCESS_STATUS_ATTR_EXTRACT_OK);
@@ -784,6 +808,9 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
             return;
         }
         List<CaseEvidenceDetailDTO> caseEvidenceDetailDTOS = queryEvidenceList(caseId, null);
+        List<EvidenceDirectoryDTO> directoryDTOS = evidenceDirectoryService.listDirectoryTree(caseId);
+        EvidenceDirectoryDTO rootDirectory = new EvidenceDirectoryDTO(directoryDTOS);
+
 
         Map<String, List<EvidenceVerifyDTO>> evidenceMap = evidenceVerifyDTOS.stream().collect(Collectors.groupingBy(EvidenceVerifyDTO::getEvidenceId));
         for (Map.Entry<String, List<EvidenceVerifyDTO>> entry : evidenceMap.entrySet()) {
@@ -799,6 +826,16 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
                     .set(CaseEvidence::getEvidenceName, CollUtil.getFirst(value).getEvidenceName())
                     .update();
 
+            // 同时更新证据属性值
+            String categoryId = rootDirectory.findDirectory(CollUtil.getFirst(value).getDirectoryId()).getCategoryId();
+            Map<String, List<NotePromptExtractAttributesDto>> map = caseEvidencePropertyService.listEvidenceProperty(categoryId, Collections.singletonList(evidenceId));
+            if (CollUtil.isEmpty(map.get(categoryId))){
+                caseEvidencePropertyService.saveEvidenceProperty(evidenceId, categoryId,CollUtil.getFirst(value).getProperties());
+            }else {
+                caseEvidencePropertyService.updateEvidenceProperty(evidenceId, categoryId,CollUtil.getFirst(value).getProperties());
+            }
+
+
             // 修改ocr内容
             for (EvidenceVerifyDTO verifyDTO : value) {
                 if (StrUtil.isNotEmpty(verifyDTO.getOcrText())) {
@@ -847,6 +884,7 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
                     evidenceVerifyDTO.setFileId(fileDTO.getFileId());
                     evidenceVerifyDTO.setOcrText(fileDTO.getOcrText());
                     CaseEvidenceDTO evidenceInfo = fileDTO.getEvidenceInfo();
+                    evidenceVerifyDTO.setDirectoryId(fileDTO.getDirectoryId());
                     if (null != evidenceInfo) {
                         evidenceVerifyDTO.setProperties(evidenceInfo.getProperty());
                         evidenceVerifyDTO.setTitle(evidenceInfo.getTitle());
@@ -867,11 +905,11 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
 
         List<CaseEvidence> caseEvidenceList = this.lambdaQuery().eq(CaseEvidence::getCaseId, caseId).list();
 
+        EvidenceDirectoryDTO rootDirectory = new EvidenceDirectoryDTO(evidenceDirectoryDTOS);
 
         // 强行翻译
-        rebuildEvidenceProperties(new EvidenceDirectoryDTO(evidenceDirectoryDTOS), caseEvidenceList);
+        rebuildEvidenceProperties(rootDirectory, caseEvidenceList);
 
-        EvidenceDirectoryDTO rootDirectory = new EvidenceDirectoryDTO(evidenceDirectoryDTOS);
         List<CategoryPromptDTO> categoryPromptDTOS = evidenceDirectoryService.listCategoryPrompt(caseId);
         Map<String, CaseEvidenceDTO> caseEvidenceMap = caseEvidenceList.stream().map(CaseEvidenceDTO::new).peek(e->e.setDirectoryNamePathValue(rootDirectory)).collect(Collectors.toMap(CaseEvidenceDTO::getId, Function.identity()));
         Map<String, CategoryPromptDTO> categoryPromptMap = categoryPromptDTOS.stream().collect(Collectors.toMap(CategoryPromptDTO::getDirectoryId, k -> k, (v1, v2) -> v1));
@@ -897,21 +935,22 @@ public class CaseEvidenceServiceImpl extends ServiceImpl<CaseEvidenceMapper, Cas
      */
     private void rebuildEvidenceProperties(EvidenceDirectoryDTO rootDirectory, List<CaseEvidence> caseEvidenceList) {
 
-        List<String> categoryIds = caseEvidenceList.stream().map(e -> {
-            EvidenceDirectoryDTO directory = rootDirectory.findDirectory(e.getDirectoryId());
-            if (null == directory) {
-                return null;
-            }
-            return directory.getCategoryId();
-        }).filter(StrUtil::isNotEmpty).distinct().toList();
-
         Map<String, String> directoryIdMapCategoryId = caseEvidenceList.stream()
                 .filter(e -> StrUtil.isNotEmpty(e.getDirectoryId()) && null != rootDirectory.findDirectory(e.getDirectoryId()))
                 .map(CaseEvidence::getDirectoryId).distinct().collect(
                         Collectors.toMap(directoryId -> directoryId,di-> rootDirectory.findDirectory(di).getCategoryId()));
 
-        List<NotePrompt> notePromptList = CollUtil.isEmpty(directoryIdMapCategoryId.values()) ? new ArrayList<>() : notePromptService.lambdaQuery().in(NotePrompt::getEvidenceCategoryId, categoryIds).list();
-        Map<String, List<NotePromptExtractAttributesDto>> categoryIdMapExtractAttributes = notePromptList.stream().collect(Collectors.toMap(NotePrompt::getEvidenceCategoryId, NotePrompt::getExtractAttributes, (v1, v2) -> v1));
+        Map<String, List<NotePromptExtractAttributesDto>> categoryIdMapExtractAttributes = new HashMap<>();
+        for (CaseEvidence caseEvidence : caseEvidenceList) {
+            EvidenceDirectoryDTO directory = rootDirectory.findDirectory(caseEvidence.getDirectoryId());
+            if (null == directory || StrUtil.isEmpty(directory.getCategoryId())){
+                continue;
+            }
+            String categoryId = directory.getCategoryId();
+            if (!categoryIdMapExtractAttributes.containsKey(categoryId)){
+                categoryIdMapExtractAttributes.put(categoryId, caseEvidencePropertyService.findExtractAttributes(categoryId));
+            }
+        }
 
 
         for (CaseEvidence caseEvidence : caseEvidenceList) {
diff --git a/src/main/java/com/supervision/police/service/impl/ModelIndexServiceImpl.java b/src/main/java/com/supervision/police/service/impl/ModelIndexServiceImpl.java
index 31609df..a778a21 100644
--- a/src/main/java/com/supervision/police/service/impl/ModelIndexServiceImpl.java
+++ b/src/main/java/com/supervision/police/service/impl/ModelIndexServiceImpl.java
@@ -449,6 +449,7 @@ public class ModelIndexServiceImpl extends ServiceImpl<ModelIndexMapper, ModelIn
         }
         graphDebugResVO.setRecordList(mapRecords(records));
 
+        // 尝试转换为图形数据
         Pair<List<WebRelDTO>, List<Map<String, String>>> pair = this.neo4jService.mergeRecord(generateNodes(records), generateRelations(records));
         graphDebugResVO.setGraphRelList(pair.getKey());
         graphDebugResVO.setGraphNodeList(pair.getValue());
@@ -462,7 +463,6 @@ public class ModelIndexServiceImpl extends ServiceImpl<ModelIndexMapper, ModelIn
                 }).collect(Collectors.toList());
         graphDebugResVO.setGraphReCountList(collect);
 
-        // 尝试转换为图形数据
         return graphDebugResVO;
     }
 
diff --git a/src/main/resources/mapper/AttributeMmhtMapper.xml b/src/main/resources/mapper/AttributeMmhtMapper.xml
new file mode 100644
index 0000000..cd760bc
--- /dev/null
+++ b/src/main/resources/mapper/AttributeMmhtMapper.xml
@@ -0,0 +1,39 @@
+<?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.supervision.police.mapper.AttributeMmhtMapper">
+
+    <resultMap id="BaseResultMap" type="com.supervision.police.domain.AttributeMmht">
+            <result property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="evidenceId" column="evidence_id" jdbcType="VARCHAR"/>
+            <result property="partA" column="part_a" jdbcType="VARCHAR"/>
+            <result property="partB" column="part_b" jdbcType="VARCHAR"/>
+            <result property="partC" column="part_c" jdbcType="VARCHAR"/>
+            <result property="qualifications" column="qualifications" jdbcType="VARCHAR"/>
+            <result property="subjectMatter" column="subject_matter" jdbcType="VARCHAR"/>
+            <result property="number" column="number" jdbcType="VARCHAR"/>
+            <result property="amountMoney" column="amount_money" jdbcType="VARCHAR"/>
+            <result property="paymentMethod" column="payment_method" jdbcType="VARCHAR"/>
+            <result property="paymentTime" column="payment_time" jdbcType="VARCHAR"/>
+            <result property="performancePeriod" column="performance_period" jdbcType="VARCHAR"/>
+            <result property="placePerformance" column="place_performance" jdbcType="VARCHAR"/>
+            <result property="liabilityBreach" column="liability_breach" jdbcType="VARCHAR"/>
+            <result property="projectDetails" column="project_details" jdbcType="VARCHAR"/>
+            <result property="signingDate" column="signing_date" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="createUserId" column="create_user_id" jdbcType="VARCHAR"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="updateUserId" column="update_user_id" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,evidence_id,part_a,
+        part_b,part_c,qualifications,
+        subject_matter,number,amount_money,
+        payment_method,payment_time,performance_period,
+        place_performance,liability_breach,project_details,
+        signing_date,create_time,create_user_id,
+        update_time,update_user_id
+    </sql>
+</mapper>
diff --git a/src/main/resources/mapper/AttributeYhlsMapper.xml b/src/main/resources/mapper/AttributeYhlsMapper.xml
new file mode 100644
index 0000000..b5fa53a
--- /dev/null
+++ b/src/main/resources/mapper/AttributeYhlsMapper.xml
@@ -0,0 +1,28 @@
+<?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.supervision.police.mapper.AttributeYhlsMapper">
+
+    <resultMap id="BaseResultMap" type="com.supervision.police.domain.AttributeYhls">
+            <result property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="evidenceId" column="evidence_id" jdbcType="VARCHAR"/>
+            <result property="accountInformation" column="account_information" jdbcType="VARCHAR"/>
+            <result property="otherAccountInformation" column="other_account_information" jdbcType="VARCHAR"/>
+            <result property="amount" column="amount" jdbcType="VARCHAR"/>
+            <result property="tradingTime" column="trading_time" jdbcType="VARCHAR"/>
+            <result property="revenueExpenditureIdentification" column="revenue_expenditure_identification" jdbcType="VARCHAR"/>
+            <result property="abstractInfo" column="abstract_info" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="createUserId" column="create_user_id" jdbcType="VARCHAR"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="updateUserId" column="update_user_id" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,evidence_id,account_information,
+        other_account_information,amount,trading_time,
+        revenue_expenditure_identification,abstract_info,create_time,
+        create_user_id,update_time,update_user_id
+    </sql>
+</mapper>
diff --git a/src/main/resources/mapper/AttributeZfpzMapper.xml b/src/main/resources/mapper/AttributeZfpzMapper.xml
new file mode 100644
index 0000000..e420c19
--- /dev/null
+++ b/src/main/resources/mapper/AttributeZfpzMapper.xml
@@ -0,0 +1,27 @@
+<?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.supervision.police.mapper.AttributeZfpzMapper">
+
+    <resultMap id="BaseResultMap" type="com.supervision.police.domain.AttributeZfpz">
+            <result property="id" column="id" jdbcType="VARCHAR"/>
+            <result property="evidenceId" column="evidence_id" jdbcType="VARCHAR"/>
+            <result property="payerName" column="payer_name" jdbcType="VARCHAR"/>
+            <result property="payeeName" column="payee_name" jdbcType="VARCHAR"/>
+            <result property="paymentTime" column="payment_time" jdbcType="VARCHAR"/>
+            <result property="amount" column="amount" jdbcType="VARCHAR"/>
+            <result property="describeInfo" column="describe_info" jdbcType="VARCHAR"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="createUserId" column="create_user_id" jdbcType="VARCHAR"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+            <result property="updateUserId" column="update_user_id" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <sql id="Base_Column_List">
+        id,evidence_id,payer_name,
+        payee_name,payment_time,amount,
+        describe_info,create_time,create_user_id,
+        update_time,update_user_id
+    </sql>
+</mapper>
diff --git a/src/test/java/com/supervision/demo/FuHsiApplicationTests.java b/src/test/java/com/supervision/demo/FuHsiApplicationTests.java
index 66d54ec..bcc7dbd 100644
--- a/src/test/java/com/supervision/demo/FuHsiApplicationTests.java
+++ b/src/test/java/com/supervision/demo/FuHsiApplicationTests.java
@@ -16,6 +16,7 @@ import com.supervision.police.domain.ModelRecordType;
 import com.supervision.police.domain.NotePrompt;
 import com.supervision.police.domain.NoteRecordSplit;
 import com.supervision.police.dto.EvidenceDirectoryDTO;
+import com.supervision.police.dto.NotePromptExtractAttributesDto;
 import com.supervision.police.dto.RetrieveReqDTO;
 import com.supervision.police.dto.RetrieveResDTO;
 import com.supervision.police.service.*;
@@ -311,7 +312,6 @@ public class FuHsiApplicationTests {
     public void initCaseDirectory() {
         caseEvidenceService.initCaseEvidenceDirectory("1846389691251220482", "1");
 
-        System.out.println("222");
     }
 
     @Data
@@ -331,4 +331,86 @@ public class FuHsiApplicationTests {
         caseEvidenceService.refreshCaseEvidence();
         System.out.println("执行完成");
     }
+
+    @Autowired
+    private CaseEvidencePropertyService caseEvidencePropertyService;
+    @Test
+    public void findExtractAttributesTest(){
+        List<NotePromptExtractAttributesDto> extractAttributes = caseEvidencePropertyService.findExtractAttributes("7");
+
+        System.out.println(JSONUtil.toJsonStr(extractAttributes));
+    }
+
+    @Test
+    public void saveEvidencePropertyTest() {
+
+        List<NotePromptExtractAttributesDto> attributesDtoList = new ArrayList<>();
+
+        NotePromptExtractAttributesDto attributesDto = new NotePromptExtractAttributesDto();
+        attributesDto.setAttrName("甲方");
+        attributesDto.setAttrValue("甲方-value");
+        attributesDto.setAttrValueType("1");
+        attributesDtoList.add(attributesDto);
+
+        NotePromptExtractAttributesDto attributesDto2 = new NotePromptExtractAttributesDto();
+        attributesDto2.setAttrName("资质要求");
+        attributesDto2.setAttrValue("资质要求-value");
+        attributesDto2.setAttrValueType("1");
+        attributesDtoList.add(attributesDto2);
+
+        NotePromptExtractAttributesDto attributesDto3 = new NotePromptExtractAttributesDto();
+        attributesDto3.setAttrName("签订日期");
+        attributesDto3.setAttrValue("2024-10-15");
+        attributesDto3.setAttrValueType("3");
+        attributesDtoList.add(attributesDto3);
+
+        caseEvidencePropertyService.saveEvidenceProperty("1111","7", attributesDtoList);
+
+    }
+
+    @Test
+    public void updateEvidencePropertyTest() {
+
+        List<NotePromptExtractAttributesDto> attributesDtoList = new ArrayList<>();
+
+        NotePromptExtractAttributesDto attributesDto = new NotePromptExtractAttributesDto();
+        attributesDto.setAttrName("甲方");
+        attributesDto.setAttrValue("甲方-value-update");
+        attributesDto.setAttrValueType("1");
+        attributesDtoList.add(attributesDto);
+
+        NotePromptExtractAttributesDto attributesDto2 = new NotePromptExtractAttributesDto();
+        attributesDto2.setAttrName("资质要求");
+        attributesDto2.setAttrValue("资质要求-value-update");
+        attributesDto2.setAttrValueType("1");
+        attributesDtoList.add(attributesDto2);
+
+        NotePromptExtractAttributesDto attributesDto3 = new NotePromptExtractAttributesDto();
+        attributesDto3.setAttrName("签订日期");
+        attributesDto3.setAttrValue("2024-10-15");
+        attributesDto3.setAttrValueType("3");
+        attributesDtoList.add(attributesDto3);
+
+        caseEvidencePropertyService.updateEvidenceProperty("1111","7", attributesDtoList);
+
+    }
+
+
+    @Test
+    public void listEvidencePropertyTest() {
+
+        Map<String, List<NotePromptExtractAttributesDto>> evidenceProperty = caseEvidencePropertyService.listEvidenceProperty("7", List.of("1111"));
+
+        System.out.println(JSONUtil.toJsonStr(evidenceProperty));
+
+    }
+
+    @Test
+    public void deleteEvidencePropertyTest() {
+
+         caseEvidencePropertyService.deleteEvidenceProperty("1111", "7");
+
+
+    }
+
 }