Files
lucia-frontend/src/stores/conformance.js

458 lines
17 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { defineStore } from "pinia";
import moment from "moment";
import { Decimal } from 'decimal.js';
import abbreviateNumber from '@/module/abbreviateNumber.js';
import apiError from '@/module/apiError.js';
export default defineStore('conformanceStore', {
state: () => ({
conformanceLogId: null, // log 檔
conformanceFilterId: null, // filter 檔
conformanceLogTempCheckId: null, // log 檔存檔前的 check Id
conformanceFilterTempCheckId: null, // Filter 檔存檔前的 check Id
conformanceLogCreateCheckId: null, // log 檔存檔後的 check Id(rule)
conformanceFilterCreateCheckId: null, // Filter 檔存檔後的 check Id(rule)
allConformanceTask: [],
allCfmSeqStart: [],
allCfmSeqEnd: [],
allProcessingTime: {},
allWaitingTime: {},
allCycleTime: {},
allConformanceTempReportData: null,
allRouteFile: null,
allIssueTraces: null,
allTaskSeq: null,
allCases: null,
allLoopTraces: null,
allLoopTaskSeq: null,
allLoopCases: null,
selectedRuleType: 'Have activity', // radio
selectedActivitySequence: 'Start & End', // radio
selectedMode: 'Directly follows', // radio
selectedProcessScope: 'End to end', // radio
selectedActSeqMore: 'All', // radio
selectedActSeqFromTo: 'From', // radio
infinite404: null,
isStartSelected: null, // start & end 連動先選擇 start
isEndSelected: null, // start & end 連動先選擇 end
conformanceRuleData: null, // create checkId's data to save
isUpdataConformance: false, // 成功儲存後要跳 Modal
conformanceFileName: null, // 儲存成功的 Modal 用
}),
getters: {
conformanceAllTasks: state => {
return state.allConformanceTask;
},
conformanceTask: state => {
return state.allConformanceTask.map(i => i.label);
},
cfmSeqStart: state => {
return state.allCfmSeqStart;
},
cfmSeqEnd: state => {
return state.allCfmSeqEnd;
},
cfmPtEteWhole: state => {
return state.allProcessingTime.end_to_end.whole;
},
cfmPtEteStart: state => {
return state.allProcessingTime.end_to_end.starts_with;
},
cfmPtEteEnd: state => {
return state.allProcessingTime.end_to_end.ends_with;
},
cfmPtEteSE: state => {
return state.allProcessingTime.end_to_end.start_end;
},
cfmPtPStart: state => {
return state.allProcessingTime.partial.starts_with;
},
cfmPtPEnd: state => {
return state.allProcessingTime.partial.ends_with;
},
cfmPtPSE: state => {
return state.allProcessingTime.partial.start_end;
},
cfmWtEteWhole: state => {
return state.allWaitingTime.end_to_end.whole;
},
cfmWtEteStart: state => {
return state.allWaitingTime.end_to_end.starts_with;
},
cfmWtEteEnd: state => {
return state.allWaitingTime.end_to_end.ends_with;
},
cfmWtEteSE: state => {
return state.allWaitingTime.end_to_end.start_end;
},
cfmWtPStart: state => {
return state.allWaitingTime.partial.starts_with;
},
cfmWtPEnd: state => {
return state.allWaitingTime.partial.ends_with;
},
cfmWtPSE: state => {
return state.allWaitingTime.partial.start_end;
},
cfmCtEteWhole: state => {
return state.allCycleTime.end_to_end.whole;
},
cfmCtEteStart: state => {
return state.allCycleTime.end_to_end.starts_with;
},
cfmCtEteEnd: state => {
return state.allCycleTime.end_to_end.ends_with;
},
cfmCtEteSE: state => {
return state.allCycleTime.end_to_end.start_end;
},
conformanceTempReportData: state => {
return state.allConformanceTempReportData;
},
routeFile: state => {
return state.allRouteFile;
},
issueTraces: state => {
return state.allIssueTraces;
},
taskSeq: state => {
return state.allTaskSeq;
},
cases: state => {
if(state.allCases !== null){
const newData = state.allCases.map(c => {
c.started_at = moment(c.started_at).format('YYYY/MM/DD HH:mm');
c.completed_at = moment(c.completed_at).format('YYYY/MM/DD HH:mm');
c.facets.map(fac => {
switch(fac.type) {
case 'duration-list':
fac.value = fac.value.map(v => v !== null ? abbreviateNumber(new Decimal(v.toFixed(2))) : null);
fac.value = (fac.value).map(v => v = v.trim()).join(', ');
break;
default:
break;
};
return fac;
});
c.attributes.map(att => {
switch (att.type) {
case 'date':
att.value = att.value !== null ? moment(att.value).format('YYYY/MM/DD HH:MM:ss') : null;
break;
case 'float':
att.value = att.value !== null ? new Decimal(att.value).toFixed(2) : null;
break
default:
break;
}
return att;
});
const { facets, attributes, ...rest } = c;
return { ...rest, facets, attributes };
});
return newData
};
},
loopTraces: state => {
return state.allLoopTraces;
},
loopTaskSeq: state => {
return state.allLoopTaskSeq;
},
loopCases: state => {
if(state.allLoopCases !== null){
const newData = state.allLoopCases.map(c => {
c.started_at = moment(c.started_at).format('YYYY/MM/DD HH:mm');
c.completed_at = moment(c.completed_at).format('YYYY/MM/DD HH:mm');
c.attributes.map(att => {
switch (att.type) {
case 'date':
att.value = att.value !== null ? moment(att.value).format('YYYY/MM/DD HH:mm:ss') : null;
break;
case 'float':
att.value = att.value !== null ? new Decimal(att.value).toFixed(2) : null;
break
default:
break;
}
return att;
});
return c;
});
return newData;
};
},
},
actions: {
/**
* fetch Log Conformance Parameters api for Rule Settings.
*/
async getConformanceParams() {
let logId = this.conformanceLogId;
let filterId = this.conformanceFilterId;
let api = '';
// 先判斷 filter 檔,再判斷 log 檔。
if(filterId !== null) {
api = `/api/filter-checks/params?filter_id=${filterId}`;
}
else {
api = `/api/log-checks/params?log_id=${logId}`;
}
try {
const response = await this.$axios.get(api);
this.allConformanceTask = response.data.tasks;
this.allCfmSeqStart = response.data.sources;
this.allCfmSeqEnd = response.data.sinks;
this.allProcessingTime = response.data.processing_time;
this.allWaitingTime = response.data.waiting_time;
this.allCycleTime = response.data.cycle_time;
} catch(error) {
apiError(error, 'Failed to load the Conformance Parameters.');
}
},
/**
* Creates a new temporary check for a log.
* @param {object} data 送給後端的 data
*/
async addConformanceCheckId(data) {
let logId = this.conformanceLogId;
let filterId = this.conformanceFilterId;
let api = '';
// 先判斷 filter 檔,再判斷 log 檔。
if(filterId !== null) {
api = `/api/temp-filter-checks?filter_id=${filterId}`;
}
else {
api = `/api/temp-log-checks?log_id=${logId}`;
}
try {
const response = await this.$axios.post(api, data);
if(filterId !== null) {
this.conformanceFilterTempCheckId = response.data.id;
}
else {
this.conformanceLogTempCheckId = response.data.id;
}
} catch(error) {
apiError(error, 'Failed to add the Temporary Check for a file.');
}
},
/**
* Get the Temporary Log Conformance Report
* @param {boolean} getRouteFile 是否為了取得 route file 而呼叫?使用在非 Conformance page
*/
async getConformanceReport(getRouteFile = false) {
let logTempCheckId = this.conformanceLogTempCheckId;
let filterTempCheckId = this.conformanceFilterTempCheckId;
let logCreateCheckId = this.conformanceLogCreateCheckId;
let filterCreateCheckId = this.conformanceFilterCreateCheckId;
let api = '';
// 先判斷 Temp 再判斷原 ID先判斷 filter 檔,再判斷 log 檔。
if(filterTempCheckId !== null) {
api = `/api/temp-filter-checks/${filterTempCheckId}`;
}
else if(logTempCheckId !== null) {
api = `/api/temp-log-checks/${logTempCheckId}`;
}
else if(filterCreateCheckId !== null) {
api = `/api/filter-checks/${filterCreateCheckId}`;
}
else if(logCreateCheckId !== null) {
api = `/api/log-checks/${logCreateCheckId}`;
}
try {
const response = await this.$axios.get(api);
!getRouteFile ? this.allConformanceTempReportData = response.data : this.allRouteFile = response.data.file;
} catch(error) {
apiError(error, 'Failed to Get the Temporary Log Conformance Report.');
}
},
/**
* Get the detail of a temporary log conformance issue.
* @param {number} issueNo Issues 編號
*/
async getConformanceIssue(issueNo) {
let logTempCheckId = this.conformanceLogTempCheckId;
let filterTempCheckId = this.conformanceFilterTempCheckId;
let logCreateCheckId = this.conformanceLogCreateCheckId;
let filterCreateCheckId = this.conformanceFilterCreateCheckId;
let api = '';
// 先判斷 filter 檔,再判斷 log 檔。
if(filterTempCheckId !== null) {
api = `/api/temp-filter-checks/${filterTempCheckId}/issues/${issueNo}`;
}
else if(logTempCheckId !== null) {
api = `/api/temp-log-checks/${logTempCheckId}/issues/${issueNo}`;
}
else if(filterCreateCheckId !== null) {
api = `/api/filter-checks/${filterCreateCheckId}/issues/${issueNo}`;
}
else if(logCreateCheckId !== null) {
api = `/api/log-checks/${logCreateCheckId}/issues/${issueNo}`;
}
try {
const response = await this.$axios.get(api);
this.allIssueTraces = response.data.traces;
} catch(error) {
apiError(error, 'Failed to Get the detail of a temporary log conformance issue.');
};
},
/**
* Get the Trace Details of a Temporary Log Conformance lssue.
* @param {number} issueNo Issues 編號
* @param {number} traceId, Trace 編號
* @param {number} start Trace 要從哪個編號開始載入
*/
async getConformanceTraceDetail(issueNo, traceId, start) {
let logTempCheckId = this.conformanceLogTempCheckId;
let filterTempCheckId = this.conformanceFilterTempCheckId;
let logCreateCheckId = this.conformanceLogCreateCheckId;
let filterCreateCheckId = this.conformanceFilterCreateCheckId;
let api = '';
// 先判斷 filter 檔,再判斷 log 檔。
if(filterTempCheckId !== null) {
api = `/api/temp-filter-checks/${filterTempCheckId}/issues/${issueNo}/traces/${traceId}?start=${start}&page_size=20`;
}
else if(logTempCheckId !== null) {
api = `/api/temp-log-checks/${logTempCheckId}/issues/${issueNo}/traces/${traceId}?start=${start}&page_size=20`;
}
else if(filterCreateCheckId !== null) {
api = `/api/filter-checks/${filterCreateCheckId}/issues/${issueNo}/traces/${traceId}?start=${start}&page_size=20`;
}
else if(logCreateCheckId !== null) {
api = `/api/log-checks/${logCreateCheckId}/issues/${issueNo}/traces/${traceId}?start=${start}&page_size=20`;
}
try {
const response = await this.$axios.get(api);
this.allTaskSeq = response.data.task_seq;
this.allCases = response.data.cases;
return response.data.cases;
} catch(error) {
if(error.response.status === 404) return this.infinite404 = 404;
apiError(error, 'Failed to Get the detail of a temporary log conformance issue.');
};
},
/**
* Get the Details of a Temporary Log Conformance Loop.
* @param {number} loopNo loop 編號
*/
async getConformanceLoop(loopNo) {
let logTempCheckId = this.conformanceLogTempCheckId;
let filterTempCheckId = this.conformanceFilterTempCheckId;
let logCreateCheckId = this.conformanceLogCreateCheckId;
let filterCreateCheckId = this.conformanceFilterCreateCheckId;
let api = '';
// 先判斷 filter 檔,再判斷 log 檔。
if(filterTempCheckId !== null) api = `/api/temp-filter-checks/${filterTempCheckId}/loops/${loopNo}`;
else if(logTempCheckId !== null) api = `/api/temp-log-checks/${logTempCheckId}/loops/${loopNo}`;
else if(filterCreateCheckId !== null) api = `/api/filter-checks/${filterCreateCheckId}/loops/${loopNo}`;
else if(logCreateCheckId !== null) api = `/api/log-checks/${logCreateCheckId}/loops/${loopNo}`;
try {
const response = await this.$axios.get(api);
this.allLoopTraces = response.data.traces;
} catch(error) {
apiError(error, 'Failed to Get the detail of a temporary log conformance loop.');
};
},
/**
* Get the Trace Details of a Temporary Log Conformance Loops.
* @param {number} loopNo loop 編號
* @param {number} traceId, Trace 編號
* @param {number} start Trace 要從哪個編號開始載入
*/
async getConformanceLoopsTraceDetail(loopNo, traceId, start) {
let logTempCheckId = this.conformanceLogTempCheckId;
let filterTempCheckId = this.conformanceFilterTempCheckId;
let logCreateCheckId = this.conformanceLogCreateCheckId;
let filterCreateCheckId = this.conformanceFilterCreateCheckId;
let api = '';
// 先判斷 filter 檔,再判斷 log 檔。
if(filterTempCheckId !== null) api = `/api/temp-filter-checks/${filterTempCheckId}/loops/${loopNo}/traces/${traceId}?start=${start}&page_size=20`;
else if(logTempCheckId !== null) api = `/api/temp-log-checks/${logTempCheckId}/loops/${loopNo}/traces/${traceId}?start=${start}&page_size=20`;
else if(filterCreateCheckId !== null) api = `/api/filter-checks/${filterCreateCheckId}/loops/${loopNo}/traces/${traceId}?start=${start}&page_size=20`;
else if(logCreateCheckId !== null) api = `/api/log-checks/${logCreateCheckId}/loops/${loopNo}/traces/${traceId}?start=${start}&page_size=20`;
try {
const response = await this.$axios.get(api);
this.allLoopTaskSeq = response.data.task_seq;
this.allLoopCases = response.data.cases;
return response.data.cases;
} catch(error) {
if(error.response.status === 404) return this.infinite404 = 404;
apiError(error, 'Failed to Get the detail of a temporary log conformance loop.');
};
},
/**
* Add a New Log Conformance Check, Save the log file.
* @param {string} value file's name
*/
async addConformanceCreateCheckId(value) {
let logId = this.conformanceLogId;
let filterId = this.conformanceFilterId;
let api = '';
let data = {
name: value,
rule: this.conformanceRuleData
};
// 先判斷 filter 檔,再判斷 log 檔。
if(filterId !== null) api = `/api/filter-checks?filter_id=${filterId}`;
else api = `/api/log-checks?log_id=${logId}`;
try {
const response = await this.$axios.post(api, data);
if(filterId !== null) {
this.conformanceFilterCreateCheckId = response.data.id;
this.conformanceFilterTempCheckId = null;
}
else {
this.conformanceLogCreateCheckId = response.data.id;
this.conformanceLogTempCheckId= null;
}
}catch(error) {
apiError(error, 'Failed to add the Conformance Check for a file.');
};
},
/**
* Updata an Existing Conformance Check, log and filter
*/
async updataConformance() {
let logCreateCheckId = this.conformanceLogCreateCheckId;
let filterCreateCheckId = this.conformanceFilterCreateCheckId;
let api = '';
const data = this.conformanceRuleData;
// 先判斷有無 Temp ID再判斷原始檔 ID
if(filterCreateCheckId !== null) api = `/api/filter-checks/${filterCreateCheckId}`;
else if(logCreateCheckId !== null) api = `/api/log-checks/${logCreateCheckId}`;
try {
const response = await this.$axios.put(api, data);
this.isUpdataConformance = response.status === 200;
this.conformanceLogTempCheckId = null;
this.conformanceFilterTempCheckId = null;
}catch(error) {
apiError(error, 'Failed to updata an Existing Conformance.');
}
},
/**
* Set the state value of conformance log creation check ID
* @param {string} createCheckID
*/
setConformanceLogCreateCheckId(createCheckID) {
this.conformanceLogCreateCheckId = createCheckID;
},
},
})