一、系统架构设计 1.分层架构 -前端层:Vue3+ElementPlus(管理员界面)/UniApp(移动端) -后端层:SpringBoot2.7(Java)+MyBatis-Plus -数据库:MySQL8.0(主库)+Redis(缓存) -部署环境:Docker容器化部署(
一、系统架构设计
1. 分层架构
- 前端层:Vue3 + Element Plus(管理员界面)/ UniApp(移动端)
- 后端层:Spring Boot 2.7(Java) + MyBatis-Plus
- 数据库:MySQL 8.0(主库) + Redis(缓存)
- 部署环境:Docker容器化部署(支持K8s集群扩展)
2. 核心模块划分
```
/src
├── account-module 欠款管理核心模块
│ ├── controller 接口层
│ ├── service 业务逻辑层
│ ├── repository 数据访问层
│ └── dto 数据传输对象
├── common 公共组件
│ ├── annotation 自定义注解(如权限控制)
│ └── util 工具类(金额计算、日期处理)
└── config 系统配置
└── quartz 定时任务配置(逾期提醒)
```
二、欠款管理核心功能实现
1. 欠款记录模型设计
```java
@Data
@TableName("account_receivable")
public class AccountReceivable {
@TableId(type = IdType.AUTO)
private Long id;
private Long customerId; // 客户ID
private String batchNo; // 批次号(关联水果批次)
private BigDecimal amount; // 欠款金额
private BigDecimal paidAmount; // 已还金额
private LocalDate dueDate; // 还款截止日
private Integer status; // 0-未结清 1-部分结清 2-已结清
private String remark; // 备注(如折扣原因)
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
```
2. 关键业务逻辑实现
(1)欠款生成(销售出库时自动创建)
```java
@Transactional
public void generateAccount(Order order) {
// 计算应付款(总金额 - 预付款)
BigDecimal receivable = order.getTotalAmount().subtract(order.getPrepayment());
if (receivable.compareTo(BigDecimal.ZERO) > 0) {
AccountReceivable account = new AccountReceivable();
account.setCustomerId(order.getCustomerId());
account.setBatchNo(order.getBatchNo());
account.setAmount(receivable);
account.setDueDate(calculateDueDate(order.getCreateTime())); // 默认T+7天
accountMapper.insert(account);
// 关联订单与欠款记录
order.setAccountId(account.getId());
orderMapper.updateById(order);
}
}
```
(2)还款记录处理
```java
@Transactional
public void processPayment(PaymentDTO dto) {
// 查询欠款记录
AccountReceivable account = accountMapper.selectById(dto.getAccountId());
if (account == null || account.getStatus() == 2) {
throw new BusinessException("无效的欠款记录");
}
// 更新欠款状态
BigDecimal newPaid = account.getPaidAmount().add(dto.getAmount());
if (newPaid.compareTo(account.getAmount()) >= 0) {
account.setStatus(2); // 已结清
} else {
account.setStatus(1); // 部分结清
}
account.setPaidAmount(newPaid);
accountMapper.updateById(account);
// 生成还款流水
PaymentRecord record = new PaymentRecord();
record.setAccountId(dto.getAccountId());
record.setAmount(dto.getAmount());
record.setPaymentMethod(dto.getMethod());
paymentRecordMapper.insert(record);
}
```
3. 逾期自动提醒(Quartz定时任务)
```java
@Component
public class OverdueReminderJob {
@Autowired
private AccountMapper accountMapper;
@Autowired
private MessageService messageService;
@Scheduled(cron = "0 0 9 * * ?") // 每天9点执行
public void execute() {
LocalDate today = LocalDate.now();
List
overdueAccounts = accountMapper.selectList(
Wrappers.lambdaQuery()
.eq(AccountReceivable::getStatus, 0)
.lt(AccountReceivable::getDueDate, today)
);
overdueAccounts.forEach(account -> {
String content = String.format(
"客户%s的欠款%s元已逾期(应还日%s),请及时催收",
account.getCustomerId(),
account.getAmount(),
account.getDueDate()
);
messageService.sendSMS(account.getCustomerPhone(), content);
});
}
}
```
三、数据可视化方案
1. 欠款看板(ECharts实现)
```javascript
// 欠款金额分布(饼图)
const option = {
title: { text: 客户欠款占比 },
tooltip: { trigger: item },
series: [{
type: pie,
radius: [40%, 70%],
data: [
{ value: 1048, name: 客户A },
{ value: 735, name: 客户B },
// ...其他客户数据
]
}]
};
```
2. 还款趋势图(折线图)
```javascript
// 近30天还款趋势
const option = {
xAxis: { type: category, data: [1日, 2日, ..., 30日] },
yAxis: { type: value },
series: [{
data: [120, 200, ..., 150],
type: line,
smooth: true
}]
};
```
四、部署优化建议
1. 数据库索引优化
```sql
CREATE INDEX idx_customer_status ON account_receivable(customer_id, status);
CREATE INDEX idx_due_date ON account_receivable(due_date);
```
2. 缓存策略
- 使用Redis缓存客户欠款总额(TTL=1小时)
- 热点数据(如今日到期欠款)采用本地缓存
3. 安全措施
- 接口权限控制:`@PreAuthorize("hasAuthority(account:manage)")`
- 敏感数据加密:客户手机号使用AES加密存储
- 操作日志审计:通过AOP记录关键操作
五、扩展功能建议
1. 分期还款支持:增加`AccountInstallment`表记录分期计划
2. 电子对账单:生成PDF格式的对账单供客户下载
3. 信用评级:根据还款历史自动计算客户信用分
该方案通过清晰的模块划分、事务控制、定时任务和可视化看板,实现了水果批发行业欠款管理的全流程数字化。实际部署时建议先进行压力测试(模拟10万+欠款记录场景),并根据业务规模调整数据库分表策略。