Files
gps-backend/workers/ReverseGeocodeWorker.js
2025-05-29 08:59:40 +00:00

258 lines
13 KiB
JavaScript
Executable File

const SandboxedJobMQ = require('bullmq').SandboxedJob;
const LibWinston = require('../library/LibWinston');
const moment = require('moment');
const axios = require('axios').default;
const url = require('url');
const request = require('../config/request');
const GpsTracksModels = require('../models/GpsTracksModels');
const RegionModels = require('../models/RegionModels');
const schedulerName = process.env.REDIS_SCHEDULER_REVERSE_GEO;
const Logger = LibWinston.initialize(schedulerName);
module.exports = async (job) => {
try {
Logger.log('info', `${schedulerName} running: ${JSON.stringify(job.opts)}`);
// (async function() {
try {
let loop = process.env.SCHEDULE_REVERSE_GEO_MAX_LOOP;
for (let x = 0; x < loop; x++) {
// let tracks = [];
let tracks = await GpsTracksModels.get2ForReverseGeo(1);
for (let i = 0; i < tracks.length; i++) {
let now = moment().unix();
let updtData = {};
let respReverseGeo = null;
try {
const sameAddr = await GpsTracksModels.select2Address(tracks[i].latitude, tracks[i].longitude);
if (sameAddr.length > 0) {
let addrData = {
device_id: tracks[i].device_id,
master_id: tracks[i].id,
type: sameAddr[0].type,
lat: tracks[i].latitude,
lng: tracks[i].longitude,
country_id: sameAddr[0].country_id,
country_code: sameAddr[0].country_code,
country_text: sameAddr[0].country_text,
state_id: sameAddr[0].state_id,
state_text: sameAddr[0].state_text,
city_id: sameAddr[0].city_id,
city_text: sameAddr[0].city_text,
district_id: sameAddr[0].district_id,
district_text: sameAddr[0].district_text,
village_id: sameAddr[0].village_id,
village_text: sameAddr[0].village_text,
postcode: sameAddr[0].postcode,
streets: sameAddr[0].streets,
fulladdress: encodeURIComponent(decodeURIComponent(sameAddr[0].fulladdress)),
type_reverse_geo: sameAddr[0].type_reverse_geo,
stts_reverse_geo: GpsTracksModels.STTS_REVERSE_GEO_SC,
log_reverse_geo: sameAddr[0].log_reverse_geo,
crt: now,
crt_format: moment.unix(now).format('YYYY-MM-DD HH:mm:ss'),
};
GpsTracksModels.create2Address(addrData);
updtData.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_SC;
await GpsTracksModels.update2(tracks[i].id, updtData);
continue;
}
let params = new url.URLSearchParams({
lat: tracks[i].latitude,
lon: tracks[i].longitude,
format: 'geojson',
});
const axInstance = axios.create();
axios.defaults.timeout = 3000;
axios.defaults.crossDomain = true;
// respReverseGeo = await axios({
// url: request.osm_reverse_geo.urlFull,
// method: request.osm_reverse_geo.method,
// params: params,
// responseType: 'json',
// });
respReverseGeo = await axInstance.get(request.osm_reverse_geo.urlFull + '?' + params.toString(), {
timeout: 3000,
});
let respData = respReverseGeo.data || {};
if (respReverseGeo.status == 200) {
if (respData.features.length < 1) {
GpsTracksModels.create2Address({
device_id: tracks[i].device_id,
master_id: tracks[i].id,
lat: tracks[i].latitude,
lng: tracks[i].longitude,
stts_reverse_geo: GpsTracksModels.STTS_REVERSE_GEO_LOST,
log_reverse_geo: JSON.stringify(respData),
crt: now,
crt_format: moment.unix(now).format('YYYY-MM-DD HH:mm:ss'),
});
updtData.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_LOST;
await GpsTracksModels.update2(tracks[i].id, updtData);
} else {
let respAddr = respData.features[0].properties.address;
let addrData = {
device_id: tracks[i].device_id,
master_id: tracks[i].id,
lat: tracks[i].latitude,
lng: tracks[i].longitude,
country_id: GpsTracksModels.DEFAULT_COUNTRY_ID,
country_code: respAddr.country_code,
country_text: (respAddr.country) ? respAddr.country.toUpperCase() : respAddr.country || null,
state_id: null,
city_id: null,
district_id: null,
village_id: null,
postcode: respAddr.postcode,
fulladdress: encodeURIComponent(respData.features[0].properties.display_name),
stts_reverse_geo: GpsTracksModels.STTS_REVERSE_GEO_SC,
log_reverse_geo: (respData.features[0].properties) ? JSON.stringify(respData.features[0].properties) : null,
crt: now,
crt_format: moment.unix(now).format('YYYY-MM-DD HH:mm:ss'),
};
if (respAddr.state || respAddr.city) {
addrData.state_text = respAddr.region || respAddr.state || respAddr.state_district || respAddr.county || respAddr.city || '';
addrData.state_text = (addrData.state_text) ? addrData.state_text.toUpperCase() : addrData.state_text || null;
addrData.state_text = addrData.state_text || null;
}
if (respAddr.city_district || respAddr.city) {
addrData.city_text = respAddr.city_district || respAddr.city || '';
addrData.city_text = (addrData.city_text) ? addrData.city_text.toUpperCase() : addrData.city_text || null;
addrData.city_text = addrData.city_text || null;
}
if (respAddr.suburb || respAddr.subdistrict) {
addrData.district_text = respAddr.suburb || respAddr.subdistrict || respAddr.subdivision || '';
addrData.district_text = (addrData.district_text) ? addrData.district_text.toUpperCase() : addrData.district_text || null;
addrData.district_text = addrData.district_text || null;
}
if (respAddr.village) {
addrData.village_text = respAddr.village || respAddr.neighbourhood || '';
addrData.village_text = (addrData.village_text) ? addrData.village_text.toUpperCase() : addrData.village_text || null;
addrData.village_text = addrData.village_text || null;
}
if (respAddr.amenity || respAddr.road || respAddr.city_block) {
addrData.streets = '';
addrData.streets += (respAddr.amenity) ? respAddr.amenity + ', ' : '';
addrData.streets += (respAddr.road) ? respAddr.road + ', ' : '';
addrData.streets += (respAddr.house_number) ? respAddr.house_number + ', ' : '';
addrData.streets += (respAddr.house_name) ? respAddr.house_name + ', ' : '';
addrData.streets += (respAddr.city_block) ? respAddr.city_block + ', ' : '';
addrData.streets += addrData.streets || null;
if (addrData.streets) {
addrData.streets = encodeURIComponent(addrData.streets.slice(0, -2));
}
}
let byAll = await RegionModels.whereLike({
nmProvinsiKel: addrData.state_text,
nmKotamadyaKel: addrData.city_text,
nmKecamatanKel: addrData.district_text,
nmKelurahan: addrData.village_text,
});
if (byAll.length > 1) {
addrData.state_id = byAll[0].kodeProv;
addrData.city_id = byAll[0].kodeKab;
addrData.district_id = byAll[0].kodeKec;
addrData.village_id = byAll[0].kodeKel;
}
let byKel = await RegionModels.whereLike({
nmKelurahan: addrData.village_text,
});
if (byAll.length < 1 && byKel.length > 0) {
addrData.state_id = byKel[0].kodeProv;
addrData.city_id = byKel[0].kodeKab;
addrData.district_id = byKel[0].kodeKec;
addrData.village_id = byKel[0].kodeKel;
}
if (addrData.state_id === null) {
let byPr = await RegionModels.whereLike({ nmProvinsiKel: addrData.state_text });
if (byPr.length > 0) { addrData.state_id = byPr[0].kodeProv; }
}
if (addrData.state_id !== null && addrData.city_id === null) {
let byKt = await RegionModels.whereLike({ nmKotamadyaKel: addrData.city_text });
if (byKt.length > 0) { addrData.city_id = byKt[0].kodeKab; }
}
if (addrData.state_id !== null && addrData.city_id !== null && addrData.district_id === null) {
let byKc = await RegionModels.whereLike({ nmKecamatanKel: addrData.district_text });
if (byKc.length > 0) { addrData.district_id = byKc[0].kodeKec; }
}
if (addrData.state_id !== null && addrData.city_id !== null && addrData.district_id !== null && addrData.village_id === null) {
let byKl = await RegionModels.whereLike({ nmKelurahan: addrData.village_text });
if (byKl.length > 0) { addrData.village_id = byKl[0].kodeKel; }
}
GpsTracksModels.create2Address(addrData).catch((e) => {
Logger.log('error', `${schedulerName} running_error: ${JSON.stringify(e, Object.getOwnPropertyNames(e))}`);
});
updtData.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_SC;
await GpsTracksModels.update2(tracks[i].id, updtData);
}
} else {
GpsTracksModels.create2Address({
device_id: tracks[i].device_id,
master_id: tracks[i].id,
lat: tracks[i].latitude,
lng: tracks[i].longitude,
stts_reverse_geo: GpsTracksModels.STTS_REVERSE_GEO_ER,
log_reverse_geo: JSON.stringify(respData),
crt: now,
crt_format: moment.unix(now).format('YYYY-MM-DD HH:mm:ss'),
});
updtData.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_ER;
await GpsTracksModels.update2(tracks[i].id, updtData);
}
} catch (e) {
let respData = {}
if (respReverseGeo) {
if (respReverseGeo.status != 200) {
respData.data = respReverseGeo.data;
} else {
respData.msg = e.message;
}
} else if (typeof e.response != 'undefined') {
respData.data = e.response;
} else {
respData.msg = e.message;
}
GpsTracksModels.create2Address({
device_id: tracks[i].device_id,
master_id: tracks[i].id,
lat: tracks[i].latitude,
lng: tracks[i].longitude,
stts_reverse_geo: GpsTracksModels.STTS_REVERSE_GEO_ER,
log_reverse_geo: JSON.stringify(respData),
crt: now,
crt_format: moment.unix(now).format('YYYY-MM-DD HH:mm:ss'),
});
updtData.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_ER;
await GpsTracksModels.update2(tracks[i].id, updtData);
}
job.updateProgress(1);
}
}
} catch (e) {
console.error(e);
Logger.log('error', `${schedulerName} error: ${JSON.stringify(e)}`);
}
// })();
return {
type: 'success',
message: 'success do reverse geocoding',
data: null,
};
} catch (e) {
return {
type: 'error',
message: e.message,
e: e,
};
}
};