This commit is contained in:
meusinfirmary
2025-06-12 01:38:34 +07:00
parent 4d73680704
commit cbca1b92f0
3 changed files with 151 additions and 105 deletions

View File

@ -1,31 +1,32 @@
require("dotenv").config({ path: "../.env" }) require("dotenv").config({ path: "../.env" });
const LibWinston = require("../library/LibWinston") const LibWinston = require("../library/LibWinston");
const moment = require("moment") const moment = require("moment");
const axios = require("axios").default const axios = require("axios").default;
const url = require("url") const url = require("url");
const request = require("../config/request") const request = require("../config/request");
const GpsTracksModels = require("../models/GpsTracksModels") const GpsTracksModels = require("../models/GpsTracksModels");
const RegionModels = require("../models/RegionModels") const RegionModels = require("../models/RegionModels");
const { stringify } = require("flatted");
const schedulerName = process.env.REDIS_SCHEDULER_REVERSE_GEO const schedulerName = process.env.REDIS_SCHEDULER_REVERSE_GEO;
const Logger = LibWinston.initialize(schedulerName) const Logger = LibWinston.initialize(schedulerName);
const go = async () => { const go = async () => {
try { try {
Logger.log("info", `${schedulerName} running: ${moment().format("YYYY-MM-DD HH:mm:ss")}`) Logger.log("info", `${schedulerName} running: ${moment().format("YYYY-MM-DD HH:mm:ss")}`);
// (async function() { // (async function() {
try { try {
let loop = process.env.SCHEDULE_REVERSE_GEO_MAX_LOOP let loop = process.env.SCHEDULE_REVERSE_GEO_MAX_LOOP;
for (let x = 0; x < loop; x++) { for (let x = 0; x < loop; x++) {
// let tracks = []; // let tracks = [];
let tracks = await GpsTracksModels.get2ForReverseGeo(1) let tracks = await GpsTracksModels.get2ForReverseGeo(1);
for (let i = 0; i < tracks.length; i++) { for (let i = 0; i < tracks.length; i++) {
console.log("tracks[i] :", tracks[i].id, tracks[i].device_id, tracks[i].latitude, tracks[i].longitude) console.log("tracks[i] :", tracks[i].id, tracks[i].device_id, tracks[i].latitude, tracks[i].longitude);
let now = moment().unix() let now = moment().unix();
let updtData = {} let updtData = {};
let respReverseGeo = null let respReverseGeo = null;
try { try {
const sameAddr = await GpsTracksModels.select2Address(tracks[i].latitude, tracks[i].longitude) const sameAddr = await GpsTracksModels.select2Address(tracks[i].latitude, tracks[i].longitude);
if (sameAddr.length > 0) { if (sameAddr.length > 0) {
let addrData = { let addrData = {
@ -53,37 +54,44 @@ const go = async () => {
log_reverse_geo: sameAddr[0].log_reverse_geo, log_reverse_geo: sameAddr[0].log_reverse_geo,
crt: now, crt: now,
crt_format: moment.unix(now).format("YYYY-MM-DD HH:mm:ss"), crt_format: moment.unix(now).format("YYYY-MM-DD HH:mm:ss"),
} };
GpsTracksModels.create2Address(addrData) GpsTracksModels.create2Address(addrData);
updtData.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_SC updtData.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_SC;
await GpsTracksModels.update2(tracks[i].id, updtData) await GpsTracksModels.update2(tracks[i].id, updtData);
continue continue;
} }
let params = new url.URLSearchParams({ let params = new url.URLSearchParams({
lat: tracks[i].latitude, lat: tracks[i].latitude,
lon: tracks[i].longitude, lon: tracks[i].longitude,
format: "geojson", format: "geojson",
}) });
//const axInstance = axios.create() //const axInstance = axios.create()
const axInstance = axios.create({ const axInstance = axios.create({
proxy: { proxy: {
host: process.env.PROXY_URL, host: process.env.PROXY_URL,
port: process.env.PROXY_PORT, }, port: process.env.PROXY_PORT,
},
}); });
axios.defaults.timeout = 10000 axios.defaults.timeout = 10000;
axios.defaults.crossDomain = true axios.defaults.crossDomain = true;
// respReverseGeo = await axios({ // respReverseGeo = await axios({
// url: request.osm_reverse_geo.urlFull, // url: request.osm_reverse_geo.urlFull,
// method: request.osm_reverse_geo.method, // method: request.osm_reverse_geo.method,
// params: params, // params: params,
// responseType: 'json', // responseType: 'json',
// }); // });
// respReverseGeo = await axInstance.get(request.osm_reverse_geo.urlFull + "?" + params.toString(), {
// timeout: 10000,
// });
respReverseGeo = await axInstance.get(request.osm_reverse_geo.urlFull + "?" + params.toString(), { respReverseGeo = await axInstance.get(request.osm_reverse_geo.urlFull + "?" + params.toString(), {
timeout: 10000, timeout: 10000,
}) headers: {
console.log("respReverseGeo: ",respReverseGeo.data || null ) "User-Agent": "movana-fleet-management/1.0 (emirsyafmun@gmail.com)",
let respData = respReverseGeo.data || {} },
});
console.log("respReverseGeo: ", respReverseGeo.data || null);
let respData = respReverseGeo.data || {};
if (respReverseGeo.status == 200) { if (respReverseGeo.status == 200) {
if (respData.features.length < 1) { if (respData.features.length < 1) {
GpsTracksModels.create2Address({ GpsTracksModels.create2Address({
@ -95,11 +103,11 @@ const go = async () => {
log_reverse_geo: JSON.stringify(respData), log_reverse_geo: JSON.stringify(respData),
crt: now, crt: now,
crt_format: moment.unix(now).format("YYYY-MM-DD HH:mm:ss"), crt_format: moment.unix(now).format("YYYY-MM-DD HH:mm:ss"),
}) });
updtData.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_LOST updtData.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_LOST;
await GpsTracksModels.update2(tracks[i].id, updtData) await GpsTracksModels.update2(tracks[i].id, updtData);
} else { } else {
let respAddr = respData.features[0].properties.address let respAddr = respData.features[0].properties.address;
let addrData = { let addrData = {
device_id: tracks[i].device_id, device_id: tracks[i].device_id,
master_id: tracks[i].id, master_id: tracks[i].id,
@ -118,37 +126,37 @@ const go = async () => {
log_reverse_geo: respData.features[0].properties ? JSON.stringify(respData.features[0].properties) : null, log_reverse_geo: respData.features[0].properties ? JSON.stringify(respData.features[0].properties) : null,
crt: now, crt: now,
crt_format: moment.unix(now).format("YYYY-MM-DD HH:mm:ss"), crt_format: moment.unix(now).format("YYYY-MM-DD HH:mm:ss"),
} };
if (respAddr.state || respAddr.city) { if (respAddr.state || respAddr.city) {
addrData.state_text = respAddr.region || respAddr.state || respAddr.state_district || respAddr.county || 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 ? addrData.state_text.toUpperCase() : addrData.state_text || null;
addrData.state_text = addrData.state_text || null addrData.state_text = addrData.state_text || null;
} }
if (respAddr.city_district || respAddr.city) { if (respAddr.city_district || respAddr.city) {
addrData.city_text = 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 ? addrData.city_text.toUpperCase() : addrData.city_text || null;
addrData.city_text = addrData.city_text || null addrData.city_text = addrData.city_text || null;
} }
if (respAddr.suburb || respAddr.subdistrict) { if (respAddr.suburb || respAddr.subdistrict) {
addrData.district_text = respAddr.suburb || respAddr.subdistrict || respAddr.subdivision || "" 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 ? addrData.district_text.toUpperCase() : addrData.district_text || null;
addrData.district_text = addrData.district_text || null addrData.district_text = addrData.district_text || null;
} }
if (respAddr.village) { if (respAddr.village) {
addrData.village_text = respAddr.village || respAddr.neighbourhood || "" 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 ? addrData.village_text.toUpperCase() : addrData.village_text || null;
addrData.village_text = addrData.village_text || null addrData.village_text = addrData.village_text || null;
} }
if (respAddr.amenity || respAddr.road || respAddr.city_block) { if (respAddr.amenity || respAddr.road || respAddr.city_block) {
addrData.streets = "" addrData.streets = "";
addrData.streets += respAddr.amenity ? respAddr.amenity + ", " : "" addrData.streets += respAddr.amenity ? respAddr.amenity + ", " : "";
addrData.streets += respAddr.road ? respAddr.road + ", " : "" addrData.streets += respAddr.road ? respAddr.road + ", " : "";
addrData.streets += respAddr.house_number ? respAddr.house_number + ", " : "" addrData.streets += respAddr.house_number ? respAddr.house_number + ", " : "";
addrData.streets += respAddr.house_name ? respAddr.house_name + ", " : "" addrData.streets += respAddr.house_name ? respAddr.house_name + ", " : "";
addrData.streets += respAddr.city_block ? respAddr.city_block + ", " : "" addrData.streets += respAddr.city_block ? respAddr.city_block + ", " : "";
addrData.streets += addrData.streets || null addrData.streets += addrData.streets || null;
if (addrData.streets) { if (addrData.streets) {
addrData.streets = encodeURIComponent(addrData.streets.slice(0, -2)) addrData.streets = encodeURIComponent(addrData.streets.slice(0, -2));
} }
} }
@ -157,57 +165,57 @@ const go = async () => {
nmKotamadyaKel: addrData.city_text, nmKotamadyaKel: addrData.city_text,
nmKecamatanKel: addrData.district_text, nmKecamatanKel: addrData.district_text,
nmKelurahan: addrData.village_text, nmKelurahan: addrData.village_text,
}) });
if (byAll.length > 1) { if (byAll.length > 1) {
addrData.state_id = byAll[0].kodeProv addrData.state_id = byAll[0].kodeProv;
addrData.city_id = byAll[0].kodeKab addrData.city_id = byAll[0].kodeKab;
addrData.district_id = byAll[0].kodeKec addrData.district_id = byAll[0].kodeKec;
addrData.village_id = byAll[0].kodeKel addrData.village_id = byAll[0].kodeKel;
} }
let byKel = await RegionModels.whereLike({ let byKel = await RegionModels.whereLike({
nmKelurahan: addrData.village_text, nmKelurahan: addrData.village_text,
}) });
if (byAll.length < 1 && byKel.length > 0) { if (byAll.length < 1 && byKel.length > 0) {
addrData.state_id = byKel[0].kodeProv addrData.state_id = byKel[0].kodeProv;
addrData.city_id = byKel[0].kodeKab addrData.city_id = byKel[0].kodeKab;
addrData.district_id = byKel[0].kodeKec addrData.district_id = byKel[0].kodeKec;
addrData.village_id = byKel[0].kodeKel addrData.village_id = byKel[0].kodeKel;
} }
if (addrData.state_id === null) { if (addrData.state_id === null) {
let byPr = await RegionModels.whereLike({ nmProvinsiKel: addrData.state_text }) let byPr = await RegionModels.whereLike({ nmProvinsiKel: addrData.state_text });
if (byPr.length > 0) { if (byPr.length > 0) {
addrData.state_id = byPr[0].kodeProv addrData.state_id = byPr[0].kodeProv;
} }
} }
if (addrData.state_id !== null && addrData.city_id === null) { if (addrData.state_id !== null && addrData.city_id === null) {
let byKt = await RegionModels.whereLike({ nmKotamadyaKel: addrData.city_text }) let byKt = await RegionModels.whereLike({ nmKotamadyaKel: addrData.city_text });
if (byKt.length > 0) { if (byKt.length > 0) {
addrData.city_id = byKt[0].kodeKab addrData.city_id = byKt[0].kodeKab;
} }
} }
if (addrData.state_id !== null && addrData.city_id !== null && addrData.district_id === null) { if (addrData.state_id !== null && addrData.city_id !== null && addrData.district_id === null) {
let byKc = await RegionModels.whereLike({ nmKecamatanKel: addrData.district_text }) let byKc = await RegionModels.whereLike({ nmKecamatanKel: addrData.district_text });
if (byKc.length > 0) { if (byKc.length > 0) {
addrData.district_id = byKc[0].kodeKec addrData.district_id = byKc[0].kodeKec;
} }
} }
if (addrData.state_id !== null && addrData.city_id !== null && addrData.district_id !== null && addrData.village_id === null) { 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 }) let byKl = await RegionModels.whereLike({ nmKelurahan: addrData.village_text });
if (byKl.length > 0) { if (byKl.length > 0) {
addrData.village_id = byKl[0].kodeKel addrData.village_id = byKl[0].kodeKel;
} }
} }
GpsTracksModels.create2Address(addrData).catch((e) => { GpsTracksModels.create2Address(addrData).catch((e) => {
Logger.log("error", `${schedulerName} running_error: ${JSON.stringify(e, Object.getOwnPropertyNames(e))}`) Logger.log("error", `${schedulerName} running_error: ${JSON.stringify(e, Object.getOwnPropertyNames(e))}`);
}) });
updtData.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_SC updtData.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_SC;
await GpsTracksModels.update2(tracks[i].id, updtData) await GpsTracksModels.update2(tracks[i].id, updtData);
} }
} else { } else {
GpsTracksModels.create2Address({ GpsTracksModels.create2Address({
@ -219,56 +227,60 @@ const go = async () => {
log_reverse_geo: JSON.stringify(respData), log_reverse_geo: JSON.stringify(respData),
crt: now, crt: now,
crt_format: moment.unix(now).format("YYYY-MM-DD HH:mm:ss"), crt_format: moment.unix(now).format("YYYY-MM-DD HH:mm:ss"),
}) });
updtData.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_ER updtData.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_ER;
await GpsTracksModels.update2(tracks[i].id, updtData) await GpsTracksModels.update2(tracks[i].id, updtData);
} }
} catch (e) { } catch (e) {
let respData = {} let respData = {};
if (respReverseGeo) { if (respReverseGeo) {
if (respReverseGeo.status != 200) { if (respReverseGeo.status != 200) {
respData.data = respReverseGeo.data respData.data = respReverseGeo.data;
} else { } else {
respData.msg = e.message respData.msg = e.message;
} }
} else if (typeof e.response != "undefined") { } else if (typeof e.response != "undefined") {
respData.data = e.response respData.data = e.response;
} else { } else {
respData.msg = e.message respData.msg = e.message;
} }
console.log("typeof respData.data:", typeof respData.data);
console.log("isPlainObject:", Object.prototype.toString.call(respData.data) === "[object Object]");
GpsTracksModels.create2Address({ GpsTracksModels.create2Address({
device_id: tracks[i].device_id, device_id: tracks[i].device_id,
master_id: tracks[i].id, master_id: tracks[i].id,
lat: tracks[i].latitude, lat: tracks[i].latitude,
lng: tracks[i].longitude, lng: tracks[i].longitude,
stts_reverse_geo: GpsTracksModels.STTS_REVERSE_GEO_ER, stts_reverse_geo: GpsTracksModels.STTS_REVERSE_GEO_ER,
log_reverse_geo: JSON.stringify(respData), // log_reverse_geo: JSON.stringify(respData.data),
log_reverse_geo: stringify(respData.data),
crt: now, crt: now,
crt_format: moment.unix(now).format("YYYY-MM-DD HH:mm:ss"), crt_format: moment.unix(now).format("YYYY-MM-DD HH:mm:ss"),
}) });
updtData.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_ER updtData.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_ER;
await GpsTracksModels.update2(tracks[i].id, updtData) await GpsTracksModels.update2(tracks[i].id, updtData);
} }
} }
} }
} catch (e) { } catch (e) {
console.error(e) console.error(e);
Logger.log("error", `${schedulerName} error: ${JSON.stringify(e)}`) Logger.log("error", `${schedulerName} error: ${JSON.stringify(e)}`);
} }
// })(); // })();
Logger.log("info", `${schedulerName} success do reverse geocoding ${moment().format("YYYY-MM-DD HH:mm:ss")}`) Logger.log("info", `${schedulerName} success do reverse geocoding ${moment().format("YYYY-MM-DD HH:mm:ss")}`);
} catch (e) { } catch (e) {
Logger.log("error", `${schedulerName} error: ${JSON.stringify(e)}`) Logger.log("error", `${schedulerName} error: ${JSON.stringify(e)}`);
}
return true
} }
return true;
};
const index = async () => { const index = async () => {
while (1 == 1) { while (1 == 1) {
await go() await go();
await new Promise((r) => setTimeout(r, 300)) await new Promise((r) => setTimeout(r, 300));
}
} }
};
index() index();

