From 540a6f5d8881cd91f2f709bd8af672f9cd9d5e78 Mon Sep 17 00:00:00 2001
From: ouyangxq <775153912@qq.com>
Date: Tue, 11 Aug 2026 09:25:41 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
deploy/service-map.yml | 4 +
deploy/sql/头程数据库统一增量-MySQL8.sql | 51 +++-
finance/pom.xml | 31 +++
.../finance/BaiyueFinanceApplication.java | 13 +
.../controller/PlatformFinanceController.java | 64 +++++
.../finance/service/FinanceService.java | 137 +++++++++++
.../src/main/resources/application-dev.yml | 6 +
finance/src/main/resources/application.yml | 32 +++
finance/src/main/resources/db/finance.sql | 227 ++++++++++++++++++
.../loading/mapper/LoadingInboundMapper.java | 28 ++-
.../service/LoadingDeliveryService.java | 2 +-
.../mapper/InboundSplitSettlementMapper.java | 50 +++-
.../service/PdaPickSettlementService.java | 67 +++---
.../service/LoadingDeliveryServiceTest.java | 12 +-
.../service/PdaPickSettlementServiceTest.java | 39 +--
order/src/main/resources/db/order.sql | 32 ++-
.../db/phase3-order-parent-child-schema.sql | 51 +++-
pom.xml | 1 +
18 files changed, 757 insertions(+), 90 deletions(-)
create mode 100644 finance/pom.xml
create mode 100644 finance/src/main/java/com/baiyue/finance/BaiyueFinanceApplication.java
create mode 100644 finance/src/main/java/com/baiyue/finance/controller/PlatformFinanceController.java
create mode 100644 finance/src/main/java/com/baiyue/finance/service/FinanceService.java
create mode 100644 finance/src/main/resources/application-dev.yml
create mode 100644 finance/src/main/resources/application.yml
create mode 100644 finance/src/main/resources/db/finance.sql
diff --git a/deploy/service-map.yml b/deploy/service-map.yml
index 6995fcb9d..bfd0c98cb 100644
--- a/deploy/service-map.yml
+++ b/deploy/service-map.yml
@@ -43,3 +43,7 @@ services:
artifactId: audit-service
jar: audit-service/target/audit-service-1.0.0-SNAPSHOT.jar
port: 9700
+ finance-service:
+ artifactId: finance-service
+ jar: finance/target/finance-service-1.0.0-SNAPSHOT.jar
+ port: 9203
diff --git a/deploy/sql/头程数据库统一增量-MySQL8.sql b/deploy/sql/头程数据库统一增量-MySQL8.sql
index 96d7c4b82..7e6099d7d 100644
--- a/deploy/sql/头程数据库统一增量-MySQL8.sql
+++ b/deploy/sql/头程数据库统一增量-MySQL8.sql
@@ -7282,7 +7282,7 @@ CREATE TABLE IF NOT EXISTS ord_order_fulfillment_split (
PRIMARY KEY(id),
UNIQUE KEY uk_order_split_operation (tenant_id,operation_id,split_role),
UNIQUE KEY uk_order_split_idempotency (tenant_id,parent_order_id,idempotency_key,split_role),
- UNIQUE KEY uk_order_split_child (tenant_id,child_order_id),
+ UNIQUE KEY uk_order_split_child_role (tenant_id,child_order_id,split_role),
KEY idx_order_split_parent (tenant_id,parent_order_id,created_at,id),
KEY idx_order_split_source (tenant_id,source_order_id,split_role),
KEY idx_order_split_container (tenant_id,container_booking_id,created_at,id),
@@ -7294,6 +7294,8 @@ CREATE TABLE IF NOT EXISTS ord_order_fulfillment_split (
DROP TRIGGER IF EXISTS trg_ord_order_parent_insert;
DROP TRIGGER IF EXISTS trg_ord_order_parent_update;
+DROP TRIGGER IF EXISTS trg_order_fulfillment_split_insert;
+DROP TRIGGER IF EXISTS trg_order_fulfillment_split_update;
DELIMITER $$
CREATE TRIGGER trg_ord_order_parent_insert BEFORE INSERT ON ord_order FOR EACH ROW
BEGIN
@@ -7353,6 +7355,10 @@ BEGIN
AND table_name='ord_order_fulfillment_split' AND index_name='uk_order_split_idempotency') THEN
ALTER TABLE ord_order_fulfillment_split DROP INDEX uk_order_split_idempotency;
END IF;
+ IF EXISTS (SELECT 1 FROM information_schema.statistics WHERE table_schema=DATABASE()
+ AND table_name='ord_order_fulfillment_split' AND index_name='uk_order_split_child') THEN
+ ALTER TABLE ord_order_fulfillment_split DROP INDEX uk_order_split_child;
+ END IF;
END$$
DELIMITER ;
CALL phase3_order_drop_split_index();
@@ -7361,6 +7367,36 @@ CALL phase3_order_add_index('ord_order_fulfillment_split','uk_order_split_operat
'UNIQUE KEY `uk_order_split_operation` (`tenant_id`,`operation_id`,`split_role`)');
CALL phase3_order_add_index('ord_order_fulfillment_split','uk_order_split_idempotency',
'UNIQUE KEY `uk_order_split_idempotency` (`tenant_id`,`parent_order_id`,`idempotency_key`,`split_role`)');
+CALL phase3_order_add_index('ord_order_fulfillment_split','uk_order_split_child_role',
+ 'UNIQUE KEY `uk_order_split_child_role` (`tenant_id`,`child_order_id`,`split_role`)');
+
+DELIMITER $$
+CREATE TRIGGER trg_order_fulfillment_split_insert
+BEFORE INSERT ON ord_order_fulfillment_split FOR EACH ROW
+BEGIN
+ IF NEW.split_role NOT IN ('LOADED','REMAINDER') THEN
+ SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='订单履约分片角色非法';
+ END IF;
+ IF NEW.split_role='LOADED' AND NEW.child_order_id<>NEW.source_order_id THEN
+ SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='实装台账必须由来源订单自身承接';
+ END IF;
+ IF NEW.split_role='REMAINDER'
+ AND (NEW.child_order_id=NEW.source_order_id OR NEW.remaining_package_count=0) THEN
+ SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='余量台账必须指向有剩余数量的新子订单';
+ END IF;
+END$$
+CREATE TRIGGER trg_order_fulfillment_split_update
+BEFORE UPDATE ON ord_order_fulfillment_split FOR EACH ROW
+BEGIN
+ IF NOT (NEW.tenant_id<=>OLD.tenant_id)
+ OR NOT (NEW.parent_order_id<=>OLD.parent_order_id)
+ OR NOT (NEW.source_order_id<=>OLD.source_order_id)
+ OR NOT (NEW.child_order_id<=>OLD.child_order_id)
+ OR NOT (NEW.split_role<=>OLD.split_role) THEN
+ SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='订单履约分片来源、子片与角色不可修改';
+ END IF;
+END$$
+DELIMITER ;
DROP PROCEDURE IF EXISTS phase3_order_add_column;
DROP PROCEDURE IF EXISTS phase3_order_add_index;
@@ -7384,9 +7420,20 @@ BEGIN
IF (SELECT COUNT(DISTINCT index_name) FROM information_schema.statistics
WHERE table_schema=DATABASE() AND table_name='ord_order_fulfillment_split'
AND index_name IN ('idx_order_split_source','uk_order_split_operation',
- 'uk_order_split_idempotency'))<>3 THEN
+ 'uk_order_split_idempotency','uk_order_split_child_role'))<>4 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='订单拆分来源或幂等索引未完整创建';
END IF;
+ IF EXISTS (SELECT 1 FROM information_schema.statistics
+ WHERE table_schema=DATABASE() AND table_name='ord_order_fulfillment_split'
+ AND index_name='uk_order_split_child') THEN
+ SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='旧订单拆分子单唯一索引仍阻止跨角色分片';
+ END IF;
+ IF (SELECT COUNT(*) FROM information_schema.triggers
+ WHERE trigger_schema=DATABASE()
+ AND trigger_name IN ('trg_order_fulfillment_split_insert',
+ 'trg_order_fulfillment_split_update'))<>2 THEN
+ SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='订单履约分片写入保护触发器未完整创建';
+ END IF;
END$$
DELIMITER ;
CALL phase3_order_assert();
diff --git a/finance/pom.xml b/finance/pom.xml
new file mode 100644
index 000000000..261a622b6
--- /dev/null
+++ b/finance/pom.xml
@@ -0,0 +1,31 @@
+
+
+ 4.0.0
+
+ com.baiyue.firstleg
+ baiyue-firstleg-platform
+ 1.0.0-SNAPSHOT
+ ../pom.xml
+
+ finance-service
+
+ com.baiyue.sharedbaiyue-common-web${project.version}
+ com.baiyue.sharedbaiyue-common-openapi${project.version}
+ com.baiyue.sharedbaiyue-common-security${project.version}
+ com.baiyue.sharedbaiyue-common-audit${project.version}
+ com.baomidoumybatis-plus-spring-boot3-starter
+ org.springframework.bootspring-boot-starter-jdbc
+ com.mysqlmysql-connector-jruntime
+ com.alibaba.cloudspring-cloud-starter-alibaba-nacos-discovery
+ com.alibaba.cloudspring-cloud-starter-alibaba-nacos-config
+ org.springframework.bootspring-boot-starter-actuator
+ org.springframework.bootspring-boot-starter-testtest
+
+
+
+ org.springframework.bootspring-boot-maven-plugin
+
+
+
diff --git a/finance/src/main/java/com/baiyue/finance/BaiyueFinanceApplication.java b/finance/src/main/java/com/baiyue/finance/BaiyueFinanceApplication.java
new file mode 100644
index 000000000..1c60aee94
--- /dev/null
+++ b/finance/src/main/java/com/baiyue/finance/BaiyueFinanceApplication.java
@@ -0,0 +1,13 @@
+package com.baiyue.finance;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/** Finance 独立服务启动入口。首期只承载人工账单、收款和成本台账。 */
+@SpringBootApplication
+public class BaiyueFinanceApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(BaiyueFinanceApplication.class, args);
+ }
+}
diff --git a/finance/src/main/java/com/baiyue/finance/controller/PlatformFinanceController.java b/finance/src/main/java/com/baiyue/finance/controller/PlatformFinanceController.java
new file mode 100644
index 000000000..c9bf7a651
--- /dev/null
+++ b/finance/src/main/java/com/baiyue/finance/controller/PlatformFinanceController.java
@@ -0,0 +1,64 @@
+package com.baiyue.finance.controller;
+
+import com.baiyue.common.audit.BusinessAudit;
+import com.baiyue.common.core.api.ApiResponse;
+import com.baiyue.common.security.AuthenticatedUser;
+import com.baiyue.finance.service.FinanceService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+@Tag(name = "人工财务台账")
+@RestController
+@RequestMapping("/api/platform/v1/finance")
+public class PlatformFinanceController {
+ private final FinanceService service;
+ public PlatformFinanceController(FinanceService service) { this.service = service; }
+
+ @GetMapping("/customers/{tenantId}/terms")
+ @PreAuthorize("hasAuthority('finance:customer-terms:view')")
+ @Operation(summary = "查询客户账期")
+ public ApiResponse