137 lines
5.5 KiB
JavaScript
Executable File
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,
|
|
};
|
|
}
|
|
}; |