41
package-lock.json generated
View File

@ -21,6 +21,7 @@
"ejs": "^3.1.6", "ejs": "^3.1.6",
"express": "^4.17.2", "express": "^4.17.2",
"firebase-admin": "^10.3.0", "firebase-admin": "^10.3.0",
"flatted": "^3.3.3",
"formidable": "^2.0.1", "formidable": "^2.0.1",
"gps-tracking": "^1.1.1", "gps-tracking": "^1.1.1",
"ioredis": "^4.28.3", "ioredis": "^4.28.3",
@ -399,6 +400,30 @@
"tinycolor2": "^1.4.1" "tinycolor2": "^1.4.1"
} }
}, },
"node_modules/@jimp/core/node_modules/buffer": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT",
"dependencies": {
"base64-js": "^1.3.1",
"ieee754": "^1.1.13"
}
},
"node_modules/@jimp/core/node_modules/mkdirp": { "node_modules/@jimp/core/node_modules/mkdirp": {
"version": "0.5.6", "version": "0.5.6",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
@ -1221,9 +1246,9 @@
} }
}, },
"node_modules/buffer": { "node_modules/buffer": {
"version": "5.7.1", "version": "6.0.3",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
"funding": [ "funding": [
{ {
"type": "github", "type": "github",
@ -1238,9 +1263,11 @@
"url": "https://feross.org/support" "url": "https://feross.org/support"
} }
], ],
"license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"base64-js": "^1.3.1", "base64-js": "^1.3.1",
"ieee754": "^1.1.13" "ieee754": "^1.2.1"
} }
}, },
"node_modules/buffer-equal": { "node_modules/buffer-equal": {
@ -1883,6 +1910,12 @@
"@google-cloud/storage": "^5.18.3" "@google-cloud/storage": "^5.18.3"
} }
}, },
"node_modules/flatted": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
"integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
"license": "ISC"
},
"node_modules/fn.name": { "node_modules/fn.name": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",

View File

@ -26,6 +26,7 @@
"ejs": "^3.1.6", "ejs": "^3.1.6",
"express": "^4.17.2", "express": "^4.17.2",
"firebase-admin": "^10.3.0", "firebase-admin": "^10.3.0",
"flatted": "^3.3.3",
"formidable": "^2.0.1", "formidable": "^2.0.1",
"gps-tracking": "^1.1.1", "gps-tracking": "^1.1.1",
"ioredis": "^4.28.3", "ioredis": "^4.28.3",