Subversion Repositories SmartDukaan

Rev

Rev 36343 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
36306 amit 1
package com.smartdukaan.cron.scheduled;
2
 
3
import com.spice.profitmandi.dao.entity.transaction.CronBatch;
36338 amit 4
import com.spice.profitmandi.service.cron.CronBatchService;
36343 amit 5
import com.spice.profitmandi.service.offers.OfferBatchService;
37083 amit 6
import com.spice.profitmandi.service.pricing.PriceDropBatchService;
36306 amit 7
import com.spice.profitmandi.service.transaction.PartnerLimitUpdateData;
8
import org.apache.logging.log4j.LogManager;
9
import org.apache.logging.log4j.Logger;
10
import org.springframework.beans.factory.annotation.Autowired;
11
import org.springframework.stereotype.Component;
12
 
13
import java.util.LinkedHashMap;
14
import java.util.List;
15
 
16
/**
17
 * Batch-aware scheduled tasks with per-partner transaction isolation.
18
 * NO @Transactional at class level — each partner gets its own transaction
19
 * via REQUIRES_NEW in the helper beans.
20
 *
21
 * Tracks every run in cron_batch / cron_batch_item tables.
36343 amit 22
 * Sends failure summary email on partial failures.
36306 amit 23
 */
24
@Component
25
public class BatchScheduledTasks {
26
 
27
    private static final Logger LOGGER = LogManager.getLogger(BatchScheduledTasks.class);
28
 
29
    @Autowired
30
    private CronBatchService cronBatchService;
31
 
32
    @Autowired
36343 amit 33
    private OfferBatchService offerBatchService;
36306 amit 34
 
35
    @Autowired
36
    private PartnerLimitHelper partnerLimitHelper;
37
 
37083 amit 38
    @Autowired
39
    private PriceDropBatchService priceDropBatchService;
40
 
36306 amit 41
    /**
36343 amit 42
     * CLI entrypoint for cron: delegates to shared OfferBatchService (also used by web/fofo controllers).
36306 amit 43
     */
44
    public void processOfferWithBatch(int offerId) throws Exception {
36343 amit 45
        offerBatchService.processOfferWithBatch(offerId);
36306 amit 46
    }
47
 
48
    /**
37083 amit 49
     * Scheduled entrypoint: delegates to shared PriceDropBatchService.
50
     * Reprocesses (rejects) price drops for IMEIs activated before the drop date,
51
     * each drop in its own REQUIRES_NEW transaction so user_wallet locks are held
52
     * per-drop instead of for the whole run.
53
     */
54
    public void reprocessPriceDropsWithBatch() {
55
        priceDropBatchService.reprocessPriceDropsWithBatch();
56
    }
57
 
58
    /**
36306 amit 59
     * Recalculates partner credit limits. Only writes to partners where values actually changed.
60
     *
61
     * Flow:
62
     * 1. Read phase: calculate limits for all 1,500 partners, compare with current values
63
     * 2. Create batch with only changed partners (~50-100 typically)
64
     * 3. Per-partner: update in REQUIRES_NEW transaction
65
     * 4. Finalize: counts + failure email
66
     */
67
    public void updatePartnerLimitWithBatch() throws Exception {
68
        List<PartnerLimitUpdateData> changedPartners;
69
        try {
70
            changedPartners = partnerLimitHelper.calculateChangedPartnerLimits();
71
        } catch (Exception e) {
72
            LOGGER.error("Failed to calculate partner limits: {}", e.getMessage());
73
            return;
74
        }
75
 
76
        if (changedPartners.isEmpty()) {
77
            LOGGER.info("No partner limits changed, skipping");
78
            return;
79
        }
80
 
81
        LinkedHashMap<Integer, String> fofoIdPartnerNameMap = new LinkedHashMap<>();
82
        for (PartnerLimitUpdateData data : changedPartners) {
83
            fofoIdPartnerNameMap.put(data.getFofoId(), "fofo-" + data.getFofoId());
84
        }
85
 
86
        CronBatch batch = cronBatchService.createBatch("updatePartnerLimit", fofoIdPartnerNameMap);
87
 
88
        for (PartnerLimitUpdateData data : changedPartners) {
89
            try {
90
                partnerLimitHelper.updateSinglePartnerLimit(batch.getId(), data);
91
            } catch (Exception e) {
92
                LOGGER.error("updatePartnerLimit failed for fofoId={}: {}", data.getFofoId(), e.getMessage());
93
                cronBatchService.markItemFailed(batch.getId(), data.getFofoId(), e.getMessage());
94
            }
95
        }
96
 
97
        cronBatchService.finalizeBatch(batch.getId());
98
    }
99
}