Conformance: Activity sequence, Sequence, Directly follows done.

This commit is contained in:
chiayin
2023-08-02 14:38:08 +08:00
parent 86e1c52585
commit 34aa0f28c2
11 changed files with 309 additions and 98 deletions

View File

@@ -28,7 +28,8 @@
</div> </div>
</div> </div>
<!-- show bar --> <!-- show bar -->
<ConformanceShowBar :class="isShowBar?'':'hidden'"></ConformanceShowBar> <ConformanceShowBar :class="isShowBar?'':'hidden'" :selectConformanceTask="selectConformanceTask" :selectConformanceStartAndEnd="selectConformanceStartAndEnd" :selectConformanceStart="selectConformanceStart" :selectConformanceEnd="selectConformanceEnd" :selectConformanceFrom="selectConformanceFrom" :selectConformanceTo="selectConformanceTo"
:listSeq="listSeq"></ConformanceShowBar>
</div> </div>
</section> </section>
</template> </template>
@@ -56,6 +57,12 @@ export default {
isShowBar: false, isShowBar: false,
visibleLeft: false, visibleLeft: false,
selectConformanceTask: null, selectConformanceTask: null,
selectConformanceStartAndEnd: null,
selectConformanceStart: null,
selectConformanceEnd: null,
selectConformanceFrom: null,
selectConformanceTo: null,
listSeq: [],
} }
}, },
components: { components: {
@@ -73,8 +80,12 @@ export default {
this.$emitter.emit('coverPlate', true); this.$emitter.emit('coverPlate', true);
// Have activity // Have activity
this.selectConformanceTask = null; this.selectConformanceTask = null;
this.$emitter.emit('reset', null); // Activity sequence
this.selectConformanceStartAndEnd = null;
this.listSeq = null;
// 其他子元件 reset
this.$emitter.emit('reset', null);
// reset 成功訊息 // reset 成功訊息
this.$toast.success('Reset Success.'); this.$toast.success('Reset Success.');
}, },
@@ -83,12 +94,46 @@ export default {
*/ */
async submit() { async submit() {
let data; let data;
let isMode = '';
switch (this.selectedMode) {
case 'Directly follows':
isMode = 'directly-follows';
break;
case 'Eventually follows':
isMode = 'a';
break;
case 'Short loop(s)':
isMode = 'b';
break;
case 'Self loop(s)':
isMode = 'c';
break;
default:
break;
};
if(this.selectedRuleType === 'Have activity') { if(this.selectedRuleType === 'Have activity') { // Activity Sequence 選 Have activity(s) 的行為
if(!this.selectConformanceTask?.length) return this.$toast.error('Not selected.'); if(!this.selectConformanceTask?.length) return this.$toast.error('Not selected.');
else data = { else data = {
type: 'contains-tasks', type: 'contains-tasks',
tasks: this.selectConformanceTask, tasks: this.selectConformanceTask,
};
}else if(this.selectedRuleType === 'Activity sequence') { // Activity Sequence 選 Start & End 的行為
if(this.selectedActivitySequence === 'Start & End'){
if(this.selectConformanceStartAndEnd === null || this.selectConformanceStartAndEnd.length === 0) return this.$toast.error('Both Start and End must be selected.');
else data = {
type: 'start-end',
starts_with: this.selectConformanceStartAndEnd[0],
ends_with: this.selectConformanceStartAndEnd[1],
};
}else if(this.selectedActivitySequence === 'Sequence'){ // Activity Sequence 選 Sequence 的行為
if(this.listSeq.length < 2) return this.$toast.error('Select two or more.');
else {
data = {
type: isMode,
task_seq: this.listSeq,
}
}
} }
} }
@@ -107,6 +152,30 @@ export default {
this.$emitter.on('actListData', (data) => { this.$emitter.on('actListData', (data) => {
this.selectConformanceTask = data; this.selectConformanceTask = data;
}); });
this.$emitter.on('actRadioData', (data) => {
switch (data.category) {
case 'Start':
this.selectConformanceStart = data.task;
break;
case 'End':
this.selectConformanceEnd = data.task;
break;
case 'From':
this.selectConformanceFrom = data.task;
break;
case 'To':
this.selectConformanceTo = data.task;
break;
default:
break;
};
if(this.selectConformanceStart !== null && this.selectConformanceEnd !== null){
this.selectConformanceStartAndEnd = [this.selectConformanceStart, this.selectConformanceEnd];
};
});
this.$emitter.on('getListSequence', (data) => {
this.listSeq = data;
})
}, },
} }
</script> </script>

View File

@@ -14,12 +14,17 @@
</template> </template>
<script> <script>
export default { export default {
props: ['data'], props: ['data', 'select'],
data() { data() {
return { return {
actList: null, actList: this.select
} }
}, },
watch: {
select(newval){
this.actList = newval;
},
},
methods: { methods: {
actListData() { actListData() {
this.$emitter.emit('actListData', this.actList); this.$emitter.emit('actListData', this.actList);

View File

@@ -5,7 +5,7 @@
<p class="h2 pl-2 border-b mb-3">Sort</p> <p class="h2 pl-2 border-b mb-3">Sort</p>
<div class="flex flex-wrap justify-start content-start gap-4 px-2 overflow-y-auto scrollbar h-[calc(100%_-_52px)]"> <div class="flex flex-wrap justify-start content-start gap-4 px-2 overflow-y-auto scrollbar h-[calc(100%_-_52px)]">
<div class="flex items-center w-[166px]" v-for="(act, index) in data" :key="index"> <div class="flex items-center w-[166px]" v-for="(act, index) in data" :key="index">
<RadioButton v-model="selectedRadio" :inputId="index.toString()" :name="vModel" :value="act" /> <RadioButton v-model="selectedRadio" :inputId="index.toString()" :name="select" :value="act" @change="actRadioData" />
<label :for="index" class="ml-2 p-2 whitespace-nowrap break-keep text-ellipsis overflow-hidden">{{ act }}</label> <label :for="index" class="ml-2 p-2 whitespace-nowrap break-keep text-ellipsis overflow-hidden">{{ act }}</label>
</div> </div>
</div> </div>
@@ -14,11 +14,29 @@
</template> </template>
<script> <script>
export default { export default {
props: ['title', 'vModel', 'data',], props: ['title', 'select', 'data', 'category'],
data() { data() {
return { return {
selectedRadio: this.vModel, selectedRadio: this.select,
} }
},
watch: {
select(newval){
this.selectedRadio = newval;
},
},
methods: {
actRadioData() {
this.$emitter.emit('actRadioData', {
category: this.category,
task: this.selectedRadio,
});
} }
},
created() {
this.$emitter.on('reset', (data) => {
this.selectedRadio = data;
});
},
} }
</script> </script>

View File

@@ -18,13 +18,13 @@
<div class="w-full h-full relative bg-neutral-10 border border-neutral-300 rounded-xl ml-4 p-2 space-y-2 text-sm"> <div class="w-full h-full relative bg-neutral-10 border border-neutral-300 rounded-xl ml-4 p-2 space-y-2 text-sm">
<p class="h2 border-b border-500 my-2">Sequence</p> <p class="h2 border-b border-500 my-2">Sequence</p>
<!-- No Data --> <!-- No Data -->
<div v-if="listSequence.length === 0" class="p-4 w-[calc(100%_-_32px)] h-5/6 flex justify-center items-center absolute"> <div v-if="listSequence && listSequence.length === 0" class="p-4 w-[calc(100%_-_32px)] h-5/6 flex justify-center items-center absolute">
<p class="text-neutral-500">Please drag and drop activity(s) here and sort.</p> <p class="text-neutral-500">Please drag and drop activity(s) here and sort.</p>
</div> </div>
<!-- Have Data --> <!-- Have Data -->
<div class="py-4 m-auto w-full h-[calc(100%_-_56px)]"> <div class="py-4 m-auto w-full h-[calc(100%_-_56px)]">
<div class="w-full h-full overflow-y-auto overflow-x-auto scrollbar px-4 text-center listSequence"> <div class="w-full h-full overflow-y-auto overflow-x-auto scrollbar px-4 text-center listSequence">
<draggable class="h-full" :list="listSequence" group="activity" itemKey="name" animation="300" :forceFallback="true" :dragClass="'dragSelected'" :fallbackTolerance="5" @start="onStart" @end="onEnd"> <draggable class="h-full" :list="listSequence" group="activity" itemKey="name" animation="300" :forceFallback="true" :dragClass="'dragSelected'" :fallbackTolerance="5" @start="onStart" @end="onEnd" :component-data="getComponentData()">
<template #item="{ element, index }"> <template #item="{ element, index }">
<div> <div>
<div class="w-full p-2 border rounded bg-neutral-10 cursor-pointer hover:bg-primary/20" @dblclick="moveSeqItem(index, element)"> <div class="w-full p-2 border rounded bg-neutral-10 cursor-pointer hover:bg-primary/20" @dblclick="moveSeqItem(index, element)">
@@ -44,20 +44,21 @@
import sortNumEngZhtw from '@/module/sortNumEngZhtw.js'; import sortNumEngZhtw from '@/module/sortNumEngZhtw.js';
export default { export default {
props: ['data', 'listSeq'],
data() { data() {
return { return {
actList: null, actList: null,
listSequence: [], listSequence: [],
lastItemIndex: null, lastItemIndex: null,
data:['第三次醫囑', '第四次醫囑','第一次醫囑', '第二次醫囑', 'ddd', 'bbb', 'ccc', 'aaa', 'accc', 'abbb', '1234', '1111', '1222', '1333', '3333', '4444', '0', '1000', '100', '10', '9', '80']
} }
}, },
computed: { computed: {
datadata: function() { datadata: function() {
// TODO Activity List 的 dblclick, drag & drop 要改假刪除 // TODO Activity List 的 dblclick, drag & drop 要改假刪除
// Activity List 要排序 // Activity List 要排序
return sortNumEngZhtw(this.data); if(this.data !== null) sortNumEngZhtw(this.data);
} return this.data;
},
}, },
methods: { methods: {
/** /**
@@ -78,6 +79,12 @@ export default {
this.listSequence.splice(index, 1); this.listSequence.splice(index, 1);
this.data.push(element); this.data.push(element);
}, },
/**
* get listSequence
*/
getComponentData(){
this.$emitter.emit('getListSequence', this.listSequence);
},
/** /**
* Element dragging started * Element dragging started
*/ */
@@ -104,10 +111,13 @@ export default {
evt.oldIndex !== listIndex ? lastChild.style.display = '' : null; evt.oldIndex !== listIndex ? lastChild.style.display = '' : null;
// reset: 拖曳最後一個元素時,倒數第二的元素的箭頭要隱藏 // reset: 拖曳最後一個元素時,倒數第二的元素的箭頭要隱藏
this.lastItemIndex = null; this.lastItemIndex = null;
this.$emit('update:listSeq', this.listSequence);
}, },
},
} created() {
this.$emitter.on('reset', (data) => {
this.listSequence = [];
});
},
} }
</script> </script>
<style scoped> <style scoped>

View File

@@ -1,36 +1,39 @@
<template> <template>
<div class="px-4 text-sm"> <div class="px-4 text-sm">
<!-- Have activity --> <!-- Have activity -->
<div class="space-y-2" v-if="selectedRuleType === 'Have activity' || selectedRuleType === 'Activity duration'"> <ResultCheck v-if="selectedRuleType === 'Have activity'" :data="containstTasksData"></ResultCheck>
<div class="flex justify-start items-center pr-4" v-for="(act, index) in data" :key="index">
<span class="material-symbols-outlined text-primary mr-2">
check_circle
</span>
<p class="px-2 py-1 border border-neutral-500 w-full whitespace-nowrap break-keep text-ellipsis overflow-hidden">{{ act }}</p>
</div>
</div>
<!-- Activity sequence --> <!-- Activity sequence -->
<div class="space-y-2" v-if="selectedRuleType === 'Activity sequence' && selectedActivitySequence === 'Sequence'"> <ResultDot v-if="selectedRuleType === 'Activity sequence' && selectedActivitySequence === 'Start & End'" :timeResultData="startEndData"></ResultDot>
<div class="flex justify-start items-center pr-4" v-for="(act, index) in data" :key="index"> <ResultArrow v-if="selectedRuleType === 'Activity sequence' && selectedActivitySequence === 'Sequence'" :data="listSequence"></ResultArrow>
<span class="material-symbols-outlined text-primary mr-2"> <!-- Activity duration -->
arrow_circle_down <ResultCheck v-if="selectedRuleType === 'Activity duration'" :title="'Activities include'"></ResultCheck>
</span> <!-- Processing time -->
<p class="px-2 py-1 border border-neutral-500 w-full whitespace-nowrap break-keep text-ellipsis overflow-hidden">{{ act }}</p> <ResultArrow v-if="selectedRuleType === 'Processing time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'Start'"></ResultArrow>
</div> <ResultArrow v-if="selectedRuleType === 'Processing time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'End'"></ResultArrow>
</div> <ResultArrow v-if="selectedRuleType === 'Processing time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'Start & End'"></ResultArrow>
<!-- Processing time, Waiting time, Cycle time --> <ResultArrow v-if="selectedRuleType === 'Processing time' && selectedProcessScope === 'Partial' && selectedActSeqFromTo === 'From'"></ResultArrow>
<ul v-if="(selectedRuleType === 'Activity sequence' && selectedActivitySequence === 'Start & End') || selectedRuleType === 'Processing time' || selectedRuleType === 'Waiting time' || selectedRuleType === 'Cycle time'"> <ResultArrow v-if="selectedRuleType === 'Processing time' && selectedProcessScope === 'Partial' && selectedActSeqFromTo === 'To'"></ResultArrow>
<li class="flex justify-start items-center py-1 pr-4" v-for="(act, index) in timeResultData" :key="index + act"> <ResultArrow v-if="selectedRuleType === 'Processing time' && selectedProcessScope === 'Partial' && selectedActSeqFromTo === 'From & To'"></ResultArrow>
<span class="material-symbols-outlined disc text-sm align-middle mr-1">fiber_manual_record</span> <!-- Waiting time -->
<span class="mr-2 block w-12">{{ act.scope }}</span> <ResultArrow v-if="selectedRuleType === 'Waiting time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'Start'"></ResultArrow>
<span class="px-2 py-1 border border-neutral-500 w-full whitespace-nowrap break-keep text-ellipsis overflow-hidden block">{{ act.activity }}</span> <ResultArrow v-if="selectedRuleType === 'Waiting time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'End'"></ResultArrow>
</li> <ResultArrow v-if="selectedRuleType === 'Waiting time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'Start & End'"></ResultArrow>
</ul> <ResultArrow v-if="selectedRuleType === 'Waiting time' && selectedProcessScope === 'Partial' && selectedActSeqFromTo === 'From'"></ResultArrow>
<ResultArrow v-if="selectedRuleType === 'Waiting time' && selectedProcessScope === 'Partial' && selectedActSeqFromTo === 'To'"></ResultArrow>
<ResultArrow v-if="selectedRuleType === 'Waiting time' && selectedProcessScope === 'Partial' && selectedActSeqFromTo === 'From & To'"></ResultArrow>
<!-- Cycle time -->
<ResultArrow v-if="selectedRuleType === 'Cycle time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'Start'"></ResultArrow>
<ResultArrow v-if="selectedRuleType === 'Cycle time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'End'"></ResultArrow>
<ResultArrow v-if="selectedRuleType === 'Cycle time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'Start & End'"></ResultArrow>
</div> </div>
</template> </template>
<script> <script>
import { storeToRefs } from 'pinia'; import { storeToRefs } from 'pinia';
import ConformanceStore from '@/stores/conformance.js'; import ConformanceStore from '@/stores/conformance.js';
import ResultCheck from '@/components/Discover/Conformance/ConformanceSidebar/ResultCheck.vue';
import ResultArrow from '@/components/Discover/Conformance/ConformanceSidebar/ResultArrow.vue';
import ResultDot from '@/components/Discover/Conformance/ConformanceSidebar/ResultDot.vue';
export default { export default {
setup() { setup() {
@@ -39,39 +42,81 @@ export default {
return { selectedRuleType, selectedActivitySequence, selectedMode, selectedProcessScope, selectedActSeqMore, selectedActSeqFromTo } return { selectedRuleType, selectedActivitySequence, selectedMode, selectedProcessScope, selectedActSeqMore, selectedActSeqFromTo }
}, },
components: {
ResultCheck,
ResultArrow,
ResultDot,
},
data() { data() {
return { return {
data: null, containstTasksData: null,
timeResultData: [ startEndData: null,
{ start: null,
id: 1, end: null,
scope: 'Start', from: null,
activity: '到院' to: null,
}, listSequence: null,
{
id: 2,
scope: 'End',
activity: '出院'
},
{
id: 3,
scope: 'From',
activity: '到院到院到院到院到院到院'
},
{
id: 4,
scope: 'Start',
activity: '出院出院出院出院出院出院'
},
],
} }
}, },
methods: {
/**
* set Time Result Data
* @param {array} data
* @returns {array}
* timeResultData: [
* {
* id: 1,
* category: 'start', start|end|from|to
* task: '到院'
* },
* ]
*/
setTimeResultData(data) {
let result = data.map((item, index) => {
return {
id: index + 1,
category: item.category.replace(/^./, item.category[0].toUpperCase()),
task: item.task
}
});
return result;
},
},
created() { created() {
this.$emitter.on('actListData', (data) => { this.$emitter.on('actListData', (data) => {
this.data = data; this.containstTasksData = data;
}); });
this.$emitter.on('actRadioData', (data) => {
switch (data.category) {
case 'Start':
this.start = [data];
break;
case 'End':
this.end = [data];
break;
case 'From':
this.from = [data];
break;
case 'To':
this.to = [data];
break;
default:
break;
};
if(this.start !== null && this.end !== null){
this.startEndData = [...this.start, ...this.end];
};
});
this.$emitter.on('getListSequence', (data) => {
this.listSequence = data;
})
this.$emitter.on('reset', (data) => { this.$emitter.on('reset', (data) => {
this.data = data; this.containstTasksData = data;
this.startEndData = data;
this.start = data;
this.end = data;
this.from = data;
this.to = data;
}); });
}, },

View File

@@ -1,48 +1,48 @@
<template> <template>
<section class="animate-fadein w-full h-full"> <section class="animate-fadein w-full h-full">
<!-- Have activity --> <!-- Have activity -->
<ActList v-if="selectedRuleType === 'Have activity'" :data="conformanceTask"></ActList> <ActList v-if="selectedRuleType === 'Have activity'" :data="conformanceTask" :select="selectConformanceTask"></ActList>
<!-- Activity sequence --> <!-- Activity sequence -->
<div v-if="selectedRuleType === 'Activity sequence' && selectedActivitySequence === 'Start & End'" class="flex h-full"> <div v-if="selectedRuleType === 'Activity sequence' && selectedActivitySequence === 'Start & End'" class="flex h-full">
<ActRadio :title="'Start activity'" :v-model="'actseqStartAndEndRadioStart'" :data="data" /> <ActRadio :title="'Start activity'" :select="'actseqStartAndEndRadioStart'" :data="conformanceStart" :category="'Start'" />
<ActRadio :title="'End activity'" :v-model="'actseqStartAndEndRadioEnd'" :data="data" /> <ActRadio :title="'End activity'" :select="'actseqStartAndEndRadioEnd'" :data="conformanceEnd" :category="'End'" />
</div> </div>
<!-- actSeqDrag --> <!-- actSeqDrag -->
<ActSeqDrag v-if="selectedRuleType === 'Activity sequence' && selectedActivitySequence === 'Sequence'"></ActSeqDrag> <ActSeqDrag v-if="selectedRuleType === 'Activity sequence' && selectedActivitySequence === 'Sequence'" :data="conformanceTask" :listSeq="listSeq"></ActSeqDrag>
<!-- Activity duration --> <!-- Activity duration -->
<ActRadio v-if="selectedRuleType === 'Activity duration'" :title="'Activities include'" :v-model="'actInclude'" :data="data" /> <ActRadio v-if="selectedRuleType === 'Activity duration'" :title="'Activities include'" :select="'actInclude'" :data="data" />
<!-- Processing time --> <!-- Processing time -->
<ActRadio v-if="selectedRuleType === 'Processing time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'Start'" :title="'Start'" :v-model="'protimeStartRadio'" :data="data" /> <ActRadio v-if="selectedRuleType === 'Processing time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'Start'" :title="'Start'" :select="'protimeStartRadio'" :data="data" />
<ActRadio v-if="selectedRuleType === 'Processing time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'End'" :title="'End'" :v-model="'protimeEndRadio'" :data="data" /> <ActRadio v-if="selectedRuleType === 'Processing time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'End'" :title="'End'" :select="'protimeEndRadio'" :data="data" />
<div v-if="selectedRuleType === 'Processing time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'Start & End'" class="flex h-full"> <div v-if="selectedRuleType === 'Processing time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'Start & End'" class="flex h-full">
<ActRadio :title="'Start'" :v-model="'protimeStartAndEndRadioStart'" :data="data" /> <ActRadio :title="'Start'" :select="'protimeStartAndEndRadioStart'" :data="data" />
<ActRadio :title="'End'" :v-model="'protimeStartAndEndRadioEnd'" :data="data" /> <ActRadio :title="'End'" :select="'protimeStartAndEndRadioEnd'" :data="data" />
</div> </div>
<ActRadio v-if="selectedRuleType === 'Processing time' && selectedProcessScope === 'Partial' && selectedActSeqFromTo === 'From'" :title="'From'" :v-model="'protimeFromRadio'" :data="data" /> <ActRadio v-if="selectedRuleType === 'Processing time' && selectedProcessScope === 'Partial' && selectedActSeqFromTo === 'From'" :title="'From'" :select="'protimeFromRadio'" :data="data" />
<ActRadio v-if="selectedRuleType === 'Processing time' && selectedProcessScope === 'Partial' && selectedActSeqFromTo === 'To'" :title="'To'" :v-model="'protimeToRadio'" :data="data" /> <ActRadio v-if="selectedRuleType === 'Processing time' && selectedProcessScope === 'Partial' && selectedActSeqFromTo === 'To'" :title="'To'" :select="'protimeToRadio'" :data="data" />
<div v-if="selectedRuleType === 'Processing time' && selectedProcessScope === 'Partial' && selectedActSeqFromTo === 'From & To'" class="flex h-full"> <div v-if="selectedRuleType === 'Processing time' && selectedProcessScope === 'Partial' && selectedActSeqFromTo === 'From & To'" class="flex h-full">
<ActRadio :title="'From'" :v-model="'protimeFromAndToRadioFrom'" :data="data" /> <ActRadio :title="'From'" :select="'protimeFromAndToRadioFrom'" :data="data" />
<ActRadio :title="'To'" :v-model="'protimeFromAndToRadioTo'" :data="data" /> <ActRadio :title="'To'" :select="'protimeFromAndToRadioTo'" :data="data" />
</div> </div>
<!-- Waiting time --> <!-- Waiting time -->
<ActRadio v-if="selectedRuleType === 'Waiting time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'Start'" :title="'Start'" :v-model="'waittimeStartRadio'" :data="data" /> <ActRadio v-if="selectedRuleType === 'Waiting time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'Start'" :title="'Start'" :select="'waittimeStartRadio'" :data="data" />
<ActRadio v-if="selectedRuleType === 'Waiting time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'End'" :title="'End'" :v-model="'waittimeEndRadio'" :data="data" /> <ActRadio v-if="selectedRuleType === 'Waiting time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'End'" :title="'End'" :select="'waittimeEndRadio'" :data="data" />
<div v-if="selectedRuleType === 'Waiting time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'Start & End'" class="flex h-full"> <div v-if="selectedRuleType === 'Waiting time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'Start & End'" class="flex h-full">
<ActRadio :title="'Start'" :v-model="'waittimeStartAndEndRadioStart'" :data="data" /> <ActRadio :title="'Start'" :select="'waittimeStartAndEndRadioStart'" :data="data" />
<ActRadio :title="'End'" :v-model="'waittimeStartAndEndRadioEnd'" :data="data" /> <ActRadio :title="'End'" :select="'waittimeStartAndEndRadioEnd'" :data="data" />
</div> </div>
<ActRadio v-if="selectedRuleType === 'Waiting time' && selectedProcessScope === 'Partial' && selectedActSeqFromTo === 'From'" :title="'From'" :v-model="'waittimeFromRadio'" :data="data" /> <ActRadio v-if="selectedRuleType === 'Waiting time' && selectedProcessScope === 'Partial' && selectedActSeqFromTo === 'From'" :title="'From'" :select="'waittimeFromRadio'" :data="data" />
<ActRadio v-if="selectedRuleType === 'Waiting time' && selectedProcessScope === 'Partial' && selectedActSeqFromTo === 'To'" :title="'To'" :v-model="'waittimeToRadio'" :data="data" /> <ActRadio v-if="selectedRuleType === 'Waiting time' && selectedProcessScope === 'Partial' && selectedActSeqFromTo === 'To'" :title="'To'" :select="'waittimeToRadio'" :data="data" />
<div v-if="selectedRuleType === 'Waiting time' && selectedProcessScope === 'Partial' && selectedActSeqFromTo === 'From & To'" class="flex h-full"> <div v-if="selectedRuleType === 'Waiting time' && selectedProcessScope === 'Partial' && selectedActSeqFromTo === 'From & To'" class="flex h-full">
<ActRadio :title="'From'" :v-model="'waittimeFromAndToRadioFrom'" :data="data" /> <ActRadio :title="'From'" :select="'waittimeFromAndToRadioFrom'" :data="data" />
<ActRadio :title="'To'" :v-model="'waittimeFromAndToRadioTo'" :data="data" /> <ActRadio :title="'To'" :select="'waittimeFromAndToRadioTo'" :data="data" />
</div> </div>
<!-- Cycle time --> <!-- Cycle time -->
<ActRadio v-if="selectedRuleType === 'Cycle time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'Start'" :title="'Start'" :v-model="'cyctimeStartRadio'" :data="data" /> <ActRadio v-if="selectedRuleType === 'Cycle time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'Start'" :title="'Start'" :select="'cyctimeStartRadio'" :data="data" />
<ActRadio v-if="selectedRuleType === 'Cycle time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'End'" :title="'End'" :v-model="'cyctimeEndRadio'" :data="data" /> <ActRadio v-if="selectedRuleType === 'Cycle time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'End'" :title="'End'" :select="'cyctimeEndRadio'" :data="data" />
<div v-if="selectedRuleType === 'Cycle time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'Start & End'" class="flex h-full"> <div v-if="selectedRuleType === 'Cycle time' && selectedProcessScope === 'End to end' && selectedActSeqMore === 'Start & End'" class="flex h-full">
<ActRadio :title="'Start'" :v-model="'cyctimeStartAndEndRadioStart'" :data="data" /> <ActRadio :title="'Start'" :select="'cyctimeStartAndEndRadioStart'" :data="data" />
<ActRadio :title="'End'" :v-model="'cyctimeStartAndEndRadioEnd'" :data="data" /> <ActRadio :title="'End'" :select="'cyctimeStartAndEndRadioEnd'" :data="data" />
</div> </div>
</section> </section>
@@ -60,10 +60,11 @@ export default {
const loadingStore = LoadingStore(); const loadingStore = LoadingStore();
const conformanceStore = ConformanceStore(); const conformanceStore = ConformanceStore();
const { isLoading } = storeToRefs(loadingStore); const { isLoading } = storeToRefs(loadingStore);
const { selectedRuleType, selectedActivitySequence, selectedMode, selectedProcessScope, selectedActSeqMore, selectedActSeqFromTo, conformanceTask } = storeToRefs(conformanceStore); const { selectedRuleType, selectedActivitySequence, selectedMode, selectedProcessScope, selectedActSeqMore, selectedActSeqFromTo, conformanceTask, conformanceStart, conformanceEnd } = storeToRefs(conformanceStore);
return { isLoading, selectedRuleType, selectedActivitySequence, selectedMode, selectedProcessScope, selectedActSeqMore, selectedActSeqFromTo, conformanceTask } return { isLoading, selectedRuleType, selectedActivitySequence, selectedMode, selectedProcessScope, selectedActSeqMore, selectedActSeqFromTo, conformanceTask, conformanceStart, conformanceEnd }
}, },
props: ['selectConformanceTask', 'selectConformanceStartAndEnd', 'selectConformanceStart', 'selectConformanceEnd', 'selectConformanceFrom', 'selectConformanceTo', 'listSeq'],
components: { components: {
ActList, ActRadio, ActSeqDrag ActList, ActRadio, ActSeqDrag
}, },

View File

@@ -0,0 +1,16 @@
<template>
<div class="space-y-2">
<div class="flex justify-start items-center pr-4" v-for="(act, index) in data" :key="index">
<span class="material-symbols-outlined text-primary mr-2">
arrow_circle_down
</span>
<p class="px-2 py-1 border border-neutral-500 w-full whitespace-nowrap break-keep text-ellipsis overflow-hidden">{{ act }}</p>
</div>
</div>
</template>
<script>
export default {
name: 'ResultArrow',
props:['data'],
}
</script>

View File

@@ -0,0 +1,16 @@
<template>
<div class="space-y-2">
<div class="flex justify-start items-center pr-4" v-for="(act, index) in data" :key="index">
<span class="material-symbols-outlined text-primary mr-2">
check_circle
</span>
<p class="px-2 py-1 border border-neutral-500 w-full whitespace-nowrap break-keep text-ellipsis overflow-hidden">{{ act }}</p>
</div>
</div>
</template>
<script>
export default {
name: 'ResultCheck',
props:['data'],
}
</script>

View File

@@ -0,0 +1,15 @@
<template>
<ul>
<li class="flex justify-start items-center py-1 pr-4" v-for="(act, index) in timeResultData" :key="index + act">
<span class="material-symbols-outlined disc text-sm align-middle mr-1">fiber_manual_record</span>
<span class="mr-2 block w-12">{{ act.category }}</span>
<span class="px-2 py-1 border border-neutral-500 w-full whitespace-nowrap break-keep text-ellipsis overflow-hidden block">{{ act.task }}</span>
</li>
</ul>
</template>
<script>
export default {
name: 'ResultDot',
props:['timeResultData'],
}
</script>

View File

@@ -58,7 +58,6 @@
import { storeToRefs } from 'pinia'; import { storeToRefs } from 'pinia';
import ConformanceStore from '@/stores/conformance.js'; import ConformanceStore from '@/stores/conformance.js';
import cytoscapeMapTrace from '@/module/cytoscapeMapTrace.js'; import cytoscapeMapTrace from '@/module/cytoscapeMapTrace.js';
import { nextTick } from 'vue';
export default { export default {
props: ['issusModal', 'issusNo', 'traceId', 'firstCases'], props: ['issusModal', 'issusNo', 'traceId', 'firstCases'],
@@ -219,9 +218,12 @@ export default {
this.setNodesData(); this.setNodesData();
this.setEdgesData(); this.setEdgesData();
cytoscapeMapTrace(this.processMap.nodes, this.processMap.edges, graphId); if(graphId !== null) cytoscapeMapTrace(this.processMap.nodes, this.processMap.edges, graphId);
}); });
}, },
/**
* 無限滾動: 載入數據
*/
async fetchData() { async fetchData() {
try { try {
this.loading = true; this.loading = true;
@@ -234,8 +236,12 @@ export default {
this.loading = false; this.loading = false;
} }
}, },
/**
* 無限滾動: 監聽 scroll 有沒有滾到底部
* @param {element} event
*/
handleScroll(event) { handleScroll(event) {
if(this.loading || this.maxItems) return; if(this.loading || this.maxItems || this.infiniteData.length < 20) return;
const container = event.target; const container = event.target;
const overScrollHeight = container.scrollTop + container.clientHeight + 20 >= container.scrollHeight; const overScrollHeight = container.scrollTop + container.clientHeight + 20 >= container.scrollHeight;

View File

@@ -5,7 +5,6 @@ import {useToast} from 'vue-toast-notification';
import 'vue-toast-notification/dist/theme-sugar.css'; import 'vue-toast-notification/dist/theme-sugar.css';
import moment from "moment"; import moment from "moment";
import { Decimal } from 'decimal.js'; import { Decimal } from 'decimal.js';
import { resolveTransitionHooks } from "vue";
const loading = loadingStore(pinia); const loading = loadingStore(pinia);
const $toast = useToast(); const $toast = useToast();
@@ -19,6 +18,8 @@ export default defineStore('conformanceStore', {
conformanceFilterId: null, conformanceFilterId: null,
conformanceTempCheckerId: null, conformanceTempCheckerId: null,
allConformanceTask: [], allConformanceTask: [],
allConformanceStart: [],
allConformanceEnd: [],
allConformanceTempReportData: null, allConformanceTempReportData: null,
allIssueTraces: null, allIssueTraces: null,
allTaskSeq: null, allTaskSeq: null,
@@ -29,12 +30,19 @@ export default defineStore('conformanceStore', {
selectedProcessScope: 'End to end', // radio selectedProcessScope: 'End to end', // radio
selectedActSeqMore: 'All', // radio selectedActSeqMore: 'All', // radio
selectedActSeqFromTo: 'From', // radio selectedActSeqFromTo: 'From', // radio
// selectConformanceTask: null, // select task
infinite404: null, infinite404: null,
}), }),
getters: { getters: {
conformanceTask: state => { conformanceTask: state => {
return state.allConformanceTask.map(i => i.label); return state.allConformanceTask.map(i => i.label);
}, },
conformanceStart: state => {
return state.allConformanceStart;
},
conformanceEnd: state => {
return state.allConformanceEnd;
},
conformanceTempReportData: state => { conformanceTempReportData: state => {
return state.allConformanceTempReportData; return state.allConformanceTempReportData;
}, },
@@ -79,6 +87,8 @@ export default defineStore('conformanceStore', {
try { try {
const response = await this.$axios.get(api); const response = await this.$axios.get(api);
this.allConformanceTask = response.data.tasks; this.allConformanceTask = response.data.tasks;
this.allConformanceStart = response.data.sources;
this.allConformanceEnd = response.data.sinks;
} catch(error) { } catch(error) {
await delay(); await delay();
loading.isLoading = true; loading.isLoading = true;