107 lines
2.7 KiB
JavaScript
107 lines
2.7 KiB
JavaScript
const utils = require("./utils");
|
|
const db = require("./db");
|
|
const sync = require("./sync"));
|
|
const metamgr = require("./metamgr");
|
|
const boxorder = require("./boxorder");
|
|
|
|
class OrderMgr {
|
|
|
|
constructor() {
|
|
this.pendingOrderHash = {};
|
|
this.historyOrderCond = new sync.Cond();
|
|
this.newOrderCond = new sync.Cond();
|
|
}
|
|
|
|
init() {
|
|
setTimeout(this.coStart.bind(this), 1000 * 0.1);
|
|
}
|
|
|
|
async coStart() {
|
|
let {err, row} = await db.execOneQuery(
|
|
'SELECT max(idx) max_idx FROM t_box_order', []);
|
|
if (err) {
|
|
throw err;
|
|
}
|
|
let hisMaxIdx = utils.emptyReplace(row['max_idx'], 0);
|
|
hisMaxIdx = Math.max(0, hisMaxIdx);
|
|
setTimeout(this.coHistoryOrder.bind(this, hisMaxIdx), 1000 * 0.1);
|
|
setTimeout(this.coNewOrder.bind(this, hisMaxIdx), 1000 * 0.1);
|
|
}
|
|
|
|
async coHistoryOrder(hisMaxIdx) {
|
|
let lastSyncIdx = hisMaxIdx;
|
|
while (lastSyncIdx > 0) {
|
|
let startIdx = Math.Max(0, lastSyncIdx - 1000);
|
|
let {err, rows} = await db.execQuery(
|
|
'SELECT * max_idx FROM t_box_order WHERE idx > ? AND idx <= ? AND done = 0 LIMIT 1000',
|
|
[startIdx, lastSyncIdx]);
|
|
if (!err) {
|
|
procHisOrderList(rows);
|
|
lastSyncIdx = startIdx;
|
|
if (rows.length() <= 0) {
|
|
continue;
|
|
}
|
|
}
|
|
await this.historyOrderCond.wait(1000 * 1);
|
|
}
|
|
log.info('history order loaded done hisMaxIdx:' + hisMaxIdx);
|
|
}
|
|
|
|
async coNewOrder(hisMaxIdx) {
|
|
let lastSyncIdx = hisMaxIdx;
|
|
while (true) {
|
|
let {err, rows} = await db.execQuery(
|
|
'SELECT * max_idx FROM t_box_order WHERE idx > ? AND done = 0 LIMIT 100',
|
|
[lastSyncIdx]);
|
|
if (!err) {
|
|
let maxIdx = procNewOrderList(rows);
|
|
if (maxIdx > lastSyncIdx) {
|
|
lastSyncIdx = maxIdx;
|
|
}
|
|
}
|
|
await this.newOrderCond.wait(1000 * 3);
|
|
}
|
|
}
|
|
|
|
newOrderNotify() {
|
|
this.newOrderCond.notify();
|
|
}
|
|
|
|
procHisOrderList(rows) {
|
|
this.internalProcOrderList(rows, false);
|
|
}
|
|
|
|
procNewOrderList(rows) {
|
|
this.internalProcOrderList(rows, true);
|
|
}
|
|
|
|
internalProcOrderList(rows, isNewOrder) {
|
|
let maxIdx = 0;
|
|
rows.forEach(function (orderDb) {
|
|
this.addPendingOrder(orderDb, isNewOrder);
|
|
if (orderDb['idx'] > maxIdx) {
|
|
maxIdx = orderDb['idx'];
|
|
}
|
|
});
|
|
return maxIdx;
|
|
}
|
|
|
|
addPendingOrder(orderDb) {
|
|
if (orderDb['order_id'] in this.pendingOrderHash) {
|
|
throw 'order_id exists ' + orderDb['order_id'];
|
|
}
|
|
let boxOrder = new boxorder.BoxOrder(orderDb);
|
|
this.pendingOrderHash[orderDb['order_id']] = boxOrder;
|
|
boxOrder.init();
|
|
}
|
|
|
|
removePendingOrder(orderId) {
|
|
delete this.pendingOrderHash[orderId];
|
|
}
|
|
|
|
}
|
|
|
|
var _instance = new OrderMgr();
|
|
|
|
module.exports = _instance;
|