“mitao”
2026-04-17 d699da385dda6257677ee93bef47388c0635f64e
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 "-";
    }