diff --git a/project_progress.md b/project_progress.md index e51c82c..cd7dc77 100644 --- a/project_progress.md +++ b/project_progress.md @@ -18,7 +18,7 @@ | 文档名称 | 状态 | 完成度 | 质量评级 | 最后更新 | 备注 | |---------|------|--------|----------|----------|------| | `water_biz_system_architecture.md` | ✅ 已完成 | 100% | A级 | 2024-12-19 | 已全面适配OpenGauss,架构图完整 | -| `water_biz_module_design.md` | 🔄 修复中 | 95% | B+级 | 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 | 已补充容器化部署方案和自动化脚本 | @@ -111,6 +111,7 @@ | 2024-12-19 | 文档删除 | 删除3个非正式文档 | 甲方要求只要正式设计文档 | 低影响,减少维护工作量 | | 2024-12-19 | 项目规划 | 创建项目管理文件 | 规范项目管理流程 | 正面影响,提高项目管控能力 | | 2024-12-19 | 需求调整 | 移除代码示例相关要求 | 甲方明确不需要代码示例 | 正面影响,聚焦架构设计 | +| 2024-12-19 | 文档优化 | 优化模块设计文档,清理过于详细的代码示例 | 概要设计应保持适当抽象层次 | 正面影响,符合概要设计标准 | | 2024-12-19 | 项目完成 | 所有核心文档已完成并达到A级标准 | 按计划完成所有交付物 | 正面影响,项目成功交付 | ## 项目完成总结 diff --git a/water_biz_module_design.md b/water_biz_module_design.md index 17a1f94..f166730 100644 --- a/water_biz_module_design.md +++ b/water_biz_module_design.md @@ -8,7 +8,7 @@ | **技术框架** | RuoYi-Vue-Pro + yudao-ui-admin-vue3 | | **文档版本** | v1.0 | | **编写日期** | 2024-12-19 | -| **文档状态** | 🟡 进行中 | +| **文档状态** | ✅ 已完成 | ## 目录 - [福建水务营收系统模块功能设计文档](#福建水务营收系统模块功能设计文档) @@ -32,9 +32,13 @@ - [3.3.1 业务流程图](#331-业务流程图) - [3.3.2 主要功能](#332-主要功能) - [3.3.3 核心接口定义](#333-核心接口定义) - - [3.3.4 前端界面设计](#334-前端界面设计) - [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-业务工单) @@ -88,6 +92,9 @@ - [12.2 API管理](#122-api管理) - [12.3 接口权限管理](#123-接口权限管理) - [12.4 系统对外接口](#124-系统对外接口) + - [系统集成架构](#系统集成架构) + - [前后端集成架构](#前后端集成架构) + - [技术栈整合方案](#技术栈整合方案) ## 一、系统整体架构 @@ -515,11 +522,11 @@ public class MeterReadingController { } ``` -**核心业务逻辑**: -- 抄表数据校验:读数合理性检查、用量异常检测 -- 批量处理机制:支持批量抄表录入和结果反馈 -- 数据复核流程:多级审核机制确保数据质量 -- 账单生成:基于抄表数据自动计算费用并生成账单 +**接口设计要点**: +- 遵循RESTful设计规范,统一的请求响应格式 +- 支持批量操作提高处理效率 +- 完整的数据校验和异常处理机制 +- 集成RuoYi-Vue-Pro的权限控制和日志记录 #### 3.2.4 前端界面设计 @@ -688,183 +695,11 @@ public class PaymentController { } ``` -**缴费Service层**: -```java -@Service -@Validated -@Slf4j -public class PaymentServiceImpl implements PaymentService { - - @Resource - private PaymentMapper paymentMapper; - @Resource - private BillService billService; - @Resource - private CustomerAccountService accountService; - @Resource - private PaymentChannelService channelService; - - @Override - @Transactional(rollbackFor = Exception.class) - public PaymentRespVO createPayment(PaymentCreateReqVO createReqVO) { - // 1. 校验账单信息 - List bills = validateBills(createReqVO.getBillIds()); - - // 2. 计算缴费金额 - BigDecimal totalAmount = bills.stream() - .map(BillDO::getBalanceAmount) - .reduce(BigDecimal.ZERO, BigDecimal::add); - - if (totalAmount.compareTo(createReqVO.getPaymentAmount()) != 0) { - throw exception(PAYMENT_AMOUNT_MISMATCH); - } - - // 3. 创建缴费记录 - PaymentDO payment = BeanUtils.toBean(createReqVO, PaymentDO.class); - payment.setPaymentCode(generatePaymentCode()); - payment.setPaymentStatus(PAYMENT_STATUS_PENDING); - payment.setTotalAmount(totalAmount); - - paymentMapper.insert(payment); - - // 4. 创建缴费明细 - createPaymentDetails(payment.getId(), bills); - - return BeanUtils.toBean(payment, PaymentRespVO.class); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public PaymentRespVO processCashPayment(CashPaymentReqVO cashReqVO) { - // 1. 创建基础缴费记录 - PaymentCreateReqVO createReqVO = BeanUtils.toBean(cashReqVO, PaymentCreateReqVO.class); - createReqVO.setPaymentChannel("CASH"); - createReqVO.setPaymentType("NORMAL"); - - PaymentRespVO payment = createPayment(createReqVO); - - // 2. 处理现金缴费 - PaymentDO paymentDO = paymentMapper.selectById(payment.getId()); - paymentDO.setActualAmount(cashReqVO.getActualAmount()); - paymentDO.setChangeAmount(cashReqVO.getChangeAmount()); - paymentDO.setOperatorId(cashReqVO.getOperatorId()); - paymentDO.setOutletCode(cashReqVO.getOutletCode()); - paymentDO.setPaymentStatus(PAYMENT_STATUS_SUCCESS); - paymentDO.setPaymentTime(LocalDateTime.now()); - - paymentMapper.updateById(paymentDO); - - // 3. 更新账单状态 - updateBillStatus(cashReqVO.getBillIds(), payment.getId()); - - // 4. 更新客户账户 - updateCustomerAccount(cashReqVO.getCustomerId(), cashReqVO.getPaymentAmount()); - - // 5. 生成收据号 - paymentDO.setInvoiceNo(generateInvoiceNo()); - paymentMapper.updateById(paymentDO); - - // 6. 记录操作日志 - logPaymentOperation(payment.getId(), "现金缴费", cashReqVO.toString()); - - return BeanUtils.toBean(paymentDO, PaymentRespVO.class); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public OnlinePaymentRespVO processOnlinePayment(OnlinePaymentReqVO onlineReqVO) { - // 1. 创建基础缴费记录 - PaymentCreateReqVO createReqVO = BeanUtils.toBean(onlineReqVO, PaymentCreateReqVO.class); - createReqVO.setPaymentType("NORMAL"); - - PaymentRespVO payment = createPayment(createReqVO); - - // 2. 调用第三方支付接口 - ThirdPartyPaymentReqDTO thirdPartyReq = ThirdPartyPaymentReqDTO.builder() - .paymentCode(payment.getPaymentCode()) - .paymentChannel(onlineReqVO.getPaymentChannel()) - .totalAmount(onlineReqVO.getPaymentAmount()) - .subject("水费缴费") - .body("账单缴费-客户:" + onlineReqVO.getCustomerId()) - .notifyUrl(onlineReqVO.getNotifyUrl()) - .returnUrl(onlineReqVO.getReturnUrl()) - .build(); - - ThirdPartyPaymentRespDTO thirdPartyResp = channelService.createPayment(thirdPartyReq); - - // 3. 更新缴费记录 - PaymentDO paymentDO = paymentMapper.selectById(payment.getId()); - paymentDO.setThirdPartyNo(thirdPartyResp.getOutTradeNo()); - paymentDO.setPaymentStatus(PAYMENT_STATUS_PROCESSING); - paymentMapper.updateById(paymentDO); - - // 4. 构建返回结果 - return OnlinePaymentRespVO.builder() - .paymentId(payment.getId()) - .paymentCode(payment.getPaymentCode()) - .prepayId(thirdPartyResp.getPrepayId()) - .payUrl(thirdPartyResp.getPayUrl()) - .qrCode(thirdPartyResp.getQrCode()) - .build(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public PaymentRespVO processPrepaidPayment(PrepaidPaymentReqVO prepaidReqVO) { - // 1. 检查预存余额 - CustomerAccountDO account = accountService.getByCustomerId(prepaidReqVO.getCustomerId()); - if (account.getBalance().compareTo(prepaidReqVO.getPaymentAmount()) < 0) { - throw exception(ACCOUNT_BALANCE_INSUFFICIENT); - } - - // 2. 创建基础缴费记录 - PaymentCreateReqVO createReqVO = BeanUtils.toBean(prepaidReqVO, PaymentCreateReqVO.class); - createReqVO.setPaymentChannel("PREPAID"); - createReqVO.setPaymentType("NORMAL"); - - PaymentRespVO payment = createPayment(createReqVO); - - // 3. 扣除预存余额 - accountService.deductBalance(prepaidReqVO.getCustomerId(), prepaidReqVO.getPaymentAmount(), - "水费缴费", payment.getPaymentCode()); - - // 4. 更新缴费状态 - PaymentDO paymentDO = paymentMapper.selectById(payment.getId()); - paymentDO.setPaymentStatus(PAYMENT_STATUS_SUCCESS); - paymentDO.setPaymentTime(LocalDateTime.now()); - paymentMapper.updateById(paymentDO); - - // 5. 更新账单状态 - updateBillStatus(prepaidReqVO.getBillIds(), payment.getId()); - - return BeanUtils.toBean(paymentDO, PaymentRespVO.class); - } - - private void updateBillStatus(List billIds, Long paymentId) { - for (Long billId : billIds) { - BillDO bill = billService.getBill(billId); - bill.setBillStatus(BILL_STATUS_PAID); - bill.setPaidAmount(bill.getTotalAmount()); - bill.setBalanceAmount(BigDecimal.ZERO); - bill.setPaymentId(paymentId); - billService.updateBill(bill); - } - } - - private void updateCustomerAccount(Long customerId, BigDecimal paymentAmount) { - CustomerAccountDO account = accountService.getByCustomerId(customerId); - account.setLastPaymentDate(LocalDate.now()); - account.setLastPaymentAmount(paymentAmount); - - // 如果有欠费,减少欠费金额 - if (account.getArrearsAmount().compareTo(BigDecimal.ZERO) > 0) { - BigDecimal newArrears = account.getArrearsAmount().subtract(paymentAmount); - account.setArrearsAmount(newArrears.max(BigDecimal.ZERO)); - } - - accountService.updateAccount(account); - } -} +**接口设计特点**: +- 支持多种缴费方式:现金、银行卡、在线支付、预存款 +- 事务控制:确保缴费操作的原子性和一致性 +- 异步处理:第三方支付采用异步回调机制 +- 安全验证:完整的权限控制和数据校验 ``` #### 3.3.4 前端界面设计 @@ -912,204 +747,148 @@ public class PaymentServiceImpl implements PaymentService { ``` -**缴费Service层**: +### 3.4 账务处理 + +账务处理模块负责处理各类特殊账务情况,确保账务数据的准确性和完整性。 + +#### 3.4.1 业务流程图 + +```mermaid +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 +``` + +#### 3.4.2 主要功能 + +**未销调整**:处理各类账务调整需求 +- 水量调整:调整用水量和相关费用 +- 金额调整:直接调整账单金额 +- 违约金减免:减免或取消违约金 +- 费用追加:补收相关费用 + +**特殊开账**:处理特殊情况的账单生成 +- 补抄开账:补录抄表数据并生成账单 +- 估抄开账:估算用水量生成账单 +- 平均开账:基于历史用量平均开账 + +**账务退款**:处理各类退款业务 +- 多缴退款:退还多缴的水费 +- 预付款退款:退还预存余额 +- 错误缴费退款:退还错误缴费 + +#### 3.4.3 核心接口定义 + ```java -@Service +@RestController +@RequestMapping("/admin-api/water/account") +@Tag(name = "管理后台 - 账务处理") @Validated -@Slf4j -public class PaymentServiceImpl implements PaymentService { +public class AccountProcessController { - @Resource - private PaymentMapper paymentMapper; - @Resource - private BillService billService; - @Resource - private CustomerAccountService accountService; - @Resource - private PaymentChannelService channelService; + @PostMapping("/adjust") + @Operation(summary = "账务调整") + @PreAuthorize("@ss.hasPermission('water:account:adjust')") + public CommonResult adjustAccount(@Valid @RequestBody AccountAdjustReqVO adjustReqVO); - @Override - @Transactional(rollbackFor = Exception.class) - public PaymentRespVO createPayment(PaymentCreateReqVO createReqVO) { - // 1. 校验账单信息 - List bills = validateBills(createReqVO.getBillIds()); - - // 2. 计算缴费金额 - BigDecimal totalAmount = bills.stream() - .map(BillDO::getBalanceAmount) - .reduce(BigDecimal.ZERO, BigDecimal::add); - - if (totalAmount.compareTo(createReqVO.getPaymentAmount()) != 0) { - throw exception(PAYMENT_AMOUNT_MISMATCH); - } - - // 3. 创建缴费记录 - PaymentDO payment = BeanUtils.toBean(createReqVO, PaymentDO.class); - payment.setPaymentCode(generatePaymentCode()); - payment.setPaymentStatus(PAYMENT_STATUS_PENDING); - payment.setTotalAmount(totalAmount); - - paymentMapper.insert(payment); - - // 4. 创建缴费明细 - createPaymentDetails(payment.getId(), bills); - - return BeanUtils.toBean(payment, PaymentRespVO.class); - } + @PostMapping("/refund") + @Operation(summary = "退款处理") + @PreAuthorize("@ss.hasPermission('water:account:refund')") + public CommonResult processRefund(@Valid @RequestBody RefundProcessReqVO refundReqVO); - @Override - @Transactional(rollbackFor = Exception.class) - public PaymentRespVO processCashPayment(CashPaymentReqVO cashReqVO) { - // 1. 创建基础缴费记录 - PaymentCreateReqVO createReqVO = BeanUtils.toBean(cashReqVO, PaymentCreateReqVO.class); - createReqVO.setPaymentChannel("CASH"); - createReqVO.setPaymentType("NORMAL"); - - PaymentRespVO payment = createPayment(createReqVO); - - // 2. 处理现金缴费 - PaymentDO paymentDO = paymentMapper.selectById(payment.getId()); - paymentDO.setActualAmount(cashReqVO.getActualAmount()); - paymentDO.setChangeAmount(cashReqVO.getChangeAmount()); - paymentDO.setOperatorId(cashReqVO.getOperatorId()); - paymentDO.setOutletCode(cashReqVO.getOutletCode()); - paymentDO.setPaymentStatus(PAYMENT_STATUS_SUCCESS); - paymentDO.setPaymentTime(LocalDateTime.now()); - - paymentMapper.updateById(paymentDO); - - // 3. 更新账单状态 - updateBillStatus(cashReqVO.getBillIds(), payment.getId()); - - // 4. 更新客户账户 - updateCustomerAccount(cashReqVO.getCustomerId(), cashReqVO.getPaymentAmount()); - - // 5. 生成收据号 - paymentDO.setInvoiceNo(generateInvoiceNo()); - paymentMapper.updateById(paymentDO); - - // 6. 记录操作日志 - logPaymentOperation(payment.getId(), "现金缴费", cashReqVO.toString()); - - return BeanUtils.toBean(paymentDO, PaymentRespVO.class); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public OnlinePaymentRespVO processOnlinePayment(OnlinePaymentReqVO onlineReqVO) { - // 1. 创建基础缴费记录 - PaymentCreateReqVO createReqVO = BeanUtils.toBean(onlineReqVO, PaymentCreateReqVO.class); - createReqVO.setPaymentType("NORMAL"); - - PaymentRespVO payment = createPayment(createReqVO); - - // 2. 调用第三方支付接口 - ThirdPartyPaymentReqDTO thirdPartyReq = ThirdPartyPaymentReqDTO.builder() - .paymentCode(payment.getPaymentCode()) - .paymentChannel(onlineReqVO.getPaymentChannel()) - .totalAmount(onlineReqVO.getPaymentAmount()) - .subject("水费缴费") - .body("账单缴费-客户:" + onlineReqVO.getCustomerId()) - .notifyUrl(onlineReqVO.getNotifyUrl()) - .returnUrl(onlineReqVO.getReturnUrl()) - .build(); - - ThirdPartyPaymentRespDTO thirdPartyResp = channelService.createPayment(thirdPartyReq); - - // 3. 更新缴费记录 - PaymentDO paymentDO = paymentMapper.selectById(payment.getId()); - paymentDO.setThirdPartyNo(thirdPartyResp.getOutTradeNo()); - paymentDO.setPaymentStatus(PAYMENT_STATUS_PROCESSING); - paymentMapper.updateById(paymentDO); - - // 4. 构建返回结果 - return OnlinePaymentRespVO.builder() - .paymentId(payment.getId()) - .paymentCode(payment.getPaymentCode()) - .prepayId(thirdPartyResp.getPrepayId()) - .payUrl(thirdPartyResp.getPayUrl()) - .qrCode(thirdPartyResp.getQrCode()) - .build(); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public PaymentRespVO processPrepaidPayment(PrepaidPaymentReqVO prepaidReqVO) { - // 1. 检查预存余额 - CustomerAccountDO account = accountService.getByCustomerId(prepaidReqVO.getCustomerId()); - if (account.getBalance().compareTo(prepaidReqVO.getPaymentAmount()) < 0) { - throw exception(ACCOUNT_BALANCE_INSUFFICIENT); - } - - // 2. 创建基础缴费记录 - PaymentCreateReqVO createReqVO = BeanUtils.toBean(prepaidReqVO, PaymentCreateReqVO.class); - createReqVO.setPaymentChannel("PREPAID"); - createReqVO.setPaymentType("NORMAL"); - - PaymentRespVO payment = createPayment(createReqVO); - - // 3. 扣除预存余额 - accountService.deductBalance(prepaidReqVO.getCustomerId(), prepaidReqVO.getPaymentAmount(), - "水费缴费", payment.getPaymentCode()); - - // 4. 更新缴费状态 - PaymentDO paymentDO = paymentMapper.selectById(payment.getId()); - paymentDO.setPaymentStatus(PAYMENT_STATUS_SUCCESS); - paymentDO.setPaymentTime(LocalDateTime.now()); - paymentMapper.updateById(paymentDO); - - // 5. 更新账单状态 - updateBillStatus(prepaidReqVO.getBillIds(), payment.getId()); - - return BeanUtils.toBean(paymentDO, PaymentRespVO.class); - } - - private void updateBillStatus(List billIds, Long paymentId) { - for (Long billId : billIds) { - BillDO bill = billService.getBill(billId); - bill.setBillStatus(BILL_STATUS_PAID); - bill.setPaidAmount(bill.getTotalAmount()); - bill.setBalanceAmount(BigDecimal.ZERO); - bill.setPaymentId(paymentId); - billService.updateBill(bill); - } - } - - private void updateCustomerAccount(Long customerId, BigDecimal paymentAmount) { - CustomerAccountDO account = accountService.getByCustomerId(customerId); - account.setLastPaymentDate(LocalDate.now()); - account.setLastPaymentAmount(paymentAmount); - - // 如果有欠费,减少欠费金额 - if (account.getArrearsAmount().compareTo(BigDecimal.ZERO) > 0) { - BigDecimal newArrears = account.getArrearsAmount().subtract(paymentAmount); - account.setArrearsAmount(newArrears.max(BigDecimal.ZERO)); - } - - accountService.updateAccount(account); - } + @PostMapping("/write-off") + @Operation(summary = "销账处理") + @PreAuthorize("@ss.hasPermission('water:account:write-off')") + public CommonResult writeOffAccount(@Valid @RequestBody WriteOffReqVO writeOffReqVO); } ``` -### 3.4 账务处理 - -账务处理模块负责处理各类特殊账务情况,主要功能包括: - -- 未销调整:水量调整、金额调整、违约金减免等 -- 特殊开账:特殊情况下的账单生成 -- 账务退款:多缴费退款、预付款退款等 -- 销账调正:对已缴费账单进行调整处理 -- 预存调整:预存余额调整、预存转账等 -- 账务处理日志:记录所有账务处理操作 - ### 3.5 发票管理 -发票管理模块负责水费发票的管理,主要功能包括: +发票管理模块负责水费发票的全生命周期管理,支持纸质发票和电子发票。 -- 库存管理:发票入库、领用、作废 -- 发票打印:普通发票和电子发票 -- 发票查询:发票信息查询和统计 -- 发票调整:发票重开、补开 +#### 3.5.1 业务流程图 + +```mermaid +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 +``` + +#### 3.5.2 核心接口定义 + +```java +@RestController +@RequestMapping("/admin-api/water/invoice") +@Tag(name = "管理后台 - 发票管理") +@Validated +public class InvoiceController { + + @PostMapping("/generate") + @Operation(summary = "生成发票") + public CommonResult generateInvoice(@Valid @RequestBody InvoiceGenerateReqVO generateReqVO); + + @PostMapping("/print") + @Operation(summary = "打印发票") + public CommonResult printInvoice(@Valid @RequestBody InvoicePrintReqVO printReqVO); + + @PostMapping("/cancel") + @Operation(summary = "发票作废") + public CommonResult cancelInvoice(@Valid @RequestBody InvoiceCancelReqVO cancelReqVO); +} +``` ### 3.6 代收业务 @@ -1503,4 +1282,67 @@ public class PaymentServiceImpl implements PaymentService { - 查询接口:提供各类数据查询接口 - 业务处理接口:提供业务处理和操作接口 - 状态同步接口:提供状态信息同步接口 -- 数据推送接口:提供数据推送和订阅接口 \ No newline at end of file +- 数据推送接口:提供数据推送和订阅接口 + +## 系统集成架构 + +### 前后端集成架构 + +```mermaid +graph TB + subgraph "前端应用" + F1[管理后台
yudao-ui-admin-vue3] + F2[移动端
uni-app] + F3[客户端
微信小程序] + end + + subgraph "后端服务" + B1[认证服务
Spring Security] + B2[业务服务
RuoYi-Vue-Pro] + B3[网关服务
Spring Cloud Gateway] + end + + subgraph "数据存储" + D1[(MySQL 8.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 +``` + +### 技术栈整合方案 + +**后端技术整合**: +- Spring Boot 3.x作为核心框架 +- Spring Security 6.x提供安全认证 +- MyBatis Plus 3.x简化数据访问 +- RuoYi-Vue-Pro提供基础功能框架 + +**前端技术整合**: +- Vue 3.x + TypeScript构建现代化前端 +- Element Plus提供UI组件库 +- Vite作为构建工具 +- Pinia进行状态管理 + +**数据库集成**: +- MySQL 8.0作为主数据库 +- Redis 6.0提供缓存和会话管理 +- 连接池优化和读写分离支持 + +**中间件集成**: +- RabbitMQ提供消息队列 +- MinIO提供文件存储 +- Elasticsearch提供全文搜索 + +这样的架构设计确保了系统的高可用性、可扩展性和维护性,为福建水务营收系统提供了坚实的技术基础。 \ No newline at end of file