From cbca1b92f02d44e35dc5ad92aeb0948d54094418 Mon Sep 17 00:00:00 2001 From: meusinfirmary Date: Thu, 12 Jun 2025 01:38:34 +0700 Subject: [PATCH] upadate --- cron/ReverseGeocodeWorker.js | 214 ++++++++++++++++++----------------- package-lock.json | 41 ++++++- package.json | 1 + 3 files changed, 151 insertions(+), 105 deletions(-) diff --git a/cron/ReverseGeocodeWorker.js b/cron/ReverseGeocodeWorker.js index 2ed82e8..1fc2751 100644 --- a/cron/ReverseGeocodeWorker.js +++ b/cron/ReverseGeocodeWorker.js @@ -1,31 +1,32 @@ -require("dotenv").config({ path: "../.env" }) -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") +require("dotenv").config({ path: "../.env" }); +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 { stringify } = require("flatted"); -const schedulerName = process.env.REDIS_SCHEDULER_REVERSE_GEO -const Logger = LibWinston.initialize(schedulerName) +const schedulerName = process.env.REDIS_SCHEDULER_REVERSE_GEO; +const Logger = LibWinston.initialize(schedulerName); const go = async () => { 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() { 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++) { // let tracks = []; - let tracks = await GpsTracksModels.get2ForReverseGeo(1) + let tracks = await GpsTracksModels.get2ForReverseGeo(1); 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) - let now = moment().unix() - let updtData = {} - let respReverseGeo = null + console.log("tracks[i] :", tracks[i].id, tracks[i].device_id, tracks[i].latitude, tracks[i].longitude); + let now = moment().unix(); + let updtData = {}; + let respReverseGeo = null; 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) { let addrData = { @@ -53,37 +54,44 @@ const go = async () => { 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 + }; + 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() const axInstance = axios.create({ - proxy: { - host: process.env.PROXY_URL, - port: process.env.PROXY_PORT, }, + proxy: { + host: process.env.PROXY_URL, + port: process.env.PROXY_PORT, + }, }); - axios.defaults.timeout = 10000 - axios.defaults.crossDomain = true + axios.defaults.timeout = 10000; + 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: 10000, + // }); respReverseGeo = await axInstance.get(request.osm_reverse_geo.urlFull + "?" + params.toString(), { timeout: 10000, - }) - console.log("respReverseGeo: ",respReverseGeo.data || null ) - let respData = respReverseGeo.data || {} + headers: { + "User-Agent": "movana-fleet-management/1.0 (emirsyafmun@gmail.com)", + }, + }); + console.log("respReverseGeo: ", respReverseGeo.data || null); + let respData = respReverseGeo.data || {}; if (respReverseGeo.status == 200) { if (respData.features.length < 1) { GpsTracksModels.create2Address({ @@ -95,11 +103,11 @@ const go = async () => { 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) + }); + 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 respAddr = respData.features[0].properties.address; let addrData = { device_id: tracks[i].device_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, 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 + 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 + 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 + 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 + 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 + 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)) + addrData.streets = encodeURIComponent(addrData.streets.slice(0, -2)); } } @@ -157,57 +165,57 @@ const go = async () => { 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 + 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 + 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 }) + let byPr = await RegionModels.whereLike({ nmProvinsiKel: addrData.state_text }); 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) { - let byKt = await RegionModels.whereLike({ nmKotamadyaKel: addrData.city_text }) + let byKt = await RegionModels.whereLike({ nmKotamadyaKel: addrData.city_text }); 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) { - let byKc = await RegionModels.whereLike({ nmKecamatanKel: addrData.district_text }) + let byKc = await RegionModels.whereLike({ nmKecamatanKel: addrData.district_text }); 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) { - let byKl = await RegionModels.whereLike({ nmKelurahan: addrData.village_text }) + let byKl = await RegionModels.whereLike({ nmKelurahan: addrData.village_text }); if (byKl.length > 0) { - addrData.village_id = byKl[0].kodeKel + 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) + 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({ @@ -219,56 +227,60 @@ const go = async () => { 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) + }); + updtData.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_ER; + await GpsTracksModels.update2(tracks[i].id, updtData); } } catch (e) { - let respData = {} + let respData = {}; if (respReverseGeo) { if (respReverseGeo.status != 200) { - respData.data = respReverseGeo.data + respData.data = respReverseGeo.data; } else { - respData.msg = e.message + respData.msg = e.message; } } else if (typeof e.response != "undefined") { - respData.data = e.response + respData.data = e.response; } 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({ 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), + // log_reverse_geo: JSON.stringify(respData.data), + log_reverse_geo: stringify(respData.data), 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) + }); + updtData.stts_reverse_geo = GpsTracksModels.STTS_REVERSE_GEO_ER; + await GpsTracksModels.update2(tracks[i].id, updtData); } } } } catch (e) { - console.error(e) - Logger.log("error", `${schedulerName} error: ${JSON.stringify(e)}`) + console.error(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) { - Logger.log("error", `${schedulerName} error: ${JSON.stringify(e)}`) + Logger.log("error", `${schedulerName} error: ${JSON.stringify(e)}`); } - return true -} + return true; +}; const index = async () => { while (1 == 1) { - await go() - await new Promise((r) => setTimeout(r, 300)) + await go(); + await new Promise((r) => setTimeout(r, 300)); } -} +}; -index() +index(); diff --git a/package-lock.json b/package-lock.json index 13678a9..452e6be 100755 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "ejs": "^3.1.6", "express": "^4.17.2", "firebase-admin": "^10.3.0", + "flatted": "^3.3.3", "formidable": "^2.0.1", "gps-tracking": "^1.1.1", "ioredis": "^4.28.3", @@ -399,6 +400,30 @@ "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": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -1221,9 +1246,9 @@ } }, "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -1238,9 +1263,11 @@ "url": "https://feross.org/support" } ], + "license": "MIT", + "peer": true, "dependencies": { "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "ieee754": "^1.2.1" } }, "node_modules/buffer-equal": { @@ -1883,6 +1910,12 @@ "@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": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", diff --git a/package.json b/package.json index c7b8eca..8facd5f 100755 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "ejs": "^3.1.6", "express": "^4.17.2", "firebase-admin": "^10.3.0", + "flatted": "^3.3.3", "formidable": "^2.0.1", "gps-tracking": "^1.1.1", "ioredis": "^4.28.3",