feat: refs #7119 enhance vehicle filter method with additional parameters and improve SQL query structure
gitea/salix/pipeline/pr-dev There was a failure building this commit
Details
gitea/salix/pipeline/pr-dev There was a failure building this commit
Details
This commit is contained in:
parent
e9b0b1b7a3
commit
68e42206c8
|
@ -1,5 +1,8 @@
|
|||
const {ParameterizedSQL} = require('loopback-connector');
|
||||
const {buildFilter, mergeFilters} = require('vn-loopback/util/filter');
|
||||
|
||||
module.exports = Self => {
|
||||
Self.remoteMethod('filter', {
|
||||
Self.remoteMethodCtx('filter', {
|
||||
description: 'Find all instances of the model matched by filter from the data source.',
|
||||
accessType: 'READ',
|
||||
accepts: [{
|
||||
|
@ -42,6 +45,9 @@ module.exports = Self => {
|
|||
}, {
|
||||
arg: 'isKmTruckRate',
|
||||
type: 'boolean'
|
||||
}, {
|
||||
arg: 'vehicleStateFk',
|
||||
type: 'number'
|
||||
}],
|
||||
returns: {
|
||||
type: ['object'],
|
||||
|
@ -53,66 +59,79 @@ module.exports = Self => {
|
|||
}
|
||||
});
|
||||
|
||||
Self.filter = async(filter, search, id, description, companyFk, tradeMark, numberPlate, warehouseFk, chassis, leasing, countryCodeFk, isKmTruckRate, options) => {
|
||||
Self.filter = async(ctx, filter, options) => {
|
||||
const conn = Self.dataSource.connector;
|
||||
const myOptions = {};
|
||||
const myWhere = {};
|
||||
const {limit, order, skip, where} = filter;
|
||||
|
||||
if (typeof options == 'object') Object.assign(myOptions, options);
|
||||
|
||||
if (search) myWhere.or = [{id: search}, {numberPlate: {like: `%${search}%`}}];
|
||||
if (id) myWhere.id = id;
|
||||
if (description) myWhere.description = {like: `%${description}%`};
|
||||
if (companyFk) myWhere.companyFk = companyFk;
|
||||
if (tradeMark) myWhere.tradeMark = {like: `%${tradeMark}%`};
|
||||
if (numberPlate) myWhere.numberPlate = {like: `%${numberPlate}%`};
|
||||
if (warehouseFk) myWhere.warehouseFk = warehouseFk;
|
||||
if (chassis) myWhere.chassis = {like: `%${chassis}%`};
|
||||
if (leasing) myWhere.leasing = {like: `%${leasing}%`};
|
||||
if (countryCodeFk) myWhere.countryCodeFk = countryCodeFk;
|
||||
if (isKmTruckRate) myWhere.isKmTruckRate = isKmTruckRate;
|
||||
|
||||
Object.assign(where || {}, myWhere);
|
||||
|
||||
const myFilter = {
|
||||
fields: ['id', 'numberPlate', 'tradeMark', 'model', 'm3', 'description', 'isActive', 'warehouseFk', 'companyFk', 'countryCodeFk', 'chassis', 'leasing', 'isKmTruckRate'],
|
||||
include: [
|
||||
{
|
||||
relation: 'warehouse',
|
||||
scope: {
|
||||
fields: ['id', 'name']
|
||||
const where = buildFilter(ctx.args, (param, value) => {
|
||||
switch (param) {
|
||||
case 'search':
|
||||
return {or: [{'v.id': value}, {numberPlate: {like: `%${value}%`}}]};
|
||||
case 'id':
|
||||
return {id: value};
|
||||
case 'description':
|
||||
return {description: {like: `%${value}%`}};
|
||||
case 'companyFk':
|
||||
return {companyFk: value};
|
||||
case 'tradeMark':
|
||||
return {tradeMark: {like: `%${value}%`}};
|
||||
case 'numberPlate':
|
||||
return {numberPlate: {like: `%${value}%`}};
|
||||
case 'warehouseFk':
|
||||
return {warehouseFk: value};
|
||||
case 'chassis':
|
||||
return {chassis: {like: `%${value}%`}};
|
||||
case 'leasing':
|
||||
return {leasing: {like: `%${value}%`}};
|
||||
case 'countryCodeFk':
|
||||
return {countryCodeFk: value};
|
||||
case 'isKmTruckRate':
|
||||
return {isKmTruckRate: value};
|
||||
case 'vehicleStateFk':
|
||||
return {vehicleStateFk: value};
|
||||
}
|
||||
},
|
||||
{
|
||||
relation: 'company',
|
||||
scope: {
|
||||
fields: ['id', 'code']
|
||||
}
|
||||
},
|
||||
{
|
||||
relation: 'event',
|
||||
scope: {
|
||||
fields: ['vehicleFk', 'vehicleStateFk'],
|
||||
include: {
|
||||
relation: 'state',
|
||||
scope: {
|
||||
fields: ['id', 'state']
|
||||
}
|
||||
},
|
||||
order: ['started DESC'],
|
||||
limit: 1
|
||||
}
|
||||
},
|
||||
],
|
||||
where: myWhere,
|
||||
order,
|
||||
limit,
|
||||
skip,
|
||||
};
|
||||
|
||||
return Self.find(myFilter, myOptions).map(v => {
|
||||
v.__data.event = v.event()[0];
|
||||
return v;
|
||||
});
|
||||
|
||||
const myFilter = mergeFilters(filter, {where});
|
||||
|
||||
const stmt = new ParameterizedSQL(`
|
||||
SELECT v.id,
|
||||
v.numberPlate,
|
||||
v.tradeMark,
|
||||
v.model,
|
||||
v.m3,
|
||||
v.description,
|
||||
v.isActive,
|
||||
v.countryCodeFk,
|
||||
v.chassis,
|
||||
v.leasing,
|
||||
v.isKmTruckRate,
|
||||
w.name as warehouse,
|
||||
c.code as company,
|
||||
sub.state
|
||||
FROM vehicle v
|
||||
LEFT JOIN warehouse w ON w.id = v.warehouseFk
|
||||
LEFT JOIN company c ON c.id = v.companyFk
|
||||
LEFT JOIN (
|
||||
SELECT e.vehicleFk,
|
||||
e.vehicleStateFk,
|
||||
s.state,
|
||||
ROW_NUMBER() OVER (PARTITION BY e.vehicleFk ORDER BY e.started DESC) as rn
|
||||
FROM vehicleEvent e
|
||||
LEFT JOIN vehicleState s ON e.vehicleStateFk = s.id
|
||||
) sub ON sub.vehicleFk = v.id AND sub.rn = 1
|
||||
`
|
||||
);
|
||||
|
||||
const sqlWhere = conn.makeWhere(myFilter.where);
|
||||
stmt.merge(sqlWhere);
|
||||
stmt.merge(conn.makePagination(myFilter));
|
||||
|
||||
const sql = ParameterizedSQL.join([stmt], ';');
|
||||
const result = await conn.executeStmt(sql, myOptions);
|
||||
|
||||
return result;
|
||||
};
|
||||
};
|
||||
|
|
|
@ -50,6 +50,9 @@
|
|||
},
|
||||
"vin": {
|
||||
"type": "string"
|
||||
},
|
||||
"ppeFk": {
|
||||
"type": "number"
|
||||
}
|
||||
},
|
||||
"relations": {
|
||||
|
|
Loading…
Reference in New Issue