@chevre/domain 24.0.0-alpha.30 → 24.0.0-alpha.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/chevre/repo/aggregateAction.js +1 -1
- package/lib/chevre/repo/mongoose/schemas/reservation.d.ts +1 -1
- package/lib/chevre/repo/order.js +2 -1
- package/lib/chevre/repo/reservation.d.ts +6 -24
- package/lib/chevre/repo/reservation.js +35 -48
- package/lib/chevre/repository.d.ts +0 -5
- package/lib/chevre/repository.js +1 -12
- package/lib/chevre/service/assetTransaction/cancelReservation/factory.js +1 -17
- package/lib/chevre/service/assetTransaction/reserve/start/factory/createReservation.js +1 -41
- package/lib/chevre/service/assetTransaction/reserve/start/factory/createStartParams.js +1 -11
- package/lib/chevre/service/assetTransaction/reserve/start.js +2 -5
- package/lib/chevre/service/delivery/factory.js +0 -1
- package/lib/chevre/service/delivery/reservation/factory.js +8 -13
- package/lib/chevre/service/offer/event/authorize/factory.js +0 -38
- package/lib/chevre/service/offer/event/authorize/processStartReserve4chevre.d.ts +0 -2
- package/lib/chevre/service/offer/event/authorize.d.ts +4 -3
- package/lib/chevre/service/offer/event/authorize.js +22 -21
- package/lib/chevre/service/offer/event/voidTransaction.d.ts +2 -0
- package/lib/chevre/service/offer/event/voidTransactionByActionId.d.ts +5 -0
- package/lib/chevre/service/offer/event/voidTransactionByActionId.js +2 -2
- package/lib/chevre/service/order/deleteOrder.js +1 -1
- package/lib/chevre/service/order/onOrderStatusChanged/onOrderProcessing/processOrder.js +1 -2
- package/lib/chevre/service/order/placeOrder/createPlacingOrderFromExistingTransaction.d.ts +7 -6
- package/lib/chevre/service/order/placeOrder/factory/orderedItem.js +0 -20
- package/lib/chevre/service/order/placeOrder/factory.js +0 -1
- package/lib/chevre/service/report.d.ts +1 -2
- package/lib/chevre/service/report.js +1 -3
- package/lib/chevre/service/reserve/cancelReservation.js +4 -11
- package/lib/chevre/service/reserve/findByCode.d.ts +1 -1
- package/lib/chevre/service/reserve/potentialActions/onReservationCanceled.d.ts +1 -2
- package/lib/chevre/service/reserve/potentialActions/onReservationCanceled.js +1 -0
- package/lib/chevre/service/reserve/searchByOrder.d.ts +1 -1
- package/lib/chevre/service/task/voidReserveTransaction.js +2 -0
- package/lib/chevre/service/transaction/placeOrder/confirm/validation.js +2 -4
- package/lib/chevre/service/transaction/placeOrder/confirm.js +1 -3
- package/lib/chevre/service/validation/validateOrder.js +1 -3
- package/package.json +2 -2
- package/lib/chevre/repo/mongoose/schemas/telemetry.d.ts +0 -10
- package/lib/chevre/repo/mongoose/schemas/telemetry.js +0 -80
- package/lib/chevre/repo/telemetry.d.ts +0 -9
- package/lib/chevre/repo/telemetry.js +0 -14
- package/lib/chevre/service/report/telemetry.d.ts +0 -313
- package/lib/chevre/service/report/telemetry.js +0 -444
|
@@ -1,444 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
-
};
|
|
28
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.TelemetryPurposeType = exports.TelemetryScope = void 0;
|
|
30
|
-
exports.searchGlobalFlow = searchGlobalFlow;
|
|
31
|
-
exports.searchGlobalStock = searchGlobalStock;
|
|
32
|
-
exports.searchSellerFlow = searchSellerFlow;
|
|
33
|
-
exports.searchSellerStock = searchSellerStock;
|
|
34
|
-
exports.search = search;
|
|
35
|
-
exports.createFlow = createFlow;
|
|
36
|
-
exports.createStock = createStock;
|
|
37
|
-
const debug_1 = __importDefault(require("debug"));
|
|
38
|
-
const moment_1 = __importDefault(require("moment"));
|
|
39
|
-
const factory = __importStar(require("../../factory"));
|
|
40
|
-
const debug = (0, debug_1.default)('chevre-domain:service');
|
|
41
|
-
const TELEMETRY_UNIT_OF_MEASUREMENT_IN_SECONDS = 60; // 測定単位時間(秒)
|
|
42
|
-
var TelemetryScope;
|
|
43
|
-
(function (TelemetryScope) {
|
|
44
|
-
TelemetryScope["Global"] = "Global";
|
|
45
|
-
TelemetryScope["Seller"] = "Seller";
|
|
46
|
-
})(TelemetryScope || (exports.TelemetryScope = TelemetryScope = {}));
|
|
47
|
-
var TelemetryPurposeType;
|
|
48
|
-
(function (TelemetryPurposeType) {
|
|
49
|
-
TelemetryPurposeType["Flow"] = "Flow";
|
|
50
|
-
TelemetryPurposeType["Stock"] = "Stock";
|
|
51
|
-
})(TelemetryPurposeType || (exports.TelemetryPurposeType = TelemetryPurposeType = {}));
|
|
52
|
-
function searchGlobalFlow(searchConditions) {
|
|
53
|
-
return search({ ...searchConditions, ...{ scope: TelemetryScope.Global, purpose: TelemetryPurposeType.Flow } });
|
|
54
|
-
}
|
|
55
|
-
function searchGlobalStock(searchConditions) {
|
|
56
|
-
return search({ ...searchConditions, ...{ scope: TelemetryScope.Global, purpose: TelemetryPurposeType.Stock } });
|
|
57
|
-
}
|
|
58
|
-
function searchSellerFlow(searchConditions) {
|
|
59
|
-
return search({ ...searchConditions, ...{ scope: TelemetryScope.Seller, purpose: TelemetryPurposeType.Flow } });
|
|
60
|
-
}
|
|
61
|
-
function searchSellerStock(searchConditions) {
|
|
62
|
-
return search({ ...searchConditions, ...{ scope: TelemetryScope.Seller, purpose: TelemetryPurposeType.Stock } });
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* 計測データを検索する
|
|
66
|
-
* @param searchConditions.measuredFrom 計測日時from
|
|
67
|
-
* @param searchConditions.measuredThrough 計測日時through
|
|
68
|
-
*/
|
|
69
|
-
function search(searchConditions) {
|
|
70
|
-
return async (repos) => {
|
|
71
|
-
return repos.telemetry.telemetryModel.find({
|
|
72
|
-
'object.scope': {
|
|
73
|
-
$exists: true,
|
|
74
|
-
$eq: searchConditions.scope
|
|
75
|
-
},
|
|
76
|
-
'object.measuredAt': {
|
|
77
|
-
$exists: true,
|
|
78
|
-
$gte: searchConditions.measuredFrom,
|
|
79
|
-
$lt: searchConditions.measuredThrough
|
|
80
|
-
},
|
|
81
|
-
'purpose.typeOf': {
|
|
82
|
-
$exists: true,
|
|
83
|
-
$eq: searchConditions.purpose
|
|
84
|
-
}
|
|
85
|
-
})
|
|
86
|
-
.sort({ 'object.measuredAt': 1 })
|
|
87
|
-
.lean()
|
|
88
|
-
.exec();
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* フロー測定データを作成する
|
|
93
|
-
*/
|
|
94
|
-
/* istanbul ignore next */
|
|
95
|
-
function createFlow(target) {
|
|
96
|
-
return async (repos) => {
|
|
97
|
-
const startDate = new Date();
|
|
98
|
-
const measuredThrough = (0, moment_1.default)(target.measuredAt);
|
|
99
|
-
const measuredFrom = (0, moment_1.default)(measuredThrough)
|
|
100
|
-
.add(-TELEMETRY_UNIT_OF_MEASUREMENT_IN_SECONDS, 'seconds');
|
|
101
|
-
let telemetry;
|
|
102
|
-
if (target.sellerId !== undefined) {
|
|
103
|
-
const flowData = await createSellerFlow(measuredFrom.toDate(), measuredThrough.toDate(), target.sellerId)(repos);
|
|
104
|
-
debug('flowData created.');
|
|
105
|
-
telemetry = {
|
|
106
|
-
purpose: { typeOf: TelemetryPurposeType.Flow },
|
|
107
|
-
object: {
|
|
108
|
-
scope: TelemetryScope.Seller,
|
|
109
|
-
measuredAt: target.measuredAt,
|
|
110
|
-
sellerId: target.sellerId
|
|
111
|
-
},
|
|
112
|
-
result: flowData,
|
|
113
|
-
startDate: startDate,
|
|
114
|
-
endDate: new Date()
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
const flowData = await createGlobalFlow(measuredFrom.toDate(), measuredThrough.toDate())({
|
|
119
|
-
task: repos.task
|
|
120
|
-
});
|
|
121
|
-
debug('flowData created.');
|
|
122
|
-
telemetry = {
|
|
123
|
-
purpose: { typeOf: TelemetryPurposeType.Flow },
|
|
124
|
-
object: {
|
|
125
|
-
scope: TelemetryScope.Global,
|
|
126
|
-
measuredAt: target.measuredAt
|
|
127
|
-
},
|
|
128
|
-
result: flowData,
|
|
129
|
-
startDate: startDate,
|
|
130
|
-
endDate: new Date()
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
await repos.telemetry.telemetryModel.create(telemetry);
|
|
134
|
-
debug('telemetry saved.');
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* ストック測定データを作成する
|
|
139
|
-
*/
|
|
140
|
-
/* istanbul ignore next */
|
|
141
|
-
function createStock(target) {
|
|
142
|
-
return async (repos) => {
|
|
143
|
-
const startDate = new Date();
|
|
144
|
-
let telemetry;
|
|
145
|
-
if (target.sellerId !== undefined) {
|
|
146
|
-
const stockData = await createSellerStock(target.measuredAt, target.sellerId)(repos);
|
|
147
|
-
debug('stockData created.');
|
|
148
|
-
telemetry = {
|
|
149
|
-
purpose: { typeOf: TelemetryPurposeType.Stock },
|
|
150
|
-
object: {
|
|
151
|
-
scope: TelemetryScope.Seller,
|
|
152
|
-
measuredAt: target.measuredAt,
|
|
153
|
-
sellerId: target.sellerId
|
|
154
|
-
},
|
|
155
|
-
result: stockData,
|
|
156
|
-
startDate: startDate,
|
|
157
|
-
endDate: new Date()
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
const stockData = await createGlobalStock(target.measuredAt)({ task: repos.task });
|
|
162
|
-
debug('stockData created.');
|
|
163
|
-
telemetry = {
|
|
164
|
-
purpose: { typeOf: TelemetryPurposeType.Stock },
|
|
165
|
-
object: {
|
|
166
|
-
scope: TelemetryScope.Global,
|
|
167
|
-
measuredAt: target.measuredAt
|
|
168
|
-
},
|
|
169
|
-
result: stockData,
|
|
170
|
-
startDate: startDate,
|
|
171
|
-
endDate: new Date()
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
await repos.telemetry.telemetryModel.create(telemetry);
|
|
175
|
-
debug('telemetry saved.');
|
|
176
|
-
};
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* フロー計測データーを作成する
|
|
180
|
-
* @param measuredFrom 計測開始日時
|
|
181
|
-
* @param measuredThrough 計測終了日時
|
|
182
|
-
*/
|
|
183
|
-
/* istanbul ignore next */
|
|
184
|
-
function createSellerFlow(measuredFrom, measuredThrough, sellerId) {
|
|
185
|
-
return async (repos) => {
|
|
186
|
-
const { sellerFlowTransactionResult, expiredTransactionIds } = await createSellerFlowTransactionResult(measuredFrom, measuredThrough, sellerId)(repos);
|
|
187
|
-
// 期限切れ取引数
|
|
188
|
-
const numberOfTransactionsExpired = sellerFlowTransactionResult.numberOfExpired;
|
|
189
|
-
// 期限切れ取引に対して作成されたアクションを取得
|
|
190
|
-
const actionsOnExpiredTransactions = await repos.action.search({
|
|
191
|
-
typeOf: { $eq: factory.actionType.AuthorizeAction },
|
|
192
|
-
purpose: { id: { $in: expiredTransactionIds } }
|
|
193
|
-
}, []);
|
|
194
|
-
debug(actionsOnExpiredTransactions.length, 'actionsOnExpiredTransactions found.');
|
|
195
|
-
const numbersOfActionsOnExpired = expiredTransactionIds.map((transactionId) => {
|
|
196
|
-
return actionsOnExpiredTransactions.filter((action) => action.purpose?.id === transactionId).length;
|
|
197
|
-
});
|
|
198
|
-
const totalNumberOfActionsOnExpired = numbersOfActionsOnExpired.reduce((a, b) => a + b, 0);
|
|
199
|
-
const maxNumberOfActionsOnExpired = numbersOfActionsOnExpired.reduce((a, b) => Math.max(a, b), 0);
|
|
200
|
-
const minNumberOfActionsOnExpired = numbersOfActionsOnExpired.reduce((a, b) => Math.min(a, b), (numberOfTransactionsExpired > 0) ? numbersOfActionsOnExpired[0] : 0);
|
|
201
|
-
const averageNumberOfActionsOnExpired = (numberOfTransactionsExpired > 0) ? totalNumberOfActionsOnExpired / numberOfTransactionsExpired : 0;
|
|
202
|
-
return {
|
|
203
|
-
transactions: {
|
|
204
|
-
...sellerFlowTransactionResult,
|
|
205
|
-
totalNumberOfActionsOnExpired: totalNumberOfActionsOnExpired,
|
|
206
|
-
maxNumberOfActionsOnExpired: maxNumberOfActionsOnExpired,
|
|
207
|
-
minNumberOfActionsOnExpired: minNumberOfActionsOnExpired,
|
|
208
|
-
averageNumberOfActionsOnExpired: parseFloat(averageNumberOfActionsOnExpired.toFixed(1)),
|
|
209
|
-
totalNumberOfOrderItems: 0, // TODO 実装
|
|
210
|
-
maxNumberOfOrderItems: 0, // TODO 実装
|
|
211
|
-
minNumberOfOrderItems: 0, // TODO 実装
|
|
212
|
-
averageNumberOfOrderItems: 0 // TODO 実装
|
|
213
|
-
},
|
|
214
|
-
measuredFrom: measuredFrom,
|
|
215
|
-
measuredThrough: measuredThrough
|
|
216
|
-
};
|
|
217
|
-
};
|
|
218
|
-
}
|
|
219
|
-
function createSellerFlowTransactionResult(measuredFrom, measuredThrough, sellerId) {
|
|
220
|
-
return async (repos) => {
|
|
221
|
-
// 計測期間内に開始された取引数を算出する
|
|
222
|
-
const { count } = await repos.placeOrder.countPlaceOrder({
|
|
223
|
-
typeOf: factory.transactionType.PlaceOrder,
|
|
224
|
-
seller: { ids: [sellerId] },
|
|
225
|
-
startFrom: measuredFrom,
|
|
226
|
-
startThrough: measuredThrough
|
|
227
|
-
});
|
|
228
|
-
const numberOfTransactionsStarted = count;
|
|
229
|
-
// 計測期間内に開始され、かつ、すでに終了している取引を検索
|
|
230
|
-
const startedAndEndedTransactions = await repos.placeOrder.findPlaceOrderTransactions({
|
|
231
|
-
typeOf: factory.transactionType.PlaceOrder,
|
|
232
|
-
seller: { ids: [sellerId] },
|
|
233
|
-
startFrom: measuredFrom,
|
|
234
|
-
startThrough: measuredThrough,
|
|
235
|
-
endThrough: new Date(),
|
|
236
|
-
inclusion: ['status']
|
|
237
|
-
});
|
|
238
|
-
const numberOfStartedAndConfirmed = startedAndEndedTransactions.filter((transaction) => transaction.status === factory.transactionStatusType.Confirmed).length;
|
|
239
|
-
const numberOfStartedAndExpired = startedAndEndedTransactions.filter((transaction) => transaction.status === factory.transactionStatusType.Expired).length;
|
|
240
|
-
const endedTransactions = await repos.placeOrder.findPlaceOrderTransactions({
|
|
241
|
-
typeOf: factory.transactionType.PlaceOrder,
|
|
242
|
-
seller: { ids: [sellerId] },
|
|
243
|
-
endFrom: measuredFrom,
|
|
244
|
-
endThrough: measuredThrough,
|
|
245
|
-
inclusion: ['status', 'endDate', 'startDate', 'result']
|
|
246
|
-
});
|
|
247
|
-
debug(endedTransactions.length, 'endedTransactions found.');
|
|
248
|
-
const confirmedTransactions = endedTransactions.filter((transaction) => transaction.status === factory.transactionStatusType.Confirmed);
|
|
249
|
-
const expiredTransactions = endedTransactions.filter((transaction) => transaction.status === factory.transactionStatusType.Expired);
|
|
250
|
-
const numberOfTransactionsConfirmed = confirmedTransactions.length;
|
|
251
|
-
// 所要時間算出(期間の成立取引リストを取得し、開始時刻と成立時刻の差を所要時間とする)
|
|
252
|
-
const requiredTimesConfirmed = confirmedTransactions.map((transaction) => (0, moment_1.default)(transaction.endDate)
|
|
253
|
-
.diff((0, moment_1.default)(transaction.startDate, 'milliseconds')));
|
|
254
|
-
const totalRequiredTimeInMilliseconds = requiredTimesConfirmed.reduce((a, b) => a + b, 0);
|
|
255
|
-
const maxRequiredTimeInMilliseconds = requiredTimesConfirmed.reduce((a, b) => Math.max(a, b), 0);
|
|
256
|
-
const minRequiredTimeInMilliseconds = requiredTimesConfirmed.reduce((a, b) => Math.min(a, b), (numberOfTransactionsConfirmed > 0) ? requiredTimesConfirmed[0] : 0);
|
|
257
|
-
const averageRequiredTimeInMilliseconds = (numberOfTransactionsConfirmed > 0) ? totalRequiredTimeInMilliseconds / numberOfTransactionsConfirmed : 0;
|
|
258
|
-
// const totalTimeLeftUntilEventInMilliseconds = timesLeftUntilEvent.reduce((a, b) => a + b, 0);
|
|
259
|
-
// const maxTimeLeftUntilEventInMilliseconds = timesLeftUntilEvent.reduce((a, b) => Math.max(a, b), 0);
|
|
260
|
-
// const minTimeLeftUntilEventInMilliseconds =
|
|
261
|
-
// timesLeftUntilEvent.reduce((a, b) => Math.min(a, b), (numberOfTransactionsConfirmed > 0) ? timesLeftUntilEvent[0] : 0);
|
|
262
|
-
// const averageTimeLeftUntilEventInMilliseconds =
|
|
263
|
-
// (numberOfTransactionsConfirmed > 0) ? totalTimeLeftUntilEventInMilliseconds / numberOfTransactionsConfirmed : 0;
|
|
264
|
-
// 金額算出
|
|
265
|
-
const amounts = confirmedTransactions.map((transaction) => transaction.result.order.price);
|
|
266
|
-
const totalAmount = amounts.reduce((a, b) => a + b, 0);
|
|
267
|
-
const maxAmount = amounts.reduce((a, b) => Math.max(a, b), 0);
|
|
268
|
-
const minAmount = amounts.reduce((a, b) => Math.min(a, b), (numberOfTransactionsConfirmed > 0) ? amounts[0] : 0);
|
|
269
|
-
const averageAmount = (numberOfTransactionsConfirmed > 0) ? totalAmount / numberOfTransactionsConfirmed : 0;
|
|
270
|
-
// アクション数集計
|
|
271
|
-
// const numbersOfActions = confirmedTransactions.map((t) => t.object.authorizeActions.length);
|
|
272
|
-
// const totalNumberOfActions = numbersOfActions.reduce((a, b) => a + b, 0);
|
|
273
|
-
// const maxNumberOfActions = numbersOfActions.reduce((a, b) => Math.max(a, b), 0);
|
|
274
|
-
// const minNumberOfActions = numbersOfActions.reduce(
|
|
275
|
-
// (a, b) => Math.min(a, b), (numberOfTransactionsConfirmed > 0) ? numbersOfActions[0] : 0
|
|
276
|
-
// );
|
|
277
|
-
// const averageNumberOfActions = (numberOfTransactionsConfirmed > 0) ? totalNumberOfActions / numberOfTransactionsConfirmed : 0;
|
|
278
|
-
// 期限切れ取引数
|
|
279
|
-
const numberOfTransactionsExpired = expiredTransactions.length;
|
|
280
|
-
const expiredTransactionIds = expiredTransactions.map((transaction) => transaction.id);
|
|
281
|
-
return {
|
|
282
|
-
sellerFlowTransactionResult: {
|
|
283
|
-
numberOfStarted: numberOfTransactionsStarted,
|
|
284
|
-
numberOfStartedAndConfirmed: numberOfStartedAndConfirmed,
|
|
285
|
-
numberOfStartedAndExpired: numberOfStartedAndExpired,
|
|
286
|
-
numberOfConfirmed: numberOfTransactionsConfirmed,
|
|
287
|
-
numberOfExpired: numberOfTransactionsExpired,
|
|
288
|
-
totalRequiredTimeInMilliseconds: totalRequiredTimeInMilliseconds,
|
|
289
|
-
maxRequiredTimeInMilliseconds: maxRequiredTimeInMilliseconds,
|
|
290
|
-
minRequiredTimeInMilliseconds: minRequiredTimeInMilliseconds,
|
|
291
|
-
averageRequiredTimeInMilliseconds: parseFloat(averageRequiredTimeInMilliseconds.toFixed(1)),
|
|
292
|
-
// totalTimeLeftUntilEventInMilliseconds: totalTimeLeftUntilEventInMilliseconds,
|
|
293
|
-
// maxTimeLeftUntilEventInMilliseconds: maxTimeLeftUntilEventInMilliseconds,
|
|
294
|
-
// minTimeLeftUntilEventInMilliseconds: minTimeLeftUntilEventInMilliseconds,
|
|
295
|
-
// averageTimeLeftUntilEventInMilliseconds: averageTimeLeftUntilEventInMilliseconds,
|
|
296
|
-
totalAmount: totalAmount,
|
|
297
|
-
maxAmount: maxAmount,
|
|
298
|
-
minAmount: minAmount,
|
|
299
|
-
averageAmount: parseFloat(averageAmount.toFixed(1)),
|
|
300
|
-
// totalNumberOfActionsOnConfirmed: totalNumberOfActions,
|
|
301
|
-
// maxNumberOfActionsOnConfirmed: maxNumberOfActions,
|
|
302
|
-
// minNumberOfActionsOnConfirmed: minNumberOfActions,
|
|
303
|
-
// averageNumberOfActionsOnConfirmed: parseFloat(averageNumberOfActions.toFixed(1)),
|
|
304
|
-
totalNumberOfOrderItems: 0, // TODO 実装
|
|
305
|
-
maxNumberOfOrderItems: 0, // TODO 実装
|
|
306
|
-
minNumberOfOrderItems: 0, // TODO 実装
|
|
307
|
-
averageNumberOfOrderItems: 0 // TODO 実装
|
|
308
|
-
},
|
|
309
|
-
expiredTransactionIds
|
|
310
|
-
};
|
|
311
|
-
};
|
|
312
|
-
}
|
|
313
|
-
/**
|
|
314
|
-
* ストック計測データを作成する
|
|
315
|
-
* @param measuredAt 計測日時
|
|
316
|
-
*/
|
|
317
|
-
/* istanbul ignore next */
|
|
318
|
-
function createSellerStock(measuredAt, sellerId) {
|
|
319
|
-
return async (repos) => {
|
|
320
|
-
// {measuredAt}以前に開始し、{measuredAt}以後に成立あるいは期限切れした取引
|
|
321
|
-
const { count } = await repos.placeOrder.countPlaceOrder({
|
|
322
|
-
typeOf: factory.transactionType.PlaceOrder,
|
|
323
|
-
seller: { ids: [sellerId] },
|
|
324
|
-
startThrough: measuredAt,
|
|
325
|
-
endFrom: measuredAt
|
|
326
|
-
});
|
|
327
|
-
const numTransactionsUnderway1 = count;
|
|
328
|
-
// {measuredAt}以前に開始し、いまだに進行中の取引
|
|
329
|
-
const count2Result = await repos.placeOrder.countPlaceOrder({
|
|
330
|
-
typeOf: factory.transactionType.PlaceOrder,
|
|
331
|
-
seller: { ids: [sellerId] },
|
|
332
|
-
startThrough: measuredAt,
|
|
333
|
-
statuses: [factory.transactionStatusType.InProgress]
|
|
334
|
-
});
|
|
335
|
-
const numTransactionsUnderway2 = count2Result.count;
|
|
336
|
-
const numberOfTransactionsUnderway = numTransactionsUnderway1 + numTransactionsUnderway2;
|
|
337
|
-
debug('numberOfTransactionsUnderway:', numberOfTransactionsUnderway);
|
|
338
|
-
return {
|
|
339
|
-
transactions: {
|
|
340
|
-
numberOfUnderway: numberOfTransactionsUnderway
|
|
341
|
-
},
|
|
342
|
-
measuredAt: measuredAt
|
|
343
|
-
};
|
|
344
|
-
};
|
|
345
|
-
}
|
|
346
|
-
/**
|
|
347
|
-
* フロー計測データーを作成する
|
|
348
|
-
* @param measuredFrom 計測開始日時
|
|
349
|
-
* @param measuredThrough 計測終了日時
|
|
350
|
-
*/
|
|
351
|
-
/* istanbul ignore next */
|
|
352
|
-
function createGlobalFlow(measuredFrom, measuredThrough) {
|
|
353
|
-
return async (repos) => {
|
|
354
|
-
// 全タスク名リスト
|
|
355
|
-
const targetTaskNames = Object.keys(factory.taskName)
|
|
356
|
-
.map((k) => factory.taskName[k]);
|
|
357
|
-
const taskResults = await Promise.all(targetTaskNames.map(async (taskName) => {
|
|
358
|
-
const numberOfTasksCreated = await repos.task.taskModel.countDocuments({
|
|
359
|
-
name: taskName,
|
|
360
|
-
createdAt: {
|
|
361
|
-
$gte: measuredFrom,
|
|
362
|
-
$lt: measuredThrough
|
|
363
|
-
}
|
|
364
|
-
})
|
|
365
|
-
.exec();
|
|
366
|
-
debug('numberOfTasksCreated:', numberOfTasksCreated);
|
|
367
|
-
// 実行中止ステータスで、最終試行日時が範囲にあるものを実行タスク数とする
|
|
368
|
-
const numberOfTasksAborted = await repos.task.taskModel.countDocuments({
|
|
369
|
-
name: taskName,
|
|
370
|
-
lastTriedAt: {
|
|
371
|
-
$type: 'date',
|
|
372
|
-
$gte: measuredFrom,
|
|
373
|
-
$lt: measuredThrough
|
|
374
|
-
},
|
|
375
|
-
status: factory.taskStatus.Aborted
|
|
376
|
-
})
|
|
377
|
-
.exec();
|
|
378
|
-
debug('numberOfTasksAborted:', numberOfTasksAborted);
|
|
379
|
-
// 実行済みステータスで、最終試行日時が範囲にあるものを実行タスク数とする
|
|
380
|
-
const executedTasks = await repos.task.taskModel.find({
|
|
381
|
-
name: taskName,
|
|
382
|
-
lastTriedAt: {
|
|
383
|
-
$type: 'date',
|
|
384
|
-
$gte: measuredFrom,
|
|
385
|
-
$lt: measuredThrough
|
|
386
|
-
},
|
|
387
|
-
status: factory.taskStatus.Executed
|
|
388
|
-
}, 'runsAt lastTriedAt numberOfTried')
|
|
389
|
-
.exec()
|
|
390
|
-
.then((docs) => docs.map((doc) => doc.toObject()));
|
|
391
|
-
debug(executedTasks.length, 'executedTasks found.');
|
|
392
|
-
const numberOfTasksExecuted = executedTasks.length;
|
|
393
|
-
const latencies = executedTasks.map((task) => (0, moment_1.default)(task.lastTriedAt)
|
|
394
|
-
.diff((0, moment_1.default)(task.runsAt, 'milliseconds')));
|
|
395
|
-
const totalLatency = latencies.reduce((a, b) => a + b, 0);
|
|
396
|
-
const maxLatency = latencies.reduce((a, b) => Math.max(a, b), 0);
|
|
397
|
-
const minLatency = latencies.reduce((a, b) => Math.min(a, b), (numberOfTasksExecuted > 0) ? latencies[0] : 0);
|
|
398
|
-
const numbersOfTrials = await Promise.all(executedTasks.map((task) => task.numberOfTried));
|
|
399
|
-
const totalNumberOfTrials = numbersOfTrials.reduce((a, b) => a + b, 0);
|
|
400
|
-
const maxNumberOfTrials = numbersOfTrials.reduce((a, b) => Math.max(a, b), 0);
|
|
401
|
-
const minNumberOfTrials = numbersOfTrials.reduce((a, b) => Math.min(a, b), (numberOfTasksExecuted > 0) ? numbersOfTrials[0] : 0);
|
|
402
|
-
return {
|
|
403
|
-
name: taskName,
|
|
404
|
-
numberOfCreated: numberOfTasksCreated,
|
|
405
|
-
numberOfExecuted: numberOfTasksExecuted,
|
|
406
|
-
numberOfAborted: numberOfTasksAborted,
|
|
407
|
-
totalLatencyInMilliseconds: totalLatency,
|
|
408
|
-
maxLatencyInMilliseconds: maxLatency,
|
|
409
|
-
minLatencyInMilliseconds: minLatency,
|
|
410
|
-
totalNumberOfTrials: totalNumberOfTrials,
|
|
411
|
-
maxNumberOfTrials: maxNumberOfTrials,
|
|
412
|
-
minNumberOfTrials: minNumberOfTrials
|
|
413
|
-
};
|
|
414
|
-
}));
|
|
415
|
-
return {
|
|
416
|
-
tasks: taskResults,
|
|
417
|
-
measuredFrom: measuredFrom,
|
|
418
|
-
measuredThrough: measuredThrough
|
|
419
|
-
};
|
|
420
|
-
};
|
|
421
|
-
}
|
|
422
|
-
/**
|
|
423
|
-
* ストック計測データを作成する
|
|
424
|
-
* @param measuredAt 計測日時
|
|
425
|
-
*/
|
|
426
|
-
/* istanbul ignore next */
|
|
427
|
-
function createGlobalStock(measuredAt) {
|
|
428
|
-
return async (repos) => {
|
|
429
|
-
// 待機状態のタスク数を算出
|
|
430
|
-
debug('counting waiting tasks globally...');
|
|
431
|
-
const numberOfTasksUnexecuted = await repos.task.taskModel.countDocuments({
|
|
432
|
-
runsAt: { $lt: measuredAt }, // 実行日時を超過している
|
|
433
|
-
status: { $in: [factory.taskStatus.Ready, factory.taskStatus.Running] }
|
|
434
|
-
})
|
|
435
|
-
.exec();
|
|
436
|
-
debug('global waiting tasks count', numberOfTasksUnexecuted);
|
|
437
|
-
return {
|
|
438
|
-
tasks: {
|
|
439
|
-
numberOfUnexecuted: numberOfTasksUnexecuted
|
|
440
|
-
},
|
|
441
|
-
measuredAt: measuredAt
|
|
442
|
-
};
|
|
443
|
-
};
|
|
444
|
-
}
|