SAP BTP - SAP 비즈니스 로직 커스텀하기
우린 앞서 service 파일을 옮김으로서 화면을 바꾸거나 로직을 추가하였다. 이번엔 있던 서비스를 직접 변경해보도록 하자.
cpapp의 srv에 risk-service.js를 추가해보자. 기존은 cds 파일 기반으로 데이터나 ui를 수정했다면 javascript로 로직을 수정
risk의 impact 값이 10000 이하면 정상, 20만 초과면 불가, 10000초과 20만 미만이면 주의
const cds = require('@sap/cds')
/**
* Implementation for Risk Management service defined in ./risk-service.cds
*/
module.exports = cds.service.impl(async function() {
this.after('READ', 'Risks', risksData => {
const risks = Array.isArray(risksData) ? risksData : [risksData];
risks.forEach(risk => {
if (risk.impact <= 10000) {
risk.criticality = 0; //정상
} else if(risk.impact >= 200000) {
risk.criticality = 1; //불가
} else {
risk.criticality = 2; //주의
}
});
});
});
예제 데이터를 보면 아래와 같이 되어 있는데 해당 데이터들은
risks-service-ui.cds에 따라 표현 하는 방법이 정해져 있는 것이다.
using RiskService from './risk-service';
annotate RiskService.Risks with {
title @title: 'Title';
prio @title: 'Priority';
descr @title: 'Description';
miti @title: 'Mitigation';
impact @title: 'Impact';
}
annotate RiskService.Mitigations with {
ID @(
UI.Hidden,
Common: {
Text: description
}
);
description @title: 'Description';
owner @title: 'Owner';
timeline @title: 'Timeline';
risks @title: 'Risks';
}
annotate RiskService.Risks with @(
UI: {
HeaderInfo: {
TypeName: 'Risk',
TypeNamePlural: 'Risks',
Title : {
$Type : 'UI.DataField',
Value : title
},
Description : {
$Type: 'UI.DataField',
Value: descr
}
},
SelectionFields: [prio],
LineItem: [
{Value: title},
{Value: miti_ID},
{
Value: prio,
Criticality: criticality
},
{
Value: impact,
Criticality: criticality
}
],
Facets: [
{$Type: 'UI.ReferenceFacet', Label: 'Main', Target: '@UI.FieldGroup#Main'}
],
FieldGroup#Main: {
Data: [
{Value: miti_ID},
{
Value: prio,
Criticality: criticality
},
{
Value: impact,
Criticality: criticality
}
]
}
},
) {
};
annotate RiskService.Risks with {
miti @(
Common: {
//show text, not id for mitigation in the context of risks
Text: miti.description , TextArrangement: #TextOnly,
ValueList: {
Label: 'Mitigations',
CollectionPath: 'Mitigations',
Parameters: [
{ $Type: 'Common.ValueListParameterInOut',
LocalDataProperty: miti_ID,
ValueListProperty: 'ID'
},
{ $Type: 'Common.ValueListParameterDisplayOnly',
ValueListProperty: 'description'
}
]
}
}
);
}
특정 조건에 따라 Criticality를 설정해주면 prio와 impact 필드가 표시되게 해준다는건데, 그렇다면 prio값에 따라 Criticality를 설정하고 title필드에도 표현해보자.
risks-service-ui.cds에서 LineItem 부분을 변경해보자.
LineItem: [
{ Value: title,
Criticality: criticality
},
{Value: miti_ID},
{
Value: prio,
Criticality: criticality
},
{
Value: impact,
Criticality: criticality
}
],
그리고 자바스크립트 단에서 prio에 따른 위험도를 설정해준다.
const cds = require('@sap/cds')
/**
* Implementation for Risk Management service defined in ./risk-service.cds
*/
module.exports = cds.service.impl(async function() {
this.after('READ', 'Risks', risksData => {
const risks = Array.isArray(risksData) ? risksData : [risksData];
risks.forEach(risk => {
if (risk.prio === '3') {
risk.criticality = 3;
} else if(risk.prio === '2') {
risk.criticality = 4;
} else {
risk.criticality = 5;
}
});
});
});
요러한 옵션들은 odata-vocabularies에서 제공하는데 https://github.com/SAP/odata-vocabularies/blob/main/vocabularies/UI.md#CriticalityType
위를 보면 위험도에 따른 표현이 정해져있다.