From d699da385dda6257677ee93bef47388c0635f64e Mon Sep 17 00:00:00 2001
From: “mitao” <“2763622819@qq.com”>
Date: 星期五, 17 四月 2026 08:57:41 +0800
Subject: [PATCH] feat:APP个人中心

---
 tcm-training-admin-backend/src/main/java/com/tcm/training/admin/points/service/PointsLedgerAppService.java |   53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 53 insertions(+), 0 deletions(-)

diff --git a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/points/service/PointsLedgerAppService.java b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/points/service/PointsLedgerAppService.java
index dedfde0..907dab0 100644
--- a/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/points/service/PointsLedgerAppService.java
+++ b/tcm-training-admin-backend/src/main/java/com/tcm/training/admin/points/service/PointsLedgerAppService.java
@@ -35,10 +35,13 @@
     public static final String TYPE_EXPENSE = "EXPENSE";
     public static final String BUSINESS_LIVE_WATCH = "LIVE_WATCH";
     public static final String BUSINESS_POINTS_EXCHANGE = "POINTS_EXCHANGE";
+    public static final String BUSINESS_POINTS_SETTLEMENT = "POINTS_SETTLEMENT";
     public static final String SOURCE_LIVE_QUIZ = "LIVE_QUIZ";
     public static final String SOURCE_EXCHANGE_ITEM = "EXCHANGE_ITEM";
+    public static final String SOURCE_POINTS_SETTLEMENT = "POINTS_SETTLEMENT";
     public static final String REF_LIVE_COURSE = "LIVE_COURSE";
     public static final String REF_EXCHANGE_ITEM = "EXCHANGE_ITEM";
+    public static final String REF_POINTS_CONFIG = "POINTS_CONFIG";
 
     private final PointsLedgerMapper pointsLedgerMapper;
 
@@ -186,6 +189,53 @@
         pointsLedgerMapper.insert(ledger);
     }
 
+    /**
+     * 记录积分活动结束后未达标用户被系统清零的支出流水。
+     */
+    @Transactional
+    public void createSettlementClearLedger(Long sourceId,
+                                            Long appUserId,
+                                            String userNickname,
+                                            String userPhone,
+                                            Long clinicId,
+                                            String clinicName,
+                                            String provinceCode,
+                                            String provinceName,
+                                            String cityCode,
+                                            String cityName,
+                                            String districtCode,
+                                            String districtName,
+                                            String contentName,
+                                            Long referenceId,
+                                            String referenceNo,
+                                            Integer pointsDelta,
+                                            LocalDateTime operatedAt) {
+        if (sourceId == null) {
+            return;
+        }
+        PointsLedger exists = pointsLedgerMapper.selectOne(new LambdaQueryWrapper<PointsLedger>()
+                .eq(PointsLedger::getDeleted, 0)
+                .eq(PointsLedger::getSourceType, SOURCE_POINTS_SETTLEMENT)
+                .eq(PointsLedger::getSourceId, sourceId)
+                .last("limit 1"));
+        if (exists != null) {
+            return;
+        }
+        PointsLedger ledger = buildBaseLedger(appUserId, userNickname, userPhone, clinicId, clinicName,
+                provinceCode, provinceName, cityCode, cityName, districtCode, districtName);
+        ledger.setIncomeExpenseType(TYPE_EXPENSE);
+        ledger.setBusinessType(BUSINESS_POINTS_SETTLEMENT);
+        ledger.setContentName(contentName);
+        ledger.setReferenceType(REF_POINTS_CONFIG);
+        ledger.setReferenceId(referenceId);
+        ledger.setReferenceNo(referenceNo);
+        ledger.setPointsDelta(pointsDelta == null ? 0 : -Math.abs(pointsDelta));
+        ledger.setOperatedAt(operatedAt == null ? LocalDateTime.now() : operatedAt);
+        ledger.setSourceType(SOURCE_POINTS_SETTLEMENT);
+        ledger.setSourceId(sourceId);
+        pointsLedgerMapper.insert(ledger);
+    }
+
     private void syncQuizLedgers() {
         List<PointsLedgerSyncQuizRow> rows = pointsLedgerMapper.selectMissingQuizLedgerRows();
         for (PointsLedgerSyncQuizRow row : rows) {
@@ -324,6 +374,9 @@
         if (BUSINESS_POINTS_EXCHANGE.equals(value)) {
             return "积分兑换";
         }
+        if (BUSINESS_POINTS_SETTLEMENT.equals(value)) {
+            return "活动结算";
+        }
         return "-";
     }
 

--
Gitblit v1.7.1