Compare commits
4 Commits
6fc45f3d5c
...
75ff298909
| Author | SHA1 | Date | |
|---|---|---|---|
| 75ff298909 | |||
| 9f2a99ab43 | |||
| df489f880a | |||
| 658718be73 |
@ -85,11 +85,7 @@
|
||||
9. 部署设计
|
||||
10. 测试方案
|
||||
|
||||
### 4.3 标题编号规范
|
||||
- 一级标题:# 一、二、三...
|
||||
- 二级标题:## 1、2、3...
|
||||
- 三级标题:### 1.1、1.2、1.3...
|
||||
- 四级标题:#### 1.1.1、1.1.2、1.1.3...
|
||||
### 4.3 不要有编号
|
||||
|
||||
### 4.4 文件命名规范
|
||||
- 主设计文档:water_biz_[模块名]_design.md
|
||||
|
||||
@ -217,14 +217,7 @@ water_biz_interface_design.md # 接口设计文档
|
||||
water_biz_deployment_design.md # 部署设计文档
|
||||
```
|
||||
|
||||
### 6.2 标题编号规范
|
||||
|
||||
```markdown
|
||||
# 一、主要章节
|
||||
## 1、二级章节
|
||||
### 1.1、三级章节
|
||||
#### 1.1.1、四级章节
|
||||
```
|
||||
### 6.2 不要有编号
|
||||
|
||||
### 6.3 必需章节结构
|
||||
|
||||
|
||||
@ -57,12 +57,7 @@
|
||||
[详细目录结构]
|
||||
```
|
||||
|
||||
#### 统一的章节编号
|
||||
- 一级标题:`# 一、二、三...`
|
||||
- 二级标题:`## 1、2、3...`
|
||||
- 三级标题:`### 1.1、1.2、1.3...`
|
||||
- 四级标题:`#### 1.1.1、1.1.2、1.1.3...`
|
||||
|
||||
#### 不要有章节编号
|
||||
### 🎨 图表质量标准
|
||||
|
||||
#### Mermaid图表要求
|
||||
|
||||
@ -19,13 +19,13 @@ CJKmainfont: "PingFang SC"
|
||||
| **技术框架** | RuoYi-Vue-Pro + yudao-ui-admin-vue3 |
|
||||
| **文档版本** | v1.0 |
|
||||
| **编写日期** | 2024-12-19 |
|
||||
| **文档状态** | 🟡 进行中 |
|
||||
| **文档状态** | ✅ 已完成 |
|
||||
|
||||
## 目录
|
||||
- [1. 接口概述](#1-接口概述)
|
||||
- [2. 外部接口](#2-外部接口)
|
||||
- [3. 内部接口](#3-内部接口)
|
||||
- [4. 接口标准](#4-接口标准)
|
||||
- [接口概述](#接口概述)
|
||||
- [外部接口](#外部接口)
|
||||
- [内部接口](#内部接口)
|
||||
- [接口标准](#接口标准)
|
||||
|
||||
## 接口概述
|
||||
|
||||
@ -134,55 +134,12 @@ CJKmainfont: "PingFang SC"
|
||||
记录类型(1位) + 客户号(12位) + 银行账号(20位) + 扣款金额(12位) + 处理状态(1位) + 银行流水号(20位) + 处理时间(14位) + 失败原因(20位)
|
||||
```
|
||||
|
||||
**Java实现示例**:
|
||||
```java
|
||||
@Service
|
||||
public class BankDeductServiceImpl implements BankDeductService {
|
||||
|
||||
@Resource
|
||||
private SftpTemplate sftpTemplate;
|
||||
@Resource
|
||||
private BillService billService;
|
||||
|
||||
@Scheduled(cron = "0 0 2 * * ?")
|
||||
public void generateDeductFile() {
|
||||
LocalDate deductDate = LocalDate.now();
|
||||
|
||||
// 获取待代扣账单
|
||||
List<BillDO> deductBills = billService.getDeductBills(deductDate);
|
||||
|
||||
// 生成代扣文件
|
||||
String fileName = "DEDUCT_" + deductDate.format(DateTimeFormatter.ofPattern("yyyyMMdd")) + ".txt";
|
||||
String fileContent = buildDeductFileContent(deductBills);
|
||||
|
||||
// 上传至银行SFTP
|
||||
sftpTemplate.put(fileName, fileContent.getBytes(StandardCharsets.UTF_8), "/upload/");
|
||||
|
||||
// 记录代扣文件日志
|
||||
DeductFileLogDO log = new DeductFileLogDO();
|
||||
log.setFileName(fileName);
|
||||
log.setFileStatus("UPLOADED");
|
||||
log.setRecordCount(deductBills.size());
|
||||
deductFileLogMapper.insert(log);
|
||||
}
|
||||
|
||||
private String buildDeductFileContent(List<BillDO> bills) {
|
||||
StringBuilder content = new StringBuilder();
|
||||
for (BillDO bill : bills) {
|
||||
content.append("1") // 记录类型
|
||||
.append(StringUtils.rightPad(bill.getCustomerCode(), 12)) // 客户号
|
||||
.append(StringUtils.rightPad(bill.getCustomerName(), 30)) // 户名
|
||||
.append(StringUtils.rightPad(bill.getBankAccount(), 20)) // 银行账号
|
||||
.append(String.format("%012d", bill.getTotalAmount().multiply(new BigDecimal(100)).intValue())) // 金额(分)
|
||||
.append(bill.getBillMonth().replace("-", "")) // 账期
|
||||
.append(StringUtils.repeat(" ", 19)) // 保留字段
|
||||
.append("
|
||||
");
|
||||
}
|
||||
return content.toString();
|
||||
}
|
||||
}
|
||||
```
|
||||
**代扣文件生成流程**:
|
||||
1. 每日凌晨2点自动生成代扣文件
|
||||
2. 查询当日待代扣账单数据
|
||||
3. 按银行要求格式生成文件内容
|
||||
4. 通过SFTP上传至银行服务器
|
||||
5. 记录文件生成和上传日志
|
||||
|
||||
#### 银行实时缴费接口
|
||||
|
||||
@ -195,6 +152,7 @@ public class BankDeductServiceImpl implements BankDeductService {
|
||||
- **认证方式**:API Key + 签名
|
||||
|
||||
**请求参数**:
|
||||
|
||||
```json
|
||||
{
|
||||
"merchantId": "WATER001",
|
||||
@ -232,6 +190,7 @@ public class BankDeductServiceImpl implements BankDeductService {
|
||||
- **认证方式**:RSA2签名
|
||||
|
||||
**预创建支付请求参数**:
|
||||
|
||||
```json
|
||||
{
|
||||
"app_id": "2021001234567890",
|
||||
@ -265,45 +224,12 @@ public class BankDeductServiceImpl implements BankDeductService {
|
||||
}
|
||||
```
|
||||
|
||||
**Java实现示例**:
|
||||
```java
|
||||
@Service
|
||||
public class AlipayServiceImpl implements AlipayService {
|
||||
|
||||
@Resource
|
||||
private AlipayClient alipayClient;
|
||||
|
||||
@Override
|
||||
public AlipayPaymentRespVO createPayment(AlipayPaymentReqVO request) {
|
||||
AlipayTradePrecreateRequest alipayRequest = new AlipayTradePrecreateRequest();
|
||||
alipayRequest.setNotifyUrl("https://water.example.com/api/payment/alipay/notify");
|
||||
|
||||
AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
|
||||
model.setOutTradeNo(request.getPaymentCode());
|
||||
model.setTotalAmount(request.getTotalAmount().toString());
|
||||
model.setSubject("水费缴费");
|
||||
model.setBody("账单号:" + String.join(",", request.getBillCodes()));
|
||||
model.setTimeoutExpress("30m");
|
||||
|
||||
alipayRequest.setBizModel(model);
|
||||
|
||||
try {
|
||||
AlipayTradePrecreateResponse response = alipayClient.execute(alipayRequest);
|
||||
if (response.isSuccess()) {
|
||||
return AlipayPaymentRespVO.builder()
|
||||
.paymentCode(request.getPaymentCode())
|
||||
.qrCode(response.getQrCode())
|
||||
.outTradeNo(response.getOutTradeNo())
|
||||
.build();
|
||||
} else {
|
||||
throw new BizException(ALIPAY_PAY_FAILED, response.getSubMsg());
|
||||
}
|
||||
} catch (AlipayApiException e) {
|
||||
throw new BizException(ALIPAY_PAY_ERROR, e.getErrMsg());
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
**支付宝支付集成流程**:
|
||||
1. 调用支付宝预创建接口生成支付二维码
|
||||
2. 前端展示二维码供用户扫码支付
|
||||
3. 支付完成后支付宝发送异步通知
|
||||
4. 系统验证通知签名并更新订单状态
|
||||
5. 记录支付日志和账务处理
|
||||
|
||||
### 微信支付接口对接
|
||||
|
||||
@ -317,6 +243,7 @@ public class AlipayServiceImpl implements AlipayService {
|
||||
- **认证方式**:微信支付V3签名
|
||||
|
||||
**统一下单请求参数**:
|
||||
|
||||
```json
|
||||
{
|
||||
"appid": "wx8888888888888888",
|
||||
@ -391,6 +318,7 @@ public class AlipayServiceImpl implements AlipayService {
|
||||
- **请求头**:`Authorization: Bearer {token}`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|
||||
|-------|------|------|------|------|
|
||||
| id | Long | 是 | 客户ID | 1 |
|
||||
@ -413,28 +341,6 @@ public class AlipayServiceImpl implements AlipayService {
|
||||
}
|
||||
```
|
||||
|
||||
**RuoYi-Vue-Pro代码示例**:
|
||||
```java
|
||||
@RestController
|
||||
@RequestMapping("/admin-api/water/customer")
|
||||
@Tag(name = "管理后台 - 客户管理")
|
||||
@Validated
|
||||
public class CustomerController {
|
||||
|
||||
@Resource
|
||||
private CustomerService customerService;
|
||||
|
||||
@GetMapping("/{id}")
|
||||
@Operation(summary = "获得客户")
|
||||
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
||||
@PreAuthorize("@ss.hasPermission('water:customer:query')")
|
||||
public CommonResult<CustomerRespVO> getCustomer(@PathVariable("id") Long id) {
|
||||
CustomerDO customer = customerService.getCustomer(id);
|
||||
return success(BeanUtils.toBean(customer, CustomerRespVO.class));
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 客户分页查询接口
|
||||
|
||||
**功能描述**:分页查询客户列表信息。
|
||||
@ -444,6 +350,7 @@ public class CustomerController {
|
||||
- **请求路径**:`/admin-api/water/customer/page`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|
||||
|-------|------|------|------|------|
|
||||
| pageNo | Integer | 否 | 页码,默认1 | 1 |
|
||||
@ -485,6 +392,7 @@ public class CustomerController {
|
||||
- **请求路径**:`/admin-api/water/customer/create`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
```json
|
||||
{
|
||||
"customerCode": "C002",
|
||||
@ -506,35 +414,6 @@ public class CustomerController {
|
||||
}
|
||||
```
|
||||
|
||||
**Service层代码示例**:
|
||||
```java
|
||||
@Service
|
||||
@Validated
|
||||
public class CustomerServiceImpl implements CustomerService {
|
||||
|
||||
@Resource
|
||||
private CustomerMapper customerMapper;
|
||||
|
||||
@Override
|
||||
public Long createCustomer(CustomerSaveReqVO createReqVO) {
|
||||
// 校验客户编号唯一性
|
||||
validateCustomerCodeUnique(createReqVO.getCustomerCode());
|
||||
|
||||
// 创建客户
|
||||
CustomerDO customer = BeanUtils.toBean(createReqVO, CustomerDO.class);
|
||||
customerMapper.insert(customer);
|
||||
return customer.getId();
|
||||
}
|
||||
|
||||
private void validateCustomerCodeUnique(String customerCode) {
|
||||
CustomerDO existCustomer = customerMapper.selectByCustomerCode(customerCode);
|
||||
if (existCustomer != null) {
|
||||
throw exception(CUSTOMER_CODE_DUPLICATE);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 水表管理API接口
|
||||
|
||||
#### 水表信息查询接口
|
||||
@ -547,6 +426,7 @@ public class CustomerServiceImpl implements CustomerService {
|
||||
- **请求头**:`Authorization: Bearer {token}`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|
||||
|-------|------|------|------|------|
|
||||
| id | Long | 是 | 水表ID | 1 |
|
||||
@ -575,28 +455,6 @@ public class CustomerServiceImpl implements CustomerService {
|
||||
}
|
||||
```
|
||||
|
||||
**Controller代码示例**:
|
||||
```java
|
||||
@RestController
|
||||
@RequestMapping("/admin-api/water/meter")
|
||||
@Tag(name = "管理后台 - 水表管理")
|
||||
@Validated
|
||||
public class MeterController {
|
||||
|
||||
@Resource
|
||||
private MeterService meterService;
|
||||
|
||||
@GetMapping("/{id}")
|
||||
@Operation(summary = "获得水表")
|
||||
@Parameter(name = "id", description = "编号", required = true)
|
||||
@PreAuthorize("@ss.hasPermission('water:meter:query')")
|
||||
public CommonResult<MeterRespVO> getMeter(@PathVariable("id") Long id) {
|
||||
MeterDO meter = meterService.getMeter(id);
|
||||
return success(BeanUtils.toBean(meter, MeterRespVO.class));
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 抄表记录创建接口
|
||||
|
||||
**功能描述**:创建新的抄表记录。
|
||||
@ -606,6 +464,7 @@ public class MeterController {
|
||||
- **请求路径**:`/admin-api/water/reading/create`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
```json
|
||||
{
|
||||
"meterId": 1,
|
||||
@ -627,47 +486,6 @@ public class MeterController {
|
||||
}
|
||||
```
|
||||
|
||||
**Service层实现示例**:
|
||||
```java
|
||||
@Service
|
||||
@Validated
|
||||
public class MeterReadingServiceImpl implements MeterReadingService {
|
||||
|
||||
@Resource
|
||||
private MeterReadingMapper readingMapper;
|
||||
@Resource
|
||||
private MeterService meterService;
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Long createReading(MeterReadingSaveReqVO createReqVO) {
|
||||
// 校验水表存在性
|
||||
MeterDO meter = meterService.validateMeterExists(createReqVO.getMeterId());
|
||||
|
||||
// 校验读数合理性
|
||||
validateReadingValue(createReqVO.getMeterId(), createReqVO.getReadingValue());
|
||||
|
||||
// 创建抄表记录
|
||||
MeterReadingDO reading = BeanUtils.toBean(createReqVO, MeterReadingDO.class);
|
||||
reading.setReadingCode(generateReadingCode());
|
||||
reading.setCustomerId(meter.getCustomerId());
|
||||
|
||||
// 计算用水量
|
||||
BigDecimal waterUsage = calculateWaterUsage(meter.getCurrentReading(),
|
||||
createReqVO.getReadingValue());
|
||||
reading.setWaterUsage(waterUsage);
|
||||
|
||||
readingMapper.insert(reading);
|
||||
|
||||
// 更新水表当前读数
|
||||
meterService.updateCurrentReading(createReqVO.getMeterId(),
|
||||
createReqVO.getReadingValue());
|
||||
|
||||
return reading.getId();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 抄表数据批量导入接口
|
||||
|
||||
**功能描述**:批量导入抄表数据,支持Excel文件上传。
|
||||
@ -678,6 +496,7 @@ public class MeterReadingServiceImpl implements MeterReadingService {
|
||||
- **Content-Type**:`multipart/form-data`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|
||||
|-------|------|------|------|------|
|
||||
| file | MultipartFile | 是 | Excel文件 | reading_data.xlsx |
|
||||
@ -713,6 +532,7 @@ public class MeterReadingServiceImpl implements MeterReadingService {
|
||||
- **请求路径**:`/admin-api/water/bill/page`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|
||||
|-------|------|------|------|------|
|
||||
| pageNo | Integer | 否 | 页码,默认1 | 1 |
|
||||
@ -759,6 +579,7 @@ public class MeterReadingServiceImpl implements MeterReadingService {
|
||||
- **请求路径**:`/admin-api/water/bill/generate`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
```json
|
||||
{
|
||||
"billMonth": "2024-12",
|
||||
@ -787,66 +608,6 @@ public class MeterReadingServiceImpl implements MeterReadingService {
|
||||
}
|
||||
```
|
||||
|
||||
**Service层代码示例**:
|
||||
```java
|
||||
@Service
|
||||
@Validated
|
||||
public class BillServiceImpl implements BillService {
|
||||
|
||||
@Resource
|
||||
private BillMapper billMapper;
|
||||
@Resource
|
||||
private MeterReadingService readingService;
|
||||
@Resource
|
||||
private WaterPriceService priceService;
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public BillGenerateRespVO generateBills(BillGenerateReqVO generateReqVO) {
|
||||
BillGenerateRespVO result = new BillGenerateRespVO();
|
||||
List<BillGenerateDetailVO> successList = new ArrayList<>();
|
||||
List<BillGenerateDetailVO> failureList = new ArrayList<>();
|
||||
|
||||
for (Long readingId : generateReqVO.getReadingIds()) {
|
||||
try {
|
||||
// 获取抄表记录
|
||||
MeterReadingDO reading = readingService.getReading(readingId);
|
||||
|
||||
// 计算水费
|
||||
WaterFeeCalculateDTO feeResult = priceService.calculateWaterFee(
|
||||
reading.getCustomerId(), reading.getWaterUsage());
|
||||
|
||||
// 创建账单
|
||||
BillDO bill = new BillDO();
|
||||
bill.setBillCode(generateBillCode());
|
||||
bill.setBillMonth(generateReqVO.getBillMonth());
|
||||
bill.setCustomerId(reading.getCustomerId());
|
||||
bill.setMeterId(reading.getMeterId());
|
||||
bill.setReadingId(readingId);
|
||||
bill.setWaterUsage(reading.getWaterUsage());
|
||||
bill.setWaterFee(feeResult.getWaterFee());
|
||||
bill.setSewageFee(feeResult.getSewageFee());
|
||||
bill.setTotalAmount(feeResult.getTotalAmount());
|
||||
bill.setDueDate(generateReqVO.getDueDate());
|
||||
|
||||
billMapper.insert(bill);
|
||||
|
||||
successList.add(buildSuccessDetail(reading.getCustomerId(),
|
||||
bill.getId(), feeResult.getTotalAmount()));
|
||||
|
||||
} catch (Exception e) {
|
||||
failureList.add(buildFailureDetail(readingId, e.getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
result.setGenerateCount(successList.size());
|
||||
result.setSuccessList(successList);
|
||||
result.setFailureList(failureList);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 缴费管理API接口
|
||||
|
||||
#### 缴费处理接口
|
||||
@ -858,6 +619,7 @@ public class BillServiceImpl implements BillService {
|
||||
- **请求路径**:`/admin-api/water/payment/create`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
```json
|
||||
{
|
||||
"customerId": 1,
|
||||
@ -895,6 +657,7 @@ public class BillServiceImpl implements BillService {
|
||||
- **请求路径**:`/admin-api/water/payment/online-pay`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
```json
|
||||
{
|
||||
"customerId": 1,
|
||||
@ -965,222 +728,84 @@ public class BillServiceImpl implements BillService {
|
||||
#### 认证机制
|
||||
|
||||
**JWT令牌认证**:
|
||||
```java
|
||||
@RestController
|
||||
public class AuthController {
|
||||
|
||||
@Resource
|
||||
private AuthService authService;
|
||||
|
||||
@PostMapping("/admin-api/system/auth/login")
|
||||
public CommonResult<AuthLoginRespVO> login(@Valid @RequestBody AuthLoginReqVO reqVO) {
|
||||
// 验证用户名密码
|
||||
AdminUserDO user = authService.authenticate(reqVO.getUsername(), reqVO.getPassword());
|
||||
|
||||
// 生成JWT Token
|
||||
String token = authService.createToken(user.getId(), user.getTenantId());
|
||||
|
||||
return success(AuthLoginRespVO.builder()
|
||||
.userId(user.getId())
|
||||
.accessToken(token)
|
||||
.refreshToken(authService.createRefreshToken(user.getId()))
|
||||
.expiresTime(LocalDateTime.now().plusHours(2))
|
||||
.build());
|
||||
}
|
||||
}
|
||||
```
|
||||
- 验证用户名密码
|
||||
- 生成JWT Token
|
||||
- 支持Token刷新机制
|
||||
- 设置合理的过期时间
|
||||
|
||||
**API Key认证**(外部系统):
|
||||
```java
|
||||
@Component
|
||||
public class ApiKeyAuthenticationFilter extends OncePerRequestFilter {
|
||||
|
||||
@Override
|
||||
protected void doFilterInternal(HttpServletRequest request,
|
||||
HttpServletResponse response,
|
||||
FilterChain filterChain) throws ServletException, IOException {
|
||||
String apiKey = request.getHeader("X-API-KEY");
|
||||
String timestamp = request.getHeader("X-TIMESTAMP");
|
||||
String signature = request.getHeader("X-SIGNATURE");
|
||||
|
||||
// 验证API Key
|
||||
if (!apiKeyService.validateApiKey(apiKey)) {
|
||||
writeErrorResponse(response, "Invalid API Key");
|
||||
return;
|
||||
}
|
||||
|
||||
// 验证时间戳(防重放攻击)
|
||||
if (!validateTimestamp(timestamp)) {
|
||||
writeErrorResponse(response, "Request expired");
|
||||
return;
|
||||
}
|
||||
|
||||
// 验证签名
|
||||
if (!validateSignature(request, signature)) {
|
||||
writeErrorResponse(response, "Invalid signature");
|
||||
return;
|
||||
}
|
||||
|
||||
filterChain.doFilter(request, response);
|
||||
}
|
||||
}
|
||||
```
|
||||
- 验证API Key有效性
|
||||
- 验证请求时间戳(防重放攻击)
|
||||
- 验证请求签名完整性
|
||||
- 记录访问日志
|
||||
|
||||
#### 数据加密
|
||||
|
||||
**敏感数据加密**:
|
||||
```java
|
||||
@Component
|
||||
public class DataEncryptionService {
|
||||
|
||||
private final AESUtil aesUtil;
|
||||
|
||||
public String encryptPersonalInfo(String plainText) {
|
||||
if (StrUtil.isBlank(plainText)) {
|
||||
return plainText;
|
||||
}
|
||||
return aesUtil.encrypt(plainText);
|
||||
}
|
||||
|
||||
public String decryptPersonalInfo(String cipherText) {
|
||||
if (StrUtil.isBlank(cipherText)) {
|
||||
return cipherText;
|
||||
}
|
||||
return aesUtil.decrypt(cipherText);
|
||||
}
|
||||
}
|
||||
```
|
||||
- 个人信息字段AES加密存储
|
||||
- 数据传输HTTPS加密
|
||||
- 数据库连接SSL加密
|
||||
- 密钥定期轮换机制
|
||||
|
||||
#### 访问控制
|
||||
|
||||
**IP白名单控制**:
|
||||
```java
|
||||
@Component
|
||||
public class IpWhitelistFilter extends OncePerRequestFilter {
|
||||
|
||||
@Value("${water.security.ip-whitelist}")
|
||||
private List<String> ipWhitelist;
|
||||
|
||||
@Override
|
||||
protected void doFilterInternal(HttpServletRequest request,
|
||||
HttpServletResponse response,
|
||||
FilterChain filterChain) throws ServletException, IOException {
|
||||
String clientIp = getClientIpAddress(request);
|
||||
|
||||
if (!isIpAllowed(clientIp)) {
|
||||
response.setStatus(HttpStatus.FORBIDDEN.value());
|
||||
response.getWriter().write("{\"code\":403,\"msg\":\"IP access denied\"}");
|
||||
return;
|
||||
}
|
||||
|
||||
filterChain.doFilter(request, response);
|
||||
}
|
||||
}
|
||||
```
|
||||
- 外部接口限制IP访问
|
||||
- 内部接口网络隔离
|
||||
- 访问日志记录和监控
|
||||
- 异常访问自动阻断
|
||||
|
||||
#### 接口限流
|
||||
|
||||
**基于Redis的令牌桶限流**:
|
||||
```java
|
||||
@Component
|
||||
public class RateLimitService {
|
||||
|
||||
@Resource
|
||||
private StringRedisTemplate redisTemplate;
|
||||
|
||||
public boolean allowRequest(String key, int maxRequests, Duration window) {
|
||||
String redisKey = "rate_limit:" + key;
|
||||
String script = """
|
||||
local key = KEYS[1]
|
||||
local window = tonumber(ARGV[1])
|
||||
local limit = tonumber(ARGV[2])
|
||||
local current = redis.call('get', key)
|
||||
if current == false then
|
||||
redis.call('setex', key, window, 1)
|
||||
return 1
|
||||
end
|
||||
if tonumber(current) < limit then
|
||||
return redis.call('incr', key)
|
||||
else
|
||||
return 0
|
||||
end
|
||||
""";
|
||||
|
||||
DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>(script, Long.class);
|
||||
Long result = redisTemplate.execute(redisScript,
|
||||
Collections.singletonList(redisKey),
|
||||
String.valueOf(window.getSeconds()),
|
||||
String.valueOf(maxRequests));
|
||||
|
||||
return result != null && result > 0;
|
||||
}
|
||||
}
|
||||
```
|
||||
- 按接口设置不同限流规则
|
||||
- 支持按用户/IP限流
|
||||
- 实时监控接口调用频率
|
||||
- 超限自动熔断保护
|
||||
|
||||
### 错误处理机制
|
||||
|
||||
#### 统一异常处理
|
||||
|
||||
```java
|
||||
@RestControllerAdvice
|
||||
public class GlobalExceptionHandler {
|
||||
|
||||
@ExceptionHandler(ServiceException.class)
|
||||
public CommonResult<?> serviceExceptionHandler(ServiceException ex) {
|
||||
log.info("[serviceExceptionHandler]", ex);
|
||||
return CommonResult.error(ex.getCode(), ex.getMessage());
|
||||
}
|
||||
|
||||
@ExceptionHandler(ConstraintViolationException.class)
|
||||
public CommonResult<?> constraintViolationExceptionHandler(ConstraintViolationException ex) {
|
||||
log.info("[constraintViolationExceptionHandler]", ex);
|
||||
return CommonResult.error(BAD_REQUEST.getCode(), "请求参数不正确:" + ex.getMessage());
|
||||
}
|
||||
|
||||
@ExceptionHandler(MethodArgumentNotValidException.class)
|
||||
public CommonResult<?> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException ex) {
|
||||
log.info("[methodArgumentNotValidExceptionHandler]", ex);
|
||||
FieldError fieldError = ex.getBindingResult().getFieldError();
|
||||
assert fieldError != null;
|
||||
return CommonResult.error(BAD_REQUEST.getCode(), "请求参数不正确:" + fieldError.getDefaultMessage());
|
||||
}
|
||||
}
|
||||
```
|
||||
系统采用统一的异常处理机制,包括:
|
||||
- 业务异常统一处理
|
||||
- 参数校验异常处理
|
||||
- 系统异常统一处理
|
||||
- 异常日志记录和监控
|
||||
|
||||
#### 错误码定义
|
||||
|
||||
```java
|
||||
public interface ErrorCodeConstants {
|
||||
|
||||
// ========== 通用错误码 1-000-000-000 ==========
|
||||
ErrorCode SUCCESS = new ErrorCode(0, "成功");
|
||||
ErrorCode BAD_REQUEST = new ErrorCode(400, "请求参数不正确");
|
||||
ErrorCode UNAUTHORIZED = new ErrorCode(401, "账号未登录");
|
||||
ErrorCode FORBIDDEN = new ErrorCode(403, "没有该操作权限");
|
||||
ErrorCode NOT_FOUND = new ErrorCode(404, "请求未找到");
|
||||
ErrorCode METHOD_NOT_ALLOWED = new ErrorCode(405, "请求方法不正确");
|
||||
ErrorCode INTERNAL_SERVER_ERROR = new ErrorCode(500, "系统异常");
|
||||
|
||||
// ========== 客户管理错误码 1-001-000-000 ==========
|
||||
ErrorCode CUSTOMER_NOT_EXISTS = new ErrorCode(1_001_000_001, "客户不存在");
|
||||
ErrorCode CUSTOMER_CODE_DUPLICATE = new ErrorCode(1_001_000_002, "客户编号已存在");
|
||||
ErrorCode CUSTOMER_STATUS_INVALID = new ErrorCode(1_001_000_003, "客户状态不正确");
|
||||
|
||||
// ========== 水表管理错误码 1-002-000-000 ==========
|
||||
ErrorCode METER_NOT_EXISTS = new ErrorCode(1_002_000_001, "水表不存在");
|
||||
ErrorCode METER_CODE_DUPLICATE = new ErrorCode(1_002_000_002, "水表编号已存在");
|
||||
ErrorCode METER_READING_INVALID = new ErrorCode(1_002_000_003, "水表读数不正确");
|
||||
|
||||
// ========== 账单管理错误码 1-003-000-000 ==========
|
||||
ErrorCode BILL_NOT_EXISTS = new ErrorCode(1_003_000_001, "账单不存在");
|
||||
ErrorCode BILL_ALREADY_PAID = new ErrorCode(1_003_000_002, "账单已缴费");
|
||||
ErrorCode BILL_AMOUNT_INVALID = new ErrorCode(1_003_000_003, "账单金额不正确");
|
||||
|
||||
// ========== 缴费管理错误码 1-004-000-000 ==========
|
||||
ErrorCode PAYMENT_FAILED = new ErrorCode(1_004_000_001, "缴费失败");
|
||||
ErrorCode PAYMENT_AMOUNT_INSUFFICIENT = new ErrorCode(1_004_000_002, "缴费金额不足");
|
||||
ErrorCode PAYMENT_CHANNEL_UNAVAILABLE = new ErrorCode(1_004_000_003, "缴费渠道不可用");
|
||||
}
|
||||
```markdown
|
||||
# 错误码规范
|
||||
|
||||
## 通用错误码 (1-000-000-000)
|
||||
- 0: 成功
|
||||
- 400: 请求参数不正确
|
||||
- 401: 账号未登录
|
||||
- 403: 没有该操作权限
|
||||
- 404: 请求未找到
|
||||
- 405: 请求方法不正确
|
||||
- 500: 系统异常
|
||||
|
||||
## 客户管理错误码 (1-001-000-000)
|
||||
- 1_001_000_001: 客户不存在
|
||||
- 1_001_000_002: 客户编号已存在
|
||||
- 1_001_000_003: 客户状态不正确
|
||||
|
||||
## 水表管理错误码 (1-002-000-000)
|
||||
- 1_002_000_001: 水表不存在
|
||||
- 1_002_000_002: 水表编号已存在
|
||||
- 1_002_000_003: 水表读数不正确
|
||||
|
||||
## 账单管理错误码 (1-003-000-000)
|
||||
- 1_003_000_001: 账单不存在
|
||||
- 1_003_000_002: 账单已缴费
|
||||
- 1_003_000_003: 账单金额不正确
|
||||
|
||||
## 缴费管理错误码 (1-004-000-000)
|
||||
- 1_004_000_001: 缴费失败
|
||||
- 1_004_000_002: 缴费金额不足
|
||||
- 1_004_000_003: 缴费渠道不可用
|
||||
```
|
||||
|
||||
#### 接口调用示例
|
||||
@ -1206,141 +831,19 @@ public interface ErrorCodeConstants {
|
||||
}
|
||||
```
|
||||
|
||||
### 前端接口调用示例
|
||||
### 前端接口调用规范
|
||||
|
||||
#### Vue3 + TypeScript接口封装
|
||||
#### 接口封装标准
|
||||
|
||||
```typescript
|
||||
// api/water/customer.ts
|
||||
import { request } from '@/utils/request'
|
||||
前端接口调用需要遵循以下规范:
|
||||
- 统一的请求配置和响应处理
|
||||
- 统一的错误处理和提示机制
|
||||
- 统一的Loading状态管理
|
||||
- 统一的数据类型定义
|
||||
|
||||
export interface CustomerVO {
|
||||
id: number
|
||||
customerCode: string
|
||||
customerName: string
|
||||
customerType: string
|
||||
phone: string
|
||||
address: string
|
||||
status: number
|
||||
createTime: string
|
||||
}
|
||||
#### 组件使用规范
|
||||
|
||||
export interface CustomerPageReqVO extends PageParam {
|
||||
customerName?: string
|
||||
customerCode?: string
|
||||
customerType?: string
|
||||
phone?: string
|
||||
}
|
||||
|
||||
export const CustomerApi = {
|
||||
// 获取客户分页
|
||||
getCustomerPage: (params: CustomerPageReqVO) => {
|
||||
return request.get<PageResult<CustomerVO>>({ url: '/water/customer/page', params })
|
||||
},
|
||||
|
||||
// 获取客户详情
|
||||
getCustomer: (id: number) => {
|
||||
return request.get<CustomerVO>({ url: `/water/customer/${id}` })
|
||||
},
|
||||
|
||||
// 创建客户
|
||||
createCustomer: (data: CustomerSaveReqVO) => {
|
||||
return request.post<number>({ url: '/water/customer/create', data })
|
||||
},
|
||||
|
||||
// 更新客户
|
||||
updateCustomer: (data: CustomerSaveReqVO) => {
|
||||
return request.put<void>({ url: '/water/customer/update', data })
|
||||
},
|
||||
|
||||
// 删除客户
|
||||
deleteCustomer: (id: number) => {
|
||||
return request.delete<void>({ url: `/water/customer/delete?id=${id}` })
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### Vue组件使用示例
|
||||
|
||||
```vue
|
||||
<script setup lang="ts">
|
||||
import { ref, onMounted } from 'vue'
|
||||
import { CustomerApi, CustomerVO } from '@/api/water/customer'
|
||||
import { formatDate } from '@/utils/formatTime'
|
||||
|
||||
const customerList = ref<CustomerVO[]>([])
|
||||
const loading = ref(true)
|
||||
const total = ref(0)
|
||||
const queryParams = ref({
|
||||
pageNo: 1,
|
||||
pageSize: 10,
|
||||
customerName: '',
|
||||
customerCode: ''
|
||||
})
|
||||
|
||||
const getCustomerList = async () => {
|
||||
loading.value = true
|
||||
try {
|
||||
const data = await CustomerApi.getCustomerPage(queryParams.value)
|
||||
customerList.value = data.list
|
||||
total.value = data.total
|
||||
} catch (error) {
|
||||
console.error('获取客户列表失败:', error)
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
const handleQuery = () => {
|
||||
queryParams.value.pageNo = 1
|
||||
getCustomerList()
|
||||
}
|
||||
|
||||
const handleReset = () => {
|
||||
queryParams.value = {
|
||||
pageNo: 1,
|
||||
pageSize: 10,
|
||||
customerName: '',
|
||||
customerCode: ''
|
||||
}
|
||||
getCustomerList()
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
getCustomerList()
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<!-- 查询表单 -->
|
||||
<el-form :model="queryParams" ref="queryFormRef" inline>
|
||||
<el-form-item label="客户名称" prop="customerName">
|
||||
<el-input v-model="queryParams.customerName" placeholder="请输入客户名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="客户编号" prop="customerCode">
|
||||
<el-input v-model="queryParams.customerCode" placeholder="请输入客户编号" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="handleQuery">搜索</el-button>
|
||||
<el-button @click="handleReset">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<!-- 数据表格 -->
|
||||
<el-table v-loading="loading" :data="customerList">
|
||||
<el-table-column label="客户编号" prop="customerCode" />
|
||||
<el-table-column label="客户名称" prop="customerName" />
|
||||
<el-table-column label="联系电话" prop="phone" />
|
||||
<el-table-column label="创建时间" prop="createTime" :formatter="formatDate" />
|
||||
</el-table>
|
||||
|
||||
<!-- 分页组件 -->
|
||||
<Pagination
|
||||
:total="total"
|
||||
v-model:page="queryParams.pageNo"
|
||||
v-model:limit="queryParams.pageSize"
|
||||
@pagination="getCustomerList"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
前端组件使用接口时需要:
|
||||
- 合理的数据加载状态展示
|
||||
- 完善的错误处理和用户提示
|
||||
- 适当的数据缓存和优化
|
||||
|
||||
@ -25,84 +25,82 @@ CJKmainfont: "PingFang SC"
|
||||
- [福建水务营收系统模块功能设计文档](#福建水务营收系统模块功能设计文档)
|
||||
- [文档信息](#文档信息)
|
||||
- [目录](#目录)
|
||||
- [一、系统整体架构](#一系统整体架构)
|
||||
- [1.1 系统架构图](#11-系统架构图)
|
||||
- [1.2 技术架构图](#12-技术架构图)
|
||||
- [1.3 业务架构图](#13-业务架构图)
|
||||
- [二、统一平台](#二统一平台)
|
||||
- [2.1 单点登录](#21-单点登录)
|
||||
- [2.2 系统管理](#22-系统管理)
|
||||
- [三、营收系统](#三营收系统)
|
||||
- [3.1 系统管理](#31-系统管理)
|
||||
- [3.2 抄表开账](#32-抄表开账)
|
||||
- [3.2.1 业务流程图](#321-业务流程图)
|
||||
- [3.2.2 主要功能](#322-主要功能)
|
||||
- [3.2.3 核心接口定义](#323-核心接口定义)
|
||||
- [3.2.4 前端界面设计](#324-前端界面设计)
|
||||
- [3.3 收费管理](#33-收费管理)
|
||||
- [3.3.1 业务流程图](#331-业务流程图)
|
||||
- [3.3.2 主要功能](#332-主要功能)
|
||||
- [3.3.3 核心接口定义](#333-核心接口定义)
|
||||
- [3.4 账务处理](#34-账务处理)
|
||||
- [3.4.1 业务流程图](#341-业务流程图)
|
||||
- [3.4.2 主要功能](#342-主要功能)
|
||||
- [3.4.3 核心接口定义](#343-核心接口定义)
|
||||
- [3.5 发票管理](#35-发票管理)
|
||||
- [3.5.1 业务流程图](#351-业务流程图)
|
||||
- [3.5.2 核心接口定义](#352-核心接口定义)
|
||||
- [3.6 代收业务](#36-代收业务)
|
||||
- [3.7 环卫系统](#37-环卫系统)
|
||||
- [3.8 业务工单](#38-业务工单)
|
||||
- [四、表务系统](#四表务系统)
|
||||
- [4.1 表务工单](#41-表务工单)
|
||||
- [4.2 表务仓库](#42-表务仓库)
|
||||
- [4.3 水表参数与基础信息](#43-水表参数与基础信息)
|
||||
- [4.4 物联网对接与数据同步](#44-物联网对接与数据同步)
|
||||
- [五、报装系统](#五报装系统)
|
||||
- [5.1 报装流程](#51-报装流程)
|
||||
- [5.2 一户一表管理](#52-一户一表管理)
|
||||
- [六、客户服务](#六客户服务)
|
||||
- [6.1 微信、支付宝服务窗](#61-微信支付宝服务窗)
|
||||
- [6.2 历史账单](#62-历史账单)
|
||||
- [6.3 电子发票](#63-电子发票)
|
||||
- [6.4 营业网点](#64-营业网点)
|
||||
- [6.5 账户流水](#65-账户流水)
|
||||
- [6.6 微网厅](#66-微网厅)
|
||||
- [七、系统配置](#七系统配置)
|
||||
- [7.1 水表参数](#71-水表参数)
|
||||
- [7.2 地址参数](#72-地址参数)
|
||||
- [7.3 价格体系](#73-价格体系)
|
||||
- [7.4 基本配置](#74-基本配置)
|
||||
- [7.5 催缴管理](#75-催缴管理)
|
||||
- [7.6 用户权限](#76-用户权限)
|
||||
- [7.7 定时任务](#77-定时任务)
|
||||
- [八、系统接口](#八系统接口)
|
||||
- [8.1 银行接口](#81-银行接口)
|
||||
- [8.2 支付宝/微信接口](#82-支付宝微信接口)
|
||||
- [8.3 短信接口](#83-短信接口)
|
||||
- [8.4 集抄系统接口](#84-集抄系统接口)
|
||||
- [8.5 政务系统接口](#85-政务系统接口)
|
||||
- [8.6 消火栓系统接口](#86-消火栓系统接口)
|
||||
- [8.7 其他系统对接](#87-其他系统对接)
|
||||
- [九、统计分析](#九统计分析)
|
||||
- [9.1 报表查询](#91-报表查询)
|
||||
- [9.2 欠费查询](#92-欠费查询)
|
||||
- [9.3 缴费记录](#93-缴费记录)
|
||||
- [9.4 用水分析](#94-用水分析)
|
||||
- [十、工程管理](#十工程管理)
|
||||
- [10.1 工程申请](#101-工程申请)
|
||||
- [10.2 工程施工](#102-工程施工)
|
||||
- [10.3 工程验收](#103-工程验收)
|
||||
- [10.4 工程查询](#104-工程查询)
|
||||
- [十一、抄表APP](#十一抄表app)
|
||||
- [11.1 首页功能](#111-首页功能)
|
||||
- [11.2 抄表功能](#112-抄表功能)
|
||||
- [11.3 工单管理](#113-工单管理)
|
||||
- [十二、接口服务](#十二接口服务)
|
||||
- [12.1 API市场](#121-api市场)
|
||||
- [12.2 API管理](#122-api管理)
|
||||
- [12.3 接口权限管理](#123-接口权限管理)
|
||||
- [12.4 系统对外接口](#124-系统对外接口)
|
||||
- [系统整体架构](#系统整体架构)
|
||||
- [系统架构图](#系统架构图)
|
||||
- [技术架构图](#技术架构图)
|
||||
- [业务架构图](#业务架构图)
|
||||
- [统一平台](#统一平台)
|
||||
- [单点登录](#单点登录)
|
||||
- [系统管理](#系统管理)
|
||||
- [营收系统](#营收系统)
|
||||
- [系统管理](#系统管理-1)
|
||||
- [抄表开账](#抄表开账)
|
||||
- [业务流程图](#业务流程图)
|
||||
- [主要功能](#主要功能)
|
||||
- [核心接口定义](#核心接口定义)
|
||||
- [前端界面设计](#前端界面设计)
|
||||
- [收费管理](#收费管理)
|
||||
- [业务流程图](#业务流程图-1)
|
||||
- [主要功能](#主要功能-1)
|
||||
- [核心接口定义](#核心接口定义-1)
|
||||
- [主要功能](#主要功能-2)
|
||||
- [核心接口定义](#核心接口定义-2)
|
||||
- [发票管理](#发票管理)
|
||||
- [业务流程图](#业务流程图-2)
|
||||
- [核心接口定义](#核心接口定义-3)
|
||||
- [代收业务](#代收业务)
|
||||
- [环卫系统](#环卫系统)
|
||||
- [业务工单](#业务工单)
|
||||
- [表务系统](#表务系统)
|
||||
- [表务工单](#表务工单)
|
||||
- [表务仓库](#表务仓库)
|
||||
- [水表参数与基础信息](#水表参数与基础信息)
|
||||
- [物联网对接与数据同步](#物联网对接与数据同步)
|
||||
- [报装系统](#报装系统)
|
||||
- [报装流程](#报装流程)
|
||||
- [一户一表管理](#一户一表管理)
|
||||
- [客户服务](#客户服务)
|
||||
- [微信、支付宝服务窗](#微信支付宝服务窗)
|
||||
- [历史账单](#历史账单)
|
||||
- [电子发票](#电子发票)
|
||||
- [营业网点](#营业网点)
|
||||
- [账户流水](#账户流水)
|
||||
- [微网厅](#微网厅)
|
||||
- [系统配置](#系统配置)
|
||||
- [水表参数](#水表参数)
|
||||
- [地址参数](#地址参数)
|
||||
- [价格体系](#价格体系)
|
||||
- [基本配置](#基本配置)
|
||||
- [催缴管理](#催缴管理)
|
||||
- [用户权限](#用户权限)
|
||||
- [定时任务](#定时任务)
|
||||
- [系统接口](#系统接口)
|
||||
- [银行接口](#银行接口)
|
||||
- [支付宝/微信接口](#支付宝微信接口)
|
||||
- [短信接口](#短信接口)
|
||||
- [集抄系统接口](#集抄系统接口)
|
||||
- [政务系统接口](#政务系统接口)
|
||||
- [消火栓系统接口](#消火栓系统接口)
|
||||
- [其他系统对接](#其他系统对接)
|
||||
- [统计分析](#统计分析)
|
||||
- [报表查询](#报表查询)
|
||||
- [欠费查询](#欠费查询)
|
||||
- [缴费记录](#缴费记录)
|
||||
- [用水分析](#用水分析)
|
||||
- [工程管理](#工程管理)
|
||||
- [工程申请](#工程申请)
|
||||
- [工程施工](#工程施工)
|
||||
- [工程验收](#工程验收)
|
||||
- [工程查询](#工程查询)
|
||||
- [抄表APP](#抄表app)
|
||||
- [首页功能](#首页功能)
|
||||
- [抄表功能](#抄表功能)
|
||||
- [工单管理](#工单管理)
|
||||
- [接口服务](#接口服务)
|
||||
- [API市场](#api市场)
|
||||
- [API管理](#api管理)
|
||||
- [接口权限管理](#接口权限管理)
|
||||
- [系统对外接口](#系统对外接口)
|
||||
- [系统集成架构](#系统集成架构)
|
||||
- [前后端集成架构](#前后端集成架构)
|
||||
- [技术栈整合方案](#技术栈整合方案)
|
||||
@ -116,7 +114,7 @@ CJKmainfont: "PingFang SC"
|
||||
|
||||
**图表 1**
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
### 技术架构图
|
||||
@ -124,7 +122,7 @@ CJKmainfont: "PingFang SC"
|
||||
|
||||
**图表 2**
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
### 业务架构图
|
||||
@ -132,7 +130,7 @@ CJKmainfont: "PingFang SC"
|
||||
|
||||
**图表 3**
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
## 统一平台
|
||||
@ -230,7 +228,7 @@ CJKmainfont: "PingFang SC"
|
||||
|
||||
**图表 4**
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
#### 主要功能
|
||||
@ -259,29 +257,13 @@ CJKmainfont: "PingFang SC"
|
||||
#### 核心接口定义
|
||||
|
||||
**抄表管理主要接口**:
|
||||
```java
|
||||
@RestController
|
||||
@RequestMapping("/admin-api/water/reading")
|
||||
@Tag(name = "管理后台 - 抄表管理")
|
||||
public class MeterReadingController {
|
||||
|
||||
@PostMapping("/create")
|
||||
@Operation(summary = "创建抄表记录")
|
||||
public CommonResult<Long> createReading(@Valid @RequestBody MeterReadingSaveReqVO createReqVO);
|
||||
|
||||
@PostMapping("/batch-create")
|
||||
@Operation(summary = "批量创建抄表记录")
|
||||
public CommonResult<MeterReadingBatchRespVO> batchCreateReading(@Valid @RequestBody MeterReadingBatchReqVO batchReqVO);
|
||||
|
||||
@PostMapping("/review")
|
||||
@Operation(summary = "抄表数据复核")
|
||||
public CommonResult<Boolean> reviewReading(@Valid @RequestBody MeterReadingReviewReqVO reviewReqVO);
|
||||
|
||||
@PostMapping("/generate-bill")
|
||||
@Operation(summary = "生成账单")
|
||||
public CommonResult<BillGenerateRespVO> generateBill(@Valid @RequestBody ReadingBillReqVO reqVO);
|
||||
}
|
||||
```
|
||||
|
||||
| 接口名称 | 请求方式 | 功能描述 |
|
||||
|---------|---------|---------|
|
||||
| `/admin-api/water/reading/create` | POST | 创建抄表记录 |
|
||||
| `/admin-api/water/reading/batch-create` | POST | 批量创建抄表记录 |
|
||||
| `/admin-api/water/reading/review` | POST | 抄表数据复核 |
|
||||
| `/admin-api/water/reading/generate-bill` | POST | 生成账单 |
|
||||
|
||||
**接口设计要点**:
|
||||
- 遵循RESTful设计规范,统一的请求响应格式
|
||||
@ -291,58 +273,12 @@ public class MeterReadingController {
|
||||
|
||||
#### 前端界面设计
|
||||
|
||||
**抄表管理页面结构**:
|
||||
```vue
|
||||
<template>
|
||||
<ContentWrap>
|
||||
<!-- 查询条件 -->
|
||||
<el-form class="search-form" inline>
|
||||
<el-form-item label="抄表日期">
|
||||
<el-date-picker v-model="queryParams.readingDate" type="daterange" />
|
||||
</el-form-item>
|
||||
<el-form-item label="抄表状态">
|
||||
<el-select v-model="queryParams.status">
|
||||
<el-option label="待复核" value="pending" />
|
||||
<el-option label="已通过" value="approved" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="handleQuery">查询</el-button>
|
||||
<el-button @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
**前端页面功能设计**:
|
||||
|
||||
<!-- 操作按钮 -->
|
||||
<el-row class="mb-10px">
|
||||
<el-button type="primary" @click="handleAdd">新增抄表</el-button>
|
||||
<el-button type="success" @click="handleBatchAdd">批量抄表</el-button>
|
||||
<el-button type="warning" @click="handleExport">导出数据</el-button>
|
||||
</el-row>
|
||||
|
||||
<!-- 数据表格 -->
|
||||
<el-table v-loading="loading" :data="readingList">
|
||||
<el-table-column prop="readingCode" label="抄表编号" width="180" />
|
||||
<el-table-column prop="customerName" label="客户名称" />
|
||||
<el-table-column prop="meterCode" label="水表编号" />
|
||||
<el-table-column prop="readingValue" label="本次读数" />
|
||||
<el-table-column prop="waterUsage" label="用水量" />
|
||||
<el-table-column prop="readingDate" label="抄表日期" />
|
||||
<el-table-column prop="status" label="状态">
|
||||
<template #default="{ row }">
|
||||
<dict-tag :type="DICT_TYPE.READING_STATUS" :value="row.status" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="200" fixed="right">
|
||||
<template #default="{ row }">
|
||||
<el-button link @click="handleUpdate(row)">编辑</el-button>
|
||||
<el-button link @click="handleReview(row)">复核</el-button>
|
||||
<el-button link type="danger" @click="handleDelete(row)">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</ContentWrap>
|
||||
</template>
|
||||
```
|
||||
**页面组件结构**:
|
||||
- 查询条件区域:抄表日期范围选择、抄表状态筛选
|
||||
- 操作按钮区域:新增抄表、批量抄表、数据导出
|
||||
- 数据表格区域:抄表记录列表展示和操作
|
||||
|
||||
**前端页面功能特性**:
|
||||
- 响应式设计:基于Element Plus的现代化UI组件
|
||||
@ -360,7 +296,7 @@ public class MeterReadingController {
|
||||
|
||||
**图表 5**
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
#### 主要功能
|
||||
@ -389,29 +325,13 @@ public class MeterReadingController {
|
||||
#### 核心接口定义
|
||||
|
||||
**缴费管理主要接口**:
|
||||
```java
|
||||
@RestController
|
||||
@RequestMapping("/admin-api/water/payment")
|
||||
@Tag(name = "管理后台 - 缴费管理")
|
||||
public class PaymentController {
|
||||
|
||||
@PostMapping("/create")
|
||||
@Operation(summary = "创建缴费记录")
|
||||
public CommonResult<PaymentRespVO> createPayment(@Valid @RequestBody PaymentCreateReqVO createReqVO);
|
||||
|
||||
@PostMapping("/cash-payment")
|
||||
@Operation(summary = "现金缴费")
|
||||
public CommonResult<PaymentRespVO> cashPayment(@Valid @RequestBody CashPaymentReqVO cashReqVO);
|
||||
|
||||
@PostMapping("/online-payment")
|
||||
@Operation(summary = "在线支付")
|
||||
public CommonResult<OnlinePaymentRespVO> onlinePayment(@Valid @RequestBody OnlinePaymentReqVO onlineReqVO);
|
||||
|
||||
@PostMapping("/prepaid-payment")
|
||||
@Operation(summary = "预存款缴费")
|
||||
public CommonResult<PaymentRespVO> prepaidPayment(@Valid @RequestBody PrepaidPaymentReqVO prepaidReqVO);
|
||||
}
|
||||
```
|
||||
|
||||
| 接口名称 | 请求方式 | 功能描述 |
|
||||
|---------|---------|---------|
|
||||
| `/admin-api/water/payment/create` | POST | 创建缴费记录 |
|
||||
| `/admin-api/water/payment/cash-payment` | POST | 现金缴费 |
|
||||
| `/admin-api/water/payment/online-payment` | POST | 在线支付 |
|
||||
| `/admin-api/water/payment/prepaid-payment` | POST | 预存款缴费 |
|
||||
|
||||
**接口设计特点**:
|
||||
- 支持多种缴费方式:现金、银行卡、在线支付、预存款
|
||||
@ -422,48 +342,12 @@ public class PaymentController {
|
||||
|
||||
#### 前端界面设计
|
||||
|
||||
**缴费管理页面结构**:
|
||||
```vue
|
||||
<template>
|
||||
<ContentWrap>
|
||||
<!-- 客户查询 -->
|
||||
<el-form class="search-form" inline>
|
||||
<el-form-item label="客户编号">
|
||||
<el-input v-model="queryParams.customerCode" placeholder="请输入客户编号" />
|
||||
</el-form-item>
|
||||
<el-form-item label="客户姓名">
|
||||
<el-input v-model="queryParams.customerName" placeholder="请输入客户姓名" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="handleQuery">查询</el-button>
|
||||
<el-button @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
**缴费管理页面功能设计**:
|
||||
|
||||
<!-- 账单信息 -->
|
||||
<el-table v-loading="loading" :data="billList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column prop="billCode" label="账单编号" />
|
||||
<el-table-column prop="billDate" label="账期" />
|
||||
<el-table-column prop="waterUsage" label="用水量" />
|
||||
<el-table-column prop="totalAmount" label="应缴金额" />
|
||||
<el-table-column prop="balanceAmount" label="欠费金额" />
|
||||
</el-table>
|
||||
|
||||
<!-- 缴费操作 -->
|
||||
<el-row class="payment-actions">
|
||||
<el-col :span="12">
|
||||
<el-statistic title="选中金额" :value="selectedAmount" prefix="¥" />
|
||||
</el-col>
|
||||
<el-col :span="12" class="text-right">
|
||||
<el-button type="success" @click="handleCashPayment">现金缴费</el-button>
|
||||
<el-button type="primary" @click="handleOnlinePayment">在线支付</el-button>
|
||||
<el-button type="warning" @click="handlePrepaidPayment">预存扣费</el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</ContentWrap>
|
||||
</template>
|
||||
```
|
||||
**页面组件结构**:
|
||||
- 客户查询区域:客户编号输入、客户姓名输入
|
||||
- 账单信息区域:待缴费账单列表展示和选择
|
||||
- 缴费操作区域:金额统计和多种缴费方式选择
|
||||
|
||||
### 账务处理
|
||||
|
||||
@ -474,7 +358,7 @@ public class PaymentController {
|
||||
|
||||
**图表 6**
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
#### 主要功能
|
||||
@ -497,29 +381,13 @@ public class PaymentController {
|
||||
|
||||
#### 核心接口定义
|
||||
|
||||
```java
|
||||
@RestController
|
||||
@RequestMapping("/admin-api/water/account")
|
||||
@Tag(name = "管理后台 - 账务处理")
|
||||
@Validated
|
||||
public class AccountProcessController {
|
||||
|
||||
@PostMapping("/adjust")
|
||||
@Operation(summary = "账务调整")
|
||||
@PreAuthorize("@ss.hasPermission('water:account:adjust')")
|
||||
public CommonResult<Boolean> adjustAccount(@Valid @RequestBody AccountAdjustReqVO adjustReqVO);
|
||||
|
||||
@PostMapping("/refund")
|
||||
@Operation(summary = "退款处理")
|
||||
@PreAuthorize("@ss.hasPermission('water:account:refund')")
|
||||
public CommonResult<Boolean> processRefund(@Valid @RequestBody RefundProcessReqVO refundReqVO);
|
||||
|
||||
@PostMapping("/write-off")
|
||||
@Operation(summary = "销账处理")
|
||||
@PreAuthorize("@ss.hasPermission('water:account:write-off')")
|
||||
public CommonResult<Boolean> writeOffAccount(@Valid @RequestBody WriteOffReqVO writeOffReqVO);
|
||||
}
|
||||
```
|
||||
**账务处理主要接口**:
|
||||
|
||||
| 接口名称 | 请求方式 | 功能描述 |
|
||||
|---------|---------|---------|
|
||||
| `/admin-api/water/account/adjust` | POST | 账务调整 |
|
||||
| `/admin-api/water/account/refund` | POST | 退款处理 |
|
||||
| `/admin-api/water/account/write-off` | POST | 销账处理 |
|
||||
|
||||
### 发票管理
|
||||
|
||||
@ -530,31 +398,18 @@ public class AccountProcessController {
|
||||
|
||||
**图表 7**
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
#### 核心接口定义
|
||||
|
||||
```java
|
||||
@RestController
|
||||
@RequestMapping("/admin-api/water/invoice")
|
||||
@Tag(name = "管理后台 - 发票管理")
|
||||
@Validated
|
||||
public class InvoiceController {
|
||||
|
||||
@PostMapping("/generate")
|
||||
@Operation(summary = "生成发票")
|
||||
public CommonResult<InvoiceRespVO> generateInvoice(@Valid @RequestBody InvoiceGenerateReqVO generateReqVO);
|
||||
|
||||
@PostMapping("/print")
|
||||
@Operation(summary = "打印发票")
|
||||
public CommonResult<Boolean> printInvoice(@Valid @RequestBody InvoicePrintReqVO printReqVO);
|
||||
|
||||
@PostMapping("/cancel")
|
||||
@Operation(summary = "发票作废")
|
||||
public CommonResult<Boolean> cancelInvoice(@Valid @RequestBody InvoiceCancelReqVO cancelReqVO);
|
||||
}
|
||||
```
|
||||
**发票管理主要接口**:
|
||||
|
||||
| 接口名称 | 请求方式 | 功能描述 |
|
||||
|---------|---------|---------|
|
||||
| `/admin-api/water/invoice/generate` | POST | 生成发票 |
|
||||
| `/admin-api/water/invoice/print` | POST | 打印发票 |
|
||||
| `/admin-api/water/invoice/cancel` | POST | 发票作废 |
|
||||
|
||||
### 代收业务
|
||||
|
||||
@ -957,7 +812,7 @@ public class InvoiceController {
|
||||
|
||||
**图表 8**
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
### 技术栈整合方案
|
||||
|
||||
@ -22,23 +22,23 @@ CJKmainfont: "PingFang SC"
|
||||
| **文档状态** | ✅ 已完成 |
|
||||
|
||||
## 目录
|
||||
- [一、引言](#一引言)
|
||||
- [1.1 编写目的](#11-编写目的)
|
||||
- [1.2 背景](#12-背景)
|
||||
- [1.3 定义](#13-定义)
|
||||
- [1.4 参考资料](#14-参考资料)
|
||||
- [引言](#引言)
|
||||
- [编写目的](#编写目的)
|
||||
- [背景](#背景)
|
||||
- [定义](#定义)
|
||||
- [参考资料](#参考资料)
|
||||
|
||||
---
|
||||
|
||||
# 引言
|
||||
|
||||
## 编写目的
|
||||
## 编写目的
|
||||
|
||||
### 文档目标
|
||||
### 文档目标
|
||||
|
||||
本文档是福建水务营收系统的概要设计文档,旨在为系统的详细设计、开发实施、测试验证、运维管理等后续工作提供重要的技术依据和指导方案。
|
||||
|
||||
### 编写目的
|
||||
### 编写目的
|
||||
|
||||
- **指导系统开发**:为开发团队提供清晰、完整、可执行的技术架构方案和实施蓝图
|
||||
- **规范设计标准**:建立统一的技术标准和开发规范,确保系统架构的一致性和可维护性
|
||||
@ -46,7 +46,7 @@ CJKmainfont: "PingFang SC"
|
||||
- **支撑项目管理**:为项目管理、进度控制、质量管控提供技术基础和评估依据
|
||||
- **保障系统质量**:通过详细的设计说明确保系统的可靠性、安全性、可扩展性和高性能
|
||||
|
||||
### 目标读者
|
||||
### 目标读者
|
||||
|
||||
本文档的主要读者包括:
|
||||
|
||||
@ -60,7 +60,7 @@ CJKmainfont: "PingFang SC"
|
||||
| **业务分析师** | 业务功能、流程设计、用户体验 | 需求验证、业务流程梳理 |
|
||||
| **甲方技术团队** | 整体技术方案、质量标准、交付成果 | 技术评审、验收标准制定 |
|
||||
|
||||
### 预期用途
|
||||
### 预期用途
|
||||
|
||||
- **开发阶段**:作为系统详细设计和编码实现的技术指导文档
|
||||
- **测试阶段**:作为系统测试、集成测试、性能测试的参考标准
|
||||
@ -68,9 +68,9 @@ CJKmainfont: "PingFang SC"
|
||||
- **维护阶段**:作为系统维护、功能扩展、技术升级的参考依据
|
||||
- **培训阶段**:作为技术培训、知识传递的重要教材
|
||||
|
||||
## 背景
|
||||
## 背景
|
||||
|
||||
### 项目背景
|
||||
### 项目背景
|
||||
|
||||
随着福建省水务行业数字化转型的深入推进和"数字福建"战略的全面实施,传统的水务营收管理系统已无法满足现代化管理的需要。为了提升水务企业的服务效率、管理水平和客户体验,迫切需要构建一套现代化、智能化、集成化的水务营收系统。
|
||||
|
||||
@ -87,7 +87,7 @@ CJKmainfont: "PingFang SC"
|
||||
- **云原生部署**:支持容器化部署和云原生架构
|
||||
- **安全合规**:满足等保三级安全要求和行业安全规范
|
||||
|
||||
### 系统现状
|
||||
### 系统现状
|
||||
|
||||
#### 现有系统问题
|
||||
- **技术架构陈旧**:基于传统单体架构,扩展性和维护性较差
|
||||
@ -102,7 +102,7 @@ CJKmainfont: "PingFang SC"
|
||||
- **收费方式单一**:主要依赖现金收费,线上支付渠道不完善
|
||||
- **数据分析能力弱**:缺乏有效的数据分析和决策支持工具
|
||||
|
||||
### 相关系统
|
||||
### 相关系统
|
||||
|
||||
本系统需要与多个相关系统进行数据交换和业务协同:
|
||||
|
||||
@ -125,7 +125,7 @@ CJKmainfont: "PingFang SC"
|
||||
- **价格监管系统**:水价政策执行情况报送
|
||||
- **环保监测系统**:污水处理和环保数据上报
|
||||
|
||||
### 建设环境
|
||||
### 建设环境
|
||||
|
||||
#### 技术环境
|
||||
- **开发框架**:基于RuoYi-Vue-Pro开源框架进行定制开发
|
||||
@ -140,9 +140,9 @@ CJKmainfont: "PingFang SC"
|
||||
- **机房环境**:符合国家A级机房标准,具备完善的电力、空调、监控设施
|
||||
- **灾备环境**:建设异地灾备中心,实现数据同步和业务连续性
|
||||
|
||||
## 定义
|
||||
## 定义
|
||||
|
||||
### 专业术语
|
||||
### 专业术语
|
||||
|
||||
| 术语 | 英文全称 | 中文定义 | 备注 |
|
||||
|------|---------|----------|------|
|
||||
@ -159,7 +159,7 @@ CJKmainfont: "PingFang SC"
|
||||
| **工单** | Work Order | 记录和跟踪业务处理过程的管理单据 | 流程管理工具 |
|
||||
| **多租户** | Multi-tenancy | 支持多个独立客户共享同一应用实例的架构模式 | 技术架构模式 |
|
||||
|
||||
### 技术术语
|
||||
### 技术术语
|
||||
|
||||
| 术语 | 英文全称 | 中文定义 | 备注 |
|
||||
|------|---------|----------|------|
|
||||
@ -174,7 +174,7 @@ CJKmainfont: "PingFang SC"
|
||||
| **JWT** | JSON Web Token | 基于JSON的安全令牌标准 | 认证技术 |
|
||||
| **RESTful** | Representational State Transfer | 基于HTTP的Web服务架构风格 | 接口设计规范 |
|
||||
|
||||
### 缩略语
|
||||
### 缩略语
|
||||
|
||||
| 缩略语 | 英文全称 | 中文含义 | 使用场景 |
|
||||
|--------|----------|----------|----------|
|
||||
@ -194,7 +194,7 @@ CJKmainfont: "PingFang SC"
|
||||
| **GPS** | Global Positioning System | 全球定位系统 | 定位技术 |
|
||||
| **GIS** | Geographic Information System | 地理信息系统 | 地理信息技术 |
|
||||
|
||||
### 业务术语规范
|
||||
### 业务术语规范
|
||||
|
||||
#### 客户管理相关
|
||||
- **用户**:指系统的操作用户,如管理员、抄表员等
|
||||
@ -215,9 +215,9 @@ CJKmainfont: "PingFang SC"
|
||||
- **厂商**:水表生产厂家
|
||||
- **型号**:水表的具体型号规格
|
||||
|
||||
## 参考资料
|
||||
## 参考资料
|
||||
|
||||
### 国家标准和行业规范
|
||||
### 国家标准和行业规范
|
||||
|
||||
| 标准编号 | 标准名称 | 版本 | 适用范围 |
|
||||
|---------|----------|------|----------|
|
||||
@ -227,7 +227,7 @@ CJKmainfont: "PingFang SC"
|
||||
| **GB 50015-2019** | 建筑给水排水设计标准 | 2019版 | 给排水工程设计 |
|
||||
| **CJ/T 224-2019** | 城市供水水质标准 | 2019版 | 供水水质要求 |
|
||||
|
||||
### 信息安全标准
|
||||
### 信息安全标准
|
||||
|
||||
| 标准编号 | 标准名称 | 版本 | 适用范围 |
|
||||
|---------|----------|------|----------|
|
||||
@ -236,7 +236,7 @@ CJKmainfont: "PingFang SC"
|
||||
| **GB/T 28448-2019** | 信息安全技术 网络安全等级保护测评要求 | 2019版 | 安全测评标准 |
|
||||
| **GM/T 0054-2018** | 信息系统密码应用基本要求 | 2018版 | 密码应用规范 |
|
||||
|
||||
### 软件工程标准
|
||||
### 软件工程标准
|
||||
|
||||
| 标准编号 | 标准名称 | 版本 | 适用范围 |
|
||||
|---------|----------|------|----------|
|
||||
@ -245,7 +245,7 @@ CJKmainfont: "PingFang SC"
|
||||
| **GB/T 15532-2008** | 计算机软件测试规范 | 2008版 | 软件测试规范 |
|
||||
| **ISO/IEC 25010:2011** | Systems and software Quality Requirements and Evaluation (SQuaRE) | 2011版 | 软件质量国际标准 |
|
||||
|
||||
### 技术参考文档
|
||||
### 技术参考文档
|
||||
|
||||
#### 开发框架文档
|
||||
- **RuoYi-Vue-Pro官方文档** - [https://doc.iocoder.cn/](https://doc.iocoder.cn/)
|
||||
@ -263,7 +263,7 @@ CJKmainfont: "PingFang SC"
|
||||
- **Kubernetes官方文档** - [https://kubernetes.io/docs/](https://kubernetes.io/docs/)
|
||||
- **Nginx官方文档** - [https://nginx.org/en/docs/](https://nginx.org/en/docs/)
|
||||
|
||||
### 业务参考资料
|
||||
### 业务参考资料
|
||||
|
||||
#### 水务行业资料
|
||||
- **《城市供水条例》** - 国务院令第158号
|
||||
@ -278,7 +278,7 @@ CJKmainfont: "PingFang SC"
|
||||
- **《现有系统调研报告》** - v1.0
|
||||
- **《业务流程梳理报告》** - v2.1
|
||||
|
||||
### 技术选型参考
|
||||
### 技术选型参考
|
||||
|
||||
#### 架构设计参考
|
||||
- **《微服务架构设计模式》** - Chris Richardson著
|
||||
|
||||
@ -22,25 +22,24 @@ CJKmainfont: "PingFang SC"
|
||||
| **文档状态** | ✅ 已完成 |
|
||||
|
||||
## 目录
|
||||
- [一、安全设计概述](#一安全设计概述)
|
||||
- [二、等级保护三级安全设计](#二等级保护三级安全设计)
|
||||
- [三、OpenGauss数据库安全](#三opengauss数据库安全)
|
||||
- [四、应用系统安全](#四应用系统安全)
|
||||
- [五、网络安全设计](#五网络安全设计)
|
||||
- [六、数据安全设计](#六数据安全设计)
|
||||
- [七、运维安全设计](#七运维安全设计)
|
||||
- [八、安全管理制度](#八安全管理制度)
|
||||
- [安全设计概述](#安全设计概述)
|
||||
- [OpenGauss数据库安全](#opengauss数据库安全)
|
||||
- [应用系统安全](#应用系统安全)
|
||||
- [网络安全设计](#网络安全设计)
|
||||
- [数据安全设计](#数据安全设计)
|
||||
- [运维安全设计](#运维安全设计)
|
||||
- [安全管理制度](#安全管理制度)
|
||||
|
||||
## 安全设计概述
|
||||
|
||||
福建水务营收系统安全设计严格按照《网络安全等级保护基本要求》第三级标准,结合水务行业特点和国产化要求,构建全方位、多层次的安全防护体系。
|
||||
福建水务营收系统安全设计结合水务行业特点和国产化要求,构建全方位、多层次的安全防护体系。
|
||||
|
||||
### 安全目标
|
||||
- **机密性**:确保敏感数据不被未授权访问
|
||||
- **完整性**:防止数据被恶意篡改或损坏
|
||||
- **可用性**:保障系统7×24小时稳定运行
|
||||
- **可审计性**:完整记录系统操作审计轨迹
|
||||
- **合规性**:满足等保三级和行业监管要求
|
||||
- **合规性**:满足行业监管要求
|
||||
|
||||
### 安全原则
|
||||
- **纵深防御**:多层安全防护,避免单点故障
|
||||
@ -54,398 +53,124 @@ CJKmainfont: "PingFang SC"
|
||||
|
||||
**图表 1**
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
## 等级保护三级安全设计
|
||||
|
||||
### 技术安全要求
|
||||
|
||||
#### 安全通信网络
|
||||
|
||||
**网络架构安全**
|
||||
|
||||
**图表 2**
|
||||
|
||||

|
||||
|
||||
|
||||
**网络安全措施**
|
||||
- 网络边界部署防火墙,实现网络访问控制
|
||||
- 重要网络设备和服务器前端部署网络入侵检测设备
|
||||
- 网络分段部署,DMZ区、应用区、数据区物理隔离
|
||||
- 关键网络设备提供双机热备功能
|
||||
- 网络设备登录实现身份标识和鉴别
|
||||
|
||||
#### 安全区域边界
|
||||
|
||||
**区域边界防护**
|
||||
- 在网络边界部署防火墙设备,设置访问控制策略
|
||||
- 在网络边界部署入侵检测设备,监控网络攻击行为
|
||||
- 在应用层部署Web应用防火墙,防护Web应用攻击
|
||||
- 对进出网络的数据流进行过滤和监控
|
||||
- 建立网络访问控制策略,限制不必要的网络连接
|
||||
|
||||
#### 安全计算环境
|
||||
|
||||
**身份鉴别**
|
||||
|
||||
**图表 3**
|
||||
|
||||

|
||||
|
||||
|
||||
**访问控制设计**
|
||||
- 实现基于角色的访问控制(RBAC)
|
||||
- 支持基于属性的访问控制(ABAC)
|
||||
- 实现最小权限原则
|
||||
- 支持权限的动态调整和审批流程
|
||||
|
||||
### 管理安全要求
|
||||
|
||||
#### 安全管理中心
|
||||
- 建立安全管理中心,统一管理安全策略
|
||||
- 配置安全管理员角色,负责安全策略制定
|
||||
- 建立安全事件响应机制
|
||||
- 定期进行安全评估和风险分析
|
||||
|
||||
#### 安全管理制度
|
||||
- 制定信息安全管理制度和操作规程
|
||||
- 建立人员安全管理制度
|
||||
- 制定系统建设管理制度
|
||||
- 建立系统运维管理制度
|
||||
|
||||
## OpenGauss数据库安全
|
||||
|
||||
### 数据库安全架构
|
||||
|
||||
|
||||
**图表 4**
|
||||
**图表 2**
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
### 国产密码算法应用
|
||||
|
||||
#### 传输加密
|
||||
```sql
|
||||
-- 配置国密SSL连接
|
||||
ALTER SYSTEM SET ssl = on;
|
||||
ALTER SYSTEM SET ssl_ciphers = 'SM4-GCM-SM3:SM4-CCM-SM3';
|
||||
ALTER SYSTEM SET ssl_cert_file = 'server-sm2.crt';
|
||||
ALTER SYSTEM SET ssl_key_file = 'server-sm2.key';
|
||||
```
|
||||
- 配置国密SSL连接,使用SM2/SM3/SM4算法套件
|
||||
- 支持SM4-GCM-SM3和SM4-CCM-SM3加密套件
|
||||
- 配置国产SM2证书和私钥文件
|
||||
- 强制要求SSL连接,拒绝明文传输
|
||||
|
||||
#### 透明数据加密
|
||||
```sql
|
||||
-- 启用TDE透明数据加密,使用SM4算法
|
||||
CREATE KEY ENCRYPTION KEY water_biz_kek
|
||||
WITH ALGORITHM = 'SM4-CTR', KEY_STORE = 'localkms';
|
||||
|
||||
-- 为敏感表启用加密
|
||||
CREATE TABLE water_customer (
|
||||
id SERIAL PRIMARY KEY,
|
||||
customer_name VARCHAR(100) ENCRYPTED WITH (
|
||||
COLUMN_ENCRYPTION_KEY = water_biz_kek,
|
||||
ENCRYPTION_TYPE = DETERMINISTIC,
|
||||
ALGORITHM = 'SM4-CTR'
|
||||
),
|
||||
id_card VARCHAR(18) ENCRYPTED WITH (
|
||||
COLUMN_ENCRYPTION_KEY = water_biz_kek,
|
||||
ENCRYPTION_TYPE = RANDOMIZED,
|
||||
ALGORITHM = 'SM4-CTR'
|
||||
)
|
||||
);
|
||||
```
|
||||
- 启用TDE透明数据加密,使用SM4算法
|
||||
- 为敏感数据表配置列级加密
|
||||
- 支持确定性加密和随机化加密
|
||||
- 集成本地密钥管理系统(localkms)
|
||||
|
||||
### 行级安全策略
|
||||
|
||||
```sql
|
||||
-- 创建多租户行级安全策略
|
||||
CREATE ROW LEVEL SECURITY POLICY tenant_isolation_policy
|
||||
ON water_customer
|
||||
USING (tenant_id = current_setting('app.current_tenant_id')::bigint);
|
||||
|
||||
-- 启用行级安全
|
||||
ALTER TABLE water_customer ENABLE ROW LEVEL SECURITY;
|
||||
|
||||
-- 创建数据访问角色
|
||||
CREATE ROLE water_data_reader;
|
||||
CREATE ROLE water_data_writer;
|
||||
|
||||
-- 配置列级权限
|
||||
GRANT SELECT (id, customer_name, phone) ON water_customer TO water_data_reader;
|
||||
GRANT ALL ON water_customer TO water_data_writer;
|
||||
```
|
||||
- 创建多租户行级安全策略,实现数据隔离
|
||||
- 配置基于用户角色的数据访问控制
|
||||
- 实现动态数据过滤和权限控制
|
||||
- 支持复杂的安全策略表达式
|
||||
|
||||
### 数据脱敏策略
|
||||
|
||||
```sql
|
||||
-- 创建数据脱敏函数
|
||||
CREATE OR REPLACE FUNCTION mask_phone(phone_num TEXT)
|
||||
RETURNS TEXT AS $$
|
||||
BEGIN
|
||||
RETURN SUBSTRING(phone_num, 1, 3) || '****' || SUBSTRING(phone_num, 8, 4);
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- 创建脱敏视图
|
||||
CREATE VIEW water_customer_masked AS
|
||||
SELECT
|
||||
id,
|
||||
customer_name,
|
||||
mask_phone(phone) as phone,
|
||||
LEFT(id_card, 6) || '********' || RIGHT(id_card, 4) as id_card_masked
|
||||
FROM water_customer;
|
||||
|
||||
-- 授权普通用户只能访问脱敏视图
|
||||
GRANT SELECT ON water_customer_masked TO water_normal_user;
|
||||
```
|
||||
- 创建敏感数据脱敏函数和规则
|
||||
- 为不同角色提供不同级别的数据视图
|
||||
- 实现手机号、身份证号等敏感信息脱敏
|
||||
- 支持动态脱敏和静态脱敏
|
||||
|
||||
## 应用系统安全
|
||||
|
||||
### Spring Security安全配置
|
||||
|
||||
#### 认证配置
|
||||
```java
|
||||
@Configuration
|
||||
@EnableWebSecurity
|
||||
@EnableMethodSecurity(prePostEnabled = true)
|
||||
public class SecurityConfig {
|
||||
|
||||
@Bean
|
||||
public PasswordEncoder passwordEncoder() {
|
||||
// 使用国密SM3哈希算法
|
||||
return new SM3PasswordEncoder();
|
||||
}
|
||||
|
||||
@Bean
|
||||
public JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter() {
|
||||
return new JwtAuthenticationTokenFilter();
|
||||
}
|
||||
|
||||
@Bean
|
||||
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
|
||||
return http
|
||||
// CSRF防护
|
||||
.csrf(csrf -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()))
|
||||
// 请求授权
|
||||
.authorizeHttpRequests(auth -> auth
|
||||
.requestMatchers("/api/login", "/api/register").permitAll()
|
||||
.requestMatchers("/api/admin/**").hasRole("ADMIN")
|
||||
.anyRequest().authenticated()
|
||||
)
|
||||
// JWT过滤器
|
||||
.addFilterBefore(jwtAuthenticationTokenFilter(), UsernamePasswordAuthenticationFilter.class)
|
||||
// 会话管理
|
||||
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
|
||||
.build();
|
||||
}
|
||||
}
|
||||
```
|
||||
- 使用国密SM3哈希算法进行密码加密
|
||||
- 配置JWT身份验证过滤器
|
||||
- 设置CSRF防护和HttpOnly Cookie
|
||||
- 配置请求授权规则和无状态会话管理
|
||||
- 启用方法级安全注解支持
|
||||
|
||||
#### 多因素认证
|
||||
```java
|
||||
@Service
|
||||
public class MFAService {
|
||||
|
||||
@Autowired
|
||||
private SmsService smsService;
|
||||
|
||||
@Autowired
|
||||
private RedisTemplate<String, String> redisTemplate;
|
||||
|
||||
public boolean sendSmsCode(String phone) {
|
||||
String code = generateRandomCode();
|
||||
String key = "mfa:sms:" + phone;
|
||||
|
||||
// 存储验证码,5分钟过期
|
||||
redisTemplate.opsForValue().set(key, code, Duration.ofMinutes(5));
|
||||
|
||||
// 发送短信
|
||||
return smsService.send(phone, "您的验证码是:" + code + ",5分钟内有效。");
|
||||
}
|
||||
|
||||
public boolean verifySmsCode(String phone, String code) {
|
||||
String key = "mfa:sms:" + phone;
|
||||
String storedCode = redisTemplate.opsForValue().get(key);
|
||||
|
||||
if (storedCode != null && storedCode.equals(code)) {
|
||||
redisTemplate.delete(key);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
```
|
||||
#### 多因素认证实现
|
||||
- 生成随机验证码并缓存到Redis
|
||||
- 设置验证码过期时间防止滥用
|
||||
- 集成短信服务提供商发送验证码
|
||||
- 实现验证码验证和及时清理机制
|
||||
|
||||
### 数据传输安全
|
||||
|
||||
#### HTTPS配置
|
||||
```yaml
|
||||
server:
|
||||
port: 8443
|
||||
ssl:
|
||||
enabled: true
|
||||
key-store: classpath:keystore/server.p12
|
||||
key-store-password: ${SSL_KEYSTORE_PASSWORD}
|
||||
key-store-type: PKCS12
|
||||
# 支持国密算法
|
||||
ciphers: SM4-GCM-SM3,SM4-CCM-SM3,ECDHE-SM2-WITH-SM4-SM3
|
||||
protocols: TLSv1.2,TLSv1.3
|
||||
```
|
||||
- 启用HTTPS协议,使用SSL/TLS加密
|
||||
- 配置国产密码算法套件支持
|
||||
- 使用PKCS12格式的数字证书
|
||||
- 支持TLSv1.2和TLSv1.3协议版本
|
||||
|
||||
#### 敏感数据加密
|
||||
```java
|
||||
@Component
|
||||
public class DataEncryptionService {
|
||||
|
||||
private final SM4Cipher sm4Cipher = new SM4Cipher();
|
||||
|
||||
public String encryptSensitiveData(String plaintext) {
|
||||
try {
|
||||
return sm4Cipher.encrypt(plaintext);
|
||||
} catch (Exception e) {
|
||||
throw new SecurityException("数据加密失败", e);
|
||||
}
|
||||
}
|
||||
|
||||
public String decryptSensitiveData(String ciphertext) {
|
||||
try {
|
||||
return sm4Cipher.decrypt(ciphertext);
|
||||
} catch (Exception e) {
|
||||
throw new SecurityException("数据解密失败", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
- 采用国密SM4对称加密算法
|
||||
- 实现统一的数据加密和解密服务
|
||||
- 对身份证号、手机号等敏感信息加密存储
|
||||
- 提供统一的异常处理和错误提示
|
||||
|
||||
### 接口安全防护
|
||||
|
||||
#### 接口签名验证
|
||||
```java
|
||||
@Component
|
||||
public class ApiSignatureValidator {
|
||||
|
||||
public boolean validateSignature(HttpServletRequest request) {
|
||||
String timestamp = request.getHeader("X-Timestamp");
|
||||
String nonce = request.getHeader("X-Nonce");
|
||||
String signature = request.getHeader("X-Signature");
|
||||
String body = getRequestBody(request);
|
||||
|
||||
// 检查时间戳,防止重放攻击
|
||||
if (isTimestampExpired(timestamp)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 生成签名
|
||||
String expectedSignature = generateSignature(timestamp, nonce, body);
|
||||
|
||||
// 验证签名
|
||||
return signature.equals(expectedSignature);
|
||||
}
|
||||
|
||||
private String generateSignature(String timestamp, String nonce, String body) {
|
||||
String message = timestamp + nonce + body;
|
||||
return SM3Utils.hash(message);
|
||||
}
|
||||
}
|
||||
```
|
||||
- 基于时间戳、随机数和请求体生成签名
|
||||
- 使用国密SM3哈希算法计算签名值
|
||||
- 检查时间戳有效性防止重放攻击
|
||||
- 实现客户端和服务端签名比对验证
|
||||
|
||||
#### 接口限流防护
|
||||
```java
|
||||
@Component
|
||||
public class RateLimitService {
|
||||
|
||||
@Autowired
|
||||
private RedisTemplate<String, String> redisTemplate;
|
||||
|
||||
public boolean isAllowed(String key, int limit, Duration window) {
|
||||
String redisKey = "rate_limit:" + key;
|
||||
String current = redisTemplate.opsForValue().get(redisKey);
|
||||
|
||||
if (current == null) {
|
||||
redisTemplate.opsForValue().set(redisKey, "1", window);
|
||||
return true;
|
||||
}
|
||||
|
||||
int count = Integer.parseInt(current);
|
||||
if (count < limit) {
|
||||
redisTemplate.opsForValue().increment(redisKey);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
```
|
||||
- 基于Redis实现分布式限流控制
|
||||
- 支持按IP、用户、接口等维度限流
|
||||
- 采用滑动窗口算法统计请求频率
|
||||
- 超过限制时返回429状态码和错误提示
|
||||
|
||||
## 网络安全设计
|
||||
|
||||
### 网络拓扑安全
|
||||
|
||||
|
||||
**图表 5**
|
||||
**图表 3**
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
### 防火墙策略配置
|
||||
|
||||
#### 边界防火墙策略
|
||||
```bash
|
||||
# 允许HTTPS访问
|
||||
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
|
||||
|
||||
# 允许HTTP重定向到HTTPS
|
||||
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
|
||||
|
||||
# 禁止直接数据库访问
|
||||
iptables -A INPUT -p tcp --dport 5432 -s ! 192.168.1.0/24 -j DROP
|
||||
|
||||
# 允许内网SSH管理
|
||||
iptables -A INPUT -p tcp --dport 22 -s 192.168.100.0/24 -j ACCEPT
|
||||
|
||||
# 拒绝其他所有入站连接
|
||||
iptables -A INPUT -j DROP
|
||||
```
|
||||
- 允许HTTPS访问,开放443端口
|
||||
- 允许HTTP重定向到HTTPS,开放80端口
|
||||
- 禁止外部直接访问数据库端口
|
||||
- 允许内网SSH管理,限制管理网段
|
||||
- 默认拒绝所有其他入站连接
|
||||
|
||||
#### 应用层防火墙策略
|
||||
```bash
|
||||
# 只允许来自DMZ区的连接
|
||||
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
|
||||
|
||||
# 允许访问数据库
|
||||
iptables -A OUTPUT -d 192.168.2.0/24 -p tcp --dport 5432 -j ACCEPT
|
||||
|
||||
# 允许访问Redis
|
||||
iptables -A OUTPUT -d 192.168.2.0/24 -p tcp --dport 6379 -j ACCEPT
|
||||
|
||||
# 允许DNS查询
|
||||
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
|
||||
|
||||
# 拒绝其他出站连接
|
||||
iptables -A OUTPUT -j DROP
|
||||
```
|
||||
- 只允许来自DMZ区的应用访问
|
||||
- 允许访问数据库服务器的指定端口
|
||||
- 允许访问Redis缓存服务
|
||||
- 允许DNS查询和时间同步
|
||||
- 默认拒绝其他出站连接
|
||||
|
||||
### 入侵检测与防护
|
||||
|
||||
#### IDS/IPS规则配置
|
||||
```bash
|
||||
# Suricata规则示例
|
||||
alert tcp any any -> $HOME_NET 443 (msg:"Suspicious HTTPS traffic"; \
|
||||
content:"POST"; http_method; content:"/api/admin"; http_uri; \
|
||||
threshold:type limit, track by_src, count 10, seconds 60; \
|
||||
sid:10001; rev:1;)
|
||||
|
||||
alert tcp any any -> $HOME_NET 5432 (msg:"Direct database access attempt"; \
|
||||
content:"SELECT"; content:"FROM"; distance:0; \
|
||||
sid:10002; rev:1;)
|
||||
|
||||
alert tcp any any -> $HOME_NET any (msg:"Brute force attack detected"; \
|
||||
flags:S; threshold:type threshold, track by_src, count 100, seconds 60; \
|
||||
sid:10003; rev:1;)
|
||||
```
|
||||
- 配置Web应用攻击检测规则
|
||||
- 配置数据库直接访问告警规则
|
||||
- 配置暴力破解攻击检测规则
|
||||
- 设置基于流量特征的异常检测
|
||||
- 配置威胁情报实时更新机制
|
||||
|
||||
## 数据安全设计
|
||||
|
||||
@ -453,146 +178,38 @@ alert tcp any any -> $HOME_NET any (msg:"Brute force attack detected"; \
|
||||
|
||||
#### 数据分类标准
|
||||
|
||||
**图表 6**
|
||||
**图表 4**
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
#### 数据保护策略
|
||||
```sql
|
||||
-- 客户敏感信息表(机密级)
|
||||
CREATE TABLE water_customer_sensitive (
|
||||
id SERIAL PRIMARY KEY,
|
||||
customer_id BIGINT NOT NULL,
|
||||
-- 身份证号:强加密存储
|
||||
id_card_encrypted VARCHAR(200) ENCRYPTED WITH (
|
||||
COLUMN_ENCRYPTION_KEY = customer_sensitive_key,
|
||||
ENCRYPTION_TYPE = RANDOMIZED,
|
||||
ALGORITHM = 'SM4-CTR'
|
||||
),
|
||||
-- 银行卡号:强加密存储
|
||||
bank_account_encrypted VARCHAR(200) ENCRYPTED WITH (
|
||||
COLUMN_ENCRYPTION_KEY = customer_sensitive_key,
|
||||
ENCRYPTION_TYPE = RANDOMIZED,
|
||||
ALGORITHM = 'SM4-CTR'
|
||||
),
|
||||
-- 手机号:确定性加密,支持查询
|
||||
phone_encrypted VARCHAR(200) ENCRYPTED WITH (
|
||||
COLUMN_ENCRYPTION_KEY = customer_sensitive_key,
|
||||
ENCRYPTION_TYPE = DETERMINISTIC,
|
||||
ALGORITHM = 'SM4-CTR'
|
||||
),
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- 创建行级安全策略
|
||||
CREATE POLICY customer_sensitive_policy ON water_customer_sensitive
|
||||
FOR ALL TO water_customer_service_role
|
||||
USING (
|
||||
customer_id IN (
|
||||
SELECT customer_id FROM water_customer
|
||||
WHERE tenant_id = current_setting('app.current_tenant_id')::bigint
|
||||
)
|
||||
);
|
||||
```
|
||||
- **机密级数据**:强加密存储,严格访问控制
|
||||
- **内部级数据**:权限控制,审计日志记录
|
||||
- **公开级数据**:无特殊保护要求
|
||||
- **敏感字段**:单独加密,支持查询需求
|
||||
|
||||
### 数据备份与恢复安全
|
||||
|
||||
#### 备份加密策略
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# OpenGauss安全备份脚本
|
||||
|
||||
# 设置备份参数
|
||||
BACKUP_DIR="/backup/opengauss"
|
||||
DATE=$(date +%Y%m%d_%H%M%S)
|
||||
BACKUP_FILE="water_biz_backup_${DATE}.tar.gz"
|
||||
ENCRYPT_KEY="/etc/opengauss/backup_key.key"
|
||||
|
||||
# 创建加密备份
|
||||
gs_backup -D $GAUSSDATA -U gaussdb \
|
||||
--encrypt --encrypt-key-file=$ENCRYPT_KEY \
|
||||
--backup-format=tar \
|
||||
--backup-path=$BACKUP_DIR/$BACKUP_FILE
|
||||
|
||||
# 验证备份完整性
|
||||
openssl dgst -sm3 $BACKUP_DIR/$BACKUP_FILE > $BACKUP_DIR/$BACKUP_FILE.sm3
|
||||
|
||||
# 安全传输到异地备份中心
|
||||
rsync -avz --delete $BACKUP_DIR/ backup-server:/backup/remote/
|
||||
```
|
||||
- 使用国产密码算法加密备份文件
|
||||
- 生成备份文件完整性校验码
|
||||
- 实现备份文件的安全传输
|
||||
- 定期验证备份文件的完整性
|
||||
|
||||
#### 数据恢复流程
|
||||
```sql
|
||||
-- 恢复前验证备份完整性
|
||||
-- 1. 验证SM3摘要
|
||||
-- 2. 解密备份文件
|
||||
-- 3. 验证数据库结构
|
||||
-- 4. 执行恢复操作
|
||||
|
||||
-- 创建恢复测试环境
|
||||
CREATE DATABASE water_biz_recovery_test;
|
||||
|
||||
-- 恢复数据到测试环境
|
||||
-- 执行恢复SQL脚本
|
||||
\i /backup/water_biz_recovery.sql;
|
||||
|
||||
-- 验证数据完整性
|
||||
SELECT COUNT(*) FROM water_customer;
|
||||
SELECT COUNT(*) FROM water_meter_reading;
|
||||
SELECT COUNT(*) FROM water_billing;
|
||||
|
||||
-- 验证加密数据
|
||||
SELECT id,
|
||||
pgp_sym_decrypt(id_card_encrypted, 'encryption_key') as id_card
|
||||
FROM water_customer_sensitive LIMIT 1;
|
||||
```
|
||||
- 验证备份文件完整性和真实性
|
||||
- 在隔离环境中进行恢复测试
|
||||
- 验证恢复数据的完整性和一致性
|
||||
- 记录详细的恢复过程和验证结果
|
||||
|
||||
### 数据销毁与清理
|
||||
|
||||
#### 安全数据销毁
|
||||
```sql
|
||||
-- 创建安全数据销毁函数
|
||||
CREATE OR REPLACE FUNCTION secure_data_destroy(table_name TEXT, where_clause TEXT)
|
||||
RETURNS BOOLEAN AS $$
|
||||
DECLARE
|
||||
sql_cmd TEXT;
|
||||
affected_rows INTEGER;
|
||||
BEGIN
|
||||
-- 构建删除SQL
|
||||
sql_cmd := 'DELETE FROM ' || table_name || ' WHERE ' || where_clause;
|
||||
|
||||
-- 执行删除
|
||||
EXECUTE sql_cmd;
|
||||
GET DIAGNOSTICS affected_rows = ROW_COUNT;
|
||||
|
||||
-- 记录审计日志
|
||||
INSERT INTO data_destroy_audit (
|
||||
table_name, where_clause, affected_rows,
|
||||
operator, operation_time
|
||||
) VALUES (
|
||||
table_name, where_clause, affected_rows,
|
||||
current_user, current_timestamp
|
||||
);
|
||||
|
||||
-- 执行VACUUM清理物理空间
|
||||
EXECUTE 'VACUUM FULL ' || table_name;
|
||||
|
||||
RETURN TRUE;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
RAISE EXCEPTION '数据销毁失败: %', SQLERRM;
|
||||
RETURN FALSE;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- 示例:销毁3年前的历史数据
|
||||
SELECT secure_data_destroy(
|
||||
'water_meter_reading_history',
|
||||
'reading_date < CURRENT_DATE - INTERVAL ''3 years'''
|
||||
);
|
||||
```
|
||||
- 实现安全的数据删除和物理清除
|
||||
- 记录数据销毁的审计日志
|
||||
- 定期清理历史数据和临时文件
|
||||
- 确保已删除数据无法被恢复
|
||||
|
||||
## 运维安全设计
|
||||
|
||||
@ -600,80 +217,30 @@ SELECT secure_data_destroy(
|
||||
|
||||
#### 安全监控架构
|
||||
|
||||
**图表 7**
|
||||
**图表 5**
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
#### 安全事件检测规则
|
||||
```yaml
|
||||
# 安全事件检测规则配置
|
||||
security_rules:
|
||||
- name: "暴力破解检测"
|
||||
type: "authentication"
|
||||
condition: "failed_login_count > 5 in 5 minutes"
|
||||
severity: "high"
|
||||
action: ["block_ip", "send_alert"]
|
||||
|
||||
- name: "异常数据访问"
|
||||
type: "data_access"
|
||||
condition: "query_count > 1000 in 1 minute"
|
||||
severity: "medium"
|
||||
action: ["rate_limit", "send_alert"]
|
||||
|
||||
- name: "权限提升检测"
|
||||
type: "privilege_escalation"
|
||||
condition: "role_change to admin"
|
||||
severity: "critical"
|
||||
action: ["block_user", "send_alert", "create_incident"]
|
||||
|
||||
- name: "异常时间访问"
|
||||
type: "abnormal_access"
|
||||
condition: "access_time between 22:00 and 06:00"
|
||||
severity: "medium"
|
||||
action: ["log_event", "send_alert"]
|
||||
```
|
||||
- **暴力破解检测**:失败登录次数阈值告警
|
||||
- **异常数据访问**:大量数据查询行为监控
|
||||
- **权限提升检测**:管理员权限变更告警
|
||||
- **异常时间访问**:非工作时间访问行为监控
|
||||
|
||||
### 漏洞管理
|
||||
|
||||
#### 漏洞扫描策略
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# 系统漏洞扫描脚本
|
||||
|
||||
# 扫描操作系统漏洞
|
||||
nmap -sV --script vulners localhost
|
||||
|
||||
# 扫描Web应用漏洞
|
||||
nikto -h https://water.example.com -ssl
|
||||
|
||||
# 扫描数据库漏洞
|
||||
nmap -p 5432 --script pgsql-brute,pgsql-databases localhost
|
||||
|
||||
# 生成漏洞报告
|
||||
cat > vulnerability_report.html << EOF
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>安全漏洞扫描报告</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>福建水务营收系统漏洞扫描报告</h1>
|
||||
<p>扫描时间:$(date)</p>
|
||||
<h2>高危漏洞</h2>
|
||||
<pre>$(grep -i "high\|critical" scan_results.txt)</pre>
|
||||
<h2>中危漏洞</h2>
|
||||
<pre>$(grep -i "medium" scan_results.txt)</pre>
|
||||
</body>
|
||||
</html>
|
||||
EOF
|
||||
```
|
||||
- 定期进行系统漏洞扫描
|
||||
- 执行Web应用安全测试
|
||||
- 进行数据库安全评估
|
||||
- 生成漏洞扫描报告和修复建议
|
||||
|
||||
#### 补丁管理流程
|
||||
|
||||
**图表 8**
|
||||
**图表 6**
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
### 应急响应预案
|
||||
@ -688,9 +255,9 @@ EOF
|
||||
|
||||
#### 应急响应流程
|
||||
|
||||
**图表 9**
|
||||
**图表 7**
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
## 安全管理制度
|
||||
@ -699,9 +266,9 @@ EOF
|
||||
|
||||
#### 安全管理组织
|
||||
|
||||
**图表 10**
|
||||
**图表 8**
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
### 安全管理制度
|
||||
@ -734,12 +301,10 @@ EOF
|
||||
|
||||
#### 行业标准合规
|
||||
- GB/T 22239-2019《信息安全技术 网络安全等级保护基本要求》
|
||||
- GB/T 25070-2019《信息安全技术 网络安全等级保护安全设计技术要求》
|
||||
- GB/T 32918《信息安全技术 SM2椭圆曲线公钥密码算法》
|
||||
- GB/T 32905《信息安全技术 SM3密码杂凑算法》
|
||||
|
||||
#### 合规检查清单
|
||||
- [ ] 等级保护三级备案完成
|
||||
- [ ] 年度安全评估报告
|
||||
- [ ] 安全管理制度建立
|
||||
- [ ] 安全技术措施落实
|
||||
@ -752,10 +317,9 @@ EOF
|
||||
|
||||
## 总结
|
||||
|
||||
福建水务营收系统安全设计严格按照等级保护三级要求,结合OpenGauss数据库的安全特性,建立了全方位、多层次的安全防护体系。通过技术防护、管理制度、人员培训等多重措施,确保系统安全稳定运行,满足水务行业的安全合规要求。
|
||||
福建水务营收系统安全设计结合OpenGauss数据库的安全特性,建立了全方位、多层次的安全防护体系。通过技术防护、管理制度、人员培训等多重措施,确保系统安全稳定运行,满足水务行业的安全要求。
|
||||
|
||||
本安全设计方案的核心特点:
|
||||
1. **国产化安全**:采用OpenGauss数据库和国密算法
|
||||
2. **纵深防御**:网络、应用、数据多层安全防护
|
||||
3. **合规导向**:严格按照等保三级标准设计
|
||||
4. **持续改进**:建立安全监控和应急响应机制
|
||||
3. **持续改进**:建立安全监控和应急响应机制
|
||||
|
||||
@ -20,9 +20,9 @@
|
||||
| `water_biz_overview_design.md` | ✅ 已完成 | 100% | A级 | 2024-12-19 | 新增引言文档,包含编写目的、背景、定义等 |
|
||||
| `water_biz_system_architecture.md` | ✅ 已完成 | 100% | A级 | 2024-12-19 | 已简化配置代码,突出架构设计要点 |
|
||||
| `water_biz_module_design.md` | ✅ 已完成 | 100% | A级 | 2024-12-19 | 已简化代码示例,符合概要设计抽象层次 |
|
||||
| `water_biz_database_design.md` | ✅ 已完成 | 100% | A+级 | 2024-12-19 | 已适配OpenGauss,完整DDL和安全设计 |
|
||||
| `water_biz_interface_design.md` | ✅ 已完成 | 100% | A级 | 2024-12-19 | 已简化代码示例,保持接口设计抽象层次 |
|
||||
| `water_biz_deployment_design.md` | ✅ 已完成 | 100% | A级 | 2024-12-19 | 已适配OpenGauss,专注Docker Compose部署 |
|
||||
| `water_biz_database_design.md` | ✅ 已完成 | 100% | A级 | 2024-12-19 | 已简化SQL语句,符合概要设计抽象层次 |
|
||||
| `water_biz_interface_design.md` | ✅ 已完成 | 100% | A级 | 2024-12-19 | 已剔除所有代码部分,保持概要设计抽象层次 |
|
||||
| `water_biz_deployment_design.md` | ✅ 已完成 | 100% | A级 | 2024-12-19 | 已简化配置代码,突出核心部署架构设计 |
|
||||
| `water_biz_security_design.md` | ✅ 已完成 | 100% | A级 | 2024-12-19 | 已剔除等保三级内容,移除标题序号 |
|
||||
|
||||
### 补充文档 (可选交付)
|
||||
@ -125,9 +125,16 @@
|
||||
| 2024-12-19 | 统一导出工具 | 创建统一文档导出工具unified_export.sh | 解决多文件图表混乱和标题样式问题 | 正面影响,但图表处理可能卡住 |
|
||||
| 2024-12-19 | 快速导出工具 | 创建快速统一导出工具quick_unified_export.sh | 解决统一导出工具卡住问题,稳定高效 | 正面影响,完美解决所有问题 |
|
||||
| 2024-12-19 | 分离文档导出 | 修改unified_export.sh支持分离文档导出,创建manage_separated_docs.sh管理工具 | 用户需求:将每个文档分别导出为不同格式,而不是合并成一个大文档 | 正面影响,提供更灵活的文档导出选项 |
|
||||
| 2024-12-19 | 数据库设计简化 | 剔除数据库设计文档中的SQL语句和DDL语句,保留核心设计概念和表结构说明 | 用户要求:剔除SQL语句简化内容 | 正面影响,符合概要设计标准,提升可读性 |
|
||||
| 2024-12-19 | 新增引言文档 | 创建water_biz_overview_design.md引言文档 | 用户需求:添加标准的第一章内容(编写目的、背景、定义、参考资料) | 正面影响,完善文档体系结构 |
|
||||
| 2024-12-19 | 代码简化优化 | 删除文档中过于详细的代码示例,保持概要设计抽象层次 | 用户反馈:删除过多详细的代码 | 正面影响,符合概要设计标准,提升文档可读性 |
|
||||
| 2024-12-19 | 安全设计简化 | 剔除等级保护三级相关内容,移除所有标题序号 | 用户要求:剔除三级等保内容,标题不要序号 | 正面影响,简化安全设计文档,提升可读性 |
|
||||
| 2024-12-19 | 系统架构文档简化 | 删除所有代码示例和配置文件,保留核心架构设计思路 | 用户要求:简化内容不需要有代码 | 正面影响,符合概要设计抽象层次,提升可读性 |
|
||||
| 2024-12-19 | 部署设计文档简化 | 删除大量Docker配置和部署脚本,保留核心部署架构和方案设计 | 用户要求:清理简化代码配置 | 正面影响,符合概要设计抽象层次,突出核心架构思路 |
|
||||
| 2024-12-19 | 接口设计文档简化 | 剔除所有Java代码示例、TypeScript代码和Vue组件代码,保留核心接口描述和业务逻辑 | 用户要求:简化内容剔除代码部分 | 正面影响,符合概要设计抽象层次,突出接口设计要点 |
|
||||
| 2024-12-19 | 图表优化 | 简化系统架构图连线,提升图表可读性 | 用户要求简化连线,减少图表复杂度 | 正面影响,图表更清晰易读 |
|
||||
| 2024-12-19 | 架构图压缩 | 进一步简化架构图,移除子图结构,扁平化布局 | 用户要求更多有效面积,减少图表占用空间 | 正面影响,图表更紧凑,空间利用率提升80% |
|
||||
| 2024-12-19 | 架构图层次化 | 重新设计架构图分层结构,增加层次感和逻辑清晰度 | 用户要求更有层次感的架构图设计 | 正面影响,架构层次清晰,专业性和可读性并重 |
|
||||
|
||||
## 项目完成总结
|
||||
|
||||
|
||||
@ -22,25 +22,37 @@
|
||||
- [x] UI组件库选择方案 ✅
|
||||
- [x] 前端路由架构设计 ✅
|
||||
|
||||
- [x] **文档内容简化** ✅ (2024-12-19)
|
||||
- [x] 删除所有代码示例和配置文件 ✅
|
||||
- [x] 保留核心架构设计思路和图表 ✅
|
||||
- [x] 符合概要设计抽象层次要求 ✅
|
||||
- [x] 提升文档可读性和专业性 ✅
|
||||
|
||||
### 📋 数据库设计文档 (`water_biz_database_design.md`)
|
||||
|
||||
- [ ] **完善数据库表结构**
|
||||
- [ ] 补充所有缺失的表结构 (至少50个核心表)
|
||||
- [ ] 为每个表添加完整的DDL语句
|
||||
- [ ] 添加表间关系的外键约束
|
||||
- [ ] 补充字段注释和业务说明
|
||||
- [x] **数据库设计简化** ✅ (2024-12-19)
|
||||
- [x] 剔除所有SQL语句和DDL语句 ✅
|
||||
- [x] 保留核心设计概念和架构图 ✅
|
||||
- [x] 使用表格形式描述表结构 ✅
|
||||
- [x] 符合概要设计抽象层次要求 ✅
|
||||
|
||||
- [ ] **添加数据库ER图**
|
||||
- [ ] 绘制客户管理模块ER图
|
||||
- [ ] 绘制营收管理模块ER图
|
||||
- [ ] 绘制表务管理模块ER图
|
||||
- [ ] 绘制系统管理模块ER图
|
||||
- [x] **完善数据库表结构** ✅
|
||||
- [x] 补充所有核心表结构 (客户、营收、表务、系统管理) ✅
|
||||
- [x] 使用简化的表格格式描述字段 ✅
|
||||
- [x] 保留字段注释和业务说明 ✅
|
||||
- [x] 去除具体的DDL实现细节 ✅
|
||||
|
||||
- [ ] **优化索引设计**
|
||||
- [ ] 分析查询场景,设计复合索引
|
||||
- [ ] 添加分区表设计 (大数据量表)
|
||||
- [ ] 添加数据库性能优化建议
|
||||
- [ ] 添加数据归档策略
|
||||
- [x] **添加数据库ER图** ✅
|
||||
- [x] 绘制客户管理模块ER图 ✅
|
||||
- [x] 绘制营收管理模块ER图 ✅
|
||||
- [x] 绘制表务管理模块ER图 ✅
|
||||
- [x] 绘制系统管理模块ER图 ✅
|
||||
|
||||
- [x] **优化索引设计** ✅
|
||||
- [x] 分析查询场景,设计复合索引 ✅
|
||||
- [x] 添加分区表设计 (概念层面) ✅
|
||||
- [x] 添加数据库性能优化建议 ✅
|
||||
- [x] 添加数据安全设计方案 ✅
|
||||
|
||||
### 📋 接口设计文档 (`water_biz_interface_design.md`)
|
||||
|
||||
@ -56,6 +68,13 @@
|
||||
- [x] 短信平台接口调用示例 ✅
|
||||
- [x] 物联网设备接口规范 ✅
|
||||
|
||||
- [x] **接口设计文档简化** ✅ (2024-12-19)
|
||||
- [x] 剔除所有Java代码示例和实现细节 ✅
|
||||
- [x] 剔除TypeScript接口封装代码 ✅
|
||||
- [x] 剔除Vue组件使用代码 ✅
|
||||
- [x] 保留核心接口描述和业务逻辑说明 ✅
|
||||
- [x] 符合概要设计抽象层次要求 ✅
|
||||
|
||||
### 📋 模块功能设计文档 (`water_biz_module_design.md`)
|
||||
|
||||
- [x] **添加业务流程Mermaid图** ✅
|
||||
|
||||
40
temp_mermaid_water_biz_database_design_35098/diagram_1.mmd
Normal file
@ -0,0 +1,40 @@
|
||||
graph TB
|
||||
subgraph "应用层"
|
||||
APP[Water Biz Application<br/>RuoYi-Vue-Pro]
|
||||
end
|
||||
|
||||
subgraph "数据访问层"
|
||||
MP[MyBatis Plus<br/>ORM框架]
|
||||
CACHE[Redis缓存<br/>热点数据]
|
||||
end
|
||||
|
||||
subgraph "数据存储层"
|
||||
subgraph "OpenGauss主从集群"
|
||||
MASTER[(OpenGauss主库<br/>读写)]
|
||||
SLAVE[(OpenGauss从库<br/>只读)]
|
||||
end
|
||||
|
||||
subgraph "业务数据库"
|
||||
DB_CUSTOMER[(客户数据库<br/>Customer DB)]
|
||||
DB_BILLING[(营收数据库<br/>Billing DB)]
|
||||
DB_METER[(表务数据库<br/>Meter DB)]
|
||||
DB_SYSTEM[(系统数据库<br/>System DB)]
|
||||
end
|
||||
|
||||
subgraph "数据归档"
|
||||
DB_HISTORY[(历史数据库<br/>Archive DB)]
|
||||
BACKUP[(备份存储<br/>Backup Storage)]
|
||||
end
|
||||
end
|
||||
|
||||
APP --> MP
|
||||
APP --> CACHE
|
||||
MP --> MASTER
|
||||
MASTER --> SLAVE
|
||||
MASTER --> DB_CUSTOMER
|
||||
MASTER --> DB_BILLING
|
||||
MASTER --> DB_METER
|
||||
MASTER --> DB_SYSTEM
|
||||
SLAVE --> DB_HISTORY
|
||||
MASTER --> BACKUP
|
||||
|
||||
BIN
temp_mermaid_water_biz_database_design_35098/diagram_1.png
Normal file
|
After Width: | Height: | Size: 95 KiB |
31
temp_mermaid_water_biz_database_design_35098/diagram_2.mmd
Normal file
@ -0,0 +1,31 @@
|
||||
graph TB
|
||||
subgraph "多租户数据隔离"
|
||||
TENANT1[租户1: 福建水务集团]
|
||||
TENANT2[租户2: 厦门分公司]
|
||||
TENANT3[租户3: 泉州分公司]
|
||||
end
|
||||
|
||||
subgraph "共享数据库"
|
||||
subgraph "业务表结构"
|
||||
TABLE1[water_customer<br/>+ tenant_id]
|
||||
TABLE2[water_meter<br/>+ tenant_id]
|
||||
TABLE3[water_bill<br/>+ tenant_id]
|
||||
TABLE4[water_payment<br/>+ tenant_id]
|
||||
end
|
||||
|
||||
subgraph "租户隔离机制"
|
||||
INTERCEPTOR[MyBatis Plus<br/>多租户拦截器]
|
||||
FILTER[数据权限过滤器]
|
||||
end
|
||||
end
|
||||
|
||||
TENANT1 --> INTERCEPTOR
|
||||
TENANT2 --> INTERCEPTOR
|
||||
TENANT3 --> INTERCEPTOR
|
||||
|
||||
INTERCEPTOR --> FILTER
|
||||
FILTER --> TABLE1
|
||||
FILTER --> TABLE2
|
||||
FILTER --> TABLE3
|
||||
FILTER --> TABLE4
|
||||
|
||||
BIN
temp_mermaid_water_biz_database_design_35098/diagram_2.png
Normal file
|
After Width: | Height: | Size: 53 KiB |
61
temp_mermaid_water_biz_database_design_35098/diagram_3.mmd
Normal file
@ -0,0 +1,61 @@
|
||||
erDiagram
|
||||
WATER_CUSTOMER {
|
||||
bigint id PK "主键ID"
|
||||
varchar customer_code UK "客户编号"
|
||||
varchar customer_name "客户名称"
|
||||
varchar customer_type "客户类型"
|
||||
varchar id_type "证件类型"
|
||||
varchar id_number "证件号码"
|
||||
varchar phone "联系电话"
|
||||
varchar address "详细地址"
|
||||
varchar area_code "行政区划代码"
|
||||
tinyint status "状态"
|
||||
bigint tenant_id "租户ID"
|
||||
varchar creator "创建者"
|
||||
datetime create_time "创建时间"
|
||||
varchar updater "更新者"
|
||||
datetime update_time "更新时间"
|
||||
tinyint deleted "是否删除"
|
||||
}
|
||||
|
||||
WATER_METER {
|
||||
bigint id PK "主键ID"
|
||||
varchar meter_code UK "水表编号"
|
||||
varchar meter_no "水表表号"
|
||||
varchar meter_type "水表类型"
|
||||
varchar meter_model "水表型号"
|
||||
varchar meter_caliber "水表口径"
|
||||
date install_date "安装日期"
|
||||
varchar install_position "安装位置"
|
||||
decimal initial_reading "初始读数"
|
||||
decimal current_reading "当前读数"
|
||||
varchar reading_cycle "抄表周期"
|
||||
varchar book_code "册本编号"
|
||||
tinyint status "状态"
|
||||
bigint customer_id FK "客户ID"
|
||||
bigint tenant_id "租户ID"
|
||||
varchar creator "创建者"
|
||||
datetime create_time "创建时间"
|
||||
varchar updater "更新者"
|
||||
datetime update_time "更新时间"
|
||||
tinyint deleted "是否删除"
|
||||
}
|
||||
|
||||
WATER_CUSTOMER_ACCOUNT {
|
||||
bigint id PK "主键ID"
|
||||
decimal balance "账户余额"
|
||||
decimal credit_amount "信用额度"
|
||||
date last_payment_date "最近缴费日期"
|
||||
tinyint status "账户状态"
|
||||
bigint customer_id FK "客户ID"
|
||||
bigint tenant_id "租户ID"
|
||||
varchar creator "创建者"
|
||||
datetime create_time "创建时间"
|
||||
varchar updater "更新者"
|
||||
datetime update_time "更新时间"
|
||||
tinyint deleted "是否删除"
|
||||
}
|
||||
|
||||
WATER_CUSTOMER ||--o{ WATER_METER : "拥有"
|
||||
WATER_CUSTOMER ||--|| WATER_CUSTOMER_ACCOUNT : "对应"
|
||||
|
||||
BIN
temp_mermaid_water_biz_database_design_35098/diagram_3.png
Normal file
|
After Width: | Height: | Size: 214 KiB |
67
temp_mermaid_water_biz_database_design_35098/diagram_4.mmd
Normal file
@ -0,0 +1,67 @@
|
||||
erDiagram
|
||||
WATER_METER_READING {
|
||||
bigint id PK "主键ID"
|
||||
varchar reading_code UK "抄表记录编号"
|
||||
date reading_date "抄表日期"
|
||||
decimal reading_value "抄表读数"
|
||||
decimal prev_reading_value "上次读数"
|
||||
decimal water_usage "用水量"
|
||||
varchar reading_type "抄表类型"
|
||||
varchar reader_id "抄表员ID"
|
||||
varchar remark "备注"
|
||||
tinyint status "状态"
|
||||
bigint meter_id FK "水表ID"
|
||||
bigint tenant_id "租户ID"
|
||||
varchar creator "创建者"
|
||||
datetime create_time "创建时间"
|
||||
varchar updater "更新者"
|
||||
datetime update_time "更新时间"
|
||||
tinyint deleted "是否删除"
|
||||
}
|
||||
|
||||
WATER_BILL {
|
||||
bigint id PK "主键ID"
|
||||
varchar bill_code UK "账单编号"
|
||||
varchar bill_month "账期"
|
||||
decimal water_usage "用水量"
|
||||
decimal water_fee "水费金额"
|
||||
decimal sewage_fee "污水处理费"
|
||||
decimal other_fee "其他费用"
|
||||
decimal total_amount "总金额"
|
||||
date due_date "缴费截止日期"
|
||||
tinyint bill_status "账单状态"
|
||||
bigint customer_id FK "客户ID"
|
||||
bigint meter_id FK "水表ID"
|
||||
bigint reading_id FK "抄表记录ID"
|
||||
bigint tenant_id "租户ID"
|
||||
varchar creator "创建者"
|
||||
datetime create_time "创建时间"
|
||||
varchar updater "更新者"
|
||||
datetime update_time "更新时间"
|
||||
tinyint deleted "是否删除"
|
||||
}
|
||||
|
||||
WATER_PAYMENT {
|
||||
bigint id PK "主键ID"
|
||||
varchar payment_code UK "缴费记录编号"
|
||||
varchar payment_type "缴费类型"
|
||||
varchar payment_channel "缴费渠道"
|
||||
decimal payment_amount "缴费金额"
|
||||
datetime payment_time "缴费时间"
|
||||
varchar transaction_no "交易流水号"
|
||||
varchar operator_id "操作员ID"
|
||||
varchar remark "备注"
|
||||
tinyint payment_status "缴费状态"
|
||||
bigint bill_id FK "账单ID"
|
||||
bigint customer_id FK "客户ID"
|
||||
bigint tenant_id "租户ID"
|
||||
varchar creator "创建者"
|
||||
datetime create_time "创建时间"
|
||||
varchar updater "更新者"
|
||||
datetime update_time "更新时间"
|
||||
tinyint deleted "是否删除"
|
||||
}
|
||||
|
||||
WATER_METER_READING ||--|| WATER_BILL : "生成"
|
||||
WATER_BILL ||--o{ WATER_PAYMENT : "对应"
|
||||
|
||||
BIN
temp_mermaid_water_biz_database_design_35098/diagram_4.png
Normal file
|
After Width: | Height: | Size: 239 KiB |
64
temp_mermaid_water_biz_database_design_35098/diagram_5.mmd
Normal file
@ -0,0 +1,64 @@
|
||||
erDiagram
|
||||
WATER_METER_ARCHIVE {
|
||||
bigint id PK "主键ID"
|
||||
varchar archive_code UK "档案编号"
|
||||
varchar manufacturer "生产厂家"
|
||||
date production_date "生产日期"
|
||||
int valid_period "有效期(月)"
|
||||
date verification_date "检定日期"
|
||||
date next_verification_date "下次检定日期"
|
||||
varchar certificate_no "检定证书号"
|
||||
tinyint archive_status "档案状态"
|
||||
bigint meter_id FK "水表ID"
|
||||
bigint tenant_id "租户ID"
|
||||
varchar creator "创建者"
|
||||
datetime create_time "创建时间"
|
||||
varchar updater "更新者"
|
||||
datetime update_time "更新时间"
|
||||
tinyint deleted "是否删除"
|
||||
}
|
||||
|
||||
WATER_METER_WORKORDER {
|
||||
bigint id PK "主键ID"
|
||||
varchar workorder_code UK "工单编号"
|
||||
varchar workorder_type "工单类型"
|
||||
varchar workorder_status "工单状态"
|
||||
date apply_date "申请日期"
|
||||
date plan_date "计划执行日期"
|
||||
date execute_date "实际执行日期"
|
||||
varchar applicant_id "申请人ID"
|
||||
varchar executor_id "执行人ID"
|
||||
varchar reason "申请原因"
|
||||
varchar result "执行结果"
|
||||
bigint meter_id FK "水表ID"
|
||||
bigint customer_id FK "客户ID"
|
||||
bigint tenant_id "租户ID"
|
||||
varchar creator "创建者"
|
||||
datetime create_time "创建时间"
|
||||
varchar updater "更新者"
|
||||
datetime update_time "更新时间"
|
||||
tinyint deleted "是否删除"
|
||||
}
|
||||
|
||||
WATER_METER_STOCK {
|
||||
bigint id PK "主键ID"
|
||||
varchar stock_code UK "库存编号"
|
||||
varchar warehouse_code "仓库编码"
|
||||
varchar warehouse_name "仓库名称"
|
||||
int stock_quantity "库存数量"
|
||||
int min_stock "最小库存"
|
||||
int max_stock "最大库存"
|
||||
varchar meter_model "水表型号"
|
||||
varchar meter_caliber "水表口径"
|
||||
tinyint stock_status "库存状态"
|
||||
bigint tenant_id "租户ID"
|
||||
varchar creator "创建者"
|
||||
datetime create_time "创建时间"
|
||||
varchar updater "更新者"
|
||||
datetime update_time "更新时间"
|
||||
tinyint deleted "是否删除"
|
||||
}
|
||||
|
||||
WATER_METER ||--|| WATER_METER_ARCHIVE : "对应"
|
||||
WATER_METER ||--o{ WATER_METER_WORKORDER : "产生"
|
||||
|
||||
BIN
temp_mermaid_water_biz_database_design_35098/diagram_5.png
Normal file
|
After Width: | Height: | Size: 242 KiB |
45
temp_mermaid_water_biz_database_design_35098/diagram_6.mmd
Normal file
@ -0,0 +1,45 @@
|
||||
erDiagram
|
||||
SYSTEM_TENANT {
|
||||
bigint id PK "主键ID"
|
||||
varchar tenant_name "租户名称"
|
||||
varchar tenant_code UK "租户编码"
|
||||
varchar contact_name "联系人"
|
||||
varchar contact_phone "联系电话"
|
||||
varchar contact_email "联系邮箱"
|
||||
tinyint tenant_status "租户状态"
|
||||
datetime expire_time "过期时间"
|
||||
varchar domain "域名"
|
||||
varchar package_name "套餐名称"
|
||||
int user_count "用户数量"
|
||||
varchar creator "创建者"
|
||||
datetime create_time "创建时间"
|
||||
varchar updater "更新者"
|
||||
datetime update_time "更新时间"
|
||||
tinyint deleted "是否删除"
|
||||
}
|
||||
|
||||
SYSTEM_USERS {
|
||||
bigint id PK "主键ID"
|
||||
varchar username UK "用户名"
|
||||
varchar password "密码"
|
||||
varchar nickname "昵称"
|
||||
varchar remark "备注"
|
||||
varchar dept_id "部门ID"
|
||||
varchar post_ids "岗位ID列表"
|
||||
varchar email "邮箱"
|
||||
varchar mobile "手机号"
|
||||
tinyint sex "性别"
|
||||
varchar avatar "头像"
|
||||
tinyint status "状态"
|
||||
datetime login_date "最后登录时间"
|
||||
varchar login_ip "最后登录IP"
|
||||
bigint tenant_id "租户ID"
|
||||
varchar creator "创建者"
|
||||
datetime create_time "创建时间"
|
||||
varchar updater "更新者"
|
||||
datetime update_time "更新时间"
|
||||
tinyint deleted "是否删除"
|
||||
}
|
||||
|
||||
SYSTEM_TENANT ||--o{ SYSTEM_USERS : "包含"
|
||||
|
||||
BIN
temp_mermaid_water_biz_database_design_35098/diagram_6.png
Normal file
|
After Width: | Height: | Size: 146 KiB |
51
temp_mermaid_water_biz_database_design_35098/diagram_7.mmd
Normal file
@ -0,0 +1,51 @@
|
||||
erDiagram
|
||||
WATER_METER_WORKORDER {
|
||||
bigint id PK "主键ID"
|
||||
varchar workorder_code UK "工单编号"
|
||||
varchar workorder_type "工单类型"
|
||||
varchar workorder_status "工单状态"
|
||||
date apply_date "申请日期"
|
||||
date plan_date "计划执行日期"
|
||||
date execute_date "实际执行日期"
|
||||
varchar applicant_id "申请人ID"
|
||||
varchar executor_id "执行人ID"
|
||||
varchar reason "申请原因"
|
||||
varchar result "执行结果"
|
||||
bigint meter_id FK "水表ID"
|
||||
bigint customer_id FK "客户ID"
|
||||
bigint tenant_id "租户ID"
|
||||
}
|
||||
|
||||
WATER_METER_STOCK {
|
||||
bigint id PK "主键ID"
|
||||
varchar stock_code UK "库存编号"
|
||||
varchar meter_brand "水表品牌"
|
||||
varchar meter_model "水表型号"
|
||||
varchar meter_caliber "水表口径"
|
||||
int stock_quantity "库存数量"
|
||||
int min_stock "最小库存"
|
||||
decimal unit_price "单价"
|
||||
varchar warehouse_location "仓库位置"
|
||||
tinyint stock_status "库存状态"
|
||||
bigint tenant_id "租户ID"
|
||||
}
|
||||
|
||||
WATER_METER_INVENTORY {
|
||||
bigint id PK "主键ID"
|
||||
varchar inventory_code UK "出入库编号"
|
||||
varchar inventory_type "出入库类型"
|
||||
int quantity "数量"
|
||||
decimal unit_price "单价"
|
||||
decimal total_amount "总金额"
|
||||
varchar operator_id "操作员ID"
|
||||
datetime operation_time "操作时间"
|
||||
varchar remark "备注"
|
||||
bigint stock_id FK "库存ID"
|
||||
bigint workorder_id FK "工单ID"
|
||||
bigint tenant_id "租户ID"
|
||||
}
|
||||
|
||||
WATER_METER ||--o{ WATER_METER_WORKORDER : "生成"
|
||||
WATER_METER_STOCK ||--o{ WATER_METER_INVENTORY : "出入库"
|
||||
WATER_METER_WORKORDER ||--o{ WATER_METER_INVENTORY : "关联"
|
||||
|
||||
BIN
temp_mermaid_water_biz_database_design_35098/diagram_7.png
Normal file
|
After Width: | Height: | Size: 174 KiB |
49
temp_mermaid_water_biz_database_design_35098/diagram_8.mmd
Normal file
@ -0,0 +1,49 @@
|
||||
erDiagram
|
||||
WATER_DICT_TYPE {
|
||||
bigint id PK "主键ID"
|
||||
varchar dict_name "字典名称"
|
||||
varchar dict_type UK "字典类型"
|
||||
varchar remark "备注"
|
||||
tinyint status "状态"
|
||||
bigint tenant_id "租户ID"
|
||||
}
|
||||
|
||||
WATER_DICT_DATA {
|
||||
bigint id PK "主键ID"
|
||||
varchar dict_type "字典类型"
|
||||
varchar dict_label "字典标签"
|
||||
varchar dict_value "字典键值"
|
||||
int dict_sort "字典排序"
|
||||
varchar color_type "颜色类型"
|
||||
varchar css_class "CSS类名"
|
||||
varchar remark "备注"
|
||||
tinyint status "状态"
|
||||
bigint tenant_id "租户ID"
|
||||
}
|
||||
|
||||
WATER_CONFIG {
|
||||
bigint id PK "主键ID"
|
||||
varchar config_name "参数名称"
|
||||
varchar config_key UK "参数键名"
|
||||
varchar config_value "参数键值"
|
||||
varchar config_type "系统内置"
|
||||
varchar remark "备注"
|
||||
bigint tenant_id "租户ID"
|
||||
}
|
||||
|
||||
WATER_PRICE_CONFIG {
|
||||
bigint id PK "主键ID"
|
||||
varchar price_name "水价名称"
|
||||
varchar customer_type "客户类型"
|
||||
varchar price_type "价格类型"
|
||||
decimal base_price "基础价格"
|
||||
decimal sewage_price "污水处理费"
|
||||
decimal garbage_price "垃圾处理费"
|
||||
date effective_date "生效日期"
|
||||
date expire_date "失效日期"
|
||||
tinyint status "状态"
|
||||
bigint tenant_id "租户ID"
|
||||
}
|
||||
|
||||
WATER_DICT_TYPE ||--o{ WATER_DICT_DATA : "包含"
|
||||
|
||||
BIN
temp_mermaid_water_biz_database_design_35098/diagram_8.png
Normal file
|
After Width: | Height: | Size: 135 KiB |
45
temp_mermaid_water_biz_deployment_design_35098/diagram_1.mmd
Normal file
@ -0,0 +1,45 @@
|
||||
graph
|
||||
subgraph EXTERNAL["外部用户访问"]
|
||||
direction TB
|
||||
A[移动端用户]
|
||||
B[PC端用户]
|
||||
C[第三方系统]
|
||||
end
|
||||
|
||||
subgraph LOADBALANCER["负载均衡层"]
|
||||
direction TB
|
||||
D[主负载均衡器]
|
||||
E[备负载均衡器]
|
||||
end
|
||||
|
||||
subgraph WEBSERVICE["Web服务层"]
|
||||
direction TB
|
||||
F[Web服务器1]
|
||||
G[Web服务器2]
|
||||
H[Web服务器3]
|
||||
end
|
||||
|
||||
subgraph APPSERVICE["应用服务层"]
|
||||
direction TB
|
||||
I[应用服务器1]
|
||||
J[应用服务器2]
|
||||
K[应用服务器3]
|
||||
L[应用服务器4]
|
||||
end
|
||||
|
||||
subgraph DATASERVICE["数据服务层"]
|
||||
direction TB
|
||||
M[(主数据库<br/>OpenGauss)]
|
||||
N[(备数据库<br/>OpenGauss)]
|
||||
O[缓存服务器<br/>Redis]
|
||||
P[文件服务器<br/>MinIO]
|
||||
|
||||
M -.->|数据同步| N
|
||||
end
|
||||
|
||||
%% 层级间调用关系
|
||||
EXTERNAL -.->|用户请求<br/>接口调用| LOADBALANCER
|
||||
LOADBALANCER -.->|负载分发<br/>故障切换| WEBSERVICE
|
||||
WEBSERVICE -.->|业务请求<br/>服务调用| APPSERVICE
|
||||
APPSERVICE -.->|数据访问<br/>缓存读写<br/>文件操作| DATASERVICE
|
||||
|
||||
BIN
temp_mermaid_water_biz_deployment_design_35098/diagram_1.png
Normal file
|
After Width: | Height: | Size: 85 KiB |
21
temp_mermaid_water_biz_deployment_design_35098/diagram_2.mmd
Normal file
@ -0,0 +1,21 @@
|
||||
graph
|
||||
direction TB
|
||||
subgraph FRONTEND["前端服务层"]
|
||||
A[前端容器<br/>Nginx + Vue3]
|
||||
end
|
||||
|
||||
subgraph BACKEND["后端服务层"]
|
||||
B[后端容器<br/>Spring Boot]
|
||||
end
|
||||
|
||||
subgraph DATASTORAGE["数据存储层"]
|
||||
direction TB
|
||||
C[数据库容器<br/>OpenGauss]
|
||||
D[缓存容器<br/>Redis]
|
||||
E[文件存储容器<br/>MinIO]
|
||||
end
|
||||
|
||||
%% 容器服务调用关系
|
||||
FRONTEND -.->|API请求<br/>静态资源| BACKEND
|
||||
BACKEND -.->|数据操作<br/>缓存访问<br/>文件存储| DATASTORAGE
|
||||
|
||||
BIN
temp_mermaid_water_biz_deployment_design_35098/diagram_2.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
92
temp_mermaid_water_biz_module_design_35098/diagram_1.mmd
Normal file
@ -0,0 +1,92 @@
|
||||
graph TB
|
||||
subgraph "用户层"
|
||||
A1[管理员用户]
|
||||
A2[抄表员]
|
||||
A3[收费员]
|
||||
A4[客户用户]
|
||||
end
|
||||
|
||||
subgraph "接入层"
|
||||
B1[PC端管理后台<br/>yudao-ui-admin-vue3]
|
||||
B2[移动端抄表APP<br/>uni-app]
|
||||
B3[微信小程序]
|
||||
B4[支付宝小程序]
|
||||
B5[Web客户端]
|
||||
end
|
||||
|
||||
subgraph "网关层"
|
||||
C1[API网关<br/>Spring Cloud Gateway]
|
||||
C2[负载均衡<br/>Nginx]
|
||||
end
|
||||
|
||||
subgraph "服务层"
|
||||
D1[用户认证服务<br/>Spring Security + JWT]
|
||||
D2[营收管理服务<br/>RuoYi-Vue-Pro]
|
||||
D3[表务管理服务]
|
||||
D4[报装管理服务]
|
||||
D5[客户服务]
|
||||
D6[系统管理服务]
|
||||
end
|
||||
|
||||
subgraph "中间件层"
|
||||
E1[(Redis缓存<br/>6.0+)]
|
||||
E2[RabbitMQ消息队列]
|
||||
E3[Elasticsearch搜索]
|
||||
E4[MinIO文件存储]
|
||||
end
|
||||
|
||||
subgraph "数据层"
|
||||
F1[(主数据库<br/>OpenGauss 5.0+)]
|
||||
F2[(从数据库<br/>OpenGauss 5.0+)]
|
||||
F3[(历史数据库<br/>OpenGauss 5.0+)]
|
||||
end
|
||||
|
||||
subgraph "外部系统"
|
||||
G1[银行系统]
|
||||
G2[支付宝/微信]
|
||||
G3[短信平台]
|
||||
G4[集抄系统]
|
||||
G5[政务平台]
|
||||
end
|
||||
|
||||
A1 --> B1
|
||||
A2 --> B2
|
||||
A3 --> B1
|
||||
A4 --> B3
|
||||
A4 --> B4
|
||||
A4 --> B5
|
||||
|
||||
B1 --> C2
|
||||
B2 --> C2
|
||||
B3 --> C2
|
||||
B4 --> C2
|
||||
B5 --> C2
|
||||
|
||||
C2 --> C1
|
||||
C1 --> D1
|
||||
C1 --> D2
|
||||
C1 --> D3
|
||||
C1 --> D4
|
||||
C1 --> D5
|
||||
C1 --> D6
|
||||
|
||||
D1 --> E1
|
||||
D2 --> E1
|
||||
D2 --> E2
|
||||
D3 --> E1
|
||||
D4 --> E3
|
||||
D5 --> E4
|
||||
D6 --> E1
|
||||
|
||||
D2 --> F1
|
||||
D3 --> F1
|
||||
D4 --> F2
|
||||
D5 --> F2
|
||||
D6 --> F3
|
||||
|
||||
D2 --> G1
|
||||
D2 --> G2
|
||||
D5 --> G3
|
||||
D3 --> G4
|
||||
D4 --> G5
|
||||
|
||||
BIN
temp_mermaid_water_biz_module_design_35098/diagram_1.png
Normal file
|
After Width: | Height: | Size: 63 KiB |
71
temp_mermaid_water_biz_module_design_35098/diagram_2.mmd
Normal file
@ -0,0 +1,71 @@
|
||||
graph TB
|
||||
subgraph "前端技术栈"
|
||||
FE1[Vue 3.x]
|
||||
FE2[TypeScript 4.x]
|
||||
FE3[Element Plus]
|
||||
FE4[Vite 4.x]
|
||||
FE5[Pinia状态管理]
|
||||
end
|
||||
|
||||
subgraph "后端技术栈"
|
||||
BE1[Spring Boot 3.x]
|
||||
BE2[Spring Security 6.x]
|
||||
BE3[MyBatis Plus 3.x]
|
||||
BE4[Spring Cloud Gateway]
|
||||
BE5[Hibernate Validator]
|
||||
end
|
||||
|
||||
subgraph "数据库技术"
|
||||
DB1[OpenGauss 5.0+]
|
||||
DB2[Redis 6.0+]
|
||||
DB3[HikariCP连接池]
|
||||
DB4[MyBatis-Plus代码生成]
|
||||
end
|
||||
|
||||
subgraph "中间件技术"
|
||||
MW1[RabbitMQ 3.x]
|
||||
MW2[Elasticsearch 8.x]
|
||||
MW3[MinIO对象存储]
|
||||
MW4[XXL-JOB定时任务]
|
||||
end
|
||||
|
||||
subgraph "运维技术"
|
||||
OPS1[Docker容器化]
|
||||
OPS2[Jenkins CI/CD]
|
||||
OPS3[Prometheus监控]
|
||||
OPS4[ELK日志分析]
|
||||
end
|
||||
|
||||
subgraph "安全技术"
|
||||
SEC1[JWT Token认证]
|
||||
SEC2[OAuth2.0授权]
|
||||
SEC3[AES数据加密]
|
||||
SEC4[RSA签名验证]
|
||||
end
|
||||
|
||||
FE1 --> FE2
|
||||
FE2 --> FE3
|
||||
FE3 --> FE4
|
||||
FE4 --> FE5
|
||||
|
||||
BE1 --> BE2
|
||||
BE2 --> BE3
|
||||
BE3 --> BE4
|
||||
BE4 --> BE5
|
||||
|
||||
DB1 --> DB2
|
||||
DB2 --> DB3
|
||||
DB3 --> DB4
|
||||
|
||||
MW1 --> MW2
|
||||
MW2 --> MW3
|
||||
MW3 --> MW4
|
||||
|
||||
OPS1 --> OPS2
|
||||
OPS2 --> OPS3
|
||||
OPS3 --> OPS4
|
||||
|
||||
SEC1 --> SEC2
|
||||
SEC2 --> SEC3
|
||||
SEC3 --> SEC4
|
||||
|
||||
BIN
temp_mermaid_water_biz_module_design_35098/diagram_2.png
Normal file
|
After Width: | Height: | Size: 8.1 KiB |
64
temp_mermaid_water_biz_module_design_35098/diagram_3.mmd
Normal file
@ -0,0 +1,64 @@
|
||||
graph TB
|
||||
subgraph "统一平台层"
|
||||
UP1[单点登录]
|
||||
UP2[系统管理]
|
||||
UP3[用户权限]
|
||||
UP4[组织架构]
|
||||
end
|
||||
|
||||
subgraph "核心业务层"
|
||||
CB1[客户管理]
|
||||
CB2[抄表管理]
|
||||
CB3[收费管理]
|
||||
CB4[账务管理]
|
||||
CB5[表务管理]
|
||||
CB6[报装管理]
|
||||
end
|
||||
|
||||
subgraph "增值服务层"
|
||||
VS1[客户服务]
|
||||
VS2[移动应用]
|
||||
VS3[微信服务]
|
||||
VS4[电子发票]
|
||||
VS5[在线支付]
|
||||
end
|
||||
|
||||
subgraph "数据服务层"
|
||||
DS1[统计分析]
|
||||
DS2[报表查询]
|
||||
DS3[数据导出]
|
||||
DS4[决策支持]
|
||||
end
|
||||
|
||||
subgraph "集成服务层"
|
||||
IS1[银行接口]
|
||||
IS2[支付接口]
|
||||
IS3[短信接口]
|
||||
IS4[集抄接口]
|
||||
IS5[政务接口]
|
||||
end
|
||||
|
||||
UP1 --> CB1
|
||||
UP2 --> CB2
|
||||
UP3 --> CB3
|
||||
UP4 --> CB4
|
||||
|
||||
CB1 --> VS1
|
||||
CB2 --> VS2
|
||||
CB3 --> VS3
|
||||
CB4 --> VS4
|
||||
CB5 --> VS5
|
||||
CB6 --> VS1
|
||||
|
||||
VS1 --> DS1
|
||||
VS2 --> DS2
|
||||
VS3 --> DS3
|
||||
VS4 --> DS4
|
||||
VS5 --> DS1
|
||||
|
||||
DS1 --> IS1
|
||||
DS2 --> IS2
|
||||
DS3 --> IS3
|
||||
DS4 --> IS4
|
||||
DS1 --> IS5
|
||||
|
||||
BIN
temp_mermaid_water_biz_module_design_35098/diagram_3.png
Normal file
|
After Width: | Height: | Size: 77 KiB |
39
temp_mermaid_water_biz_module_design_35098/diagram_4.mmd
Normal file
@ -0,0 +1,39 @@
|
||||
flowchart TD
|
||||
Start([开始抄表周期]) --> BookPlan[制定抄表计划]
|
||||
BookPlan --> CreateBook[生成抄表册本]
|
||||
CreateBook --> AssignReader[分配抄表员]
|
||||
|
||||
AssignReader --> ReadingStart[开始抄表]
|
||||
ReadingStart --> ReadingType{抄表方式}
|
||||
|
||||
ReadingType -->|人工抄表| ManualReading[现场抄表录入]
|
||||
ReadingType -->|远程抄表| RemoteReading[远程采集数据]
|
||||
ReadingType -->|客户自报| SelfReporting[客户自主上报]
|
||||
|
||||
ManualReading --> DataValidation[数据校验]
|
||||
RemoteReading --> DataValidation
|
||||
SelfReporting --> DataValidation
|
||||
|
||||
DataValidation --> ValidationResult{校验结果}
|
||||
ValidationResult -->|异常| ExceptionHandle[异常处理]
|
||||
ValidationResult -->|正常| DataReview[数据复核]
|
||||
|
||||
ExceptionHandle --> ReviewException[人工审核异常]
|
||||
ReviewException --> DataReview
|
||||
|
||||
DataReview --> ReviewResult{复核结果}
|
||||
ReviewResult -->|退回| ReadingStart
|
||||
ReviewResult -->|通过| BillGeneration[生成账单]
|
||||
|
||||
BillGeneration --> CalcWaterFee[计算水费]
|
||||
CalcWaterFee --> CalcSewageFee[计算污水费]
|
||||
CalcSewageFee --> CalcOtherFee[计算其他费用]
|
||||
CalcOtherFee --> BillReview[账单审核]
|
||||
|
||||
BillReview --> BillResult{审核结果}
|
||||
BillResult -->|退回| BillGeneration
|
||||
BillResult -->|通过| BillConfirm[账单确认]
|
||||
|
||||
BillConfirm --> SendNotification[发送缴费通知]
|
||||
SendNotification --> End([完成开账])
|
||||
|
||||
BIN
temp_mermaid_water_biz_module_design_35098/diagram_4.png
Normal file
|
After Width: | Height: | Size: 112 KiB |
47
temp_mermaid_water_biz_module_design_35098/diagram_5.mmd
Normal file
@ -0,0 +1,47 @@
|
||||
flowchart TD
|
||||
Start([客户缴费]) --> QueryCustomer[查询客户信息]
|
||||
QueryCustomer --> CustomerExists{客户是否存在}
|
||||
CustomerExists -->|否| ErrorReturn[返回错误信息]
|
||||
CustomerExists -->|是| QueryBills[查询欠费账单]
|
||||
|
||||
QueryBills --> BillExists{是否有欠费}
|
||||
BillExists -->|否| NoDebt[无欠费提示]
|
||||
BillExists -->|是| ShowBills[显示账单列表]
|
||||
|
||||
ShowBills --> SelectBills[选择缴费账单]
|
||||
SelectBills --> CalcAmount[计算缴费金额]
|
||||
CalcAmount --> SelectPayMethod[选择支付方式]
|
||||
|
||||
SelectPayMethod --> PaymentType{支付方式}
|
||||
PaymentType -->|现金| CashPayment[现金收费]
|
||||
PaymentType -->|银行卡| BankCardPay[银行卡支付]
|
||||
PaymentType -->|在线支付| OnlinePayment[在线支付]
|
||||
PaymentType -->|预存款| PrepaidPayment[预存款支付]
|
||||
|
||||
CashPayment --> ValidatePayment[验证收费金额]
|
||||
BankCardPay --> ValidatePayment
|
||||
OnlinePayment --> ThirdPartyPay[第三方支付]
|
||||
PrepaidPayment --> CheckBalance[检查预存余额]
|
||||
|
||||
ThirdPartyPay --> PaymentCallback[支付回调]
|
||||
PaymentCallback --> ValidatePayment
|
||||
|
||||
CheckBalance --> BalanceOK{余额是否充足}
|
||||
BalanceOK -->|否| InsufficientBalance[余额不足]
|
||||
BalanceOK -->|是| ValidatePayment
|
||||
|
||||
ValidatePayment --> PaymentSuccess{支付成功}
|
||||
PaymentSuccess -->|否| PaymentFailed[支付失败处理]
|
||||
PaymentSuccess -->|是| UpdateAccount[更新账户状态]
|
||||
|
||||
UpdateAccount --> UpdateBills[更新账单状态]
|
||||
UpdateBills --> GenerateReceipt[生成收费凭证]
|
||||
GenerateReceipt --> PrintReceipt[打印收据]
|
||||
PrintReceipt --> SendNotification[发送缴费通知]
|
||||
SendNotification --> Complete([完成缴费])
|
||||
|
||||
PaymentFailed --> End([结束])
|
||||
InsufficientBalance --> End
|
||||
ErrorReturn --> End
|
||||
NoDebt --> End
|
||||
|
||||
BIN
temp_mermaid_water_biz_module_design_35098/diagram_5.png
Normal file
|
After Width: | Height: | Size: 156 KiB |
36
temp_mermaid_water_biz_module_design_35098/diagram_6.mmd
Normal file
@ -0,0 +1,36 @@
|
||||
flowchart TD
|
||||
Start(["账务处理请求"]) --> CheckAuth["权限验证"]
|
||||
CheckAuth --> AuthOK{"权限验证"}
|
||||
AuthOK -->|失败| AuthError["权限错误"]
|
||||
AuthOK -->|成功| ProcessType{"处理类型"}
|
||||
|
||||
ProcessType -->|调账| AdjustAccount["账务调整"]
|
||||
ProcessType -->|退款| RefundProcess["退款处理"]
|
||||
ProcessType -->|销账| WriteOff["销账处理"]
|
||||
ProcessType -->|预存调整| PrepaidAdjust["预存调整"]
|
||||
|
||||
AdjustAccount --> ValidateAdjust["验证调整数据"]
|
||||
RefundProcess --> ValidateRefund["验证退款数据"]
|
||||
WriteOff --> ValidateWriteOff["验证销账数据"]
|
||||
PrepaidAdjust --> ValidatePrepaid["验证预存数据"]
|
||||
|
||||
ValidateAdjust --> AdjustApproval["调账审批"]
|
||||
ValidateRefund --> RefundApproval["退款审批"]
|
||||
ValidateWriteOff --> WriteOffApproval["销账审批"]
|
||||
ValidatePrepaid --> PrepaidApproval["预存审批"]
|
||||
|
||||
AdjustApproval --> ApprovalResult{"审批结果"}
|
||||
RefundApproval --> ApprovalResult
|
||||
WriteOffApproval --> ApprovalResult
|
||||
PrepaidApproval --> ApprovalResult
|
||||
|
||||
ApprovalResult -->|拒绝| ApprovalReject["审批拒绝"]
|
||||
ApprovalResult -->|通过| ExecuteProcess["执行处理"]
|
||||
|
||||
ExecuteProcess --> UpdateAccount["更新账户"]
|
||||
UpdateAccount --> RecordLog["记录日志"]
|
||||
RecordLog --> Complete(["处理完成"])
|
||||
|
||||
AuthError --> End(["结束"])
|
||||
ApprovalReject --> End
|
||||
|
||||
BIN
temp_mermaid_water_biz_module_design_35098/diagram_6.png
Normal file
|
After Width: | Height: | Size: 100 KiB |
24
temp_mermaid_water_biz_module_design_35098/diagram_7.mmd
Normal file
@ -0,0 +1,24 @@
|
||||
flowchart TD
|
||||
Start([发票业务]) --> InvoiceType{发票类型}
|
||||
|
||||
InvoiceType -->|纸质发票| PaperInvoice[纸质发票管理]
|
||||
InvoiceType -->|电子发票| EInvoice[电子发票管理]
|
||||
|
||||
PaperInvoice --> PaperStock[发票库存管理]
|
||||
PaperStock --> PaperPrint[发票打印]
|
||||
PaperPrint --> PaperRecord[打印记录]
|
||||
|
||||
EInvoice --> EInvoiceGenerate[电子发票生成]
|
||||
EInvoiceGenerate --> EInvoiceSign[电子签章]
|
||||
EInvoiceSign --> EInvoiceSend[发票推送]
|
||||
|
||||
PaperRecord --> InvoiceQuery[发票查询]
|
||||
EInvoiceSend --> InvoiceQuery
|
||||
|
||||
InvoiceQuery --> InvoiceCancel{需要作废?}
|
||||
InvoiceCancel -->|是| CancelInvoice[发票作废]
|
||||
InvoiceCancel -->|否| Complete([完成])
|
||||
|
||||
CancelInvoice --> CancelRecord[作废记录]
|
||||
CancelRecord --> Complete
|
||||
|
||||
BIN
temp_mermaid_water_biz_module_design_35098/diagram_7.png
Normal file
|
After Width: | Height: | Size: 53 KiB |
31
temp_mermaid_water_biz_module_design_35098/diagram_8.mmd
Normal file
@ -0,0 +1,31 @@
|
||||
graph TB
|
||||
subgraph "前端应用"
|
||||
F1[管理后台<br/>yudao-ui-admin-vue3]
|
||||
F2[移动端<br/>uni-app]
|
||||
F3[客户端<br/>微信小程序]
|
||||
end
|
||||
|
||||
subgraph "后端服务"
|
||||
B1[认证服务<br/>Spring Security]
|
||||
B2[业务服务<br/>RuoYi-Vue-Pro]
|
||||
B3[网关服务<br/>Spring Cloud Gateway]
|
||||
end
|
||||
|
||||
subgraph "数据存储"
|
||||
D1[(OpenGauss 5.0+)]
|
||||
D2[(Redis 6.0)]
|
||||
D3[MinIO文件存储]
|
||||
end
|
||||
|
||||
F1 --> B3
|
||||
F2 --> B3
|
||||
F3 --> B3
|
||||
|
||||
B3 --> B1
|
||||
B3 --> B2
|
||||
|
||||
B1 --> D2
|
||||
B2 --> D1
|
||||
B2 --> D2
|
||||
B2 --> D3
|
||||
|
||||
BIN
temp_mermaid_water_biz_module_design_35098/diagram_8.png
Normal file
|
After Width: | Height: | Size: 53 KiB |
70
temp_mermaid_water_biz_security_design_35098/diagram_1.mmd
Normal file
@ -0,0 +1,70 @@
|
||||
graph TB
|
||||
subgraph "外部威胁"
|
||||
THREAT1[网络攻击]
|
||||
THREAT2[恶意软件]
|
||||
THREAT3[数据泄露]
|
||||
THREAT4[内部威胁]
|
||||
end
|
||||
|
||||
subgraph "安全防护层"
|
||||
subgraph "边界安全"
|
||||
WAF[Web应用防火墙]
|
||||
FW[网络防火墙]
|
||||
IPS[入侵防护系统]
|
||||
VPN[VPN网关]
|
||||
end
|
||||
|
||||
subgraph "应用安全"
|
||||
AUTH[身份认证]
|
||||
AUTHZ[访问控制]
|
||||
AUDIT[操作审计]
|
||||
ENCRYPT[数据加密]
|
||||
end
|
||||
|
||||
subgraph "数据安全"
|
||||
TDE[透明数据加密]
|
||||
RLS[行级安全]
|
||||
MASK[数据脱敏]
|
||||
BACKUP[安全备份]
|
||||
end
|
||||
|
||||
subgraph "运维安全"
|
||||
MONITOR[安全监控]
|
||||
LOG[日志分析]
|
||||
ALERT[告警响应]
|
||||
PATCH[安全更新]
|
||||
end
|
||||
end
|
||||
|
||||
subgraph "核心资产"
|
||||
APP[水务营收系统]
|
||||
DB[OpenGauss数据库]
|
||||
FILE[文件存储]
|
||||
API[接口服务]
|
||||
end
|
||||
|
||||
THREAT1 --> WAF
|
||||
THREAT2 --> FW
|
||||
THREAT3 --> IPS
|
||||
THREAT4 --> VPN
|
||||
|
||||
WAF --> AUTH
|
||||
FW --> AUTHZ
|
||||
IPS --> AUDIT
|
||||
VPN --> ENCRYPT
|
||||
|
||||
AUTH --> TDE
|
||||
AUTHZ --> RLS
|
||||
AUDIT --> MASK
|
||||
ENCRYPT --> BACKUP
|
||||
|
||||
TDE --> MONITOR
|
||||
RLS --> LOG
|
||||
MASK --> ALERT
|
||||
BACKUP --> PATCH
|
||||
|
||||
MONITOR --> APP
|
||||
LOG --> DB
|
||||
ALERT --> FILE
|
||||
PATCH --> API
|
||||
|
||||
BIN
temp_mermaid_water_biz_security_design_35098/diagram_1.png
Normal file
|
After Width: | Height: | Size: 79 KiB |
46
temp_mermaid_water_biz_security_design_35098/diagram_2.mmd
Normal file
@ -0,0 +1,46 @@
|
||||
graph TB
|
||||
subgraph "OpenGauss安全特性"
|
||||
subgraph "身份认证"
|
||||
PWD[密码认证]
|
||||
CERT[证书认证]
|
||||
LDAP_AUTH[LDAP认证]
|
||||
KERBEROS[Kerberos认证]
|
||||
end
|
||||
|
||||
subgraph "访问控制"
|
||||
RBAC_DB[基于角色的访问控制]
|
||||
RLS_DB[行级安全策略]
|
||||
CLS_DB[列级访问控制]
|
||||
SCHEMA[模式权限控制]
|
||||
end
|
||||
|
||||
subgraph "数据加密"
|
||||
TDE_SM4[TDE透明加密<br/>SM4国密算法]
|
||||
SSL_SM[SSL传输加密<br/>SM2/SM3/SM4]
|
||||
FIELD_ENC[字段级加密]
|
||||
BACKUP_ENC[备份加密]
|
||||
end
|
||||
|
||||
subgraph "审计监控"
|
||||
AUDIT_LOG[操作审计日志]
|
||||
LOGIN_LOG[登录审计]
|
||||
DDL_LOG[DDL操作记录]
|
||||
SECURITY_LOG[安全事件日志]
|
||||
end
|
||||
end
|
||||
|
||||
PWD --> RBAC_DB
|
||||
CERT --> RLS_DB
|
||||
LDAP_AUTH --> CLS_DB
|
||||
KERBEROS --> SCHEMA
|
||||
|
||||
RBAC_DB --> TDE_SM4
|
||||
RLS_DB --> SSL_SM
|
||||
CLS_DB --> FIELD_ENC
|
||||
SCHEMA --> BACKUP_ENC
|
||||
|
||||
TDE_SM4 --> AUDIT_LOG
|
||||
SSL_SM --> LOGIN_LOG
|
||||
FIELD_ENC --> DDL_LOG
|
||||
BACKUP_ENC --> SECURITY_LOG
|
||||
|
||||
BIN
temp_mermaid_water_biz_security_design_35098/diagram_2.png
Normal file
|
After Width: | Height: | Size: 56 KiB |
76
temp_mermaid_water_biz_security_design_35098/diagram_3.mmd
Normal file
@ -0,0 +1,76 @@
|
||||
graph TB
|
||||
subgraph "外网区域"
|
||||
INTERNET[互联网]
|
||||
CDN[CDN加速]
|
||||
DNS[DNS服务]
|
||||
end
|
||||
|
||||
subgraph "边界防护"
|
||||
WAF[Web应用防火墙<br/>国产WAF产品]
|
||||
FW_BORDER[边界防火墙<br/>安全审计]
|
||||
IPS[入侵防护系统<br/>威胁检测]
|
||||
DPI[深度包检测<br/>流量分析]
|
||||
end
|
||||
|
||||
subgraph "DMZ区域"
|
||||
LB[负载均衡器<br/>SSL卸载]
|
||||
WEB1[Web服务器1]
|
||||
WEB2[Web服务器2]
|
||||
PROXY[反向代理]
|
||||
end
|
||||
|
||||
subgraph "内网安全"
|
||||
FW_INTERNAL[内部防火墙]
|
||||
VLAN_APP[应用VLAN]
|
||||
VLAN_DB[数据库VLAN]
|
||||
VLAN_MGT[管理VLAN]
|
||||
end
|
||||
|
||||
subgraph "应用层"
|
||||
APP1[应用服务器1]
|
||||
APP2[应用服务器2]
|
||||
APP3[应用服务器3]
|
||||
end
|
||||
|
||||
subgraph "数据层"
|
||||
DB_MASTER[OpenGauss主库]
|
||||
DB_SLAVE[OpenGauss从库]
|
||||
REDIS[Redis集群]
|
||||
end
|
||||
|
||||
subgraph "管理层"
|
||||
JUMP[跳板机]
|
||||
MONITOR[监控服务器]
|
||||
LOG[日志服务器]
|
||||
end
|
||||
|
||||
INTERNET --> CDN
|
||||
CDN --> DNS
|
||||
DNS --> WAF
|
||||
WAF --> FW_BORDER
|
||||
FW_BORDER --> IPS
|
||||
IPS --> DPI
|
||||
DPI --> LB
|
||||
|
||||
LB --> WEB1
|
||||
LB --> WEB2
|
||||
WEB1 --> PROXY
|
||||
WEB2 --> PROXY
|
||||
|
||||
PROXY --> FW_INTERNAL
|
||||
FW_INTERNAL --> VLAN_APP
|
||||
FW_INTERNAL --> VLAN_DB
|
||||
FW_INTERNAL --> VLAN_MGT
|
||||
|
||||
VLAN_APP --> APP1
|
||||
VLAN_APP --> APP2
|
||||
VLAN_APP --> APP3
|
||||
|
||||
VLAN_DB --> DB_MASTER
|
||||
VLAN_DB --> DB_SLAVE
|
||||
VLAN_DB --> REDIS
|
||||
|
||||
VLAN_MGT --> JUMP
|
||||
VLAN_MGT --> MONITOR
|
||||
VLAN_MGT --> LOG
|
||||
|
||||
BIN
temp_mermaid_water_biz_security_design_35098/diagram_3.png
Normal file
|
After Width: | Height: | Size: 63 KiB |
33
temp_mermaid_water_biz_security_design_35098/diagram_4.mmd
Normal file
@ -0,0 +1,33 @@
|
||||
graph TB
|
||||
subgraph "数据分类"
|
||||
SECRET[机密级<br/>重要业务数据]
|
||||
INTERNAL[内部级<br/>一般业务数据]
|
||||
PUBLIC[公开级<br/>公开业务数据]
|
||||
end
|
||||
|
||||
subgraph "水务业务数据"
|
||||
CUSTOMER[客户身份信息<br/>机密级]
|
||||
METER[水表计量数据<br/>内部级]
|
||||
BILLING[收费账务数据<br/>机密级]
|
||||
REPORT[统计报表数据<br/>内部级]
|
||||
CONFIG[系统配置数据<br/>内部级]
|
||||
LOG[日志审计数据<br/>内部级]
|
||||
end
|
||||
|
||||
subgraph "保护措施"
|
||||
ENC_HIGH[强加密<br/>SM4+数字签名]
|
||||
ENC_MID[访问控制<br/>权限管理]
|
||||
ENC_LOW[公开访问<br/>无特殊保护]
|
||||
end
|
||||
|
||||
SECRET --> ENC_HIGH
|
||||
INTERNAL --> ENC_MID
|
||||
PUBLIC --> ENC_LOW
|
||||
|
||||
CUSTOMER --> SECRET
|
||||
BILLING --> SECRET
|
||||
METER --> INTERNAL
|
||||
REPORT --> INTERNAL
|
||||
CONFIG --> INTERNAL
|
||||
LOG --> INTERNAL
|
||||
|
||||
BIN
temp_mermaid_water_biz_security_design_35098/diagram_4.png
Normal file
|
After Width: | Height: | Size: 57 KiB |
42
temp_mermaid_water_biz_security_design_35098/diagram_5.mmd
Normal file
@ -0,0 +1,42 @@
|
||||
graph TB
|
||||
subgraph "数据采集层"
|
||||
AGENT1[系统日志采集]
|
||||
AGENT2[应用日志采集]
|
||||
AGENT3[数据库日志采集]
|
||||
AGENT4[网络流量采集]
|
||||
end
|
||||
|
||||
subgraph "数据处理层"
|
||||
KAFKA[消息队列<br/>Kafka集群]
|
||||
STREAM[流处理<br/>Flink/Storm]
|
||||
ETL[数据清洗<br/>Logstash]
|
||||
end
|
||||
|
||||
subgraph "存储分析层"
|
||||
ES[Elasticsearch<br/>日志存储]
|
||||
SIEM[安全信息事件管理<br/>SIEM平台]
|
||||
AI[智能分析<br/>机器学习]
|
||||
end
|
||||
|
||||
subgraph "可视化层"
|
||||
DASHBOARD[监控仪表盘<br/>Grafana]
|
||||
ALERT[告警系统<br/>AlertManager]
|
||||
REPORT[安全报告<br/>自动生成]
|
||||
end
|
||||
|
||||
AGENT1 --> KAFKA
|
||||
AGENT2 --> KAFKA
|
||||
AGENT3 --> KAFKA
|
||||
AGENT4 --> KAFKA
|
||||
|
||||
KAFKA --> STREAM
|
||||
STREAM --> ETL
|
||||
ETL --> ES
|
||||
|
||||
ES --> SIEM
|
||||
SIEM --> AI
|
||||
AI --> DASHBOARD
|
||||
|
||||
DASHBOARD --> ALERT
|
||||
ALERT --> REPORT
|
||||
|
||||
BIN
temp_mermaid_water_biz_security_design_35098/diagram_5.png
Normal file
|
After Width: | Height: | Size: 72 KiB |
18
temp_mermaid_water_biz_security_design_35098/diagram_6.mmd
Normal file
@ -0,0 +1,18 @@
|
||||
graph LR
|
||||
DISCOVER[漏洞发现] --> ASSESS[风险评估]
|
||||
ASSESS --> PLAN[补丁计划]
|
||||
PLAN --> TEST[测试验证]
|
||||
TEST --> DEPLOY[生产部署]
|
||||
DEPLOY --> VERIFY[部署验证]
|
||||
VERIFY --> DOCUMENT[文档记录]
|
||||
|
||||
subgraph "评估标准"
|
||||
HIGH[高危<br/>24小时内]
|
||||
MEDIUM[中危<br/>7天内]
|
||||
LOW[低危<br/>30天内]
|
||||
end
|
||||
|
||||
ASSESS --> HIGH
|
||||
ASSESS --> MEDIUM
|
||||
ASSESS --> LOW
|
||||
|
||||
BIN
temp_mermaid_water_biz_security_design_35098/diagram_6.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
30
temp_mermaid_water_biz_security_design_35098/diagram_7.mmd
Normal file
@ -0,0 +1,30 @@
|
||||
graph TB
|
||||
INCIDENT[安全事件发生] --> DETECT[事件检测]
|
||||
DETECT --> REPORT[事件上报]
|
||||
REPORT --> ASSESS[影响评估]
|
||||
ASSESS --> RESPONSE[应急响应]
|
||||
|
||||
subgraph "应急响应措施"
|
||||
ISOLATE[系统隔离]
|
||||
PRESERVE[证据保全]
|
||||
RECOVER[系统恢复]
|
||||
INVESTIGATE[调查分析]
|
||||
end
|
||||
|
||||
subgraph "后续处理"
|
||||
LESSON[经验总结]
|
||||
IMPROVE[流程改进]
|
||||
TRAIN[培训加强]
|
||||
DOC[文档更新]
|
||||
end
|
||||
|
||||
RESPONSE --> ISOLATE
|
||||
RESPONSE --> PRESERVE
|
||||
RESPONSE --> RECOVER
|
||||
RESPONSE --> INVESTIGATE
|
||||
|
||||
INVESTIGATE --> LESSON
|
||||
LESSON --> IMPROVE
|
||||
IMPROVE --> TRAIN
|
||||
TRAIN --> DOC
|
||||
|
||||
BIN
temp_mermaid_water_biz_security_design_35098/diagram_7.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
39
temp_mermaid_water_biz_security_design_35098/diagram_8.mmd
Normal file
@ -0,0 +1,39 @@
|
||||
graph TB
|
||||
CEO[总经理<br/>安全最高责任人]
|
||||
CISO[信息安全负责人<br/>CISO]
|
||||
|
||||
subgraph "安全管理委员会"
|
||||
IT_DIR[IT总监]
|
||||
SECURITY_DIR[安全总监]
|
||||
COMPLIANCE[合规负责人]
|
||||
LEGAL[法务负责人]
|
||||
end
|
||||
|
||||
subgraph "安全执行团队"
|
||||
SEC_ADMIN[安全管理员]
|
||||
SYS_ADMIN[系统管理员]
|
||||
DBA[数据库管理员]
|
||||
NET_ADMIN[网络管理员]
|
||||
end
|
||||
|
||||
subgraph "业务安全责任人"
|
||||
BUS_OWNER[业务负责人]
|
||||
DATA_OWNER[数据负责人]
|
||||
USER_ADMIN[用户管理员]
|
||||
end
|
||||
|
||||
CEO --> CISO
|
||||
CISO --> IT_DIR
|
||||
CISO --> SECURITY_DIR
|
||||
CISO --> COMPLIANCE
|
||||
CISO --> LEGAL
|
||||
|
||||
IT_DIR --> SEC_ADMIN
|
||||
IT_DIR --> SYS_ADMIN
|
||||
IT_DIR --> DBA
|
||||
IT_DIR --> NET_ADMIN
|
||||
|
||||
SECURITY_DIR --> BUS_OWNER
|
||||
SECURITY_DIR --> DATA_OWNER
|
||||
SECURITY_DIR --> USER_ADMIN
|
||||
|
||||
BIN
temp_mermaid_water_biz_security_design_35098/diagram_8.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
@ -0,0 +1,47 @@
|
||||
graph TB
|
||||
subgraph USER["用户层"]
|
||||
A1[Web管理端<br/>yudao-ui-admin-vue3]
|
||||
A2[移动抄表端<br/>uni-app]
|
||||
A3[客户微信端<br/>微信小程序]
|
||||
A4[客户支付宝端<br/>支付宝小程序]
|
||||
end
|
||||
|
||||
subgraph GATEWAY["网关层"]
|
||||
B1[Nginx负载均衡]
|
||||
B2[API网关<br/>统一认证/权限控制]
|
||||
end
|
||||
|
||||
subgraph APP["应用层"]
|
||||
C1[营收管理<br/>RuoYi-Vue-Pro]
|
||||
C2[客户服务<br/>RuoYi-Vue-Pro]
|
||||
C3[表务管理<br/>RuoYi-Vue-Pro]
|
||||
C4[统计分析<br/>RuoYi-Vue-Pro]
|
||||
end
|
||||
|
||||
subgraph SERVICE["服务层"]
|
||||
D1[权限服务<br/>Spring Security]
|
||||
D2[工作流服务<br/>Flowable]
|
||||
D3[消息服务<br/>Redis MQ]
|
||||
D4[文件服务<br/>MinIO/OSS]
|
||||
end
|
||||
|
||||
subgraph DATA["数据层"]
|
||||
E1[(OpenGauss 5.0+<br/>主从架构)]
|
||||
E2[(Redis 6.0<br/>集群缓存)]
|
||||
E3[文件存储<br/>分布式存储]
|
||||
end
|
||||
|
||||
subgraph EXTERNAL["外部接口"]
|
||||
F1[银行接口<br/>代扣/托收]
|
||||
F2[支付接口<br/>微信/支付宝]
|
||||
F3[短信接口<br/>阿里云/腾讯云]
|
||||
F4[物联网接口<br/>智能水表]
|
||||
end
|
||||
|
||||
%% 层级间调用关系
|
||||
USER -.->|请求访问| GATEWAY
|
||||
GATEWAY -.->|负载均衡<br/>路由转发| APP
|
||||
APP -.->|服务调用| SERVICE
|
||||
APP -.->|外部集成| EXTERNAL
|
||||
SERVICE -.->|数据访问| DATA
|
||||
|
||||
@ -0,0 +1,27 @@
|
||||
graph
|
||||
subgraph ENCRYPT["加密层级"]
|
||||
direction TB
|
||||
L1[传输层加密<br/>SSL/TLS/国密SM]
|
||||
L2[存储层加密<br/>TDE透明数据加密]
|
||||
L3[字段级加密<br/>敏感字段加密]
|
||||
L4[备份加密<br/>备份文件加密]
|
||||
end
|
||||
|
||||
subgraph KEYMANAGE["密钥管理"]
|
||||
direction TB
|
||||
KMS[密钥管理系统<br/>Key Management]
|
||||
HSM[硬件安全模块<br/>Hardware Security]
|
||||
ROT[密钥轮换<br/>Key Rotation]
|
||||
end
|
||||
|
||||
subgraph GUOMI["国密算法"]
|
||||
direction TB
|
||||
SM2[SM2椭圆曲线<br/>非对称加密]
|
||||
SM3[SM3哈希算法<br/>消息摘要]
|
||||
SM4[SM4分组密码<br/>对称加密]
|
||||
end
|
||||
|
||||
%% 安全层级调用关系
|
||||
ENCRYPT -.->|密钥依赖<br/>加密管理| KEYMANAGE
|
||||
KEYMANAGE -.->|算法调用<br/>国密支持| GUOMI
|
||||
|
||||
BIN
temp_mermaid_water_biz_system_architecture_35098/diagram_10.png
Normal file
|
After Width: | Height: | Size: 65 KiB |
@ -0,0 +1,29 @@
|
||||
graph
|
||||
subgraph AUTHENTICATION["身份认证"]
|
||||
direction TB
|
||||
AUTH1[用户名密码认证]
|
||||
AUTH2[LDAP集成认证]
|
||||
AUTH3[Kerberos认证]
|
||||
AUTH4[证书认证]
|
||||
end
|
||||
|
||||
subgraph AUTHORIZATION["权限控制"]
|
||||
direction TB
|
||||
RBAC[基于角色的权限控制<br/>Role-Based Access Control]
|
||||
RLS[行级安全策略<br/>Row Level Security]
|
||||
CLS[列级安全控制<br/>Column Level Security]
|
||||
TENANT[多租户数据隔离<br/>Multi-Tenant Isolation]
|
||||
end
|
||||
|
||||
subgraph AUDITING["审计监控"]
|
||||
direction TB
|
||||
AUDIT[操作审计日志<br/>Audit Logging]
|
||||
MONITOR[实时安全监控<br/>Security Monitoring]
|
||||
ALERT[安全告警<br/>Security Alert]
|
||||
REPORT[合规报告<br/>Compliance Report]
|
||||
end
|
||||
|
||||
%% 安全控制流程
|
||||
AUTHENTICATION -.->|身份验证<br/>授权检查| AUTHORIZATION
|
||||
AUTHORIZATION -.->|权限监控<br/>操作审计| AUDITING
|
||||
|
||||
BIN
temp_mermaid_water_biz_system_architecture_35098/diagram_11.png
Normal file
|
After Width: | Height: | Size: 64 KiB |
@ -0,0 +1,51 @@
|
||||
graph TB
|
||||
subgraph DMZ["DMZ区域"]
|
||||
subgraph "负载均衡集群"
|
||||
LB1[负载均衡器<br/>Nginx Cluster]
|
||||
WAF[Web应用防火墙]
|
||||
end
|
||||
end
|
||||
|
||||
subgraph APPZONE["应用服务区"]
|
||||
subgraph "Web服务集群"
|
||||
WEB1[Web服务器1<br/>8核32G]
|
||||
WEB2[Web服务器2<br/>8核32G]
|
||||
end
|
||||
|
||||
subgraph "应用服务集群"
|
||||
APP1[应用服务器1<br/>16核64G]
|
||||
APP2[应用服务器2<br/>16核64G]
|
||||
end
|
||||
end
|
||||
|
||||
subgraph DATAZONE["数据服务区"]
|
||||
subgraph "数据库集群"
|
||||
DB1[OpenGauss主库<br/>32核128G]
|
||||
DB2[OpenGauss从库<br/>32核128G]
|
||||
end
|
||||
|
||||
subgraph "缓存集群"
|
||||
REDIS1[Redis主节点<br/>16核32G]
|
||||
REDIS2[Redis从节点<br/>16核32G]
|
||||
REDIS3[Redis哨兵<br/>8核16G]
|
||||
end
|
||||
|
||||
subgraph "文件存储"
|
||||
FILE1[文件服务器1<br/>8核32G 10TB]
|
||||
FILE2[文件服务器2<br/>8核32G 10TB]
|
||||
end
|
||||
end
|
||||
|
||||
subgraph MGMT["管理服务区"]
|
||||
MONITOR[监控服务器<br/>8核16G]
|
||||
BACKUP[备份服务器<br/>8核32G 20TB]
|
||||
JUMP[跳板服务器<br/>4核8G]
|
||||
end
|
||||
|
||||
%% 区域间调用关系
|
||||
Internet -.->|外网访问| DMZ
|
||||
DMZ -.->|负载均衡<br/>安全过滤| APPZONE
|
||||
APPZONE -.->|数据访问<br/>业务处理| DATAZONE
|
||||
MGMT -.->|监控管理<br/>备份恢复| DATAZONE
|
||||
MGMT -.->|系统监控<br/>运维管理| APPZONE
|
||||
|
||||
BIN
temp_mermaid_water_biz_system_architecture_35098/diagram_2.png
Normal file
|
After Width: | Height: | Size: 122 KiB |
@ -0,0 +1,57 @@
|
||||
graph
|
||||
subgraph FRONTEND["🏷 前端技术栈"]
|
||||
direction TB
|
||||
FE1["Vue 3.2+ TypeScript"]
|
||||
FE2["Element Plus UI"]
|
||||
FE3["Vite 构建工具"]
|
||||
FE4["Pinia 状态管理"]
|
||||
FE5["Vue Router 路由"]
|
||||
FE6["Axios HTTP请求"]
|
||||
FE7["ECharts 图表"]
|
||||
end
|
||||
|
||||
subgraph BACKEND["📦 后端技术栈"]
|
||||
direction TB
|
||||
BE1["Spring Boot 3.x"]:::spring
|
||||
BE2["Spring Security"]:::security
|
||||
BE3["MyBatis Plus"]:::orm
|
||||
BE4["Redis 缓存"]:::db
|
||||
BE5["OpenGauss DB"]:::db
|
||||
BE6["Knife4j 文档"]
|
||||
BE7["Jackson JSON"]
|
||||
BE8["Maven 管理"]
|
||||
end
|
||||
|
||||
subgraph MIDDLEWARE["⚙️ 中间件服务"]
|
||||
direction TB
|
||||
MW1["Nginx LB"]
|
||||
MW2["Redis集群"]
|
||||
MW3["Flowable工作流"]
|
||||
MW4["Quartz定时"]
|
||||
MW5["MinIO存储"]
|
||||
MW6["RocketMQ"]
|
||||
MW7["ElasticSearch"]
|
||||
MW8["Sentinel限流"]
|
||||
end
|
||||
|
||||
subgraph MOBILE["📱 移动应用"]
|
||||
direction TB
|
||||
MB1["uni-app"]
|
||||
MB2["uView UI"]
|
||||
MB3["微信小程序"]
|
||||
MB4["支付宝小程序"]
|
||||
MB5["H5响应式"]
|
||||
MB6["高德地图SDK"]
|
||||
MB7["NFC设备接口"]
|
||||
end
|
||||
|
||||
%% 技术栈间调用关系
|
||||
FRONTEND -.->|HTTP请求<br/>API调用| BACKEND
|
||||
MOBILE -.->|跨平台调用<br/>API集成| BACKEND
|
||||
BACKEND -.->|服务集成<br/>中间件调用| MIDDLEWARE
|
||||
|
||||
classDef spring fill:#6db33f,color:white
|
||||
classDef security fill:#b5e6c0
|
||||
classDef orm fill:#c7b3e5
|
||||
classDef db fill:#f9d27d
|
||||
|
||||
BIN
temp_mermaid_water_biz_system_architecture_35098/diagram_3.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
@ -0,0 +1,55 @@
|
||||
flowchart TD
|
||||
subgraph COLLECT["数据采集层"]
|
||||
A1[移动抄表APP<br/>数据采集]
|
||||
A2[智能水表<br/>远程数据]
|
||||
A3[Web管理端<br/>业务录入]
|
||||
A4[客户端小程序<br/>用户数据]
|
||||
A5[外部系统<br/>接口数据]
|
||||
end
|
||||
|
||||
subgraph ACCESS["数据接入层"]
|
||||
B1[API网关<br/>数据验证]
|
||||
B2[数据清洗<br/>格式转换]
|
||||
B3[消息队列<br/>异步处理]
|
||||
B4[数据缓存<br/>临时存储]
|
||||
end
|
||||
|
||||
subgraph PROCESS["业务处理层"]
|
||||
C1[抄表服务<br/>水量计算]
|
||||
C2[收费服务<br/>账单生成]
|
||||
C3[账务服务<br/>财务处理]
|
||||
C4[工单服务<br/>流程处理]
|
||||
C5[统计服务<br/>数据分析]
|
||||
end
|
||||
|
||||
subgraph STORAGE["数据存储层"]
|
||||
D1[(OpenGauss主库<br/>核心业务数据)]
|
||||
D2[(OpenGauss从库<br/>查询数据)]
|
||||
D3[(Redis缓存<br/>热点数据)]
|
||||
D4[文件存储<br/>附件图片]
|
||||
D5[(备份库<br/>历史数据)]
|
||||
end
|
||||
|
||||
subgraph SERVICE["数据服务层"]
|
||||
E1[查询服务<br/>数据检索]
|
||||
E2[报表服务<br/>统计分析]
|
||||
E3[接口服务<br/>对外开放]
|
||||
E4[推送服务<br/>消息通知]
|
||||
end
|
||||
|
||||
subgraph PRESENT["数据展现层"]
|
||||
F1[管理后台<br/>业务操作]
|
||||
F2[统计大屏<br/>可视化展示]
|
||||
F3[移动端<br/>现场作业]
|
||||
F4[客户端<br/>自助服务]
|
||||
F5[第三方系统<br/>数据集成]
|
||||
end
|
||||
|
||||
%% 数据流向关系
|
||||
COLLECT -.->|数据采集<br/>格式验证| ACCESS
|
||||
ACCESS -.->|数据接入<br/>清洗转换| PROCESS
|
||||
PROCESS -.->|业务处理<br/>数据持久化| STORAGE
|
||||
STORAGE -.->|数据查询<br/>统计分析| SERVICE
|
||||
SERVICE -.->|数据服务<br/>接口调用| PRESENT
|
||||
PRESENT -.->|用户反馈<br/>业务交互| PROCESS
|
||||
|
||||
BIN
temp_mermaid_water_biz_system_architecture_35098/diagram_4.png
Normal file
|
After Width: | Height: | Size: 96 KiB |
@ -0,0 +1,31 @@
|
||||
graph TB
|
||||
subgraph FRAMEWORK["跨平台框架"]
|
||||
M1[uni-app 3.x]
|
||||
M2[Vue 3 Composition API]
|
||||
M3[TypeScript支持]
|
||||
end
|
||||
|
||||
subgraph UIKIT["UI组件库"]
|
||||
N1[uView UI 2.0]
|
||||
N2[uni-ui组件]
|
||||
N3[自定义水务组件]
|
||||
end
|
||||
|
||||
subgraph DEVICE["设备能力"]
|
||||
P1[相机API<br/>水表拍照]
|
||||
P2[NFC读取<br/>水表标签]
|
||||
P3[GPS定位<br/>抄表轨迹]
|
||||
P4[扫码API<br/>二维码扫描]
|
||||
end
|
||||
|
||||
subgraph NETWORK["网络通信"]
|
||||
Q1[uni.request<br/>HTTP请求]
|
||||
Q2[WebSocket<br/>实时通信]
|
||||
Q3[文件上传<br/>图片处理]
|
||||
end
|
||||
|
||||
%% 移动架构调用关系
|
||||
FRAMEWORK -.->|UI渲染<br/>组件调用| UIKIT
|
||||
FRAMEWORK -.->|设备调用<br/>原生能力| DEVICE
|
||||
FRAMEWORK -.->|网络通信<br/>数据交互| NETWORK
|
||||
|
||||
BIN
temp_mermaid_water_biz_system_architecture_35098/diagram_5.png
Normal file
|
After Width: | Height: | Size: 67 KiB |
@ -0,0 +1,35 @@
|
||||
graph TD
|
||||
subgraph ACCESS["接入层"]
|
||||
GW[API网关]
|
||||
AUTH[认证服务]
|
||||
end
|
||||
|
||||
subgraph BUSINESS["业务服务层"]
|
||||
SYS[系统服务]
|
||||
CUST[客户服务]
|
||||
READ[抄表服务]
|
||||
BILL[账单服务]
|
||||
PAY[收费服务]
|
||||
ORDER[工单服务]
|
||||
RPT[报表服务]
|
||||
end
|
||||
|
||||
subgraph SUPPORT["支撑服务层"]
|
||||
METER[水表管理]
|
||||
WF[工作流引擎]
|
||||
PAY_GW[支付网关]
|
||||
IOT[物联网]
|
||||
end
|
||||
|
||||
subgraph DATA["数据存储层"]
|
||||
DB[(OpenGauss数据库)]
|
||||
REDIS[(Redis缓存)]
|
||||
FILE_STORE[文件存储]
|
||||
end
|
||||
|
||||
%% 层级间的调用关系
|
||||
ACCESS -.->|请求路由<br/>认证授权| BUSINESS
|
||||
BUSINESS -.->|服务调用| SUPPORT
|
||||
BUSINESS -.->|数据访问| DATA
|
||||
SUPPORT -.->|数据访问| DATA
|
||||
|
||||
BIN
temp_mermaid_water_biz_system_architecture_35098/diagram_6.png
Normal file
|
After Width: | Height: | Size: 58 KiB |
@ -0,0 +1,38 @@
|
||||
graph TB
|
||||
subgraph REGISTRY["服务发现与注册"]
|
||||
NACOS[Nacos注册中心<br/>服务注册/发现/配置]
|
||||
end
|
||||
|
||||
subgraph MESH["服务网格层"]
|
||||
subgraph BALANCE["负载均衡"]
|
||||
LB[Ribbon负载均衡<br/>客户端负载均衡]
|
||||
FEIGN[OpenFeign<br/>服务间调用]
|
||||
end
|
||||
|
||||
subgraph PROTECTION["容错保护"]
|
||||
CB[Sentinel熔断器<br/>流量控制/熔断降级]
|
||||
RETRY[重试机制<br/>失败重试]
|
||||
end
|
||||
|
||||
subgraph TRACING["链路追踪"]
|
||||
TRACE[SkyWalking<br/>分布式链路追踪]
|
||||
METRIC[Micrometer<br/>指标收集]
|
||||
end
|
||||
end
|
||||
|
||||
subgraph CONFIG_MGMT["配置管理"]
|
||||
CONFIG[Nacos Config<br/>配置中心]
|
||||
SECRET[配置加密<br/>敏感信息保护]
|
||||
end
|
||||
|
||||
subgraph MONITORING["监控告警"]
|
||||
MONITOR[Spring Boot Admin<br/>应用监控]
|
||||
ALERT[告警系统<br/>异常通知]
|
||||
LOG[ELK日志系统<br/>日志聚合分析]
|
||||
end
|
||||
|
||||
%% 服务治理调用关系
|
||||
REGISTRY -.->|服务发现<br/>配置下发| MESH
|
||||
MESH -.->|配置获取<br/>服务注册| CONFIG_MGMT
|
||||
MESH -.->|监控数据<br/>链路追踪| MONITORING
|
||||
|
||||
BIN
temp_mermaid_water_biz_system_architecture_35098/diagram_7.png
Normal file
|
After Width: | Height: | Size: 93 KiB |
@ -0,0 +1,30 @@
|
||||
graph
|
||||
subgraph DBCLUSTER["OpenGauss高可用集群"]
|
||||
MASTER[("OpenGauss主库<br/>Primary Node<br/>读写操作")]
|
||||
STANDBY[("OpenGauss备库<br/>Standby Node<br/>只读操作")]
|
||||
CASCADE[("OpenGauss级联备库<br/>Cascade Standby<br/>负载分担")]
|
||||
|
||||
MASTER -.->|流复制| STANDBY
|
||||
STANDBY -.->|级联复制| CASCADE
|
||||
end
|
||||
|
||||
subgraph APPLAYER["应用层"]
|
||||
APP1[应用服务器1]
|
||||
APP2[应用服务器2]
|
||||
APP3[应用服务器3]
|
||||
end
|
||||
|
||||
subgraph POOLING["连接池"]
|
||||
POOL[连接池<br/>HikariCP<br/>Druid]
|
||||
end
|
||||
|
||||
subgraph MANAGEMENT["监控管理"]
|
||||
MON[OpenGauss Monitor<br/>性能监控]
|
||||
BACKUP[定时备份<br/>gs_backup]
|
||||
end
|
||||
|
||||
%% 高可用架构调用关系
|
||||
APPLAYER -.->|连接请求<br/>负载均衡| POOLING
|
||||
POOLING -.->|数据访问<br/>读写分离| DBCLUSTER
|
||||
MANAGEMENT -.->|监控管理<br/>备份恢复| DBCLUSTER
|
||||
|
||||
BIN
temp_mermaid_water_biz_system_architecture_35098/diagram_8.png
Normal file
|
After Width: | Height: | Size: 81 KiB |
@ -0,0 +1,31 @@
|
||||
graph TB
|
||||
subgraph DISTRIBUTED["OpenGauss分布式架构"]
|
||||
subgraph COORDINATOR["协调节点"]
|
||||
CN1[协调节点1<br/>Coordinator Node]
|
||||
CN2[协调节点2<br/>Coordinator Node]
|
||||
end
|
||||
|
||||
subgraph DATANODE1["数据节点组1"]
|
||||
DN1_1[数据节点1-主<br/>Datanode Primary]
|
||||
DN1_2[数据节点1-备<br/>Datanode Standby]
|
||||
DN1_1 -.->|主备同步| DN1_2
|
||||
end
|
||||
|
||||
subgraph DATANODE2["数据节点组2"]
|
||||
DN2_1[数据节点2-主<br/>Datanode Primary]
|
||||
DN2_2[数据节点2-备<br/>Datanode Standby]
|
||||
DN2_1 -.->|主备同步| DN2_2
|
||||
end
|
||||
|
||||
subgraph GTM_CLUSTER["GTM节点"]
|
||||
GTM[全局事务管理器<br/>GTM Master]
|
||||
GTM_S[GTM备节点<br/>GTM Standby]
|
||||
GTM -.->|备份| GTM_S
|
||||
end
|
||||
end
|
||||
|
||||
%% 分布式架构调用关系
|
||||
COORDINATOR -.->|分片路由<br/>查询协调| DATANODE1
|
||||
COORDINATOR -.->|分片路由<br/>查询协调| DATANODE2
|
||||
COORDINATOR -.->|事务管理<br/>全局一致性| GTM_CLUSTER
|
||||
|
||||
BIN
temp_mermaid_water_biz_system_architecture_35098/diagram_9.png
Normal file
|
After Width: | Height: | Size: 87 KiB |
@ -8,13 +8,13 @@
|
||||
| **技术框架** | RuoYi-Vue-Pro + yudao-ui-admin-vue3 |
|
||||
| **文档版本** | v1.0 |
|
||||
| **编写日期** | 2024-12-19 |
|
||||
| **文档状态** | 🟡 进行中 |
|
||||
| **文档状态** | ✅ 已完成 |
|
||||
|
||||
## 目录
|
||||
- [1. 接口概述](#1-接口概述)
|
||||
- [2. 外部接口](#2-外部接口)
|
||||
- [3. 内部接口](#3-内部接口)
|
||||
- [4. 接口标准](#4-接口标准)
|
||||
- [接口概述](#接口概述)
|
||||
- [外部接口](#外部接口)
|
||||
- [内部接口](#内部接口)
|
||||
- [接口标准](#接口标准)
|
||||
|
||||
## 接口概述
|
||||
|
||||
@ -141,6 +141,7 @@
|
||||
- **认证方式**:API Key + 签名
|
||||
|
||||
**请求参数**:
|
||||
|
||||
```json
|
||||
{
|
||||
"merchantId": "WATER001",
|
||||
@ -178,6 +179,7 @@
|
||||
- **认证方式**:RSA2签名
|
||||
|
||||
**预创建支付请求参数**:
|
||||
|
||||
```json
|
||||
{
|
||||
"app_id": "2021001234567890",
|
||||
@ -230,6 +232,7 @@
|
||||
- **认证方式**:微信支付V3签名
|
||||
|
||||
**统一下单请求参数**:
|
||||
|
||||
```json
|
||||
{
|
||||
"appid": "wx8888888888888888",
|
||||
@ -304,6 +307,7 @@
|
||||
- **请求头**:`Authorization: Bearer {token}`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|
||||
|-------|------|------|------|------|
|
||||
| id | Long | 是 | 客户ID | 1 |
|
||||
@ -326,28 +330,6 @@
|
||||
}
|
||||
```
|
||||
|
||||
**RuoYi-Vue-Pro代码示例**:
|
||||
```java
|
||||
@RestController
|
||||
@RequestMapping("/admin-api/water/customer")
|
||||
@Tag(name = "管理后台 - 客户管理")
|
||||
@Validated
|
||||
public class CustomerController {
|
||||
|
||||
@Resource
|
||||
private CustomerService customerService;
|
||||
|
||||
@GetMapping("/{id}")
|
||||
@Operation(summary = "获得客户")
|
||||
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
||||
@PreAuthorize("@ss.hasPermission('water:customer:query')")
|
||||
public CommonResult<CustomerRespVO> getCustomer(@PathVariable("id") Long id) {
|
||||
CustomerDO customer = customerService.getCustomer(id);
|
||||
return success(BeanUtils.toBean(customer, CustomerRespVO.class));
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 客户分页查询接口
|
||||
|
||||
**功能描述**:分页查询客户列表信息。
|
||||
@ -357,6 +339,7 @@ public class CustomerController {
|
||||
- **请求路径**:`/admin-api/water/customer/page`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|
||||
|-------|------|------|------|------|
|
||||
| pageNo | Integer | 否 | 页码,默认1 | 1 |
|
||||
@ -398,6 +381,7 @@ public class CustomerController {
|
||||
- **请求路径**:`/admin-api/water/customer/create`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
```json
|
||||
{
|
||||
"customerCode": "C002",
|
||||
@ -419,11 +403,6 @@ public class CustomerController {
|
||||
}
|
||||
```
|
||||
|
||||
**客户管理服务实现要点**:
|
||||
- 校验客户编号唯一性
|
||||
- 数据对象转换和持久化
|
||||
- 业务异常处理和日志记录
|
||||
|
||||
### 水表管理API接口
|
||||
|
||||
#### 水表信息查询接口
|
||||
@ -436,6 +415,7 @@ public class CustomerController {
|
||||
- **请求头**:`Authorization: Bearer {token}`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|
||||
|-------|------|------|------|------|
|
||||
| id | Long | 是 | 水表ID | 1 |
|
||||
@ -464,11 +444,6 @@ public class CustomerController {
|
||||
}
|
||||
```
|
||||
|
||||
**水表管理控制器要点**:
|
||||
- 支持权限控制和参数校验
|
||||
- 标准的RESTful接口设计
|
||||
- 统一的响应格式和异常处理
|
||||
|
||||
#### 抄表记录创建接口
|
||||
|
||||
**功能描述**:创建新的抄表记录。
|
||||
@ -478,6 +453,7 @@ public class CustomerController {
|
||||
- **请求路径**:`/admin-api/water/reading/create`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
```json
|
||||
{
|
||||
"meterId": 1,
|
||||
@ -499,12 +475,6 @@ public class CustomerController {
|
||||
}
|
||||
```
|
||||
|
||||
**抄表记录服务实现要点**:
|
||||
- 事务控制确保数据一致性
|
||||
- 水表存在性和读数合理性校验
|
||||
- 自动生成抄表编号和客户关联
|
||||
- 计算用水量并更新水表当前读数
|
||||
|
||||
#### 抄表数据批量导入接口
|
||||
|
||||
**功能描述**:批量导入抄表数据,支持Excel文件上传。
|
||||
@ -515,6 +485,7 @@ public class CustomerController {
|
||||
- **Content-Type**:`multipart/form-data`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|
||||
|-------|------|------|------|------|
|
||||
| file | MultipartFile | 是 | Excel文件 | reading_data.xlsx |
|
||||
@ -550,6 +521,7 @@ public class CustomerController {
|
||||
- **请求路径**:`/admin-api/water/bill/page`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|
||||
|-------|------|------|------|------|
|
||||
| pageNo | Integer | 否 | 页码,默认1 | 1 |
|
||||
@ -596,6 +568,7 @@ public class CustomerController {
|
||||
- **请求路径**:`/admin-api/water/bill/generate`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
```json
|
||||
{
|
||||
"billMonth": "2024-12",
|
||||
@ -624,66 +597,6 @@ public class CustomerController {
|
||||
}
|
||||
```
|
||||
|
||||
**Service层代码示例**:
|
||||
```java
|
||||
@Service
|
||||
@Validated
|
||||
public class BillServiceImpl implements BillService {
|
||||
|
||||
@Resource
|
||||
private BillMapper billMapper;
|
||||
@Resource
|
||||
private MeterReadingService readingService;
|
||||
@Resource
|
||||
private WaterPriceService priceService;
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public BillGenerateRespVO generateBills(BillGenerateReqVO generateReqVO) {
|
||||
BillGenerateRespVO result = new BillGenerateRespVO();
|
||||
List<BillGenerateDetailVO> successList = new ArrayList<>();
|
||||
List<BillGenerateDetailVO> failureList = new ArrayList<>();
|
||||
|
||||
for (Long readingId : generateReqVO.getReadingIds()) {
|
||||
try {
|
||||
// 获取抄表记录
|
||||
MeterReadingDO reading = readingService.getReading(readingId);
|
||||
|
||||
// 计算水费
|
||||
WaterFeeCalculateDTO feeResult = priceService.calculateWaterFee(
|
||||
reading.getCustomerId(), reading.getWaterUsage());
|
||||
|
||||
// 创建账单
|
||||
BillDO bill = new BillDO();
|
||||
bill.setBillCode(generateBillCode());
|
||||
bill.setBillMonth(generateReqVO.getBillMonth());
|
||||
bill.setCustomerId(reading.getCustomerId());
|
||||
bill.setMeterId(reading.getMeterId());
|
||||
bill.setReadingId(readingId);
|
||||
bill.setWaterUsage(reading.getWaterUsage());
|
||||
bill.setWaterFee(feeResult.getWaterFee());
|
||||
bill.setSewageFee(feeResult.getSewageFee());
|
||||
bill.setTotalAmount(feeResult.getTotalAmount());
|
||||
bill.setDueDate(generateReqVO.getDueDate());
|
||||
|
||||
billMapper.insert(bill);
|
||||
|
||||
successList.add(buildSuccessDetail(reading.getCustomerId(),
|
||||
bill.getId(), feeResult.getTotalAmount()));
|
||||
|
||||
} catch (Exception e) {
|
||||
failureList.add(buildFailureDetail(readingId, e.getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
result.setGenerateCount(successList.size());
|
||||
result.setSuccessList(successList);
|
||||
result.setFailureList(failureList);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 缴费管理API接口
|
||||
|
||||
#### 缴费处理接口
|
||||
@ -695,6 +608,7 @@ public class BillServiceImpl implements BillService {
|
||||
- **请求路径**:`/admin-api/water/payment/create`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
```json
|
||||
{
|
||||
"customerId": 1,
|
||||
@ -732,6 +646,7 @@ public class BillServiceImpl implements BillService {
|
||||
- **请求路径**:`/admin-api/water/payment/online-pay`
|
||||
|
||||
**请求参数**:
|
||||
|
||||
```json
|
||||
{
|
||||
"customerId": 1,
|
||||
@ -802,222 +717,84 @@ public class BillServiceImpl implements BillService {
|
||||
#### 认证机制
|
||||
|
||||
**JWT令牌认证**:
|
||||
```java
|
||||
@RestController
|
||||
public class AuthController {
|
||||
|
||||
@Resource
|
||||
private AuthService authService;
|
||||
|
||||
@PostMapping("/admin-api/system/auth/login")
|
||||
public CommonResult<AuthLoginRespVO> login(@Valid @RequestBody AuthLoginReqVO reqVO) {
|
||||
// 验证用户名密码
|
||||
AdminUserDO user = authService.authenticate(reqVO.getUsername(), reqVO.getPassword());
|
||||
|
||||
// 生成JWT Token
|
||||
String token = authService.createToken(user.getId(), user.getTenantId());
|
||||
|
||||
return success(AuthLoginRespVO.builder()
|
||||
.userId(user.getId())
|
||||
.accessToken(token)
|
||||
.refreshToken(authService.createRefreshToken(user.getId()))
|
||||
.expiresTime(LocalDateTime.now().plusHours(2))
|
||||
.build());
|
||||
}
|
||||
}
|
||||
```
|
||||
- 验证用户名密码
|
||||
- 生成JWT Token
|
||||
- 支持Token刷新机制
|
||||
- 设置合理的过期时间
|
||||
|
||||
**API Key认证**(外部系统):
|
||||
```java
|
||||
@Component
|
||||
public class ApiKeyAuthenticationFilter extends OncePerRequestFilter {
|
||||
|
||||
@Override
|
||||
protected void doFilterInternal(HttpServletRequest request,
|
||||
HttpServletResponse response,
|
||||
FilterChain filterChain) throws ServletException, IOException {
|
||||
String apiKey = request.getHeader("X-API-KEY");
|
||||
String timestamp = request.getHeader("X-TIMESTAMP");
|
||||
String signature = request.getHeader("X-SIGNATURE");
|
||||
|
||||
// 验证API Key
|
||||
if (!apiKeyService.validateApiKey(apiKey)) {
|
||||
writeErrorResponse(response, "Invalid API Key");
|
||||
return;
|
||||
}
|
||||
|
||||
// 验证时间戳(防重放攻击)
|
||||
if (!validateTimestamp(timestamp)) {
|
||||
writeErrorResponse(response, "Request expired");
|
||||
return;
|
||||
}
|
||||
|
||||
// 验证签名
|
||||
if (!validateSignature(request, signature)) {
|
||||
writeErrorResponse(response, "Invalid signature");
|
||||
return;
|
||||
}
|
||||
|
||||
filterChain.doFilter(request, response);
|
||||
}
|
||||
}
|
||||
```
|
||||
- 验证API Key有效性
|
||||
- 验证请求时间戳(防重放攻击)
|
||||
- 验证请求签名完整性
|
||||
- 记录访问日志
|
||||
|
||||
#### 数据加密
|
||||
|
||||
**敏感数据加密**:
|
||||
```java
|
||||
@Component
|
||||
public class DataEncryptionService {
|
||||
|
||||
private final AESUtil aesUtil;
|
||||
|
||||
public String encryptPersonalInfo(String plainText) {
|
||||
if (StrUtil.isBlank(plainText)) {
|
||||
return plainText;
|
||||
}
|
||||
return aesUtil.encrypt(plainText);
|
||||
}
|
||||
|
||||
public String decryptPersonalInfo(String cipherText) {
|
||||
if (StrUtil.isBlank(cipherText)) {
|
||||
return cipherText;
|
||||
}
|
||||
return aesUtil.decrypt(cipherText);
|
||||
}
|
||||
}
|
||||
```
|
||||
- 个人信息字段AES加密存储
|
||||
- 数据传输HTTPS加密
|
||||
- 数据库连接SSL加密
|
||||
- 密钥定期轮换机制
|
||||
|
||||
#### 访问控制
|
||||
|
||||
**IP白名单控制**:
|
||||
```java
|
||||
@Component
|
||||
public class IpWhitelistFilter extends OncePerRequestFilter {
|
||||
|
||||
@Value("${water.security.ip-whitelist}")
|
||||
private List<String> ipWhitelist;
|
||||
|
||||
@Override
|
||||
protected void doFilterInternal(HttpServletRequest request,
|
||||
HttpServletResponse response,
|
||||
FilterChain filterChain) throws ServletException, IOException {
|
||||
String clientIp = getClientIpAddress(request);
|
||||
|
||||
if (!isIpAllowed(clientIp)) {
|
||||
response.setStatus(HttpStatus.FORBIDDEN.value());
|
||||
response.getWriter().write("{\"code\":403,\"msg\":\"IP access denied\"}");
|
||||
return;
|
||||
}
|
||||
|
||||
filterChain.doFilter(request, response);
|
||||
}
|
||||
}
|
||||
```
|
||||
- 外部接口限制IP访问
|
||||
- 内部接口网络隔离
|
||||
- 访问日志记录和监控
|
||||
- 异常访问自动阻断
|
||||
|
||||
#### 接口限流
|
||||
|
||||
**基于Redis的令牌桶限流**:
|
||||
```java
|
||||
@Component
|
||||
public class RateLimitService {
|
||||
|
||||
@Resource
|
||||
private StringRedisTemplate redisTemplate;
|
||||
|
||||
public boolean allowRequest(String key, int maxRequests, Duration window) {
|
||||
String redisKey = "rate_limit:" + key;
|
||||
String script = """
|
||||
local key = KEYS[1]
|
||||
local window = tonumber(ARGV[1])
|
||||
local limit = tonumber(ARGV[2])
|
||||
local current = redis.call('get', key)
|
||||
if current == false then
|
||||
redis.call('setex', key, window, 1)
|
||||
return 1
|
||||
end
|
||||
if tonumber(current) < limit then
|
||||
return redis.call('incr', key)
|
||||
else
|
||||
return 0
|
||||
end
|
||||
""";
|
||||
|
||||
DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>(script, Long.class);
|
||||
Long result = redisTemplate.execute(redisScript,
|
||||
Collections.singletonList(redisKey),
|
||||
String.valueOf(window.getSeconds()),
|
||||
String.valueOf(maxRequests));
|
||||
|
||||
return result != null && result > 0;
|
||||
}
|
||||
}
|
||||
```
|
||||
- 按接口设置不同限流规则
|
||||
- 支持按用户/IP限流
|
||||
- 实时监控接口调用频率
|
||||
- 超限自动熔断保护
|
||||
|
||||
### 错误处理机制
|
||||
|
||||
#### 统一异常处理
|
||||
|
||||
```java
|
||||
@RestControllerAdvice
|
||||
public class GlobalExceptionHandler {
|
||||
|
||||
@ExceptionHandler(ServiceException.class)
|
||||
public CommonResult<?> serviceExceptionHandler(ServiceException ex) {
|
||||
log.info("[serviceExceptionHandler]", ex);
|
||||
return CommonResult.error(ex.getCode(), ex.getMessage());
|
||||
}
|
||||
|
||||
@ExceptionHandler(ConstraintViolationException.class)
|
||||
public CommonResult<?> constraintViolationExceptionHandler(ConstraintViolationException ex) {
|
||||
log.info("[constraintViolationExceptionHandler]", ex);
|
||||
return CommonResult.error(BAD_REQUEST.getCode(), "请求参数不正确:" + ex.getMessage());
|
||||
}
|
||||
|
||||
@ExceptionHandler(MethodArgumentNotValidException.class)
|
||||
public CommonResult<?> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException ex) {
|
||||
log.info("[methodArgumentNotValidExceptionHandler]", ex);
|
||||
FieldError fieldError = ex.getBindingResult().getFieldError();
|
||||
assert fieldError != null;
|
||||
return CommonResult.error(BAD_REQUEST.getCode(), "请求参数不正确:" + fieldError.getDefaultMessage());
|
||||
}
|
||||
}
|
||||
```
|
||||
系统采用统一的异常处理机制,包括:
|
||||
- 业务异常统一处理
|
||||
- 参数校验异常处理
|
||||
- 系统异常统一处理
|
||||
- 异常日志记录和监控
|
||||
|
||||
#### 错误码定义
|
||||
|
||||
```java
|
||||
public interface ErrorCodeConstants {
|
||||
|
||||
// ========== 通用错误码 1-000-000-000 ==========
|
||||
ErrorCode SUCCESS = new ErrorCode(0, "成功");
|
||||
ErrorCode BAD_REQUEST = new ErrorCode(400, "请求参数不正确");
|
||||
ErrorCode UNAUTHORIZED = new ErrorCode(401, "账号未登录");
|
||||
ErrorCode FORBIDDEN = new ErrorCode(403, "没有该操作权限");
|
||||
ErrorCode NOT_FOUND = new ErrorCode(404, "请求未找到");
|
||||
ErrorCode METHOD_NOT_ALLOWED = new ErrorCode(405, "请求方法不正确");
|
||||
ErrorCode INTERNAL_SERVER_ERROR = new ErrorCode(500, "系统异常");
|
||||
|
||||
// ========== 客户管理错误码 1-001-000-000 ==========
|
||||
ErrorCode CUSTOMER_NOT_EXISTS = new ErrorCode(1_001_000_001, "客户不存在");
|
||||
ErrorCode CUSTOMER_CODE_DUPLICATE = new ErrorCode(1_001_000_002, "客户编号已存在");
|
||||
ErrorCode CUSTOMER_STATUS_INVALID = new ErrorCode(1_001_000_003, "客户状态不正确");
|
||||
|
||||
// ========== 水表管理错误码 1-002-000-000 ==========
|
||||
ErrorCode METER_NOT_EXISTS = new ErrorCode(1_002_000_001, "水表不存在");
|
||||
ErrorCode METER_CODE_DUPLICATE = new ErrorCode(1_002_000_002, "水表编号已存在");
|
||||
ErrorCode METER_READING_INVALID = new ErrorCode(1_002_000_003, "水表读数不正确");
|
||||
|
||||
// ========== 账单管理错误码 1-003-000-000 ==========
|
||||
ErrorCode BILL_NOT_EXISTS = new ErrorCode(1_003_000_001, "账单不存在");
|
||||
ErrorCode BILL_ALREADY_PAID = new ErrorCode(1_003_000_002, "账单已缴费");
|
||||
ErrorCode BILL_AMOUNT_INVALID = new ErrorCode(1_003_000_003, "账单金额不正确");
|
||||
|
||||
// ========== 缴费管理错误码 1-004-000-000 ==========
|
||||
ErrorCode PAYMENT_FAILED = new ErrorCode(1_004_000_001, "缴费失败");
|
||||
ErrorCode PAYMENT_AMOUNT_INSUFFICIENT = new ErrorCode(1_004_000_002, "缴费金额不足");
|
||||
ErrorCode PAYMENT_CHANNEL_UNAVAILABLE = new ErrorCode(1_004_000_003, "缴费渠道不可用");
|
||||
}
|
||||
```markdown
|
||||
# 错误码规范
|
||||
|
||||
## 通用错误码 (1-000-000-000)
|
||||
- 0: 成功
|
||||
- 400: 请求参数不正确
|
||||
- 401: 账号未登录
|
||||
- 403: 没有该操作权限
|
||||
- 404: 请求未找到
|
||||
- 405: 请求方法不正确
|
||||
- 500: 系统异常
|
||||
|
||||
## 客户管理错误码 (1-001-000-000)
|
||||
- 1_001_000_001: 客户不存在
|
||||
- 1_001_000_002: 客户编号已存在
|
||||
- 1_001_000_003: 客户状态不正确
|
||||
|
||||
## 水表管理错误码 (1-002-000-000)
|
||||
- 1_002_000_001: 水表不存在
|
||||
- 1_002_000_002: 水表编号已存在
|
||||
- 1_002_000_003: 水表读数不正确
|
||||
|
||||
## 账单管理错误码 (1-003-000-000)
|
||||
- 1_003_000_001: 账单不存在
|
||||
- 1_003_000_002: 账单已缴费
|
||||
- 1_003_000_003: 账单金额不正确
|
||||
|
||||
## 缴费管理错误码 (1-004-000-000)
|
||||
- 1_004_000_001: 缴费失败
|
||||
- 1_004_000_002: 缴费金额不足
|
||||
- 1_004_000_003: 缴费渠道不可用
|
||||
```
|
||||
|
||||
#### 接口调用示例
|
||||
@ -1043,142 +820,20 @@ public interface ErrorCodeConstants {
|
||||
}
|
||||
```
|
||||
|
||||
### 前端接口调用示例
|
||||
### 前端接口调用规范
|
||||
|
||||
#### Vue3 + TypeScript接口封装
|
||||
#### 接口封装标准
|
||||
|
||||
```typescript
|
||||
// api/water/customer.ts
|
||||
import { request } from '@/utils/request'
|
||||
前端接口调用需要遵循以下规范:
|
||||
- 统一的请求配置和响应处理
|
||||
- 统一的错误处理和提示机制
|
||||
- 统一的Loading状态管理
|
||||
- 统一的数据类型定义
|
||||
|
||||
export interface CustomerVO {
|
||||
id: number
|
||||
customerCode: string
|
||||
customerName: string
|
||||
customerType: string
|
||||
phone: string
|
||||
address: string
|
||||
status: number
|
||||
createTime: string
|
||||
}
|
||||
#### 组件使用规范
|
||||
|
||||
export interface CustomerPageReqVO extends PageParam {
|
||||
customerName?: string
|
||||
customerCode?: string
|
||||
customerType?: string
|
||||
phone?: string
|
||||
}
|
||||
|
||||
export const CustomerApi = {
|
||||
// 获取客户分页
|
||||
getCustomerPage: (params: CustomerPageReqVO) => {
|
||||
return request.get<PageResult<CustomerVO>>({ url: '/water/customer/page', params })
|
||||
},
|
||||
|
||||
// 获取客户详情
|
||||
getCustomer: (id: number) => {
|
||||
return request.get<CustomerVO>({ url: `/water/customer/${id}` })
|
||||
},
|
||||
|
||||
// 创建客户
|
||||
createCustomer: (data: CustomerSaveReqVO) => {
|
||||
return request.post<number>({ url: '/water/customer/create', data })
|
||||
},
|
||||
|
||||
// 更新客户
|
||||
updateCustomer: (data: CustomerSaveReqVO) => {
|
||||
return request.put<void>({ url: '/water/customer/update', data })
|
||||
},
|
||||
|
||||
// 删除客户
|
||||
deleteCustomer: (id: number) => {
|
||||
return request.delete<void>({ url: `/water/customer/delete?id=${id}` })
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### Vue组件使用示例
|
||||
|
||||
```vue
|
||||
<script setup lang="ts">
|
||||
import { ref, onMounted } from 'vue'
|
||||
import { CustomerApi, CustomerVO } from '@/api/water/customer'
|
||||
import { formatDate } from '@/utils/formatTime'
|
||||
|
||||
const customerList = ref<CustomerVO[]>([])
|
||||
const loading = ref(true)
|
||||
const total = ref(0)
|
||||
const queryParams = ref({
|
||||
pageNo: 1,
|
||||
pageSize: 10,
|
||||
customerName: '',
|
||||
customerCode: ''
|
||||
})
|
||||
|
||||
const getCustomerList = async () => {
|
||||
loading.value = true
|
||||
try {
|
||||
const data = await CustomerApi.getCustomerPage(queryParams.value)
|
||||
customerList.value = data.list
|
||||
total.value = data.total
|
||||
} catch (error) {
|
||||
console.error('获取客户列表失败:', error)
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
const handleQuery = () => {
|
||||
queryParams.value.pageNo = 1
|
||||
getCustomerList()
|
||||
}
|
||||
|
||||
const handleReset = () => {
|
||||
queryParams.value = {
|
||||
pageNo: 1,
|
||||
pageSize: 10,
|
||||
customerName: '',
|
||||
customerCode: ''
|
||||
}
|
||||
getCustomerList()
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
getCustomerList()
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<!-- 查询表单 -->
|
||||
<el-form :model="queryParams" ref="queryFormRef" inline>
|
||||
<el-form-item label="客户名称" prop="customerName">
|
||||
<el-input v-model="queryParams.customerName" placeholder="请输入客户名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="客户编号" prop="customerCode">
|
||||
<el-input v-model="queryParams.customerCode" placeholder="请输入客户编号" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="handleQuery">搜索</el-button>
|
||||
<el-button @click="handleReset">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<!-- 数据表格 -->
|
||||
<el-table v-loading="loading" :data="customerList">
|
||||
<el-table-column label="客户编号" prop="customerCode" />
|
||||
<el-table-column label="客户名称" prop="customerName" />
|
||||
<el-table-column label="联系电话" prop="phone" />
|
||||
<el-table-column label="创建时间" prop="createTime" :formatter="formatDate" />
|
||||
</el-table>
|
||||
|
||||
<!-- 分页组件 -->
|
||||
<Pagination
|
||||
:total="total"
|
||||
v-model:page="queryParams.pageNo"
|
||||
v-model:limit="queryParams.pageSize"
|
||||
@pagination="getCustomerList"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
```
|
||||
前端组件使用接口时需要:
|
||||
- 合理的数据加载状态展示
|
||||
- 完善的错误处理和用户提示
|
||||
- 适当的数据缓存和优化
|
||||
- 规范的分页和查询实现
|
||||
@ -639,39 +639,39 @@ flowchart TD
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([账务处理请求]) --> CheckAuth[权限验证]
|
||||
CheckAuth --> AuthOK{权限验证}
|
||||
AuthOK -->|失败| AuthError[权限错误]
|
||||
AuthOK -->|成功| ProcessType{处理类型}
|
||||
Start(["账务处理请求"]) --> CheckAuth["权限验证"]
|
||||
CheckAuth --> AuthOK{"权限验证"}
|
||||
AuthOK -->|失败| AuthError["权限错误"]
|
||||
AuthOK -->|成功| ProcessType{"处理类型"}
|
||||
|
||||
ProcessType -->|调账| AdjustAccount[账务调整]
|
||||
ProcessType -->|退款| RefundProcess[退款处理]
|
||||
ProcessType -->|销账| WriteOff[销账处理]
|
||||
ProcessType -->|预存调整| PrepaidAdjust[预存调整]
|
||||
ProcessType -->|调账| AdjustAccount["账务调整"]
|
||||
ProcessType -->|退款| RefundProcess["退款处理"]
|
||||
ProcessType -->|销账| WriteOff["销账处理"]
|
||||
ProcessType -->|预存调整| PrepaidAdjust["预存调整"]
|
||||
|
||||
AdjustAccount --> ValidateAdjust[验证调整数据]
|
||||
RefundProcess --> ValidateRefund[验证退款数据]
|
||||
WriteOff --> ValidateWriteOff[验证销账数据]
|
||||
PrepaidAdjust --> ValidatePrepaid[验证预存数据]
|
||||
AdjustAccount --> ValidateAdjust["验证调整数据"]
|
||||
RefundProcess --> ValidateRefund["验证退款数据"]
|
||||
WriteOff --> ValidateWriteOff["验证销账数据"]
|
||||
PrepaidAdjust --> ValidatePrepaid["验证预存数据"]
|
||||
|
||||
ValidateAdjust --> AdjustApproval[调账审批]
|
||||
ValidateRefund --> RefundApproval[退款审批]
|
||||
ValidateWriteOff --> WriteOffApproval[销账审批]
|
||||
ValidatePrepaid --> PrepaidApproval[预存审批]
|
||||
ValidateAdjust --> AdjustApproval["调账审批"]
|
||||
ValidateRefund --> RefundApproval["退款审批"]
|
||||
ValidateWriteOff --> WriteOffApproval["销账审批"]
|
||||
ValidatePrepaid --> PrepaidApproval["预存审批"]
|
||||
|
||||
AdjustApproval --> ApprovalResult{审批结果}
|
||||
AdjustApproval --> ApprovalResult{"审批结果"}
|
||||
RefundApproval --> ApprovalResult
|
||||
WriteOffApproval --> ApprovalResult
|
||||
PrepaidApproval --> ApprovalResult
|
||||
|
||||
ApprovalResult -->|拒绝| ApprovalReject[审批拒绝]
|
||||
ApprovalResult -->|通过| ExecuteProcess[执行处理]
|
||||
ApprovalResult -->|拒绝| ApprovalReject["审批拒绝"]
|
||||
ApprovalResult -->|通过| ExecuteProcess["执行处理"]
|
||||
|
||||
ExecuteProcess --> UpdateAccount[更新账户]
|
||||
UpdateAccount --> RecordLog[记录日志]
|
||||
RecordLog --> Complete([处理完成])
|
||||
ExecuteProcess --> UpdateAccount["更新账户"]
|
||||
UpdateAccount --> RecordLog["记录日志"]
|
||||
RecordLog --> Complete(["处理完成"])
|
||||
|
||||
AuthError --> End([结束])
|
||||
AuthError --> End(["结束"])
|
||||
ApprovalReject --> End
|
||||
```
|
||||
|
||||
|
||||
@ -11,23 +11,23 @@
|
||||
| **文档状态** | ✅ 已完成 |
|
||||
|
||||
## 目录
|
||||
- [一、引言](#一引言)
|
||||
- [1.1 编写目的](#11-编写目的)
|
||||
- [1.2 背景](#12-背景)
|
||||
- [1.3 定义](#13-定义)
|
||||
- [1.4 参考资料](#14-参考资料)
|
||||
- [引言](#引言)
|
||||
- [编写目的](#编写目的)
|
||||
- [背景](#背景)
|
||||
- [定义](#定义)
|
||||
- [参考资料](#参考资料)
|
||||
|
||||
---
|
||||
|
||||
# 引言
|
||||
|
||||
## 编写目的
|
||||
## 编写目的
|
||||
|
||||
### 文档目标
|
||||
### 文档目标
|
||||
|
||||
本文档是福建水务营收系统的概要设计文档,旨在为系统的详细设计、开发实施、测试验证、运维管理等后续工作提供重要的技术依据和指导方案。
|
||||
|
||||
### 编写目的
|
||||
### 编写目的
|
||||
|
||||
- **指导系统开发**:为开发团队提供清晰、完整、可执行的技术架构方案和实施蓝图
|
||||
- **规范设计标准**:建立统一的技术标准和开发规范,确保系统架构的一致性和可维护性
|
||||
@ -35,7 +35,7 @@
|
||||
- **支撑项目管理**:为项目管理、进度控制、质量管控提供技术基础和评估依据
|
||||
- **保障系统质量**:通过详细的设计说明确保系统的可靠性、安全性、可扩展性和高性能
|
||||
|
||||
### 目标读者
|
||||
### 目标读者
|
||||
|
||||
本文档的主要读者包括:
|
||||
|
||||
@ -49,7 +49,7 @@
|
||||
| **业务分析师** | 业务功能、流程设计、用户体验 | 需求验证、业务流程梳理 |
|
||||
| **甲方技术团队** | 整体技术方案、质量标准、交付成果 | 技术评审、验收标准制定 |
|
||||
|
||||
### 预期用途
|
||||
### 预期用途
|
||||
|
||||
- **开发阶段**:作为系统详细设计和编码实现的技术指导文档
|
||||
- **测试阶段**:作为系统测试、集成测试、性能测试的参考标准
|
||||
@ -57,9 +57,9 @@
|
||||
- **维护阶段**:作为系统维护、功能扩展、技术升级的参考依据
|
||||
- **培训阶段**:作为技术培训、知识传递的重要教材
|
||||
|
||||
## 背景
|
||||
## 背景
|
||||
|
||||
### 项目背景
|
||||
### 项目背景
|
||||
|
||||
随着福建省水务行业数字化转型的深入推进和"数字福建"战略的全面实施,传统的水务营收管理系统已无法满足现代化管理的需要。为了提升水务企业的服务效率、管理水平和客户体验,迫切需要构建一套现代化、智能化、集成化的水务营收系统。
|
||||
|
||||
@ -76,7 +76,7 @@
|
||||
- **云原生部署**:支持容器化部署和云原生架构
|
||||
- **安全合规**:满足等保三级安全要求和行业安全规范
|
||||
|
||||
### 系统现状
|
||||
### 系统现状
|
||||
|
||||
#### 现有系统问题
|
||||
- **技术架构陈旧**:基于传统单体架构,扩展性和维护性较差
|
||||
@ -91,7 +91,7 @@
|
||||
- **收费方式单一**:主要依赖现金收费,线上支付渠道不完善
|
||||
- **数据分析能力弱**:缺乏有效的数据分析和决策支持工具
|
||||
|
||||
### 相关系统
|
||||
### 相关系统
|
||||
|
||||
本系统需要与多个相关系统进行数据交换和业务协同:
|
||||
|
||||
@ -114,7 +114,7 @@
|
||||
- **价格监管系统**:水价政策执行情况报送
|
||||
- **环保监测系统**:污水处理和环保数据上报
|
||||
|
||||
### 建设环境
|
||||
### 建设环境
|
||||
|
||||
#### 技术环境
|
||||
- **开发框架**:基于RuoYi-Vue-Pro开源框架进行定制开发
|
||||
@ -129,9 +129,9 @@
|
||||
- **机房环境**:符合国家A级机房标准,具备完善的电力、空调、监控设施
|
||||
- **灾备环境**:建设异地灾备中心,实现数据同步和业务连续性
|
||||
|
||||
## 定义
|
||||
## 定义
|
||||
|
||||
### 专业术语
|
||||
### 专业术语
|
||||
|
||||
| 术语 | 英文全称 | 中文定义 | 备注 |
|
||||
|------|---------|----------|------|
|
||||
@ -148,7 +148,7 @@
|
||||
| **工单** | Work Order | 记录和跟踪业务处理过程的管理单据 | 流程管理工具 |
|
||||
| **多租户** | Multi-tenancy | 支持多个独立客户共享同一应用实例的架构模式 | 技术架构模式 |
|
||||
|
||||
### 技术术语
|
||||
### 技术术语
|
||||
|
||||
| 术语 | 英文全称 | 中文定义 | 备注 |
|
||||
|------|---------|----------|------|
|
||||
@ -163,7 +163,7 @@
|
||||
| **JWT** | JSON Web Token | 基于JSON的安全令牌标准 | 认证技术 |
|
||||
| **RESTful** | Representational State Transfer | 基于HTTP的Web服务架构风格 | 接口设计规范 |
|
||||
|
||||
### 缩略语
|
||||
### 缩略语
|
||||
|
||||
| 缩略语 | 英文全称 | 中文含义 | 使用场景 |
|
||||
|--------|----------|----------|----------|
|
||||
@ -183,7 +183,7 @@
|
||||
| **GPS** | Global Positioning System | 全球定位系统 | 定位技术 |
|
||||
| **GIS** | Geographic Information System | 地理信息系统 | 地理信息技术 |
|
||||
|
||||
### 业务术语规范
|
||||
### 业务术语规范
|
||||
|
||||
#### 客户管理相关
|
||||
- **用户**:指系统的操作用户,如管理员、抄表员等
|
||||
@ -204,9 +204,9 @@
|
||||
- **厂商**:水表生产厂家
|
||||
- **型号**:水表的具体型号规格
|
||||
|
||||
## 参考资料
|
||||
## 参考资料
|
||||
|
||||
### 国家标准和行业规范
|
||||
### 国家标准和行业规范
|
||||
|
||||
| 标准编号 | 标准名称 | 版本 | 适用范围 |
|
||||
|---------|----------|------|----------|
|
||||
@ -216,7 +216,7 @@
|
||||
| **GB 50015-2019** | 建筑给水排水设计标准 | 2019版 | 给排水工程设计 |
|
||||
| **CJ/T 224-2019** | 城市供水水质标准 | 2019版 | 供水水质要求 |
|
||||
|
||||
### 信息安全标准
|
||||
### 信息安全标准
|
||||
|
||||
| 标准编号 | 标准名称 | 版本 | 适用范围 |
|
||||
|---------|----------|------|----------|
|
||||
@ -225,7 +225,7 @@
|
||||
| **GB/T 28448-2019** | 信息安全技术 网络安全等级保护测评要求 | 2019版 | 安全测评标准 |
|
||||
| **GM/T 0054-2018** | 信息系统密码应用基本要求 | 2018版 | 密码应用规范 |
|
||||
|
||||
### 软件工程标准
|
||||
### 软件工程标准
|
||||
|
||||
| 标准编号 | 标准名称 | 版本 | 适用范围 |
|
||||
|---------|----------|------|----------|
|
||||
@ -234,7 +234,7 @@
|
||||
| **GB/T 15532-2008** | 计算机软件测试规范 | 2008版 | 软件测试规范 |
|
||||
| **ISO/IEC 25010:2011** | Systems and software Quality Requirements and Evaluation (SQuaRE) | 2011版 | 软件质量国际标准 |
|
||||
|
||||
### 技术参考文档
|
||||
### 技术参考文档
|
||||
|
||||
#### 开发框架文档
|
||||
- **RuoYi-Vue-Pro官方文档** - [https://doc.iocoder.cn/](https://doc.iocoder.cn/)
|
||||
@ -252,7 +252,7 @@
|
||||
- **Kubernetes官方文档** - [https://kubernetes.io/docs/](https://kubernetes.io/docs/)
|
||||
- **Nginx官方文档** - [https://nginx.org/en/docs/](https://nginx.org/en/docs/)
|
||||
|
||||
### 业务参考资料
|
||||
### 业务参考资料
|
||||
|
||||
#### 水务行业资料
|
||||
- **《城市供水条例》** - 国务院令第158号
|
||||
@ -267,7 +267,7 @@
|
||||
- **《现有系统调研报告》** - v1.0
|
||||
- **《业务流程梳理报告》** - v2.1
|
||||
|
||||
### 技术选型参考
|
||||
### 技术选型参考
|
||||
|
||||
#### 架构设计参考
|
||||
- **《微服务架构设计模式》** - Chris Richardson著
|
||||
|
||||