This commit is contained in:
wayanrivan
2026-07-29 08:59:49 +07:00
parent 504fb02c3d
commit 319dbbe7bb

View File

@ -144,117 +144,117 @@ class GpsTracksModels {
}) })
} }
static bundleCreate2(logs = {}, rltm = {}) { // static bundleCreate2(logs = {}, rltm = {}) {
// console.log(rltm.device_id + " : Start bundleCreate2") // // console.log(rltm.device_id + " : Start bundleCreate2")
return new Promise(async (resolve, reject) => { // return new Promise(async (resolve, reject) => {
try { // try {
const conn = await MysqlHelpers.createConnection() // const conn = await MysqlHelpers.createConnection()
await MysqlHelpers.createTrx(conn) // await MysqlHelpers.createTrx(conn)
// console.log("createTrx : " + rltm.device_id) // // console.log("createTrx : " + rltm.device_id)
let rltmLength = Object.keys(rltm).length // let rltmLength = Object.keys(rltm).length
let resLogs = undefined // let resLogs = undefined
if (Object.keys(logs).length > 0) { // if (Object.keys(logs).length > 0) {
resLogs = await MysqlHelpers.queryTrx( // resLogs = await MysqlHelpers.queryTrx(
conn, // conn,
`INSERT INTO t_gps_tracks SET ?;`, // `INSERT INTO t_gps_tracks SET ?;`,
[logs], // [logs],
) // )
// console.log("insert t_gps_tracks : " + rltm.device_id) // // console.log("insert t_gps_tracks : " + rltm.device_id)
if (logs.action == "location") { // if (logs.action == "location") {
const date = logs.crt_d // const date = logs.crt_d
const mm = moment.unix(date).format("MM") // const mm = moment.unix(date).format("MM")
const yy = moment.unix(date).format("YY") // const yy = moment.unix(date).format("YY")
logs.id = resLogs.insertId // logs.id = resLogs.insertId
try { // try {
await MysqlHelpers.queryTrx( // await MysqlHelpers.queryTrx(
conn, // conn,
` // `
INSERT INTO tracks_${yy}${mm} // INSERT INTO tracks_${yy}${mm}
SET ? // SET ?
`, // `,
[logs], // [logs],
) // )
} catch (error) { // } catch (error) {
console.log(error) // console.log(error)
fs.appendFileSync( // fs.appendFileSync(
path.join(__dirname, `error_data_log.txt`), // path.join(__dirname, `error_data_log.txt`),
JSON.stringify(logs) + `\n`, // JSON.stringify(logs) + `\n`,
) // )
} // }
// console.log("insert tracks_${yy}${mm} : " + rltm.device_id) // // console.log("insert tracks_${yy}${mm} : " + rltm.device_id)
} // }
} // }
if (rltmLength > 0 && typeof resLogs !== "undefined") // if (rltmLength > 0 && typeof resLogs !== "undefined")
rltm.master_id = resLogs.insertId // rltm.master_id = resLogs.insertId
if ( // if (
rltmLength > 0 && // rltmLength > 0 &&
rltm.latitude !== null && // rltm.latitude !== null &&
rltm.longitude !== null // rltm.longitude !== null
) { // ) {
let devices = await MysqlHelpers.queryTrx( // let devices = await MysqlHelpers.queryTrx(
conn, // conn,
`SELECT id FROM t_gps_tracks_rltm as rltm WHERE rltm.device_id = ?`, // `SELECT id FROM t_gps_tracks_rltm as rltm WHERE rltm.device_id = ?`,
[rltm.device_id], // [rltm.device_id],
) // )
if (devices.length > 1) // if (devices.length > 1)
await MysqlHelpers.queryTrx( // await MysqlHelpers.queryTrx(
conn, // conn,
`DELETE from t_gps_tracks_rltm WHERE device_id = ?;`, // `DELETE from t_gps_tracks_rltm WHERE device_id = ?;`,
[rltm.device_id], // [rltm.device_id],
) // )
if (rltm.vhc_id != 0) { // if (rltm.vhc_id != 0) {
let vhcs = await MysqlHelpers.queryTrx( // let vhcs = await MysqlHelpers.queryTrx(
conn, // conn,
`SELECT id FROM t_gps_tracks_rltm as rltm WHERE rltm.vhc_id = ?`, // `SELECT id FROM t_gps_tracks_rltm as rltm WHERE rltm.vhc_id = ?`,
[rltm.vhc_id], // [rltm.vhc_id],
) // )
if (vhcs.length > 1) // if (vhcs.length > 1)
await MysqlHelpers.queryTrx( // await MysqlHelpers.queryTrx(
conn, // conn,
`DELETE from t_gps_tracks_rltm WHERE vhc_id = ?;`, // `DELETE from t_gps_tracks_rltm WHERE vhc_id = ?;`,
[rltm.vhc_id], // [rltm.vhc_id],
) // )
} // }
if (rltm.drv_id != 0) { // if (rltm.drv_id != 0) {
let drvs = await MysqlHelpers.queryTrx( // let drvs = await MysqlHelpers.queryTrx(
conn, // conn,
`SELECT id FROM t_gps_tracks_rltm as rltm WHERE rltm.drv_id = ?`, // `SELECT id FROM t_gps_tracks_rltm as rltm WHERE rltm.drv_id = ?`,
[rltm.drv_id], // [rltm.drv_id],
) // )
if (drvs.length > 1) // if (drvs.length > 1)
await MysqlHelpers.queryTrx( // await MysqlHelpers.queryTrx(
conn, // conn,
`DELETE from t_gps_tracks_rltm WHERE drv_id = ?;`, // `DELETE from t_gps_tracks_rltm WHERE drv_id = ?;`,
[rltm.drv_id], // [rltm.drv_id],
) // )
} // }
await MysqlHelpers.queryTrx( // await MysqlHelpers.queryTrx(
conn, // conn,
`INSERT INTO t_gps_tracks_rltm SET ? ON DUPLICATE KEY UPDATE ?;`, // `INSERT INTO t_gps_tracks_rltm SET ? ON DUPLICATE KEY UPDATE ?;`,
[rltm, rltm], // [rltm, rltm],
) // )
} // }
await MysqlHelpers.commit(conn) // await MysqlHelpers.commit(conn)
// console.log("Commit bundleCreate2 : " + rltm.device_id) // // console.log("Commit bundleCreate2 : " + rltm.device_id)
resolve({ // resolve({
type: "success", // type: "success",
result: resLogs, // result: resLogs,
}) // })
} catch (err) { // } catch (err) {
console.log("ERROR bundleCreate2 : " + rltm.device_id) // console.log("ERROR bundleCreate2 : " + rltm.device_id)
reject(err) // reject(err)
} // }
}) // })
} // }
/** MUTEX ESPECIALLY FOR RLTM */ /** MUTEX ESPECIALLY FOR RLTM */
@ -391,149 +391,149 @@ class GpsTracksModels {
/** MUTEX FOR ALL REQUEST */ /** MUTEX FOR ALL REQUEST */
// static bundleCreate2(logs = {}, rltm = {}) { static bundleCreate2(logs = {}, rltm = {}) {
// return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
// let lock = null let lock = null
// let conn = null let conn = null
// try { try {
// conn = await MysqlHelpers.createConnection() conn = await MysqlHelpers.createConnection()
// await MysqlHelpers.createTrx(conn) await MysqlHelpers.createTrx(conn)
// let rltmLength = Object.keys(rltm).length let rltmLength = Object.keys(rltm).length
// let resLogs = undefined let resLogs = undefined
// if (Object.keys(logs).length > 0) { if (Object.keys(logs).length > 0) {
// resLogs = await MysqlHelpers.queryTrx( resLogs = await MysqlHelpers.queryTrx(
// conn, conn,
// `INSERT INTO t_gps_tracks SET ?;`, `INSERT INTO t_gps_tracks SET ?;`,
// [logs], [logs],
// ) )
// let trackLock = null let trackLock = null
// try { try {
// if (logs.action == "location") { if (logs.action == "location") {
// trackLock = await rltmMutex.lock( trackLock = await rltmMutex.lock(
// `tracks_insert:${logs.device_id}`, `tracks_insert:${logs.device_id}`,
// { {
// duration: 90000, duration: 90000,
// maxWait: 90000, maxWait: 90000,
// } }
// ) )
// const date = logs.crt_d const date = logs.crt_d
// const mm = moment.unix(date).format("MM") const mm = moment.unix(date).format("MM")
// const yy = moment.unix(date).format("YY") const yy = moment.unix(date).format("YY")
// logs.id = resLogs.insertId logs.id = resLogs.insertId
// await MysqlHelpers.queryTrx( await MysqlHelpers.queryTrx(
// conn, conn,
// ` `
// INSERT INTO tracks_${yy}${mm} INSERT INTO tracks_${yy}${mm}
// SET ? SET ?
// `, `,
// [logs] [logs]
// ) )
// } }
// } finally { } finally {
// if (trackLock) { if (trackLock) {
// await rltmMutex.unlock(trackLock) await rltmMutex.unlock(trackLock)
// } }
// // conn.release(); // conn.release();
// } }
// } }
// if (rltmLength > 0 && typeof resLogs !== "undefined") if (rltmLength > 0 && typeof resLogs !== "undefined")
// rltm.master_id = resLogs.insertId rltm.master_id = resLogs.insertId
// if ( if (
// rltmLength > 0 && rltmLength > 0 &&
// rltm.latitude !== null && rltm.latitude !== null &&
// rltm.longitude !== null rltm.longitude !== null
// ) { ) {
// // === KUNCI DI SINI === // === KUNCI DI SINI ===
// // Lock per device_id supaya SELECT-DELETE-INSERT untuk // Lock per device_id supaya SELECT-DELETE-INSERT untuk
// // device yang sama tidak berjalan bersamaan dari request/worker // device yang sama tidak berjalan bersamaan dari request/worker
// // lain. Inilah yang tadinya memicu ER_DUP_ENTRY dan // lain. Inilah yang tadinya memicu ER_DUP_ENTRY dan
// // "Lock wait timeout" karena banyak transaksi menumpuk // "Lock wait timeout" karena banyak transaksi menumpuk
// // menunggu baris yang sama. // menunggu baris yang sama.
// lock = await rltmMutex.lock(`t_gps_tracks_rltm:${rltm.device_id}`, { lock = await rltmMutex.lock(`t_gps_tracks_rltm:${rltm.device_id}`, {
// duration: 90000, // maksimal lock dipegang 5 detik duration: 90000, // maksimal lock dipegang 5 detik
// maxWait: 90000, // menunggu lock maksimal 10 detik lalu error maxWait: 90000, // menunggu lock maksimal 10 detik lalu error
// }) })
// let devices = await MysqlHelpers.queryTrx( let devices = await MysqlHelpers.queryTrx(
// conn, conn,
// `SELECT id FROM t_gps_tracks_rltm as rltm WHERE rltm.device_id = ?`, `SELECT id FROM t_gps_tracks_rltm as rltm WHERE rltm.device_id = ?`,
// [rltm.device_id], [rltm.device_id],
// ) )
// if (devices.length > 1) if (devices.length > 1)
// await MysqlHelpers.queryTrx( await MysqlHelpers.queryTrx(
// conn, conn,
// `DELETE from t_gps_tracks_rltm WHERE device_id = ?;`, `DELETE from t_gps_tracks_rltm WHERE device_id = ?;`,
// [rltm.device_id], [rltm.device_id],
// ) )
// if (rltm.vhc_id != 0) { if (rltm.vhc_id != 0) {
// let vhcs = await MysqlHelpers.queryTrx( let vhcs = await MysqlHelpers.queryTrx(
// conn, conn,
// `SELECT id FROM t_gps_tracks_rltm as rltm WHERE rltm.vhc_id = ?`, `SELECT id FROM t_gps_tracks_rltm as rltm WHERE rltm.vhc_id = ?`,
// [rltm.vhc_id], [rltm.vhc_id],
// ) )
// if (vhcs.length > 1) if (vhcs.length > 1)
// await MysqlHelpers.queryTrx( await MysqlHelpers.queryTrx(
// conn, conn,
// `DELETE from t_gps_tracks_rltm WHERE vhc_id = ?;`, `DELETE from t_gps_tracks_rltm WHERE vhc_id = ?;`,
// [rltm.vhc_id], [rltm.vhc_id],
// ) )
// } }
// if (rltm.drv_id != 0) { if (rltm.drv_id != 0) {
// let drvs = await MysqlHelpers.queryTrx( let drvs = await MysqlHelpers.queryTrx(
// conn, conn,
// `SELECT id FROM t_gps_tracks_rltm as rltm WHERE rltm.drv_id = ?`, `SELECT id FROM t_gps_tracks_rltm as rltm WHERE rltm.drv_id = ?`,
// [rltm.drv_id], [rltm.drv_id],
// ) )
// if (drvs.length > 1) if (drvs.length > 1)
// await MysqlHelpers.queryTrx( await MysqlHelpers.queryTrx(
// conn, conn,
// `DELETE from t_gps_tracks_rltm WHERE drv_id = ?;`, `DELETE from t_gps_tracks_rltm WHERE drv_id = ?;`,
// [rltm.drv_id], [rltm.drv_id],
// ) )
// } }
// await MysqlHelpers.queryTrx( await MysqlHelpers.queryTrx(
// conn, conn,
// `INSERT INTO t_gps_tracks_rltm SET ? ON DUPLICATE KEY UPDATE ?;`, `INSERT INTO t_gps_tracks_rltm SET ? ON DUPLICATE KEY UPDATE ?;`,
// [rltm, rltm], [rltm, rltm],
// ) )
// } }
// await MysqlHelpers.commit(conn) await MysqlHelpers.commit(conn)
// resolve({ resolve({
// type: "success", type: "success",
// result: resLogs, result: resLogs,
// }) })
// } catch (err) { } catch (err) {
// console.log("ERROR bundleCreate2 : " + rltm.device_id) console.log("ERROR bundleCreate2 : " + rltm.device_id)
// reject(err) reject(err)
// } finally { } finally {
// // Lock selalu dilepas, baik sukses maupun gagal, // Lock selalu dilepas, baik sukses maupun gagal,
// // supaya tidak deadlock request device yang sama berikutnya. // supaya tidak deadlock request device yang sama berikutnya.
// if (lock) { if (lock) {
// try { try {
// await rltmMutex.unlock(lock) await rltmMutex.unlock(lock)
// } catch (unlockErr) { } catch (unlockErr) {
// console.log("ERROR unlock mutex : " + rltm.device_id, unlockErr) console.log("ERROR unlock mutex : " + rltm.device_id, unlockErr)
// } }
// } }
// conn.release(); // release connection conn.release(); // release connection
// } }
// }) })
// } }
static async get2() { static async get2() {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {