const SandboxedJobMQ = require('bullmq').SandboxedJob; const moment = require('moment'); const LibWinston = require('../library/LibWinston'); const LibFirebase = require('../library/LibFirebase'); const OrdersModels = require('../models/OrdersModels'); const DriversModels = require('../models/DriversModels'); const OrdersPckDropsModels = require('../models/OrdersPckDropsModels'); const LogsSchNotifModels = require('../models/LogsSchNotifModels'); // const GpsTracksModels = require('../models/GpsTracksModels'); const schedulerName = process.env.REDIS_SCHEDULER_DRV_UP_LOC; const Logger = LibWinston.initialize(schedulerName); module.exports = async (job) => { try { // const now = moment().unix(); Logger.log('info', `${schedulerName} running: ${JSON.stringify(job.opts)}`); /** * semua aktif order dan driver sedang login * get last t_gps_tracks by drv_id * jika crt_d > 5 minute => send notif */ const libFirebase = new LibFirebase(); let notifTitle = 'Notifikasi Cek Lokasi'; // up location let notifBody = 'Harap Dihiraukan'; // up location // (async function() { try { async function checkNotifNLogs(job) { // hapus logs notif jika lebih dari 3x dan lebih dari 1jam const logs = await LogsSchNotifModels.list({ drv_id: job.drv_id, notif_type: LibFirebase.upLocActiveOrder, order_by: 'lognot.drv_id DESC', limit: 3 }); if (logs.length >= 3) { let start = moment(); end = moment.unix(logs[0].crt); duration = moment.duration(start.diff(end)); if (duration.asHours() >= 1) { LogsSchNotifModels.delLogs({ drv_id: job.drv_id, notif_type: LibFirebase.upLocActiveOrder }); } else { // continue; return false; } } // kirim notif console.log('drvUpLocWorker driver id => ', job.drv_id, ' at ', moment().unix()); libFirebase.sendToDevice(job.drv_fcm_token, { notification: { title: notifTitle, body: notifBody, }, data: { title: notifTitle, body: notifBody, type: '' + LibFirebase.upLocActiveOrder, detail_id: '', content_available: 'true', } }, { priority: 'high', // to apple: normal(5), high(10) android: { priority: 'high', // to anroid: low(?). normal(5), high(10) }, content_available: true, click_action: 'FLUTTER_NOTIFICATION_CLICK', }); LogsSchNotifModels.insLog({ fcm_token: job.drv_fcm_token, device_id: job.drv_device_id, drv_id: job.drv_id, notif_type: LibFirebase.upLocActiveOrder, crt: moment().unix(), }); } let loop = process.env.SCHEDULE_DRV_UP_LOC_MAX_LOOP; for (let x = 0; x < loop; x++) { // all active order const activeJobs = await OrdersModels.listOrders({ is_active: OrdersModels.IS_ACTIVE, delivery_statuses: [ OrdersPckDropsModels.STTS_DELIVERY_OTW_PICKUP,OrdersPckDropsModels.STTS_DELIVERY_ARRIVED_PICKUP,OrdersPckDropsModels.STTS_DELIVERY_PROCESS_PICKUP ,OrdersPckDropsModels.STTS_DELIVERY_FINISH_PICKUP,OrdersPckDropsModels.STTS_DELIVERY_TRAVEL_DOC,OrdersPckDropsModels.STTS_DELIVERY_OTW_DROP ,OrdersPckDropsModels.STTS_DELIVERY_ARRIVED_DROP,OrdersPckDropsModels.STTS_DELIVERY_PROCESS_DROP,OrdersPckDropsModels.STTS_DELIVERY_FINISH_DROP // ,OrdersPckDropsModels.STTS_DELIVERY_HANDOVER_DOC ], couple_pck_drop: 1, inner_join_phone_devices: 1, phone_devices_is_login: DriversModels.IS_LOGIN, last_tracks_phone_drv: 1, group_by: 'GROUP BY ord_drv.drv_id', }); /** * jika telah mengirim notif lebih dari 3x, maka stop * ngapusnya gimana ? permasalahnnya order yang didapet adalah ketika driver login * ngapusnya pas driver sudah update data terbaru * kalo misalkan pas ngirim notif masih ada log notif belum terhapus sebanyak 3x, maka check apakah sudah 1hari ? baru dihapus dan create log baru */ for (const job of activeJobs) { // baru ketembak notif, minimal ada 1x update lokasi if (job.drv_fcm_token && job.tr_crt_d && job.tr_crt_d != 0) { // more than 5 minute let start = moment(); let end = moment.unix(job.tr_crt_d); let duration = moment.duration(start.diff(end)); if (duration.asMinutes() >= 4) { await checkNotifNLogs(job); } else { LogsSchNotifModels.delLogs({ drv_id: job.drv_id, notif_type: LibFirebase.upLocActiveOrder }); } } // ketembak notif jika belum pernah ada update lokasi samsek else { await checkNotifNLogs(job); } } } } catch (e) { console.error(e); Logger.log('error', `${schedulerName} error: ${JSON.stringify(e)}`); } // })(); return { type: 'success', message: 'success run scheduler drv up location', data: null, }; } catch (e) { return { type: 'error', message: e.message, e: e, }; } };