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

137 lines
5.5 KiB
JavaScript
Executable File

const SandboxedJobMQ = require('bullmq').SandboxedJob;
const LibWinston = require('../library/LibWinston');
const LibMail = require('../library/LibMail');
const moment = require('moment');
const GpsTracksModels = require('../models/GpsTracksModels');
const OrdersModels = require('../models/OrdersModels');
const OrdersVendorsModels = require('../models/OrdersVendorsModels');
const UsersModels = require('../models/UsersModels');
const queueName = process.env.REDIS_QUEUE_BLAST_ORDER;
const Logger = LibWinston.initialize(queueName);
module.exports = async (job) => {
try {
Logger.log('info', `${queueName} running: ${JSON.stringify(job.opts)}`);
const now = moment().unix();
const { ord_id, ord_code, base_link } = job.data;
if (!ord_id || !ord_code || !base_link) {
Logger.log('info', `${queueName} running_fail: data not valid`);
return {
type: 'fail',
message: 'data not valid',
data: null,
};
}
const order = await OrdersModels.showOrder({
'id': ord_id,
});
if (order.length < 1) {
Logger.log('info', `${queueName} running_fail: order not found on order_id ${ord_id}`);
return {
type: 'fail',
message: `order not found on order_id ${ord_id}`,
data: null,
};
}
++order[0].count_sch_blast_order;
// check is accepted
if (order[0].ord_vdr_id) {
Logger.log('info', `${queueName} running_info: order have been accepted by another vendor ${order[0].ord_vdr_id} on order_id ${ord_id}`);
return {
type: 'success',
message: 'order have been accepted by another vendor',
data: null,
};
}
// Kirim ke admin bahwa tidak ada vendor yang acc 3x10 menit
if (order[0].count_sch_blast_order >= 3) {
Logger.log('info', `${queueName} running_info: No vendor accept this order on order_id ${ord_id} in 3x10 minutes`);
let admins = await UsersModels.getUsersActiveByRole(UsersModels.ROLE_ADMIN);
for (let admin of admins) {
LibMail.sendAdminInfoNoVdrAccOrd('Order Diabaikan oleh Vendor', admin.email, {
trx_code: order[0].ord_code,
trx_at: moment.unix(order[0].crt).format('DD MMM YYYY'),
admin_id: admin.id,
admin_name: admin.first_name,
admin_phone: '0' + admin.phone,
admin_mail: admin.email,
admin_addr: admin.fulladdress,
client_id: order[0].c_id,
client_name: order[0].c_name,
client_phone: '0' + order[0].c_phone_val,
client_mail: order[0].c_mail,
client_addr: '',
client_prefer_type_truck: '',
pickup_zone_title: order[0].pck_name,
pickup_zone_addr: order[0].pck_addr,
pickup_at: order[0].set_pck_at,
drop_zone_title: order[0].drop_name,
drop_zone_addr: order[0].drop_addr,
});
}
return {
type: 'fail',
message: `No vendor accept this order on order_id ${ord_id} in 3x10 minutes`,
data: null,
};
}
OrdersModels.updt(order[0].ord_id, {
count_sch_blast_order: order[0].count_sch_blast_order,
});
// blast to other vendor
const nextVendors = await OrdersVendorsModels.getNextVendorsByOrdId(ord_id);
if (nextVendors.length > 0) {
for (let key in nextVendors) {
const blastToVendor = await OrdersVendorsModels.getById(nextVendors[key].id);
if (blastToVendor.length < 1) {
Logger.log('info', `${queueName} running_fail: vendor ${nextVendors[key].vdr_id} want to blast not found on order_id ${ord_id[key]}`);
continue;
}
// kalau expirednya mau diupdate
if (blastToVendor[0].status === OrdersVendorsModels.STTS_WAIT && blastToVendor[0].is_want === OrdersVendorsModels.IS_WANT_IGNORE) {
await OrdersVendorsModels.updt(nextVendors[key].id, {
is_exp: OrdersVendorsModels.LINK_WILL_EXP,
exp_at: moment.unix(now).add(10, 'minutes').unix(),
// exp_at: moment.unix(now).add(1, 'day').unix(),
});
}
const bidOrderMailData = {
trx_code: order[0].ord_code,
// client_id: order[0].ord_client_id,
client_name: order[0].c_name,
client_phone: '0' + order[0].c_phone_val,
client_mail: order[0].c_mail,
// client_addr,
client_prefer_type_truck: order[0].prefer_type_truck,
pickup_zone_title: order[0].pck_name,
pickup_zone_addr: order[0].pck_addr,
pickup_at: moment.unix(order[0].set_pck_at).format('DD MMM YYYY HH:mm') + ' WIB',
drop_zone_title: order[0].drop_name,
drop_zone_addr: order[0].drop_addr,
// vendor_id: blastToVendor[0].vdr_id,
vendor_name: blastToVendor[0].vdr_name,
vendor_phone: '0' + blastToVendor[0].vdr_phone_val,
vendor_mail: blastToVendor[0].vdr_mail,
vendor_addr: blastToVendor[0].vdr_addr,
vendor_acc_link: base_link + blastToVendor[0].bid_token,
};
LibMail.sendBidOrderMail('Ada Order Masuk', blastToVendor[0].vdr_mail, bidOrderMailData);
}
} else {
Logger.log('info', `${queueName} running_info: No next vendors, mean all vendors want but no accepted on order_id ${ord_id} in 3x10 minutes`);
}
// Logger.log('error', `${queueName} running_error: ${JSON.stringify(e, Object.getOwnPropertyNames(e))}`);
return {
type: 'success',
message: 'success do blast order to vendor',
data: null,
};
} catch (e) {
return {
type: 'error',
message: e.message,
e: e,
};
}
};