数据追踪实战 Java+MySQL实现合同生命周期管理系统
·

需求分析与系统设计
合同生命周期管理系统需涵盖合同创建、审批、执行、监控、归档等环节。核心模块包括:
- 合同模板管理:支持自定义模板(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);
}
}
性能优化策略
- 索引优化:为
contract_no、status、expire_date等高频查询字段建立复合索引 - 读写分离:Spring Boot配置多数据源,查询走从库
- 缓存设计:使用Redis缓存热点合同数据
@Cacheable(value = "contract", key = "#contractNo") public Contract getByNo(String contractNo) { return contractMapper.selectByNo(contractNo); }
安全控制要点
- 数据权限:通过MyBatis拦截器自动添加
WHERE creator_id = #{currentUser} - 敏感操作:关键操作(如合同终止)需二次密码验证
- 日志脱敏:使用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定时任务生成每日风险报告,自动邮件提醒即将到期合同。
更多推荐
所有评论(0)