需求分析与系统设计

合同生命周期管理系统需涵盖合同创建、审批、执行、监控、归档等环节。核心模块包括:

  • 合同模板管理:支持自定义模板(DOC/PDF)
  • 审批流程引擎:基于角色权限的多人会签
  • 履约监控:关键节点提醒与风险预警
  • 数据分析:履约率、违约率统计

技术栈选择:

  • 后端:Spring Boot + MyBatis
  • 数据库:MySQL 8.0(支持JSON字段存储动态属性)
  • 前端:Vue3 + Element Plus(可选)

数据库表结构设计

关键表结构示例:

CREATE TABLE `contract` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT,
  `contract_no` VARCHAR(64) UNIQUE COMMENT '合同编号',
  `title` VARCHAR(255) NOT NULL,
  `type` ENUM('采购','销售','租赁') NOT NULL,
  `status` ENUM('草稿','审批中','生效','终止','归档') DEFAULT '草稿',
  `content` LONGTEXT COMMENT 'HTML格式合同内容',
  `attachment` JSON COMMENT '附件路径数组',
  `sign_date` DATE COMMENT '签订日期',
  `effective_date` DATE COMMENT '生效日期',
  `expire_date` DATE COMMENT '到期日期',
  `creator_id` BIGINT NOT NULL,
  `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `approval_flow` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT,
  `contract_id` BIGINT NOT NULL,
  `approver_id` BIGINT NOT NULL,
  `approval_result` ENUM('待处理','通过','拒绝'),
  `comments` VARCHAR(500),
  `created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (`contract_id`) REFERENCES `contract`(`id`)
);

核心功能实现

合同状态机控制
使用状态模式实现状态流转:

public interface ContractState {
    void submit(ContractContext context);
    void approve(ContractContext context);
    void reject(ContractContext context);
    void archive(ContractContext context);
}

// 示例:生效状态实现
public class ActiveState implements ContractState {
    @Override
    public void archive(ContractContext context) {
        context.setState(new ArchivedState());
        context.getContract().setStatus("归档");
    }
}

审批流程引擎
基于责任链模式构建动态审批流:

public abstract class ApproverHandler {
    protected ApproverHandler next;
    
    public void setNext(ApproverHandler next) {
        this.next = next;
    }
    
    public abstract void handleRequest(ApprovalRequest request);
}

// 具体审批人实现
public class DepartmentManagerHandler extends ApproverHandler {
    @Override
    public void handleRequest(ApprovalRequest request) {
        if (canApprove(request)) {
            // 数据库记录审批结果
            approvalRepository.save(new Approval(
                request.getContractId(),
                getCurrentUserId(),
                "通过"
            ));
        } else if (next != null) {
            next.handleRequest(request);
        }
    }
}

数据追踪实现方案

版本控制
采用历史表记录变更:

CREATE TABLE `contract_history` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT,
  `contract_id` BIGINT NOT NULL,
  `snapshot` JSON COMMENT '变更前数据快照',
  `modified_by` BIGINT NOT NULL,
  `modified_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (`contract_id`) REFERENCES `contract`(`id`)
);

变更日志记录
通过Spring AOP实现审计日志:

@Aspect
@Component
public class ContractAuditAspect {
    
    @Autowired
    private ContractHistoryRepository historyRepo;
    
    @AfterReturning(
        pointcut = "execution(* com..contract..update*(..)) && args(contract)",
        returning = "result"
    )
    public void logUpdate(Contract contract, Object result) {
        ContractHistory history = new ContractHistory();
        history.setContractId(contract.getId());
        history.setSnapshot(JSON.toJSONString(contract));
        historyRepo.save(history);
    }
}

性能优化策略

  1. 索引优化:为contract_nostatusexpire_date等高频查询字段建立复合索引
  2. 读写分离:Spring Boot配置多数据源,查询走从库
  3. 缓存设计:使用Redis缓存热点合同数据
    @Cacheable(value = "contract", key = "#contractNo")
    public Contract getByNo(String contractNo) {
        return contractMapper.selectByNo(contractNo);
    }
    

安全控制要点

  1. 数据权限:通过MyBatis拦截器自动添加WHERE creator_id = #{currentUser}
  2. 敏感操作:关键操作(如合同终止)需二次密码验证
  3. 日志脱敏:使用Jackson自定义序列化器对身份证、银行账号脱敏

监控与统计

基于MySQL窗口函数实现履约分析:

SELECT 
    type,
    COUNT(*) AS total,
    SUM(CASE WHEN status = '生效' THEN 1 ELSE 0 END) AS active_count,
    SUM(CASE WHEN expire_date < CURDATE() THEN 1 ELSE 0 END) AS expired_count
FROM contract
GROUP BY type;

通过Quartz定时任务生成每日风险报告,自动邮件提醒即将到期合同。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